import React, { useState, useMemo } from 'react'; import { useLanguage } from '@/contexts/LanguageContext'; import { Table, TableHeader, TableBody, TableRow, TableHead, TableCell } from '@/components/ui/table'; import { Badge } from '@/components/ui/badge'; import { format } from 'date-fns'; import { MaintenanceStatusDropdown } from './MaintenanceStatusDropdown'; import { MaintenanceActionsMenu } from './MaintenanceActionsMenu'; import { MaintenanceDetailDialog } from './detail-dialog/MaintenanceDetailDialog'; import { MaintenanceItem } from '@/services/types/maintenance.types'; import { Skeleton } from '@/components/ui/skeleton'; import { EmptyMaintenanceState } from './EmptyMaintenanceState'; interface MaintenanceTableProps { data: MaintenanceItem[]; isLoading?: boolean; onMaintenanceUpdated: () => void; } export const MaintenanceTable = ({ data, isLoading = false, onMaintenanceUpdated }: MaintenanceTableProps) => { const { t } = useLanguage(); const [selectedMaintenance, setSelectedMaintenance] = useState(null); const [detailDialogOpen, setDetailDialogOpen] = useState(false); // Memoize the formatted date function to avoid recreating it on each render const formatDate = useMemo(() => (dateString: string) => { if (!dateString) return '-'; try { return format(new Date(dateString), 'MMM d, yyyy HH:mm'); } catch (error) { return dateString || '-'; } }, []); const handleViewMaintenance = (maintenance: MaintenanceItem) => { setSelectedMaintenance(maintenance); setDetailDialogOpen(true); }; if (isLoading) { // Render skeleton loading state with table structure for smoother transitions return ( {t('title')} {t('status')} {t('scheduledStart')} {t('scheduledEnd')} {t('affectedServices')} {t('impact')} {t('actions')} {[1, 2, 3].map(i => ( ))}
); } if (!data || data.length === 0) { return ; } // Memoize the impact badge variant calculation const getImpactBadgeVariant = (field: string | undefined) => { const fieldLower = field?.toLowerCase() || ''; if (fieldLower === 'critical') return 'destructive'; if (fieldLower === 'major') return 'default'; if (fieldLower === 'minor') return 'secondary'; return 'outline'; }; return ( <> {t('title')} {t('status')} {t('scheduledStart')} {t('scheduledEnd')} {t('affectedServices')} {t('impact')} {t('actions')} {data.map((item) => ( handleViewMaintenance(item)}> {item.title || '-'} e.stopPropagation()}> handleViewMaintenance(item)}> {formatDate(item.start_time)} handleViewMaintenance(item)}> {formatDate(item.end_time)} handleViewMaintenance(item)}>
{item.affected ? item.affected.split(',').slice(0, 2).map((service, index) => ( {service.trim()} )) : '-'} {item.affected && item.affected.split(',').length > 2 && ( +{item.affected.split(',').length - 2} )}
handleViewMaintenance(item)}> {item.field ? t(item.field.toLowerCase()) : '-'} e.stopPropagation()}>
))}
); };