import { useMemo, useState, useEffect } from 'react'; import { Plus } from 'lucide-react'; import { matchSorter } from 'match-sorter'; import { SystemRoles, PermissionTypes, Permissions } from 'librechat-data-provider'; import { Button, Checkbox, Spinner, FilterInput, TooltipAnchor, OGDialogTrigger, useToastContext, } from '@librechat/client'; import type { TUserMemory } from 'librechat-data-provider'; import { useUpdateMemoryPreferencesMutation, useMemoriesQuery, useGetUserQuery, } from '~/data-provider'; import { useLocalize, useAuthContext, useHasAccess } from '~/hooks'; import MemoryCreateDialog from './MemoryCreateDialog'; import MemoryUsageBadge from './MemoryUsageBadge'; import AdminSettings from './AdminSettings'; import MemoryList from './MemoryList'; const pageSize = 10; export default function MemoryPanel() { const localize = useLocalize(); const { user } = useAuthContext(); const { data: userData } = useGetUserQuery(); const { data: memData, isLoading } = useMemoriesQuery(); const { showToast } = useToastContext(); const [pageIndex, setPageIndex] = useState(0); const [searchQuery, setSearchQuery] = useState(''); const [createDialogOpen, setCreateDialogOpen] = useState(false); const [referenceSavedMemories, setReferenceSavedMemories] = useState(true); const updateMemoryPreferencesMutation = useUpdateMemoryPreferencesMutation({ onSuccess: () => { showToast({ message: localize('com_ui_preferences_updated'), status: 'success', }); }, onError: () => { showToast({ message: localize('com_ui_error_updating_preferences'), status: 'error', }); setReferenceSavedMemories((prev) => !prev); }, }); useEffect(() => { if (userData?.personalization?.memories !== undefined) { setReferenceSavedMemories(userData.personalization.memories); } }, [userData?.personalization?.memories]); const handleMemoryToggle = (checked: boolean) => { setReferenceSavedMemories(checked); updateMemoryPreferencesMutation.mutate({ memories: checked }); }; const hasReadAccess = useHasAccess({ permissionType: PermissionTypes.MEMORIES, permission: Permissions.READ, }); const hasUpdateAccess = useHasAccess({ permissionType: PermissionTypes.MEMORIES, permission: Permissions.UPDATE, }); const hasCreateAccess = useHasAccess({ permissionType: PermissionTypes.MEMORIES, permission: Permissions.CREATE, }); const hasOptOutAccess = useHasAccess({ permissionType: PermissionTypes.MEMORIES, permission: Permissions.OPT_OUT, }); const memories: TUserMemory[] = useMemo(() => memData?.memories ?? [], [memData]); const filteredMemories = useMemo(() => { return matchSorter(memories, searchQuery, { keys: ['key', 'value'], }); }, [memories, searchQuery]); const currentRows = useMemo(() => { return filteredMemories.slice(pageIndex * pageSize, (pageIndex + 1) * pageSize); }, [filteredMemories, pageIndex]); // Reset page when search changes useEffect(() => { setPageIndex(0); }, [searchQuery]); if (isLoading) { return (
{localize('com_ui_no_read_access')}