import { useState, useMemo } from 'react'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { Card, Button, Modal, Stack, Group, Grid, Select, TextInput, NumberInput, Table, Badge, Text, Container } from '@mantine/core'; import { DateInput } from '@mantine/dates'; import { Plus } from 'lucide-react'; import { QUERY_KEYS } from '@/constants/QUERY_KEYS'; import { api } from '@/services/api'; import { vehiclesService } from '@/services/vehicles.service'; import { freightBrand } from '@/theme/freight-brand'; interface MaintenanceSchedule { id: string; vehicleId: string; maintenanceType: string; description: string; scheduledDate: string; completedDate?: string; status: string; estimatedCost?: number; actualCost?: number; serviceProvider?: string; } export function MaintenancePage() { const [selectedVehicle, setSelectedVehicle] = useState(null); const [openScheduleModal, setOpenScheduleModal] = useState(false); const [formData, setFormData] = useState({ maintenanceType: 'PREVENTIVE', description: '', scheduledDate: new Date(), estimatedCost: 0, serviceProvider: '', notes: '', }); const queryClient = useQueryClient(); const { data: vehicles } = 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: () => selectedVehicle ? api.get(`/maintenance/upcoming/${selectedVehicle}`) : Promise.resolve([]), enabled: !!selectedVehicle, }); const scheduleMutation = useMutation({ mutationFn: async () => { if (!selectedVehicle) return; return api.post('/maintenance/schedules', { vehicleId: selectedVehicle, ...formData, }); }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: QUERY_KEYS.MAINTENANCE.upcoming(selectedVehicle || '') }); setOpenScheduleModal(false); setFormData({ maintenanceType: 'PREVENTIVE', description: '', scheduledDate: new Date(), estimatedCost: 0, serviceProvider: '', notes: '', }); }, }); const vehicleOptions = useMemo( () => vehicles?.map(v => ({ label: v.registrationNumber || v.id, value: v.id })) || [], [vehicles] ); 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 ( Schedule Maintenance setFormData({ ...formData, maintenanceType: v || 'PREVENTIVE' })} /> setFormData({ ...formData, description: e.currentTarget.value })} /> setFormData({ ...formData, scheduledDate: d || new Date() })} /> setFormData({ ...formData, estimatedCost: Number(v) })} /> setFormData({ ...formData, serviceProvider: e.currentTarget.value })} /> setFormData({ ...formData, notes: e.currentTarget.value })} /> ); }