import { ChangeEvent } from 'react'; import { Stack, Group, Divider } from '@mantine/core'; import { RiServerFill } from 'react-icons/ri'; import { ServerPermissionType } from '@/renderer/api/types'; import { Accordion, Button, Select, Switch, Text, toast, Tooltip, } from '@/renderer/components'; import { useCreateServerPermission, useServerList, useUpdateServerPermission, useCreateServerFolderPermission, useDeleteServerFolderPermission, useDeleteServerPermission, } from '@/renderer/features/servers'; import { ServerPermission, usePermissions } from '@/renderer/features/shared'; import { useUserDetail } from '@/renderer/features/users/queries/get-user-detail'; import { titleCase } from '@/renderer/utils'; interface EditUserPermissionsFormProps { onCancel: () => void; userId: string; } export const PERMISSION_TYPE_OPTIONS = [ { label: 'None', value: '' }, { label: 'Viewer', value: ServerPermissionType.VIEWER }, { label: 'Editor', value: ServerPermissionType.EDITOR }, { label: 'Editor', value: ServerPermissionType.EDITOR }, ]; export const EditUserPermissionsForm = ({ userId, onCancel, }: EditUserPermissionsFormProps) => { const permissions = usePermissions(); const serverListQuery = useServerList(); const userDetailQuery = useUserDetail({ userId }); const createServerPermissionMutation = useCreateServerPermission(); const deleteServerPermissionMutation = useDeleteServerPermission(); const updateServerPermissionMutation = useUpdateServerPermission(); const createServerFolderPermissionMutation = useCreateServerFolderPermission(); const deleteServerFolderPermissionMutation = useDeleteServerFolderPermission(); const permissionTypeOptions = [ { label: 'None', value: 'none' }, { label: 'Viewer', value: ServerPermissionType.VIEWER }, { label: 'Editor', value: ServerPermissionType.EDITOR }, { disabled: !permissions.isAdmin, label: 'Admin', value: ServerPermissionType.ADMIN, }, ]; const userDetailId = userDetailQuery?.data?.data.id; return ( {serverListQuery?.data?.data.map((s) => { const currentServerPermission = userDetailQuery?.data?.data.serverPermissions?.find( (p) => p.serverId === s.id ); const isServerAdminEditingSelf = permissions[s.id] >= ServerPermission.ADMIN && userDetailQuery?.data?.data.id === permissions.userId; const isServerAdminEditingOtherAdmin = !permissions.isAdmin && currentServerPermission?.type === ServerPermissionType.ADMIN; const isPermissionTypeDisabled = isServerAdminEditingSelf || isServerAdminEditingOtherAdmin; const handleChangeServerPermission = async (e: string | null) => { if (!e || !userDetailId) return; if (e === 'none' && currentServerPermission) { deleteServerPermissionMutation.mutate( { query: { permissionId: currentServerPermission.id, serverId: s.id, }, userId: userDetailId, }, { onError: (err) => toast.error({ message: err?.response?.data.error.message, title: 'Error deleting folder permission', }), } ); } else if (currentServerPermission) { updateServerPermissionMutation.mutate( { body: { type: e as ServerPermissionType, }, query: { permissionId: currentServerPermission.id, serverId: s.id, }, userId: userDetailId, }, { onError: (err) => toast.error({ message: err?.response?.data.error.message, title: 'Error updating folder permission', }), } ); } else { createServerPermissionMutation.mutate( { body: { type: e as ServerPermissionType, userId: userDetailId, }, query: { serverId: s.id, }, }, { onError: (err) => toast.error({ message: err?.response?.data.error.message, title: 'Error creating server permission', }), } ); } }; return ( }> {s.name} ({titleCase(s.type)})