| | import React, { useEffect, useState } from 'react'; |
| | import { useCreatePresetMutation } from 'librechat-data-provider/react-query'; |
| | import { OGDialogTemplate, OGDialog, Input, Label, useToastContext } from '@librechat/client'; |
| | import type { TEditPresetProps } from '~/common'; |
| | import { cn, removeFocusOutlines, cleanupPreset, defaultTextProps } from '~/utils'; |
| | import { NotificationSeverity } from '~/common'; |
| | import { useLocalize } from '~/hooks'; |
| |
|
| | const SaveAsPresetDialog = ({ open, onOpenChange, preset }: TEditPresetProps) => { |
| | const [title, setTitle] = useState<string>(preset.title ?? 'My Preset'); |
| | const createPresetMutation = useCreatePresetMutation(); |
| | const { showToast } = useToastContext(); |
| | const localize = useLocalize(); |
| |
|
| | const submitPreset = () => { |
| | const _preset = cleanupPreset({ |
| | preset: { |
| | ...preset, |
| | title, |
| | }, |
| | }); |
| |
|
| | const toastTitle = |
| | (_preset.title ?? '') ? `\`${_preset.title}\`` : localize('com_endpoint_preset_title'); |
| |
|
| | createPresetMutation.mutate(_preset, { |
| | onSuccess: () => { |
| | showToast({ |
| | message: `${toastTitle} ${localize('com_ui_saved')}`, |
| | }); |
| | onOpenChange(false); |
| | }, |
| | onError: () => { |
| | showToast({ |
| | message: localize('com_endpoint_preset_save_error'), |
| | severity: NotificationSeverity.ERROR, |
| | }); |
| | }, |
| | }); |
| | }; |
| |
|
| | useEffect(() => { |
| | setTitle(preset.title ?? localize('com_endpoint_my_preset')); |
| | |
| | }, [open]); |
| |
|
| | |
| | const handleKeyDown = (event: React.KeyboardEvent) => { |
| | if (event.key === 'Enter') { |
| | event.preventDefault(); |
| | submitPreset(); |
| | } |
| | }; |
| |
|
| | return ( |
| | <OGDialog open={open} onOpenChange={onOpenChange}> |
| | <OGDialogTemplate |
| | title={localize('com_endpoint_save_as_preset')} |
| | className="z-[90] w-11/12 sm:w-1/4" |
| | overlayClassName="z-[80]" |
| | showCloseButton={false} |
| | main={ |
| | <div className="flex w-full flex-col items-center gap-2"> |
| | <div className="grid w-full items-center gap-2"> |
| | <Label htmlFor="preset-custom-name" className="text-left text-sm font-medium"> |
| | {localize('com_endpoint_preset_name')} |
| | </Label> |
| | <Input |
| | id="preset-custom-name" |
| | value={title || ''} |
| | onChange={(e) => setTitle(e.target.value || '')} |
| | onKeyDown={handleKeyDown} |
| | placeholder={localize('com_endpoint_preset_custom_name_placeholder')} |
| | aria-label={localize('com_endpoint_preset_name')} |
| | className={cn( |
| | defaultTextProps, |
| | 'flex h-10 max-h-10 w-full resize-none border-border-medium px-3 py-2', |
| | removeFocusOutlines, |
| | )} |
| | /> |
| | </div> |
| | </div> |
| | } |
| | selection={{ |
| | selectHandler: submitPreset, |
| | selectClasses: 'bg-green-500 hover:bg-green-600 dark:hover:bg-green-600 text-white', |
| | selectText: localize('com_ui_save'), |
| | }} |
| | /> |
| | </OGDialog> |
| | ); |
| | }; |
| |
|
| | export default SaveAsPresetDialog; |
| |
|