import { api } from "@convex/_generated/api" import type { DirectoryItem } from "@convex/model/directories" import type { ColumnDef, Row } from "@tanstack/react-table" import { useQuery } from "convex/react" import { TextCursorInputIcon, TrashIcon } from "lucide-react" import { useState } from "react" import { DirectoryIcon } from "@/components/icons/directory-icon" import { Checkbox } from "@/components/ui/checkbox" import { ContextMenu, ContextMenuContent, ContextMenuItem, ContextMenuTrigger, } from "@/components/ui/context-menu" import { DataTable } from "@/components/ui/data-table" function formatFileSize(bytes: number): string { if (bytes === 0) return "0 B" const k = 1024 const sizes = ["B", "KB", "MB", "GB", "TB", "PB"] const i = Math.floor(Math.log(bytes) / Math.log(k)) return `${parseFloat((bytes / k ** i).toFixed(2))} ${sizes[i]}` } const columns: ColumnDef[] = [ { id: "select", header: ({ table }) => ( table.toggleAllPageRowsSelected(!!value) } aria-label="Select all" /> ), cell: ({ row }) => ( row.toggleSelected(!!value)} aria-label="Select row" /> ), enableSorting: false, enableHiding: false, }, { header: "Name", accessorKey: "doc.name", cell: ({ row }) => { switch (row.original.kind) { case "file": return case "directory": return (
{row.original.doc.name}
) } }, }, { header: "Size", accessorKey: "size", cell: ({ row }) => { switch (row.original.kind) { case "file": return
{formatFileSize(row.original.doc.size)}
case "directory": return
-
} }, }, { header: "Created At", accessorKey: "createdAt", cell: ({ row }) => { return (
{new Date(row.original.doc.createdAt).toLocaleString()}
) }, }, ] export function FileTable() { const directory = useQuery(api.files.fetchDirectoryContent, {}) const [selectedItem, setSelectedItem] = useState(null) if (!directory) { return null } const handleRename = () => { if (selectedItem) { console.log("Renaming:", selectedItem.doc.name) // TODO: Implement rename functionality } } const handleDelete = () => { if (selectedItem) { console.log("Deleting:", selectedItem.doc.name) // TODO: Implement delete functionality } } const handleRowContextMenu = (row: Row) => { setSelectedItem(row.original) } return (
Rename Move to trash
) } function FileNameCell({ initialName }: { initialName: string }) { return
{initialName}
}