Initial commit

This commit is contained in:
2025-06-22 00:01:22 +03:00
parent fd70166cf6
commit 033b80bfad
153 changed files with 26874 additions and 1 deletions

176
app/dashboard/page.tsx Normal file
View File

@@ -0,0 +1,176 @@
"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<User | null>(null)
const [selectedStatus, setSelectedStatus] = useState<string | null>(null)
const [lastUpdated, setLastUpdated] = useState<string | null>(null)
const [loading, setLoading] = useState(false)
const router = useRouter()
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)
}, [router])
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 (
<div className="min-h-screen bg-gray-50 p-4" dir="rtl">
<div className="max-w-md mx-auto space-y-6">
<Card>
<CardHeader className="text-center">
<CardTitle className="text-xl">שלום {user.name}</CardTitle>
<div className="text-sm text-gray-600 mb-2">
{ROLE_NAMES[user.role] || user.role}
{user.field && ` - תחום ${user.field}`}
{user.department && ` - מסגרת ${user.department}`}
{user.team && ` - צוות ${user.team}`}
</div>
<div className="flex justify-between items-center">
<Button variant="outline" size="sm" onClick={handleLogout} className="flex items-center gap-2">
<LogOut className="h-4 w-4" />
התנתקות
</Button>
{canAccessAdmin() && (
<Button
variant="outline"
size="sm"
onClick={() => router.push("/admin")}
className="flex items-center gap-2"
>
{user.role === "user" ? <Settings className="h-4 w-4" /> : <Users className="h-4 w-4" />}
{user.role === "user" ? "ניהול" : "ניהול"}
</Button>
)}
</div>
</CardHeader>
</Card>
<div className="space-y-4">
<Button
variant={selectedStatus === "safe_after_exit" ? "default" : "outline"}
className={`w-full h-16 text-lg ${selectedStatus === "safe_after_exit" ? "bg-green-600 hover:bg-green-700" : ""}`}
onClick={() => handleStatusUpdate("safe_after_exit")}
disabled={loading}
>
<Shield className="ml-2 h-6 w-6" />
אני בטוח.ה (אחרי יציאה מהמקלט)
</Button>
<Button
variant={selectedStatus === "yes" ? "default" : "outline"}
className={`w-full h-20 text-xl ${selectedStatus === "yes" ? "bg-green-600 hover:bg-green-700" : ""}`}
onClick={() => handleStatusUpdate("yes")}
disabled={loading}
>
<ShieldCheck className="ml-2 h-8 w-8" />
במקלט/מרחב מוגן
</Button>
<Button
variant={selectedStatus === "no" ? "default" : "outline"}
className={`w-full h-16 text-lg ${selectedStatus === "no" ? "bg-green-600 hover:bg-green-700" : ""}`}
onClick={() => handleStatusUpdate("no")}
disabled={loading}
>
<ShieldX className="ml-2 h-6 w-6" />
לא במקלט - אין מקלט בקרבת מקום
</Button>
<Button
variant={selectedStatus === "no_alarm" ? "default" : "outline"}
className={`w-full h-16 text-lg ${selectedStatus === "no_alarm" ? "bg-green-600 hover:bg-green-700" : ""}`}
onClick={() => handleStatusUpdate("no_alarm")}
disabled={loading}
>
<Smile className="ml-2 h-6 w-6" />
אין אזעקה באזור שלי
</Button>
</div>
{selectedStatus && lastUpdated && (
<Card>
<CardContent className="pt-6 text-center">
<p className="text-sm text-gray-600">סטטוס נוכחי:</p>
<p className="font-semibold text-green-600">{getStatusText(selectedStatus)}</p>
<p className="text-xs text-gray-500 mt-2">עודכן: {lastUpdated}</p>
</CardContent>
</Card>
)}
{/* Hostname Footer */}
<Card className="mt-8">
<CardContent className="py-3">
<div className="text-center text-xs text-gray-500">
סביבה: {process.env.NEXT_PUBLIC_HOSTNAME || process.env.HOSTNAME || "לא זוהה"}
<br />
2025 COPYRIGHT TR-WEB
</div>
</CardContent>
</Card>
</div>
</div>
)
}