/** * 文件剪贴板 Composable(应用内内存态单例) * 复制/剪切 → 粘贴到其他目录;粘贴动作由 index.vue 执行 */ import { ref, computed } from 'vue' import type { FileItem } from '@/types/file-system' export type ClipboardMode = 'copy' | 'cut' interface FileClipboardState { mode: ClipboardMode items: FileItem[] fromDir: string } // 模块级单例状态(跨组件共享) const state = ref(null) export function useFileClipboard() { const clipboard = computed(() => state.value) const clipboardEmpty = computed(() => !state.value || state.value.items.length === 0) /** 设置复制项 */ const setCopy = (items: FileItem[], fromDir: string) => { state.value = { mode: 'copy', items: [...items], fromDir } } /** 设置剪切项 */ const setCut = (items: FileItem[], fromDir: string) => { state.value = { mode: 'cut', items: [...items], fromDir } } /** 清空剪贴板 */ const clear = () => { state.value = null } return { clipboard, clipboardEmpty, setCopy, setCut, clear } }