"use client"; import { useEffect, useState } from "react"; import { GeofenceEvent } from "@/lib/types"; interface EnrichedGeofenceEvent extends GeofenceEvent { geofenceName?: string; geofenceColor?: string; } export default function GeofenceEventsPage() { const [events, setEvents] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [filter, setFilter] = useState({ deviceId: "", geofenceId: "", }); useEffect(() => { fetchEvents(); // Auto-refresh every 30 seconds const interval = setInterval(fetchEvents, 30000); return () => clearInterval(interval); }, [filter]); const fetchEvents = async () => { try { const params = new URLSearchParams(); if (filter.deviceId) params.append("deviceId", filter.deviceId); if (filter.geofenceId) params.append("geofenceId", filter.geofenceId); params.append("limit", "100"); const response = await fetch(`/api/geofences/events?${params.toString()}`); if (!response.ok) throw new Error("Failed to fetch events"); const data = await response.json(); setEvents(data.events || []); setError(null); } catch (err) { console.error("Failed to fetch events", err); setError("Failed to load events"); } finally { setLoading(false); } }; const getNotificationStatusBadge = (status: number) => { switch (status) { case 0: return ( Pending ); case 1: return ( ✓ Sent ); case 2: return ( ✗ Failed ); default: return null; } }; if (loading) { return (

Loading events...

); } return (
{/* Hero Section */}

Geofence Events

View enter and exit events for all your geofences

← Back to Geofences
{/* Stats Cards */}
📊

Total Events

{events.length}

Enters

{events.filter((e) => e.event_type === "enter").length}

Exits

{events.filter((e) => e.event_type === "exit").length}

📧

Sent

{events.filter((e) => e.notification_sent === 1).length}

{/* Error Message */} {error && (

{error}

)} {/* Events Table */}
📋

Event History

{events.length === 0 ? (
📭

No events yet

Events will appear here when devices enter or exit your geofences

) : (
{events.map((event) => ( ))}
Timestamp Device Geofence Event Position Distance Notification
{new Date(event.timestamp).toLocaleString()} Device {event.device_id}
{event.geofenceName}
{event.event_type === "enter" ? ( ↓ Enter ) : ( ↑ Exit )} {typeof event.latitude === 'number' ? event.latitude.toFixed(4) : parseFloat(event.latitude as string).toFixed(4)},{" "} {typeof event.longitude === 'number' ? event.longitude.toFixed(4) : parseFloat(event.longitude as string).toFixed(4)} {event.distance_from_center !== null ? `${Math.round(event.distance_from_center)} m` : "N/A"} {getNotificationStatusBadge(event.notification_sent)} {event.notification_sent === 2 && event.notification_error && (

{event.notification_error}

)}
)}
); }