"use client"; import React, { useState, useEffect } from "react"; import { RefreshCw, Truck, Navigation, Gauge } from "lucide-react"; import { Button } from "@/components/ui/button"; interface Vehicle { id: string; vehicle_number: string; vehicle_name: string; driver_name: string; latitude: number; longitude: number; status: string; speed: number; destination: string; } interface VehicleListWidgetProps { element?: any; // 대시보드 요소 (dataSource 포함) refreshInterval?: number; } export default function VehicleListWidget({ element, refreshInterval = 30000 }: VehicleListWidgetProps) { const [vehicles, setVehicles] = useState([]); const [isLoading, setIsLoading] = useState(false); const [lastUpdate, setLastUpdate] = useState(new Date()); const [selectedStatus, setSelectedStatus] = useState("all"); const loadVehicles = async () => { setIsLoading(true); // 설정된 쿼리가 없으면 로딩 중단 (기본 쿼리 사용 안 함) if (!element?.dataSource?.query) { setIsLoading(false); return; } const query = element.dataSource.query; try { const response = await fetch("/api/dashboards/execute-query", { method: "POST", headers: { "Content-Type": "application/json", Authorization: `Bearer ${typeof window !== "undefined" ? localStorage.getItem("authToken") || "" : ""}`, }, body: JSON.stringify({ query }), }); if (response.ok) { const result = await response.json(); if (result.success && result.data.rows.length > 0) { setVehicles(result.data.rows); setLastUpdate(new Date()); } } } catch (error) { console.error("차량 목록 로드 실패:", error); } setIsLoading(false); }; // 데이터 로드 및 자동 새로고침 useEffect(() => { loadVehicles(); const interval = setInterval(loadVehicles, refreshInterval); return () => clearInterval(interval); }, [element?.dataSource?.query, refreshInterval]); // 설정되지 않았을 때도 빈 상태로 표시 (안내 메시지 제거) const getStatusColor = (status: string) => { const s = status?.toLowerCase() || ""; if (s === "active" || s === "running") return "bg-green-500"; if (s === "inactive" || s === "idle") return "bg-yellow-500"; if (s === "maintenance") return "bg-orange-500"; if (s === "warning" || s === "breakdown") return "bg-red-500"; return "bg-gray-500"; }; const getStatusText = (status: string) => { const s = status?.toLowerCase() || ""; if (s === "active" || s === "running") return "운행 중"; if (s === "inactive" || s === "idle") return "대기"; if (s === "maintenance") return "정비"; if (s === "warning" || s === "breakdown") return "고장"; return "알 수 없음"; }; const filteredVehicles = selectedStatus === "all" ? vehicles : vehicles.filter((v) => v.status?.toLowerCase() === selectedStatus); return (
{/* 헤더 */}

📋 차량 목록

마지막 업데이트: {lastUpdate.toLocaleTimeString("ko-KR")}

{/* 필터 버튼 */}
{/* 차량 목록 */}
{filteredVehicles.length === 0 ? (

차량이 없습니다

) : (
{filteredVehicles.map((vehicle) => (
{vehicle.vehicle_name}
{getStatusText(vehicle.status)}
차량번호 {vehicle.vehicle_number}
기사 {vehicle.driver_name || "미배정"}
{vehicle.destination || "대기 중"}
{vehicle.speed || 0} km/h
))}
)}
); }