LibreChat/client/src/components/Endpoints/EditPresetDialog.jsx

144 lines
4.9 KiB
React
Raw Normal View History

2023-04-02 04:15:07 +08:00
import React, { useEffect, useState } from 'react';
import { useSetRecoilState, useRecoilValue } from 'recoil';
import axios from 'axios';
2023-04-03 12:54:15 +08:00
import exportFromJSON from 'export-from-json';
2023-04-02 04:15:07 +08:00
import DialogTemplate from '../ui/DialogTemplate';
2023-04-03 12:54:15 +08:00
import { Dialog, DialogClose, DialogButton } from '../ui/Dialog.tsx';
2023-04-02 04:15:07 +08:00
import { Input } from '../ui/Input.tsx';
import { Label } from '../ui/Label.tsx';
import Dropdown from '../ui/Dropdown';
import { cn } from '~/utils/';
import cleanupPreset from '~/utils/cleanupPreset';
2023-04-04 13:11:59 +08:00
import Settings from './Settings';
2023-04-02 04:15:07 +08:00
import store from '~/store';
2023-04-04 13:11:59 +08:00
const EditPresetDialog = ({ open, onOpenChange, preset: _preset, title }) => {
2023-04-02 04:15:07 +08:00
// const [title, setTitle] = useState('My Preset');
2023-04-04 01:39:40 +08:00
const [preset, setPreset] = useState(_preset);
2023-04-02 04:15:07 +08:00
const setPresets = useSetRecoilState(store.presets);
const availableEndpoints = useRecoilValue(store.availableEndpoints);
const setOption = param => newValue => {
let update = {};
update[param] = newValue;
setPreset(prevState =>
cleanupPreset({
...prevState,
...update
})
);
2023-04-02 04:15:07 +08:00
};
const defaultTextProps =
'rounded-md border border-gray-200 focus:border-slate-400 focus:bg-gray-50 bg-transparent text-sm shadow-[0_0_10px_rgba(0,0,0,0.05)] outline-none placeholder:text-gray-400 focus:outline-none focus:ring-gray-400 focus:ring-opacity-20 focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 dark:border-gray-500 dark:bg-gray-700 focus:dark:bg-gray-600 dark:text-gray-50 dark:shadow-[0_0_15px_rgba(0,0,0,0.10)] dark:focus:border-gray-400 dark:focus:outline-none dark:focus:ring-0 dark:focus:ring-gray-400 dark:focus:ring-offset-0';
2023-04-02 04:15:07 +08:00
const submitPreset = () => {
axios({
method: 'post',
url: '/api/presets',
data: cleanupPreset(preset),
2023-04-02 04:15:07 +08:00
withCredentials: true
}).then(res => {
setPresets(res?.data);
});
};
2023-04-03 12:54:15 +08:00
const exportPreset = () => {
exportFromJSON({
data: cleanupPreset(preset),
2023-04-03 12:54:15 +08:00
fileName: `${preset?.title}.json`,
exportType: exportFromJSON.types.json
});
};
2023-04-02 04:15:07 +08:00
useEffect(() => {
setPreset(_preset);
}, [open]);
return (
<Dialog
open={open}
onOpenChange={onOpenChange}
>
<DialogTemplate
2023-04-04 13:11:59 +08:00
title={`${title || 'Edit Preset'} - ${preset?.title}`}
2023-04-02 04:15:07 +08:00
className="max-w-full sm:max-w-4xl"
main={
<div className="flex w-full flex-col items-center gap-2">
<div className="grid w-full gap-6 sm:grid-cols-2">
<div className="col-span-1 flex flex-col items-start justify-start gap-2">
<Label
htmlFor="chatGptLabel"
className="text-left text-sm font-medium"
>
Preset Name
</Label>
<Input
id="chatGptLabel"
value={preset?.title || ''}
onChange={e => setOption('title')(e.target.value || '')}
placeholder="Set a custom name, in case you can find this preset"
className={cn(
defaultTextProps,
'flex h-10 max-h-10 w-full resize-none px-3 py-2 focus:outline-none focus:ring-0 focus:ring-opacity-0 focus:ring-offset-0'
)}
/>
</div>
<div className="col-span-1 flex flex-col items-start justify-start gap-2">
<Label
htmlFor="endpoint"
className="text-left text-sm font-medium"
>
Endpoint
</Label>
<Dropdown
id="endpoint"
value={preset?.endpoint || ''}
onChange={setOption('endpoint')}
options={availableEndpoints}
className={cn(
defaultTextProps,
'flex h-10 max-h-10 w-full resize-none focus:outline-none focus:ring-0 focus:ring-opacity-0 focus:ring-offset-0'
)}
containerClassName="flex w-full resize-none"
/>
</div>
2023-04-02 04:15:07 +08:00
</div>
<div className="my-4 w-full border-t border-gray-300 dark:border-gray-500" />
2023-04-04 13:11:59 +08:00
<div className="w-full p-0">
<Settings
preset={preset}
setOption={setOption}
/>
</div>
2023-04-02 04:15:07 +08:00
</div>
}
2023-04-03 12:54:15 +08:00
buttons={
<>
<DialogClose
onClick={submitPreset}
className="dark:hover:gray-400 border-gray-700 bg-green-600 text-white hover:bg-green-700 dark:hover:bg-green-800"
>
Save
</DialogClose>
</>
}
leftButtons={
<>
<DialogButton
onClick={exportPreset}
className="dark:hover:gray-400 border-gray-700"
2023-04-03 12:54:15 +08:00
>
Export
</DialogButton>
</>
}
2023-04-02 04:15:07 +08:00
/>
</Dialog>
);
};
export default EditPresetDialog;