import React, { useEffect, useState } from 'react'; import { useSetRecoilState, useRecoilValue } from 'recoil'; import axios from 'axios'; import exportFromJSON from 'export-from-json'; import DialogTemplate from '../ui/DialogTemplate'; import { Dialog, DialogClose, DialogButton } from '../ui/Dialog.tsx'; import { Input } from '../ui/Input.tsx'; import { Label } from '../ui/Label.tsx'; import Dropdown from '../ui/Dropdown'; import { cn } from '~/utils/'; import OpenAISettings from './OpenAI/Settings'; import store from '~/store'; const EditPresetDialog = ({ open, onOpenChange, preset: _preset }) => { // const [title, setTitle] = useState('My Preset'); const [preset, setPreset] = useState({}); const setPresets = useSetRecoilState(store.presets); const availableEndpoints = useRecoilValue(store.availableEndpoints); const setOption = param => newValue => { let update = {}; update[param] = newValue; setPreset(prevState => ({ ...prevState, ...update })); }; const renderSettings = () => { const { endpoint } = preset || {}; if (endpoint === 'openAI') return ( ); else return null; }; 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'; // in order not to use wrong data from other endpoint const clearPreset = () => { if (preset?.endpoint === 'openAI') return { title: preset?.title, endpoint: preset?.endpoint, model: preset?.model, chatGptLabel: preset?.chatGptLabel, promptPrefix: preset?.promptPrefix, temperature: preset?.temperature, top_p: preset?.top_p, presence_penalty: preset?.presence_penalty, frequency_penalty: preset?.frequency_penalty }; else return { title: preset?.title, endpoint: preset?.endpoint }; // TODO: else }; const submitPreset = () => { axios({ method: 'post', url: '/api/presets', data: clearPreset(), withCredentials: true }).then(res => { setPresets(res?.data); }); }; const exportPreset = () => { exportFromJSON({ data: clearPreset(), fileName: `${preset?.title}.json`, exportType: exportFromJSON.types.json }); }; useEffect(() => { setPreset(_preset); }, [open]); return (
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' )} />
{renderSettings()}
} buttons={ <> Save } leftButtons={ <> Export } />
); }; export default EditPresetDialog;