import * as Ariakit from '@ariakit/react'; import { ExternalLink } from 'lucide-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, Button, Switch, DropdownPopup, } from '~/components/ui'; import { useUpdatePromptPermissionsMutation } from '~/data-provider'; import OGDialogTemplate from '~/components/ui/OGDialogTemplate'; import { useLocalize, useAuthContext } from '~/hooks'; import { useToastContext } from '~/Providers'; type FormValues = Record; type LabelControllerProps = { label: string; promptPerm: Permissions; control: Control; setValue: UseFormSetValue; getValues: UseFormGetValues; confirmChange?: (newValue: boolean, onChange: (value: boolean) => void) => void; }; const LabelController: React.FC = ({ control, promptPerm, label, confirmChange, }) => (
{label} ( { if (val === false && confirmChange) { confirmChange(val, field.onChange); } else { field.onChange(val); } }} value={field.value.toString()} /> )} />
); const AdminSettings = () => { const localize = useLocalize(); const { user, roles } = useAuthContext(); const { showToast } = useToastContext(); const [confirmAdminUseChange, setConfirmAdminUseChange] = useState<{ newValue: boolean; callback: (value: boolean) => void; } | null>(null); 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]?.permissions) { return roles[selectedRole]?.permissions[PermissionTypes.PROMPTS]; } return roleDefaults[selectedRole].permissions[PermissionTypes.PROMPTS]; }, [roles, selectedRole]); const { reset, control, setValue, getValues, handleSubmit, formState: { isSubmitting }, } = useForm({ mode: 'onChange', defaultValues, }); useEffect(() => { reset(roles?.[selectedRole]?.permissions?.[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} itemClassName="items-center justify-center" sameWidth={true} />
{labelControllerData.map(({ promptPerm, label }) => (
void, ) => setConfirmAdminUseChange({ newValue, callback: onChange }), } : {})} /> {selectedRole === SystemRoles.ADMIN && promptPerm === Permissions.USE && ( <>
{localize('com_ui_admin_access_warning')} {'\n'} {localize('com_ui_more_info')}
)}
))}
{ if (!open) { setConfirmAdminUseChange(null); } }} > {localize('com_ui_confirm_admin_use_change')}

} selection={{ selectHandler: () => { if (confirmAdminUseChange) { confirmAdminUseChange.callback(confirmAdminUseChange.newValue); } setConfirmAdminUseChange(null); }, selectClasses: 'bg-surface-destructive hover:bg-surface-destructive-hover text-white transition-colors duration-200', selectText: localize('com_ui_confirm_action'), isLoading: false, }} />
); }; export default AdminSettings;