'use client';
import { useState } from "react";
import {
Button,
CircularProgress,
Box,
Chip,
IconButton,
Typography,
Stack,
TextField,
InputAdornment,
Tooltip,
} from "@mui/material";
import {
DataGrid,
GridColDef,
GridToolbarContainer,
// Using the new non-deprecated QuickFilter components
QuickFilter,
QuickFilterControl,
} from "@mui/x-data-grid";
import SyncIcon from "@mui/icons-material/Sync";
import RefreshIcon from "@mui/icons-material/Refresh";
import FolderIcon from "@mui/icons-material/Folder";
import InsertDriveFileIcon from "@mui/icons-material/InsertDriveFile";
import DeleteIcon from "@mui/icons-material/Delete";
import EditIcon from "@mui/icons-material/Edit";
import SearchIcon from '@mui/icons-material/Search';
import DownloadIcon from '@mui/icons-material/Download';
import OpenInNewIcon from '@mui/icons-material/OpenInNew';
import { syncOneDrive } from "./sync-actions";
import { deleteFileNodeAction } from "./actions";
import { useRouter } from "next/navigation";
/**
* UPDATED TOOLBAR: Uses the new QuickFilter structure to avoid deprecation
*/
function CustomToolbar() {
return (
Library
(
),
},
}}
/>
)}
/>
);
}
interface DashboardViewProps {
initialFiles: any[];
user?: {
id?: string;
role?: string;
};
}
export default function DashboardView({ initialFiles, user }: DashboardViewProps) {
const [loading, setLoading] = useState(false);
const [isRefreshing, setIsRefreshing] = useState(false);
const router = useRouter();
const isAdmin = user?.role === "ADMIN";
const getVirtualPath = (parentId: string | null): string => {
if (!parentId) return "WebCalibre";
const parent = initialFiles.find((f) => f.id === parentId);
if (!parent) return "WebCalibre";
const prefix = parent.parentId ? `${getVirtualPath(parent.parentId)} / ` : "";
return `${prefix}${parent.name}`;
};
const handleSync = async () => {
setLoading(true);
try {
await syncOneDrive();
router.refresh();
} catch (error) {
console.error("Sync failed:", error);
} finally {
setLoading(false);
}
};
const handleRefresh = () => {
setIsRefreshing(true);
router.refresh();
setTimeout(() => setIsRefreshing(false), 800);
};
const handleDelete = async (id: string, name: string) => {
if (!confirm(`Are you sure you want to delete "${name}"?`)) return;
try {
await deleteFileNodeAction(id);
router.refresh();
} catch (error: any) {
alert(error.message || "Failed to delete file");
}
};
const handleDownload = (id: string) => {
window.location.href = `/api/download?id=${id}&mode=attachment`;
};
const handleViewInTab = (id: string) => {
window.open(`/api/download?id=${id}&mode=inline`, '_blank');
};
const columns: GridColDef[] = [
{
field: "name",
headerName: "Name",
flex: 1.5,
minWidth: 250,
renderCell: (params) => (
{params.row.isFolder ? : }
{params.value}
)
},
{
field: "parentId",
headerName: "Location",
flex: 1,
renderCell: (params) =>
},
{ field: "description", headerName: "Description", flex: 1 },
{
field: "type",
headerName: "Type",
width: 120,
valueGetter: (value, row) => row.metadata?.type || (row.isFolder ? "Folder" : "File"),
renderCell: (params) => (
{params.value}
)
},
{
field: "size",
headerName: "Size",
width: 100,
renderCell: (params) => params.row.isFolder ? "--" : `${(Number(params.value) / 1024 / 1024).toFixed(2)} MB`
},
{
field: "actions",
headerName: "Actions",
width: 180,
align: 'right',
renderCell: (params) => {
const isOwner = params.row.ownerId === user?.id;
const isFolder = params.row.isFolder;
return (
{!isFolder && (
<>
handleViewInTab(params.row.id)}>
handleDownload(params.row.id)}>
>
)}
{(isAdmin || isOwner) && (
<>
router.push(`/update/${params.row.id}`)}
>
handleDelete(params.row.id, params.row.name)}
>
>
)}
);
}
}
];
return (
: }
onClick={handleRefresh}
>
Refresh List
: }
onClick={handleSync}
disabled={loading}
>
Sync OneDrive
);
}