import { useState } from "react"; import { useQuery } from "@tanstack/react-query"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { apiRequest } from "@/lib/queryClient"; import { Folder, FolderOpen, ChevronLeft, Loader2 } from "lucide-react"; interface BrowseResult { current: string; parent: string | null; dirs: { name: string; path: string }[]; } interface FolderBrowserModalProps { open: boolean; onClose: () => void; onSelect: (path: string) => void; } export function FolderBrowserModal({ open, onClose, onSelect }: FolderBrowserModalProps) { const [browsePath, setBrowsePath] = useState("/"); const [selected, setSelected] = useState("/"); const { data, isLoading, isError } = useQuery({ queryKey: ["/db/browse", browsePath], queryFn: async () => { const res = await apiRequest( "GET", `/api/database-management/browse?path=${encodeURIComponent(browsePath)}` ); if (!res.ok) throw new Error((await res.json()).error); return res.json(); }, enabled: open, }); const handleNavigate = (path: string) => { setSelected(path); setBrowsePath(path); }; const handleConfirm = () => { onSelect(selected); onClose(); }; return ( !o && onClose()}> Select Folder {/* Current path breadcrumb */}
{data?.current ?? browsePath}
{/* Back button */} {data?.parent && ( )} {/* Directory list */}
{isLoading && (
Loading...
)} {isError && (

Cannot read this directory.

)} {!isLoading && !isError && data?.dirs.length === 0 && (

No sub-folders here.

)} {!isLoading && !isError && data?.dirs.map((dir) => ( ))}

Single-click to select ยท Double-click to open

); }