"use client" import { useState, useEffect } from "react" import { useRouter } from "next/navigation" import { Button } from "@/components/ui/button" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Shield, ShieldAlert, ShieldX, Settings, LogOut, Users, ShieldCheck, Home, Sun, Smile } from "lucide-react" import { type User, ROLE_NAMES } from "@/types/user" export default function DashboardPage() { const [user, setUser] = useState(null) const [selectedStatus, setSelectedStatus] = useState(null) const [lastUpdated, setLastUpdated] = useState(null) const [loading, setLoading] = useState(false) const [instanceName, setInstanceName] = useState("") const router = useRouter() const refreshUser = async (currentUser: User) => { try { const response = await fetch("/api/user", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ nationalId: currentUser.national_id }), }) const data = await response.json() if (response.ok && data.user) { setUser(data.user) setSelectedStatus(data.user.in_shelter) setLastUpdated(data.user.last_updated) localStorage.setItem("user", JSON.stringify(data.user)) } } catch (err) { console.error("Error refreshing user:", err) } } useEffect(() => { const userData = localStorage.getItem("user") if (!userData) { router.push("/login") return } const parsedUser = JSON.parse(userData) setUser(parsedUser) setSelectedStatus(parsedUser.in_shelter) setLastUpdated(parsedUser.last_updated) refreshUser(parsedUser) const handleVisibility = () => { if (document.visibilityState === "visible" && parsedUser) { refreshUser(parsedUser) } } window.addEventListener("visibilitychange", handleVisibility) return () => window.removeEventListener("visibilitychange", handleVisibility) }, [router]) useEffect(() => { const loadInstance = async () => { try { const response = await fetch("/api/instance") const data = await response.json() if (response.ok && data.instance) { setInstanceName(data.instance) } } catch (error) { console.error("Failed to load instance name:", error) } } loadInstance() }, []) const handleStatusUpdate = async (status: string) => { if (!user) return setLoading(true) try { const response = await fetch("/api/status/update", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ nationalId: user.national_id, status, }), }) if (response.ok) { setSelectedStatus(status) setLastUpdated(new Date().toLocaleString("he-IL")) } } catch (err) { console.error("Error updating status:", err) } finally { setLoading(false) } } const handleLogout = () => { localStorage.removeItem("user") router.push("/login") } const canAccessAdmin = () => { return !!user?.role && user.role !== "user" } if (!user) return null const getStatusText = (status: string) => { switch (status) { case "yes": return "במקלט/חדר מוגן" case "no": return "לא במקלט - אין מקלט בקרבת מקום" case "no_alarm": return "אין אזעקה באזור שלי" case "safe_after_exit": return "אני בטוח (אחרי יציאה מהמקלט)" default: return "" } } return (
שלום {user.name}
{ROLE_NAMES[user.role] || user.role} {user.field && ` - תחום ${user.field}`} {user.department && ` - מסגרת ${user.department}`} {user.team && ` - צוות ${user.team}`}
{canAccessAdmin() && ( )}
{selectedStatus && lastUpdated && (

סטטוס נוכחי:

{getStatusText(selectedStatus)}

עודכן: {lastUpdated}

)} {/* Hostname Footer */}
סביבה: {instanceName || process.env.NEXT_PUBLIC_HOSTNAME || process.env.HOSTNAME || "לא זוהה"}
גרסה: {process.env.APPVERSION || "לא הוגדרה גרסה ב-Dockerfile!"}
2025 COPYRIGHT TR-WEB
) }