import { useCallback, useState } from 'react' import { Link, useParams } from 'react-router-dom' import { Button, Table, Thead, Tbody, Tr, Th, Td, IconButton, Badge, Avatar, } from '@chakra-ui/react' import { KeyedMutator, useSWRConfig } from 'swr' import { Select } from 'chakra-react-select' import cx from 'classnames' import FileAPI, { GroupPermission, List } from '@/client/api/file' import { Group } from '@/client/api/group' import { geEditorPermission } from '@/client/api/permission' import WorkspaceAPI from '@/client/api/workspace' import GroupSelector from '@/components/common/group-selector' import useFileListSearchParams from '@/hooks/use-file-list-params' import { Spinner, Text } from '@/lib' import { IconAdd, IconCheck, IconDelete } from '@/lib' import { useAppDispatch, useAppSelector } from '@/store/hook' import { sharingModalDidClose } from '@/store/ui/files' import reactSelectStyles from '@/styles/react-select' import SharingFormSkeleton from './sharing-form-skeleton' export type SharingGroupsProps = { groups?: Group[] permissions?: GroupPermission[] mutateGroupPermissions: KeyedMutator } const SharingGroups = ({ groups, permissions, mutateGroupPermissions, }: SharingGroupsProps) => { const { mutate } = useSWRConfig() const { id, fileId } = useParams() const dispatch = useAppDispatch() const { data: workspace } = WorkspaceAPI.useGetById(id) const selection = useAppSelector((state) => state.ui.files.selection) const [isGrantLoading, setIsGrantLoading] = useState(false) const [permissionBeingRevoked, setPermissionBeingRevoked] = useState() const [activeGroup, setActiveGroup] = useState() const [activePermission, setActivePermission] = useState() const fileListSearchParams = useFileListSearchParams() const isSingleSelection = selection.length === 1 const handleGrantGroupPermission = useCallback(async () => { if (activeGroup && activePermission) { try { setIsGrantLoading(true) await FileAPI.grantGroupPermission({ ids: selection, groupId: activeGroup.id, permission: activePermission, }) await mutate(`/files/${fileId}/list?${fileListSearchParams}`) if (isSingleSelection) { await mutateGroupPermissions() } setActiveGroup(undefined) setIsGrantLoading(false) if (!isSingleSelection) { dispatch(sharingModalDidClose()) } } catch { setIsGrantLoading(false) } } }, [ fileId, selection, activeGroup, activePermission, isSingleSelection, fileListSearchParams, mutate, dispatch, mutateGroupPermissions, ]) const handleRevokeGroupPermission = useCallback( async (permission: GroupPermission) => { try { setPermissionBeingRevoked(permission.id) await FileAPI.revokeGroupPermission({ ids: selection, groupId: permission.group.id, }) await mutate(`/files/${fileId}/list?${fileListSearchParams}`) if (isSingleSelection) { await mutateGroupPermissions() } } finally { setPermissionBeingRevoked(undefined) } }, [ fileId, selection, isSingleSelection, fileListSearchParams, mutate, mutateGroupPermissions, ], ) return (
{!groups ? : null} {groups && groups.length > 0 ? (
setActiveGroup(value)} />