From 9431d0459f6c131446deb99eb238af5619e74e1f Mon Sep 17 00:00:00 2001 From: shiyu Date: Fri, 29 Aug 2025 13:00:24 +0800 Subject: [PATCH] refactor: Remove unused props from GridView component and clean up related code --- .../FileExplorerPage/FileExplorerPage.tsx | 2 - .../FileExplorerPage/components/GridView.tsx | 47 +++++++------------ 2 files changed, 17 insertions(+), 32 deletions(-) diff --git a/web/src/pages/FileExplorerPage/FileExplorerPage.tsx b/web/src/pages/FileExplorerPage/FileExplorerPage.tsx index af8addf..f4d52e4 100644 --- a/web/src/pages/FileExplorerPage/FileExplorerPage.tsx +++ b/web/src/pages/FileExplorerPage/FileExplorerPage.tsx @@ -121,8 +121,6 @@ const FileExplorerPage = memo(function FileExplorerPage() { onSelectRange={handleSelectRange} onOpen={handleOpenEntry} onContextMenu={openContextMenu} - onCreateDir={() => setCreatingDir(true)} - onGoUp={goUp} /> ) : ( ; - // ...existing code... - // selected was single entry before; now use selectedEntries for multi-select + thumbs: Record; selectedEntries: string[]; loading: boolean; path: string; - // onSelect: clicked entry, additive indicates Ctrl/Cmd click to toggle onSelect: (e: VfsEntry, additive?: boolean) => void; - // onSelectRange: called when marquee/selecting multiple by box onSelectRange: (names: string[]) => void; onOpen: (e: VfsEntry) => void; onContextMenu: (e: React.MouseEvent, entry: VfsEntry) => void; - onCreateDir: () => void; - onGoUp: () => void; } const formatSize = (size: number) => { @@ -30,14 +24,12 @@ const formatSize = (size: number) => { return (size / 1024 / 1024 / 1024).toFixed(1) + ' GB'; }; -export const GridView: React.FC = ({ entries, thumbs, selectedEntries, loading, path, onSelect, onSelectRange, onOpen, onContextMenu, onCreateDir, onGoUp }) => { +export const GridView: React.FC = ({ entries, thumbs, selectedEntries, loading, path, onSelect, onSelectRange, onOpen, onContextMenu }) => { const { token } = theme.useToken(); - - // refs for marquee selection const containerRef = useRef(null); const itemRefs = useRef>({}); - const startRef = useRef<{x:number,y:number} | null>(null); - const [rect, setRect] = useState<{left:number,top:number,width:number,height:number} | null>(null); + const startRef = useRef<{ x: number, y: number } | null>(null); + const [rect, setRect] = useState<{ left: number, top: number, width: number, height: number } | null>(null); const [selecting, setSelecting] = useState(false); useEffect(() => { @@ -52,12 +44,11 @@ export const GridView: React.FC = ({ entries, thumbs, selectedEntries, lo const height = Math.abs(cy - s.y); setRect({ left, top, width, height }); }; - const onUp = () => { // 不需要 MouseEvent 参数,避免未使用警告 + const onUp = () => { if (!startRef.current) return; setSelecting(false); const r = rect; if (r) { - // compute intersecting items const container = containerRef.current; if (container) { const sel: string[] = []; @@ -89,17 +80,14 @@ export const GridView: React.FC = ({ entries, thumbs, selectedEntries, lo }, [selecting, rect, entries, onSelectRange]); const handleMouseDown = (e: React.MouseEvent) => { - // only left button and not on an item actionable element if (e.button !== 0) return; - // start marquee if click on empty space inside container const target = e.target as HTMLElement; if (target.closest('.fx-grid-item')) { - return; // clicks on item handled separately + return; } startRef.current = { x: e.clientX, y: e.clientY }; setSelecting(true); setRect({ left: e.clientX, top: e.clientY, width: 0, height: 0 }); - // prevent text selection e.preventDefault(); }; @@ -108,29 +96,28 @@ export const GridView: React.FC = ({ entries, thumbs, selectedEntries, lo {entries.map(ent => { const isImg = thumbs[ent.name]; const ext = ent.name.split('.').pop()?.toLowerCase(); - const isPictureType = ['png','jpg','jpeg','gif','webp','svg'].includes(ext || ''); + const isPictureType = ['png', 'jpg', 'jpeg', 'gif', 'webp', 'svg'].includes(ext || ''); const isSelected = selectedEntries.includes(ent.name); return (
{ itemRefs.current[ent.name] = el; }} // 确保函数不返回值,匹配 Ref 类型 - className={['fx-grid-item', isSelected ? 'selected' : '', ent.is_dir? 'dir':'file'].join(' ')} + ref={(el) => { itemRefs.current[ent.name] = el; }} + className={['fx-grid-item', isSelected ? 'selected' : '', ent.is_dir ? 'dir' : 'file'].join(' ')} onClick={(ev) => { - // click selection: support ctrl/cmd to toggle const additive = ev.ctrlKey || ev.metaKey; onSelect(ent, additive); }} onDoubleClick={() => onOpen(ent)} - onContextMenu={(e)=> onContextMenu(e, ent)} - style={{ userSelect:'none' }} + onContextMenu={(e) => onContextMenu(e, ent)} + style={{ userSelect: 'none' }} >
- {ent.is_dir && } - {!ent.is_dir && (isImg ? {ent.name} : isPictureType ? : getFileIcon(ent.name,32))} + {ent.is_dir && } + {!ent.is_dir && (isImg ? {ent.name} : isPictureType ? : getFileIcon(ent.name, 32))} {ent.type === 'mount' && M}
-
{ent.name}
-
{ent.is_dir ? '目录' : formatSize(ent.size)}
+
{ent.name}
+
{ent.is_dir ? '目录' : formatSize(ent.size)}
) })} @@ -148,8 +135,8 @@ export const GridView: React.FC = ({ entries, thumbs, selectedEntries, lo }} /> )} - {loading &&
} - {!loading && entries.length === 0 && } + {loading &&
} + {!loading && entries.length === 0 && } ); };