From 66167e8ac5c02de4926037514246961ce3269b71 Mon Sep 17 00:00:00 2001 From: natib21 Date: Tue, 7 Jul 2026 07:55:15 +0000 Subject: [PATCH] fix --- .../src/pages/fleet/TrackingPage.tsx | 73 ++++++++++++++----- 1 file changed, 54 insertions(+), 19 deletions(-) diff --git a/apps/edr-freight-web/backoffice/src/pages/fleet/TrackingPage.tsx b/apps/edr-freight-web/backoffice/src/pages/fleet/TrackingPage.tsx index a70a75bbf..78039cb7d 100644 --- a/apps/edr-freight-web/backoffice/src/pages/fleet/TrackingPage.tsx +++ b/apps/edr-freight-web/backoffice/src/pages/fleet/TrackingPage.tsx @@ -23,7 +23,7 @@ import { Marker, useMap, } from "@vis.gl/react-google-maps"; -import { Activity, Plus, Radio, Trash2 } from "lucide-react"; +import { Activity, Pencil, Plus, Radio, Trash2 } from "lucide-react"; import Breadcrumbs from "@/components/ui/Breadcrumbs"; import { useToast } from "@/hooks/use-toast"; import { vehiclesService } from "@/services/vehicles.service"; @@ -97,9 +97,21 @@ export function TrackingPage() { const { toast } = useToast(); const qc = useQueryClient(); const [selectedId, setSelectedId] = useState(null); - const [registerOpen, setRegisterOpen] = useState(false); + const [modalOpen, setModalOpen] = useState(false); + const [editDevice, setEditDevice] = useState(null); const [form, setForm] = useState({ imei: "", name: "", vehicleId: "" }); + const openRegister = () => { + setEditDevice(null); + setForm({ imei: "", name: "", vehicleId: "" }); + setModalOpen(true); + }; + const openEdit = (d: GpsDevice) => { + setEditDevice(d); + setForm({ imei: d.imei, name: d.name ?? "", vehicleId: d.vehicleId ?? "" }); + setModalOpen(true); + }; + // Poll every 10s so the map tracks live movement. const { data: devices = [] } = useQuery({ queryKey: ["gps", "devices"], @@ -155,23 +167,29 @@ export function TrackingPage() { } as google.maps.Symbol; }; - const registerMutation = useMutation({ + const saveMutation = useMutation({ mutationFn: () => - gpsTrackingService.register({ - imei: form.imei.trim(), - name: form.name.trim() || undefined, - vehicleId: form.vehicleId || null, - }), + editDevice + ? gpsTrackingService.update(editDevice.id, { + name: form.name.trim() || undefined, + vehicleId: form.vehicleId || null, + }) + : gpsTrackingService.register({ + imei: form.imei.trim(), + name: form.name.trim() || undefined, + vehicleId: form.vehicleId || null, + }), onSuccess: () => { - toast({ title: "Tracker registered" }); - setRegisterOpen(false); + toast({ title: editDevice ? "Tracker updated" : "Tracker registered" }); + setModalOpen(false); + setEditDevice(null); setForm({ imei: "", name: "", vehicleId: "" }); void qc.invalidateQueries({ queryKey: ["gps", "devices"] }); }, onError: (err: unknown) => { const description = (err as { response?: { data?: { message?: string } } })?.response?.data?.message ?? "Failed"; - toast({ title: "Registration failed", description, variant: "destructive" }); + toast({ title: editDevice ? "Update failed" : "Registration failed", description, variant: "destructive" }); }, }); @@ -204,7 +222,7 @@ export function TrackingPage() { Real-Time Vehicle Tracking Live GPS positions from GT06 trackers - @@ -327,7 +345,17 @@ export function TrackingPage() { - {d.online ? "Live" : "Offline"} + + {d.online ? "Live" : "Offline"} + { e.stopPropagation(); openEdit(d); }} + > + + + ))} @@ -347,13 +375,20 @@ export function TrackingPage() { - {/* Register modal */} - setRegisterOpen(false)} title="Register GPS tracker" radius="lg" centered> + {/* Register / edit modal */} + setModalOpen(false)} + title={editDevice ? "Edit GPS tracker" : "Register GPS tracker"} + radius="lg" + centered + > setForm({ ...form, imei: e.currentTarget.value })} /> @@ -373,13 +408,13 @@ export function TrackingPage() { clearable /> - +