import { useState, useCallback, useEffect } from "react"; import { X, Save, RotateCcw, Folder } from "lucide-react"; import { useFileBrowser } from "../hooks/useFileBrowser"; import { useFileEditor } from "../hooks/useFileEditor"; import { FileBrowser } from "./FileBrowser"; import { FileEditor } from "./FileEditor"; interface FileBrowserModalProps { taskId: string; worktreePath?: string; isOpen?: boolean; onClose: () => void; } export function FileBrowserModal({ taskId, worktreePath, onClose }: FileBrowserModalProps) { const [selectedFile, setSelectedFile] = useState(null); const { entries, currentPath, setPath, loading: browserLoading, error: browserError, refresh, } = useFileBrowser(taskId, true); const { content, setContent, originalContent, loading: editorLoading, saving, error: editorError, save, hasChanges, mtime, } = useFileEditor(taskId, selectedFile, true); // Keyboard shortcuts useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { if (e.key === "Escape") { onClose(); } if ((e.metaKey || e.ctrlKey) && e.key === "s") { e.preventDefault(); if (hasChanges && !saving) { save(); } } }; document.addEventListener("keydown", handleKeyDown); return () => document.removeEventListener("keydown", handleKeyDown); }, [onClose, hasChanges, saving, save]); const handleSelectFile = useCallback((path: string) => { setSelectedFile(path); }, []); const handleDiscard = useCallback(() => { setContent(originalContent); }, [originalContent, setContent]); const formatFileSize = (content: string): string => { const bytes = new Blob([content]).size; if (bytes < 1024) return `${bytes} B`; return `${(bytes / 1024).toFixed(1)} KB`; }; return (
e.stopPropagation()}>
Files {selectedFile && ( {currentPath === "." ? "" : currentPath + "/"} {selectedFile} )}
{selectedFile ? ( <>
{selectedFile} {mtime && ( Modified: {new Date(mtime).toLocaleString()} )} {editorLoading && ( Loading... )}
{hasChanges && ( <> )}
{editorError && (
{editorError}
)}
{formatFileSize(content)} {hasChanges && Unsaved changes}
) : (

Select a file to edit

)}
); }