mirror of
https://github.com/usebruno/bruno.git
synced 2026-06-29 07:34:07 +00:00
100 lines
3.3 KiB
JavaScript
100 lines
3.3 KiB
JavaScript
import React, { useState, useEffect } from 'react';
|
|
import get from 'lodash/get';
|
|
import { useDispatch } from 'react-redux';
|
|
import { requestUrlChanged, updateRequestMethod } from 'providers/ReduxStore/slices/collections';
|
|
import { saveRequest } from 'providers/ReduxStore/slices/collections/actions';
|
|
import HttpMethodSelector from './HttpMethodSelector';
|
|
import { useTheme } from 'providers/Theme';
|
|
import { IconDeviceFloppy, IconArrowRight } from '@tabler/icons';
|
|
import SingleLineEditor from 'components/SingleLineEditor';
|
|
import { isMacOS } from 'utils/common/platform';
|
|
import StyledWrapper from './StyledWrapper';
|
|
|
|
const QueryUrl = ({ item, collection, handleRun }) => {
|
|
const { theme, storedTheme } = useTheme();
|
|
const dispatch = useDispatch();
|
|
const method = item.draft ? get(item, 'draft.request.method') : get(item, 'request.method');
|
|
const url = item.draft ? get(item, 'draft.request.url') : get(item, 'request.url');
|
|
const isMac = isMacOS();
|
|
const saveShortcut = isMac ? 'Cmd + S' : 'Ctrl + S';
|
|
|
|
const [methodSelectorWidth, setMethodSelectorWidth] = useState(90);
|
|
|
|
useEffect(() => {
|
|
const el = document.querySelector('.method-selector-container');
|
|
setMethodSelectorWidth(el.offsetWidth);
|
|
}, [method]);
|
|
|
|
const onSave = () => {
|
|
dispatch(saveRequest(item.uid, collection.uid));
|
|
};
|
|
|
|
const onUrlChange = (value) => {
|
|
dispatch(
|
|
requestUrlChanged({
|
|
itemUid: item.uid,
|
|
collectionUid: collection.uid,
|
|
url: value
|
|
})
|
|
);
|
|
};
|
|
|
|
const onMethodSelect = (verb) => {
|
|
dispatch(
|
|
updateRequestMethod({
|
|
method: verb,
|
|
itemUid: item.uid,
|
|
collectionUid: collection.uid
|
|
})
|
|
);
|
|
};
|
|
|
|
return (
|
|
<StyledWrapper className="flex items-center">
|
|
<div className="flex items-center h-full method-selector-container">
|
|
<HttpMethodSelector method={method} onMethodSelect={onMethodSelect} />
|
|
</div>
|
|
<div
|
|
className="flex items-center flex-grow input-container h-full"
|
|
style={{
|
|
color: 'yellow',
|
|
width: `calc(100% - ${methodSelectorWidth}px)`,
|
|
maxWidth: `calc(100% - ${methodSelectorWidth}px)`
|
|
}}
|
|
>
|
|
<SingleLineEditor
|
|
value={url}
|
|
onSave={onSave}
|
|
theme={storedTheme}
|
|
onChange={(newValue) => onUrlChange(newValue)}
|
|
onRun={handleRun}
|
|
collection={collection}
|
|
/>
|
|
<div className="flex items-center h-full mr-2 cursor-pointer" id="send-request" onClick={handleRun}>
|
|
<div
|
|
className="tooltip mr-3"
|
|
onClick={(e) => {
|
|
e.stopPropagation();
|
|
if (!item.draft) return;
|
|
onSave();
|
|
}}
|
|
>
|
|
<IconDeviceFloppy
|
|
color={item.draft ? theme.colors.text.yellow : theme.requestTabs.icon.color}
|
|
strokeWidth={1.5}
|
|
size={22}
|
|
className={`${item.draft ? 'cursor-pointer' : 'cursor-default'}`}
|
|
/>
|
|
<span className="tooltiptext text-xs">
|
|
Save <span className="shortcut">({saveShortcut})</span>
|
|
</span>
|
|
</div>
|
|
<IconArrowRight color={theme.requestTabPanel.url.icon} strokeWidth={1.5} size={22} />
|
|
</div>
|
|
</div>
|
|
</StyledWrapper>
|
|
);
|
|
};
|
|
|
|
export default QueryUrl;
|