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 type { Control, UseFormSetValue, UseFormGetValues } from 'react-hook-form'; import { OGDialog, OGDialogTitle, OGDialogContent, OGDialogTrigger } from '~/components/ui'; import { useUpdatePromptPermissionsMutation } from '~/data-provider'; import { useLocalize, useAuthContext } from '~/hooks'; import { Button, Switch, DropdownPopup } from '~/components/ui'; import { useToastContext } from '~/Providers'; type FormValues = Record; type LabelControllerProps = { label: string; promptPerm: Permissions; control: Control; setValue: UseFormSetValue; getValues: UseFormGetValues; }; const LabelController: React.FC = ({ control, promptPerm, label, getValues, setValue, }) => (
( )} />
); const AdminSettings = () => { const localize = useLocalize(); const { user, roles } = useAuthContext(); const { showToast } = useToastContext(); const { mutate, isLoading } = useUpdatePromptPermissionsMutation({ 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]) { return roles[selectedRole][PermissionTypes.PROMPTS]; } return roleDefaults[selectedRole][PermissionTypes.PROMPTS]; }, [roles, selectedRole]); const { reset, control, setValue, getValues, handleSubmit, formState: { isSubmitting }, } = useForm({ mode: 'onChange', defaultValues, }); useEffect(() => { if (roles?.[selectedRole]?.[PermissionTypes.PROMPTS]) { reset(roles[selectedRole][PermissionTypes.PROMPTS]); } else { reset(roleDefaults[selectedRole][PermissionTypes.PROMPTS]); } }, [roles, selectedRole, reset]); if (user?.role !== SystemRoles.ADMIN) { return null; } const labelControllerData = [ { promptPerm: Permissions.SHARED_GLOBAL, label: localize('com_ui_prompts_allow_share_global'), }, { promptPerm: Permissions.CREATE, label: localize('com_ui_prompts_allow_create'), }, { promptPerm: Permissions.USE, label: localize('com_ui_prompts_allow_use'), }, ]; 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_prompts')}`}
{/* Role selection dropdown */}
{localize('com_ui_role_select')}: {selectedRole} } items={roleDropdownItems} className="border border-border-light bg-surface-primary" itemClassName="hover:bg-surface-tertiary items-center justify-center" sameWidth={true} />
{labelControllerData.map(({ promptPerm, label }) => (
{selectedRole === SystemRoles.ADMIN && promptPerm === Permissions.USE && ( <>
{localize('com_ui_admin_access_warning')} {'\n'} {localize('com_ui_more_info')}
)}
))}
); }; export default AdminSettings;