import React, { useMemo } from 'react'; import { useAuth0 } from '@auth0/auth0-react'; import { useDocumentsList, useDeleteDocument } from '../hooks/useDocuments'; import { Card, CardContent, Box, Typography, IconButton, Button, useTheme, useMediaQuery, } from '@mui/material'; import VisibilityIcon from '@mui/icons-material/Visibility'; import EditIcon from '@mui/icons-material/Edit'; import DeleteIcon from '@mui/icons-material/Delete'; import { useNavigate } from 'react-router-dom'; import { AddDocumentDialog } from '../components/AddDocumentDialog'; import { EditDocumentDialog } from '../components/EditDocumentDialog'; import { ExpirationBadge } from '../components/ExpirationBadge'; import type { DocumentRecord } from '../types/documents.types'; import { DocumentCardMetadata } from '../components/DocumentCardMetadata'; import { useVehicles } from '../../vehicles/hooks/useVehicles'; import { getVehicleLabel } from '../utils/vehicleLabel'; export const DocumentsPage: React.FC = () => { const { isAuthenticated, isLoading: authLoading, loginWithRedirect } = useAuth0(); const { data, isLoading, error } = useDocumentsList(); const { data: vehicles } = useVehicles(); const navigate = useNavigate(); const removeDoc = useDeleteDocument(); const [isAddOpen, setIsAddOpen] = React.useState(false); const [editingDoc, setEditingDoc] = React.useState(null); const theme = useTheme(); const isMobile = useMediaQuery(theme.breakpoints.down('sm')); const vehiclesMap = useMemo(() => new Map(vehicles?.map(v => [v.id, v]) || []), [vehicles]); // Show loading while auth is initializing if (authLoading) { return ( Documents Checking authentication... ); } // Show login prompt when not authenticated if (!isAuthenticated) { return ( Documents Authentication Required Please log in to view your documents ); } // Check for authentication error (401) const isAuthError = error && (error as any).response?.status === 401; if (isAuthError) { return ( Documents Session Expired Your session has expired. Please log in again to continue. ); } return ( Documents setIsAddOpen(false)} /> {editingDoc && ( setEditingDoc(null)} document={editingDoc} /> )} {isLoading && ( Loading documents... )} {error && !isAuthError && ( Error Loading Documents Failed to load documents. Please try again. )} {!isLoading && !error && data && data.length === 0 && ( No Documents Yet You haven't added any documents yet. Documents will appear here once you create them. )} {!isLoading && !error && data && data.length > 0 && ( {data.map((doc) => { const vehicle = vehiclesMap.get(doc.vehicleId); const vehicleLabel = getVehicleLabel(vehicle); return ( {doc.title} Type: {doc.documentType} Vehicle: navigate(`/garage/vehicles/${doc.vehicleId}`)} sx={{ color: 'primary.main', textDecoration: 'underline', cursor: 'pointer', background: 'none', border: 'none', p: 0, minHeight: 44, display: 'inline-flex', alignItems: 'center', '&:hover': { color: 'primary.dark' }, }} > {vehicleLabel} {doc.sharedVehicleIds.length > 0 && ( Shared with {doc.sharedVehicleIds.length} other vehicle{doc.sharedVehicleIds.length > 1 ? 's' : ''} )} navigate(`/garage/documents/${doc.id}`)} sx={{ color: 'text.secondary', minWidth: isMobile ? 48 : 'auto', minHeight: isMobile ? 48 : 'auto', }} title="View Details" > setEditingDoc(doc)} sx={{ color: 'text.secondary', minWidth: isMobile ? 48 : 'auto', minHeight: isMobile ? 48 : 'auto', }} title="Edit" > removeDoc.mutate(doc.id)} sx={{ color: 'error.main', minWidth: isMobile ? 48 : 'auto', minHeight: isMobile ? 48 : 'auto', }} title="Delete" > ); })} )} ); }; export default DocumentsPage;