'use client'; import { useEffect, useState } from 'react'; import { useParams, useRouter } from 'next/navigation'; import Link from 'next/link'; import Image from 'next/image'; interface JobAction { id: number; action_type: string; part_type: string | null; part_id: string | null; custom_price: number; labour_fee: number; created_at: string; } interface Vehicle { id: string; make: string; model: string; capacity: number | null; yom: number | null; owner: number | null; } interface ServiceRecord { id: number; created_at: string; vehicle: string; metadata: string | null; status: number; Vehicles?: Vehicle; } export default function VehicleStatusPage() { const router = useRouter(); const params = useParams(); const vehicleId = params?.vehicleId as string; const [serviceRecords, setServiceRecords] = useState([]); const [loading, setLoading] = useState(true); const [selectedRecord, setSelectedRecord] = useState(null); const [jobActions, setJobActions] = useState([]); const [loadingActions, setLoadingActions] = useState(false); useEffect(() => { if (vehicleId) { loadServiceRecords(); } }, [vehicleId]); // Close modal when clicking outside or pressing Escape useEffect(() => { const handleEscape = (event: KeyboardEvent) => { if (event.key === 'Escape' && selectedRecord) { setSelectedRecord(null); setJobActions([]); } }; if (selectedRecord) { document.addEventListener('keydown', handleEscape); } return () => { document.removeEventListener('keydown', handleEscape); }; }, [selectedRecord]); const loadServiceRecords = async () => { try { setLoading(true); const response = await fetch(`/api/vehicle/${encodeURIComponent(vehicleId)}/records`); if (response.ok) { const data = await response.json(); setServiceRecords(data); } else { console.error('Failed to load service records'); } } catch (error) { console.error('Error loading service records:', error); } finally { setLoading(false); } }; const getStatusLabel = (status: number) => { switch (status) { case 0: return 'Pending'; case 1: return 'Active'; case 2: return 'Waiting for Customer Response'; case 3: return 'Waiting for Parts'; case 10: return 'Completed'; default: return 'Unknown'; } }; const getStatusColor = (status: number) => { switch (status) { case 0: return 'text-white/60'; case 1: return 'text-cyan-400'; case 2: return 'text-yellow-400'; case 3: return 'text-orange-400'; case 10: return 'text-green-400'; default: return 'text-white/60'; } }; const handleShowDetails = async (record: ServiceRecord) => { setSelectedRecord(record); setLoadingActions(true); try { const response = await fetch(`/api/vehicle/${encodeURIComponent(vehicleId)}/actions/${record.id}`); if (response.ok) { const data = await response.json(); setJobActions(data); } else { console.error('Failed to load job actions'); setJobActions([]); } } catch (error) { console.error('Error loading job actions:', error); setJobActions([]); } finally { setLoadingActions(false); } }; const vehicle = serviceRecords[0]?.Vehicles; return (
{/* Animated background elements */}

Service Status

← Back to Home
{/* Vehicle Info */} {vehicle && (
{vehicle.id}
{vehicle.make} {vehicle.model} {vehicle.capacity && ` (${vehicle.capacity}cc)`} {vehicle.yom && ` - ${vehicle.yom}`}
)} {/* Service Records List */} {loading ? (

Loading Service Records...

) : serviceRecords.length === 0 ? (

No service records found for vehicle {vehicleId}

) : (
{serviceRecords.map((record) => (
Service Record ID
#{record.id}
Status
{getStatusLabel(record.status)}
Created At
{new Date(record.created_at).toLocaleString()}
{record.metadata && (
Notes
{record.metadata}
)}
Record ID: {record.id}
))}
)} {!loading && serviceRecords.length > 0 && (

{serviceRecords.length} service record{serviceRecords.length !== 1 ? 's' : ''} found

)}
{/* Details Modal */} {selectedRecord && (
{ setSelectedRecord(null); setJobActions([]); }} >
e.stopPropagation()} >

Service Record Details

{/* Service Record Details */}
Service Record ID
#{selectedRecord.id}
Status
{getStatusLabel(selectedRecord.status)}
Vehicle Number
{selectedRecord.Vehicles?.id || 'N/A'}
{selectedRecord.Vehicles?.make || 'N/A'} {selectedRecord.Vehicles?.model || ''} {selectedRecord.Vehicles?.capacity && ` (${selectedRecord.Vehicles.capacity}cc)`}
Created At
{new Date(selectedRecord.created_at).toLocaleString()}
{selectedRecord.metadata && (
Notes
{selectedRecord.metadata}
)}
{/* Job Actions List */}

Job Actions

{jobActions.length} action{jobActions.length !== 1 ? 's' : ''}
{loadingActions ? (

Loading Actions...

) : jobActions.length === 0 ? (

No job actions found

) : (
{jobActions.map((action) => (
Action Type
{action.action_type}
Created At
{new Date(action.created_at).toLocaleString()}
{action.part_type && (
Part Type
{action.part_type}
)} {action.part_id && (
Part ID
{action.part_id}
)} {action.labour_fee > 0 && (
Labour Fee
₹{action.labour_fee}
)} {action.custom_price > 0 && action.custom_price !== -1 && (
Custom Price
₹{action.custom_price}
)}
Action ID: {action.id}
))}
)}
)}
); }