import { useState, useEffect } from "react"; import { Link } from "wouter"; import { Button } from "@/components/ui/button"; import { Card } from "@/components/ui/card"; import { ArrowLeft, FileText, Folder, Plus, Trash2, Download, Copy, Loader2 } from "lucide-react"; import { supabase } from "@/lib/supabase"; import { useAuth } from "@/lib/auth"; import { nanoid } from "nanoid"; interface FileItem { id: string; user_id: string; name: string; type: "file" | "folder"; path: string; size?: number; modified: string; language?: string; is_folder?: boolean; created_at?: Date; } export default function FileManager() { const { user } = useAuth(); const [currentPath, setCurrentPath] = useState("/root"); const [files, setFiles] = useState([]); const [selectedFile, setSelectedFile] = useState(null); const [loading, setLoading] = useState(true); useEffect(() => { if (user?.id) fetchFiles(); }, [user, currentPath]); const fetchFiles = async () => { try { const { data, error } = await supabase .from('files') .select('*') .eq('user_id', user?.id) .eq('path', currentPath) .order('created_at', { ascending: false }); if (!error && data) { setFiles(data.map(f => ({ ...f, type: f.is_folder ? 'folder' : 'file', modified: new Date(f.created_at).toLocaleDateString() }))); } } catch (err) { console.error('Error fetching files:', err); } finally { setLoading(false); } }; const formatFileSize = (bytes?: number) => { if (!bytes) return "-"; if (bytes < 1024) return `${bytes}B`; if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`; return `${(bytes / (1024 * 1024)).toFixed(1)}MB`; }; const deleteFile = async (id: string) => { try { await supabase.from('files').delete().eq('id', id); setFiles(files.filter((f) => f.id !== id)); if (selectedFile?.id === id) setSelectedFile(null); } catch (err) { console.error('Error deleting file:', err); } }; return (
{/* Header */}

File Manager

{/* File List */}
{/* Breadcrumb */}
{currentPath.split("/").map( (part, idx) => part && (
/
) )}
{/* File Table */}
{files.map((file) => (
setSelectedFile(file)} className={`p-4 rounded-lg border transition-colors cursor-pointer ${ selectedFile?.id === file.id ? "bg-slate-700 border-cyan-500" : "bg-slate-800 border-slate-700 hover:bg-slate-700" }`} >
{file.type === "folder" ? ( ) : ( )}

{file.name}

{file.type === "file" && file.language && ( <> {file.language.toUpperCase()} •{" "} )} {formatFileSize(file.size)} • {file.modified}

))}
{/* File Preview */} {selectedFile && selectedFile.type === "file" && (
{/* File Info */}

{selectedFile.name}

Size: {formatFileSize(selectedFile.size)}

Modified: {selectedFile.modified}

{selectedFile.language && (

Language: {selectedFile.language.toUpperCase()}

)}
{/* Actions */}
{/* Preview */}
{"import { Create, Delete, Upload } from 'fs';"}
// Sample file content preview
{"export function createFile(path: string) {"}
// Implementation here
{"}"}
)}
); }