import { useMemo, useEffect, useState } from 'react'; import * as Ariakit from '@ariakit/react'; import { ShieldEllipsis } from 'lucide-react'; import { useForm, Controller } from 'react-hook-form'; import { Permissions, SystemRoles, roleDefaults, PermissionTypes } from 'librechat-data-provider'; import { Button, Switch, OGDialog, DropdownPopup, OGDialogTitle, OGDialogContent, OGDialogTrigger, useToastContext, } from '@librechat/client'; import type { Control, UseFormSetValue, UseFormGetValues } from 'react-hook-form'; import { useUpdatePeoplePickerPermissionsMutation } from '~/data-provider'; import { useLocalize, useAuthContext } from '~/hooks'; type FormValues = { [Permissions.VIEW_USERS]: boolean; [Permissions.VIEW_GROUPS]: boolean; [Permissions.VIEW_ROLES]: boolean; }; type LabelControllerProps = { label: string; peoplePickerPerm: Permissions.VIEW_USERS | Permissions.VIEW_GROUPS | Permissions.VIEW_ROLES; control: Control; setValue: UseFormSetValue; getValues: UseFormGetValues; }; const LabelController: React.FC = ({ control, peoplePickerPerm, label, getValues, setValue, }) => (
( )} />
); const PeoplePickerAdminSettings = () => { const localize = useLocalize(); const { showToast } = useToastContext(); const { user, roles } = useAuthContext(); const { mutate, isLoading } = useUpdatePeoplePickerPermissionsMutation({ 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(() => { const rolePerms = roles?.[selectedRole]?.permissions; if (rolePerms) { return rolePerms[PermissionTypes.PEOPLE_PICKER]; } return roleDefaults[selectedRole].permissions[PermissionTypes.PEOPLE_PICKER]; }, [roles, selectedRole]); const { reset, control, setValue, getValues, handleSubmit, formState: { isSubmitting }, } = useForm({ mode: 'onChange', defaultValues, }); useEffect(() => { const value = roles?.[selectedRole]?.permissions?.[PermissionTypes.PEOPLE_PICKER]; if (value) { reset(value); } else { reset(roleDefaults[selectedRole].permissions[PermissionTypes.PEOPLE_PICKER]); } }, [roles, selectedRole, reset]); if (user?.role !== SystemRoles.ADMIN) { return null; } const labelControllerData: { peoplePickerPerm: Permissions.VIEW_USERS | Permissions.VIEW_GROUPS | Permissions.VIEW_ROLES; label: string; }[] = [ { peoplePickerPerm: Permissions.VIEW_USERS, label: localize('com_ui_people_picker_allow_view_users'), }, { peoplePickerPerm: Permissions.VIEW_GROUPS, label: localize('com_ui_people_picker_allow_view_groups'), }, { peoplePickerPerm: Permissions.VIEW_ROLES, label: localize('com_ui_people_picker_allow_view_roles'), }, ]; 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_people_picker', )}`}
{/* Role selection dropdown */}
{localize('com_ui_role_select')}: {selectedRole} } items={roleDropdownItems} itemClassName="items-center justify-center" sameWidth={true} />
{/* Permissions form */}
{labelControllerData.map(({ peoplePickerPerm, label }) => (
))}
); }; export default PeoplePickerAdminSettings;