in frontend/apps/quantgrid/src/app/components/Dashboard/DashboardFileList/FileListItemMenu.tsx [45:250]
export function FileListItemMenu({
item,
isFolder,
trigger,
children,
className,
}: PropsWithChildren<Props>) {
const { userBucket, isAdmin } = useContext(ApiContext);
const { refetchData } = useContext(DashboardContext);
const { shareResources } = useContext(ProjectContext);
const { downloadFiles } = useApiRequests();
const { deleteResources } = useDeleteResources();
const { cloneResources } = useCloneResources();
const { moveResources } = useMoveResources();
const { revokeResourceAccess } = useDashboardRevokeAccessResource();
const { discardResourceAccess } = useDashboardDiscardAccessResource();
const [renameModalOpen, setRenameModalOpen] = useState(false);
const [selectFolderModalOpen, setSelectFolderModalOpen] = useState(false);
const isAbleToEdit =
item.bucket === userBucket || (item.bucket === publicBucket && isAdmin);
const isAbleToShare = item.bucket === userBucket;
const isSharedWithMe =
item.bucket !== userBucket && item.bucket !== publicBucket;
const handleMoveToFolder = useCallback(
async (path: string | null | undefined, bucket: string) => {
setSelectFolderModalOpen(false);
await moveResources([item], path, bucket, () => refetchData());
},
[item, moveResources, refetchData]
);
const contextMenuItems: MenuProps['items'] = useMemo(
() =>
[
!isFolder
? getDropdownItem({
key: 'download',
label: 'Download',
icon: (
<Icon
className="text-textSecondary w-[18px]"
component={() => <DownloadIcon />}
/>
),
onClick: async () => {
toast.loading(`Downloading file '${item.name}'...`);
const result = await downloadFiles({
files: [
{
bucket: item.bucket,
name: item.name,
path: item.parentPath,
},
],
});
toast.dismiss();
if (!result) {
toast.error('Error happened during downloading file');
}
},
})
: undefined,
!isFolder && isAbleToEdit
? getDropdownItem({
key: 'rename',
label: 'Rename',
icon: (
<Icon
className="stroke-textSecondary w-[18px]"
component={() => <EditIcon />}
/>
),
onClick: () => {
setRenameModalOpen(true);
},
})
: undefined,
!isFolder && isAbleToEdit
? getDropdownItem({
key: 'clone',
label: 'Clone',
icon: (
<Icon
className="text-textSecondary w-[18px]"
component={() => <CopyIcon />}
/>
),
onClick: async () => {
await cloneResources({
items: [item],
});
refetchData();
},
})
: undefined,
isAbleToEdit
? getDropdownItem({
key: 'moveTo',
label: 'Move to',
icon: (
<Icon
className="text-textSecondary w-[18px]"
component={() => <MoveToIcon />}
/>
),
onClick: () => {
setSelectFolderModalOpen(true);
},
})
: undefined,
isAbleToShare
? getDropdownItem({
key: 'share',
label: 'Share',
icon: (
<Icon
className="text-textSecondary w-[18px]"
component={() => <ShareIcon />}
/>
),
onClick: () => shareResources([item]),
})
: undefined,
item.isSharedByMe
? getDropdownItem({
key: 'unshare',
label: 'Unshare',
icon: (
<Icon
className="text-textSecondary w-[18px]"
component={() => <UnshareIcon />}
/>
),
onClick: async () => {
revokeResourceAccess(
{
name: item.name,
bucket: item.bucket,
parentPath: item.parentPath,
nodeType: item.nodeType,
},
() => refetchData()
);
},
})
: undefined,
isSharedWithMe
? getDropdownItem({
key: 'discard',
label: 'Discard access',
icon: (
<Icon
className="text-textSecondary w-[18px]"
component={() => <TrashIcon />}
/>
),
onClick: async () => {
discardResourceAccess(
{
name: item.name,
bucket: item.bucket,
parentPath: item.parentPath,
nodeType: item.nodeType,
},
() => refetchData()
);
},
})
: undefined,
isAbleToEdit
? getDropdownItem({
key: 'delete',
label: 'Delete',
icon: (
<Icon
className="text-textSecondary w-[18px]"
component={() => <TrashIcon />}
/>
),
onClick: () => {
deleteResources([item], () => refetchData());
},
})
: undefined,
].filter(Boolean) as MenuProps['items'],
[
isFolder,
isAbleToEdit,
isAbleToShare,
item,
isSharedWithMe,
downloadFiles,
cloneResources,
refetchData,
shareResources,
revokeResourceAccess,
discardResourceAccess,
deleteResources,
]
);
return (
<div className={className} onClick={(e) => e.stopPropagation()}>