mirror of
https://github.com/usebruno/bruno.git
synced 2026-07-01 08:34:07 +00:00
110 lines
3.4 KiB
JavaScript
110 lines
3.4 KiB
JavaScript
import React, { useRef, forwardRef, useEffect } from 'react';
|
|
import { useDispatch } from 'react-redux';
|
|
import get from 'lodash/get';
|
|
import { IconCaretDown } from '@tabler/icons';
|
|
import Dropdown from 'components/Dropdown';
|
|
import { useTheme } from 'providers/Theme';
|
|
import SingleLineEditor from 'components/SingleLineEditor';
|
|
import { updateCollectionAuth } from 'providers/ReduxStore/slices/collections';
|
|
import { saveCollectionSettings } from 'providers/ReduxStore/slices/collections/actions';
|
|
import StyledWrapper from './StyledWrapper';
|
|
import { humanizeRequestAPIKeyPlacement } from 'utils/collections';
|
|
|
|
const ApiKeyAuth = ({ collection }) => {
|
|
const dispatch = useDispatch();
|
|
const { storedTheme } = useTheme();
|
|
const dropdownTippyRef = useRef();
|
|
const onDropdownCreate = (ref) => (dropdownTippyRef.current = ref);
|
|
|
|
const apikeyAuth = collection.draft?.root ? get(collection, 'draft.root.request.auth.apikey', {}) : get(collection, 'root.request.auth.apikey', {});
|
|
|
|
const handleSave = () => dispatch(saveCollectionSettings(collection.uid));
|
|
|
|
const Icon = forwardRef((props, ref) => {
|
|
return (
|
|
<div ref={ref} className="flex items-center justify-end auth-type-label select-none">
|
|
{humanizeRequestAPIKeyPlacement(apikeyAuth?.placement)}
|
|
<IconCaretDown className="caret ml-1 mr-1" size={14} strokeWidth={2} />
|
|
</div>
|
|
);
|
|
});
|
|
|
|
const handleAuthChange = (property, value) => {
|
|
dispatch(
|
|
updateCollectionAuth({
|
|
mode: 'apikey',
|
|
collectionUid: collection.uid,
|
|
content: {
|
|
...apikeyAuth,
|
|
[property]: value
|
|
}
|
|
})
|
|
);
|
|
};
|
|
|
|
useEffect(() => {
|
|
!apikeyAuth?.placement
|
|
&& dispatch(
|
|
updateCollectionAuth({
|
|
mode: 'apikey',
|
|
collectionUid: collection.uid,
|
|
content: {
|
|
placement: 'header'
|
|
}
|
|
})
|
|
);
|
|
}, [apikeyAuth]);
|
|
|
|
return (
|
|
<StyledWrapper className="mt-2 w-full">
|
|
<label className="block font-medium mb-2">Key</label>
|
|
<div className="single-line-editor-wrapper mb-2">
|
|
<SingleLineEditor
|
|
value={apikeyAuth.key || ''}
|
|
theme={storedTheme}
|
|
onSave={handleSave}
|
|
onChange={(val) => handleAuthChange('key', val)}
|
|
collection={collection}
|
|
/>
|
|
</div>
|
|
|
|
<label className="block font-medium mb-2">Value</label>
|
|
<div className="single-line-editor-wrapper mb-2">
|
|
<SingleLineEditor
|
|
value={apikeyAuth.value || ''}
|
|
theme={storedTheme}
|
|
onSave={handleSave}
|
|
onChange={(val) => handleAuthChange('value', val)}
|
|
collection={collection}
|
|
/>
|
|
</div>
|
|
|
|
<label className="block font-medium mb-2">Add To</label>
|
|
<div className="inline-flex items-center cursor-pointer auth-placement-selector w-fit">
|
|
<Dropdown onCreate={onDropdownCreate} icon={<Icon />} placement="bottom-end">
|
|
<div
|
|
className="dropdown-item"
|
|
onClick={() => {
|
|
dropdownTippyRef.current.hide();
|
|
handleAuthChange('placement', 'header');
|
|
}}
|
|
>
|
|
Header
|
|
</div>
|
|
<div
|
|
className="dropdown-item"
|
|
onClick={() => {
|
|
dropdownTippyRef.current.hide();
|
|
handleAuthChange('placement', 'queryparams');
|
|
}}
|
|
>
|
|
Query Params
|
|
</div>
|
|
</Dropdown>
|
|
</div>
|
|
</StyledWrapper>
|
|
);
|
|
};
|
|
|
|
export default ApiKeyAuth;
|