|
import exportFromJSON from 'export-from-json'; |
|
import { useEffect, useState } from 'react'; |
|
import { useRecoilState } from 'recoil'; |
|
import { tPresetSchema } from 'librechat-data-provider'; |
|
import type { TSetOption, TEditPresetProps } from '~/common'; |
|
import { Dialog, DialogButton } from '~/components/ui'; |
|
import DialogTemplate from '~/components/ui/DialogTemplate'; |
|
import SaveAsPresetDialog from './SaveAsPresetDialog'; |
|
import EndpointSettings from './EndpointSettings'; |
|
import PopoverButtons from './PopoverButtons'; |
|
import { cleanupPreset } from '~/utils'; |
|
import { useLocalize } from '~/hooks'; |
|
import store from '~/store'; |
|
|
|
|
|
const EndpointOptionsDialog = ({ |
|
open, |
|
onOpenChange, |
|
preset: _preset, |
|
title, |
|
}: TEditPresetProps) => { |
|
const [preset, setPreset] = useRecoilState(store.preset); |
|
const [saveAsDialogShow, setSaveAsDialogShow] = useState(false); |
|
const localize = useLocalize(); |
|
|
|
const setOption: TSetOption = (param) => (newValue) => { |
|
const update = {}; |
|
update[param] = newValue; |
|
setPreset((prevState) => |
|
tPresetSchema.parse({ |
|
...prevState, |
|
...update, |
|
}), |
|
); |
|
}; |
|
|
|
const saveAsPreset = () => { |
|
setSaveAsDialogShow(true); |
|
}; |
|
|
|
const exportPreset = () => { |
|
if (!preset) { |
|
return; |
|
} |
|
exportFromJSON({ |
|
data: cleanupPreset({ preset }), |
|
fileName: `${preset?.title}.json`, |
|
exportType: exportFromJSON.types.json, |
|
}); |
|
}; |
|
|
|
useEffect(() => { |
|
setPreset(_preset); |
|
|
|
}, [open]); |
|
|
|
const { endpoint } = preset ?? {}; |
|
if (!endpoint) { |
|
return null; |
|
} |
|
|
|
if (!preset) { |
|
return null; |
|
} |
|
|
|
return ( |
|
<> |
|
<Dialog open={open} onOpenChange={onOpenChange}> |
|
<DialogTemplate |
|
title={`${title || localize('com_endpoint_save_convo_as_preset')}`} |
|
className="h-full max-w-full overflow-y-auto pb-4 sm:w-[680px] sm:pb-0 md:h-[680px] md:w-[750px] md:overflow-y-hidden lg:w-[950px]" |
|
// headerClassName="sm:p-2 h-16" |
|
main={ |
|
<div className="flex w-full flex-col items-center gap-2 md:h-[530px]"> |
|
<div className="w-full p-0"> |
|
<PopoverButtons |
|
endpoint={endpoint} |
|
buttonClass="ml-0 mb-4 col-span-2 dark:bg-gray-700 dark:hover:bg-gray-800 p-2" |
|
/> |
|
<EndpointSettings |
|
conversation={preset} |
|
setOption={setOption} |
|
isPreset={true} |
|
className="h-full md:mb-0 md:h-[490px]" |
|
/> |
|
</div> |
|
</div> |
|
} |
|
buttons={ |
|
<div className="mb-6 md:mb-2"> |
|
<DialogButton onClick={exportPreset} className="dark:hover:gray-400 border-gray-700"> |
|
{localize('com_endpoint_export')} |
|
</DialogButton> |
|
<DialogButton |
|
onClick={saveAsPreset} |
|
className="dark:hover:gray-400 ml-2 border-gray-700 bg-green-600 text-white hover:bg-green-700 dark:hover:bg-green-800" |
|
> |
|
{localize('com_endpoint_save_as_preset')} |
|
</DialogButton> |
|
</div> |
|
} |
|
/> |
|
</Dialog> |
|
<SaveAsPresetDialog |
|
open={saveAsDialogShow} |
|
onOpenChange={setSaveAsDialogShow} |
|
preset={preset} |
|
/> |
|
</> |
|
); |
|
}; |
|
|
|
export default EndpointOptionsDialog; |
|
|