'use client'; import { useState } from 'react'; import { Grid, List, Upload } from 'lucide-react'; import { useQueryClient } from '@tanstack/react-query'; import { Button } from '@/components/ui/button'; import { PageHeader } from '@/components/shared/page-header'; import { PermissionGate } from '@/components/shared/permission-gate'; import { FileGrid } from '@/components/files/file-grid'; import { FolderTree } from '@/components/files/folder-tree'; import { FileUploadZone } from '@/components/files/file-upload-zone'; import { FilePreviewDialog } from '@/components/files/file-preview-dialog'; import { usePaginatedQuery } from '@/hooks/use-paginated-query'; import { useRealtimeInvalidation } from '@/hooks/use-realtime-invalidation'; import { useFileBrowserStore } from '@/stores/file-browser-store'; import { apiFetch } from '@/lib/api/client'; import type { FileRow } from '@/components/files/file-grid'; export default function DocumentsPage() { const queryClient = useQueryClient(); const { viewMode, setViewMode, currentFolder, setCurrentFolder } = useFileBrowserStore(); const [showUpload, setShowUpload] = useState(false); const [previewFile, setPreviewFile] = useState(null); const [, setRenameFile] = useState(null); const { data, isLoading } = usePaginatedQuery({ queryKey: ['files'], endpoint: '/api/v1/files', filterDefinitions: [], }); useRealtimeInvalidation({ 'file:uploaded': [['files']], 'file:updated': [['files']], 'file:deleted': [['files']], }); const filesInFolder = currentFolder ? data.filter((f) => f.storagePath?.includes(currentFolder)) : data; const handleDownload = async (file: FileRow) => { try { const res = await apiFetch<{ data: { url: string; filename: string } }>( `/api/v1/files/${file.id}/download`, ); const a = document.createElement('a'); a.href = res.data.url; a.download = res.data.filename; a.click(); } catch { // silent } }; const handleDelete = async (file: FileRow) => { if (!confirm(`Delete "${file.filename}"? This cannot be undone.`)) return; try { await apiFetch(`/api/v1/files/${file.id}`, { method: 'DELETE' }); queryClient.invalidateQueries({ queryKey: ['files'] }); } catch { // silent } }; return (
} /> {showUpload && ( { queryClient.invalidateQueries({ queryKey: ['files'] }); setShowUpload(false); }} /> )}
{/* Folder tree sidebar */} {/* Main content */}
!open && setPreviewFile(null)} fileId={previewFile?.id} fileName={previewFile?.filename} mimeType={previewFile?.mimeType ?? undefined} /> ); }