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 { useUpdateMarketplacePermissionsMutation } from '~/data-provider'; import { useLocalize, useAuthContext } from '~/hooks'; type FormValues = { [Permissions.USE]: boolean; }; type LabelControllerProps = { label: string; marketplacePerm: Permissions.USE; control: Control; setValue: UseFormSetValue; getValues: UseFormGetValues; }; const LabelController: React.FC = ({ control, marketplacePerm, label, getValues, setValue, }) => (
( )} />
); const MarketplaceAdminSettings = () => { const localize = useLocalize(); const { showToast } = useToastContext(); const { user, roles } = useAuthContext(); const { mutate, isLoading } = useUpdateMarketplacePermissionsMutation({ 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.MARKETPLACE]; } return roleDefaults[selectedRole].permissions[PermissionTypes.MARKETPLACE]; }, [roles, selectedRole]); const { reset, control, setValue, getValues, handleSubmit, formState: { isSubmitting }, } = useForm({ mode: 'onChange', defaultValues, }); useEffect(() => { const value = roles?.[selectedRole]?.permissions?.[PermissionTypes.MARKETPLACE]; if (value) { reset(value); } else { reset(roleDefaults[selectedRole].permissions[PermissionTypes.MARKETPLACE]); } }, [roles, selectedRole, reset]); if (user?.role !== SystemRoles.ADMIN) { return null; } const labelControllerData: { marketplacePerm: Permissions.USE; label: string; }[] = [ { marketplacePerm: Permissions.USE, label: localize('com_ui_marketplace_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_marketplace', )}`}
{/* Role selection dropdown */}
{localize('com_ui_role_select')}: {selectedRole} } items={roleDropdownItems} itemClassName="items-center justify-center" sameWidth={true} />
{/* Permissions form */}
{labelControllerData.map(({ marketplacePerm, label }) => (
))}
); }; export default MarketplaceAdminSettings;