import { useState } from 'react'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { Card, Button, Modal, Stack, Group, Select, TextInput, NumberInput, Table, Badge, Text, Title, Container, } from '@mantine/core'; import { Plus } from 'lucide-react'; import Breadcrumbs from '@/components/ui/Breadcrumbs'; import { useToast } from '@/hooks/use-toast'; import { QUERY_KEYS } from '@/constants/QUERY_KEYS'; import { api } from '@/auth/http'; import { vehiclesService, type Vehicle as VehicleType } from '@/services/vehicles.service'; interface MaintenanceSchedule { id: string; vehicleId: string; maintenanceType: string; description: string; scheduledDate: string; completedDate?: string; status: string; estimatedCost?: number; actualCost?: number; serviceProvider?: string; } const emptyForm = { maintenanceType: 'PREVENTIVE', description: '', scheduledDate: new Date().toISOString().split('T')[0], estimatedCost: 0, serviceProvider: '', notes: '', }; export function MaintenancePage() { const { toast } = useToast(); const queryClient = useQueryClient(); const [selectedVehicle, setSelectedVehicle] = useState(null); const [openScheduleModal, setOpenScheduleModal] = useState(false); const [formData, setFormData] = useState(emptyForm); const { data: vehiclesData } = useQuery({ queryKey: QUERY_KEYS.VEHICLES.list(), queryFn: async () => { const res = await vehiclesService.getAll({ limit: 1000 }); return res.data || []; }, }); const { data: upcoming, isLoading } = useQuery({ queryKey: QUERY_KEYS.MAINTENANCE.upcoming(selectedVehicle || ''), queryFn: async () => { if (!selectedVehicle) return []; const res = await api.get(`/maintenance/upcoming/${selectedVehicle}`); return res.data || []; }, enabled: !!selectedVehicle, }); const upcomingList: MaintenanceSchedule[] = Array.isArray(upcoming) ? upcoming : []; const scheduleMutation = useMutation({ mutationFn: async () => { if (!selectedVehicle) return; const res = await api.post('/maintenance/schedules', { vehicleId: selectedVehicle, ...formData, }); return res.data; }, onSuccess: () => { toast({ title: 'Maintenance scheduled' }); queryClient.invalidateQueries({ queryKey: QUERY_KEYS.MAINTENANCE.upcoming(selectedVehicle || ''), }); setOpenScheduleModal(false); setFormData(emptyForm); }, onError: (err: any) => { toast({ title: 'Error', description: err?.response?.data?.message ?? 'Failed', variant: 'destructive', }); }, }); const vehicleOptions = vehiclesData?.map((v: VehicleType) => ({ value: v.id, label: v.plateNumber ? `${v.plateNumber} - ${v.manufacturer} ${v.model}` : v.registrationNumber || v.id, })) || []; const statusColor = (status: string) => { const colors: Record = { SCHEDULED: 'edr-blue', IN_PROGRESS: 'edr-amber-soft', COMPLETED: 'edr-green', OVERDUE: 'edr-red', }; return colors[status] || 'edr-slate'; }; return ( Maintenance setFormData({ ...formData, maintenanceType: v || 'PREVENTIVE' })} /> setFormData({ ...formData, description: e.currentTarget.value })} /> setFormData({ ...formData, scheduledDate: e.currentTarget.value })} /> setFormData({ ...formData, estimatedCost: Number(v) })} /> setFormData({ ...formData, serviceProvider: e.currentTarget.value })} /> setFormData({ ...formData, notes: e.currentTarget.value })} /> ); }