import React, { useState } from 'react'; import { PermissionTypes, Permissions } from 'librechat-data-provider'; import { OGDialog, OGDialogTemplate, Button, Label, Input, Spinner, useToastContext, } from '@librechat/client'; import { useCreateMemoryMutation } from '~/data-provider'; import { useLocalize, useHasAccess } from '~/hooks'; interface MemoryCreateDialogProps { open: boolean; onOpenChange: (open: boolean) => void; children: React.ReactNode; triggerRef?: React.MutableRefObject; } export default function MemoryCreateDialog({ open, onOpenChange, children, triggerRef, }: MemoryCreateDialogProps) { const localize = useLocalize(); const { showToast } = useToastContext(); const hasCreateAccess = useHasAccess({ permissionType: PermissionTypes.MEMORIES, permission: Permissions.CREATE, }); const { mutate: createMemory, isLoading } = useCreateMemoryMutation({ onSuccess: () => { showToast({ message: localize('com_ui_memory_created'), status: 'success', }); onOpenChange(false); setKey(''); setValue(''); setTimeout(() => { triggerRef?.current?.focus(); }, 0); }, onError: (error: Error) => { let errorMessage = localize('com_ui_error'); if (error && typeof error === 'object' && 'response' in error) { const axiosError = error as any; if (axiosError.response?.data?.error) { errorMessage = axiosError.response.data.error; // Check for duplicate key error if (axiosError.response?.status === 409 || errorMessage.includes('already exists')) { errorMessage = localize('com_ui_memory_key_exists'); } // Check for key validation error (lowercase and underscores only) else if (errorMessage.includes('lowercase letters and underscores')) { errorMessage = localize('com_ui_memory_key_validation'); } } } else if (error.message) { errorMessage = error.message; } showToast({ message: errorMessage, status: 'error', }); }, }); const [key, setKey] = useState(''); const [value, setValue] = useState(''); const handleSave = () => { if (!hasCreateAccess) { return; } if (!key.trim() || !value.trim()) { showToast({ message: localize('com_ui_field_required'), status: 'error', }); return; } createMemory({ key: key.trim(), value: value.trim(), }); }; const handleKeyPress = (e: React.KeyboardEvent) => { if (e.key === 'Enter' && e.ctrlKey && hasCreateAccess) { handleSave(); } }; return ( {children}
setKey(e.target.value)} onKeyDown={handleKeyPress} placeholder={localize('com_ui_enter_key')} className="w-full" />