import { Copy, Scissors } from '@phosphor-icons/react'; import { useLibraryMutation } from '@sd/client'; import { ContextMenu, ModifierKeys, toast } from '@sd/ui'; import { useKeybindFactory } from '~/hooks/useKeybindFactory'; import { isNonEmpty } from '~/util'; import { useExplorerContext } from '../../Context'; import { getExplorerStore } from '../../store'; import { useExplorerSearchParams } from '../../util'; import { ConditionalItem } from '../ConditionalItem'; import { useContextMenuContext } from '../context'; export const CutCopyItems = new ConditionalItem({ useCondition: () => { const { parent } = useExplorerContext(); const { selectedFilePaths } = useContextMenuContext(); if (parent?.type !== 'Location' || !isNonEmpty(selectedFilePaths)) return null; return { locationId: parent.location.id, selectedFilePaths }; }, Component: ({ locationId, selectedFilePaths }) => { const keybind = useKeybindFactory(); const [{ path }] = useExplorerSearchParams(); const copyFiles = useLibraryMutation('files.copyFiles'); return ( <> { getExplorerStore().cutCopyState = { sourceParentPath: path ?? '/', sourceLocationId: locationId, sourcePathIds: selectedFilePaths.map((p) => p.id), type: 'Cut' }; }} icon={Scissors} /> { getExplorerStore().cutCopyState = { sourceParentPath: path ?? '/', sourceLocationId: locationId, sourcePathIds: selectedFilePaths.map((p) => p.id), type: 'Copy' }; }} icon={Copy} /> { try { await copyFiles.mutateAsync({ source_location_id: locationId, sources_file_path_ids: selectedFilePaths.map((p) => p.id), target_location_id: locationId, target_location_relative_directory_path: path ?? '/', target_file_name_suffix: ' copy' }); } catch (error) { toast.error({ title: 'Failed to duplicate file', body: `Error: ${error}.` }); } }} /> ); } });