import * as Ariakit from '@ariakit/react'; import { useMemo, useEffect, useState } from 'react'; import { ShieldEllipsis } from 'lucide-react'; import { useForm, Controller } from 'react-hook-form'; import { Permissions, SystemRoles, roleDefaults, PermissionTypes } from 'librechat-data-provider'; import { OGDialog, OGDialogTitle, OGDialogContent, OGDialogTrigger, Button, Switch, DropdownPopup, useToastContext, } from '@librechat/client'; import type { Control, UseFormSetValue, UseFormGetValues } from 'react-hook-form'; import { useUpdateMemoryPermissionsMutation } from '~/data-provider'; import { useLocalize, useAuthContext } from '~/hooks'; type FormValues = Record; type LabelControllerProps = { label: string; memoryPerm: Permissions; control: Control; setValue: UseFormSetValue; getValues: UseFormGetValues; }; const LabelController: React.FC = ({ control, memoryPerm, label }) => (
{label} ( )} />
); const AdminSettings = () => { const localize = useLocalize(); const { user, roles } = useAuthContext(); const { showToast } = useToastContext(); const { mutate, isLoading } = useUpdateMemoryPermissionsMutation({ onSuccess: () => { showToast({ status: 'success', message: localize('com_ui_saved') }); }, onError: () => { showToast({ status: 'error', message: localize('com_ui_error_save_admin_settings') }); }, }); const [isRoleMenuOpen, setIsRoleMenuOpen] = useState(false); const [selectedRole, setSelectedRole] = useState(SystemRoles.USER); const defaultValues = useMemo(() => { if (roles?.[selectedRole]?.permissions) { return roles?.[selectedRole]?.permissions?.[PermissionTypes.MEMORIES]; } return roleDefaults[selectedRole].permissions[PermissionTypes.MEMORIES]; }, [roles, selectedRole]); const { reset, control, setValue, getValues, handleSubmit, formState: { isSubmitting }, } = useForm({ mode: 'onChange', defaultValues, }); useEffect(() => { if (roles?.[selectedRole]?.permissions?.[PermissionTypes.MEMORIES]) { reset(roles?.[selectedRole]?.permissions?.[PermissionTypes.MEMORIES]); } else { reset(roleDefaults[selectedRole].permissions[PermissionTypes.MEMORIES]); } }, [roles, selectedRole, reset]); if (user?.role !== SystemRoles.ADMIN) { return null; } const labelControllerData = [ { memoryPerm: Permissions.USE, label: localize('com_ui_memories_allow_use'), }, { memoryPerm: Permissions.CREATE, label: localize('com_ui_memories_allow_create'), }, { memoryPerm: Permissions.UPDATE, label: localize('com_ui_memories_allow_update'), }, { memoryPerm: Permissions.READ, label: localize('com_ui_memories_allow_read'), }, { memoryPerm: Permissions.OPT_OUT, label: localize('com_ui_memories_allow_opt_out'), }, ]; const onSubmit = (data: FormValues) => { mutate({ roleName: selectedRole, updates: data }); }; const roleDropdownItems = [ { label: SystemRoles.USER, onClick: () => { setSelectedRole(SystemRoles.USER); }, }, { label: SystemRoles.ADMIN, onClick: () => { setSelectedRole(SystemRoles.ADMIN); }, }, ]; return ( {`${localize('com_ui_admin_settings')} - ${localize( 'com_ui_memories', )}`}
{/* Role selection dropdown */}
{localize('com_ui_role_select')}: {selectedRole} } items={roleDropdownItems} itemClassName="items-center justify-center" sameWidth={true} />
{/* Permissions form */}
{labelControllerData.map(({ memoryPerm, label }) => (
{selectedRole === SystemRoles.ADMIN && memoryPerm === Permissions.USE && ( <>
{localize('com_ui_admin_access_warning')} {'\n'} {localize('com_ui_more_info')}
)}
))}
); }; export default AdminSettings;