"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 { Input } from "@/components/ui/input" import { Alert, AlertDescription } from "@/components/ui/alert" import { ArrowRight, Users, UserCog, MessageSquare, KeyRound, Trash2, Home } from "lucide-react" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table" import { RoleManagementModal } from "@/components/role-management-modal" import { ReportOnBehalfModal } from "@/components/report-on-behalf-modal" import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger, } from "@/components/ui/alert-dialog" import { type User, type UserRole, ROLE_NAMES } from "@/types/user" interface AdminUser { national_id: string name: string role: UserRole field?: string department?: string team?: string } export default function RoleAdminPage() { const [admin, setAdmin] = useState(null) const [users, setUsers] = useState([]) const [filteredUsers, setFilteredUsers] = useState([]) const [searchTerm, setSearchTerm] = useState("") const [message, setMessage] = useState("") const [loading, setLoading] = useState(false) const [roleModalOpen, setRoleModalOpen] = useState(false) const [reportModalOpen, setReportModalOpen] = useState(false) const [selectedUser, setSelectedUser] = useState(null) const router = useRouter() useEffect(() => { const userData = localStorage.getItem("user") if (!userData) { router.push("/login") return } const parsedUser = JSON.parse(userData) if (parsedUser.role === "user") { router.push("/dashboard") return } setAdmin(parsedUser) fetchManageableUsers(parsedUser.national_id) }, [router]) useEffect(() => { if (searchTerm) { setFilteredUsers(users.filter((user) => user.name.includes(searchTerm))) } else { setFilteredUsers(users) } }, [searchTerm, users]) const fetchManageableUsers = async (adminId: string) => { setLoading(true) try { const response = await fetch("/api/admin/manageable-users", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ adminId }), }) const data = await response.json() if (response.ok) { setUsers(data.users) } else { setMessage(data.error || "שגיאה בטעינת משתמשים") } } catch (err) { setMessage("שגיאה בחיבור לשרת") } finally { setLoading(false) } } const handleRoleChange = async (userId: string, newRole: string) => { try { const response = await fetch("/api/admin/change-role", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ adminId: admin?.national_id, targetUserId: userId, newRole, }), }) const data = await response.json() if (response.ok) { setMessage(data.message) fetchManageableUsers(admin?.national_id || "") } else { setMessage(data.error || "שגיאה בשינוי תפקיד") } } catch (err) { setMessage("שגיאה בחיבור לשרת") } } const handleReportOnBehalf = async (userId: string, status: string) => { try { const response = await fetch("/api/admin/report-on-behalf", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ adminId: admin?.national_id, targetUserId: userId, status, }), }) const data = await response.json() if (response.ok) { setMessage(data.message) fetchManageableUsers(admin?.national_id || "") } else { setMessage(data.error || "שגיאה בדיווח") } } catch (err) { setMessage("שגיאה בחיבור לשרת") } } const handleDeleteUser = async (nationalId: string) => { try { const response = await fetch(`/api/admin/users/${nationalId}`, { method: "DELETE", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ adminId: admin?.national_id, }), }) if (response.ok) { setMessage("משתמש נמחק בהצלחה") fetchManageableUsers(admin?.national_id || "") } else { const data = await response.json() setMessage(data.error || "שגיאה במחיקת משתמש") } } catch (err) { setMessage("שגיאה בחיבור לשרת") } } const handleResetPassword = async (nationalId: string, userName: string) => { try { const response = await fetch("/api/admin/reset-password", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ adminId: admin?.national_id, targetUserId: nationalId, }), }) if (response.ok) { setMessage(`סיסמה אופסה בהצלחה עבור ${userName}. הסיסמה החדשה: password123`) fetchManageableUsers(admin?.national_id || "") } else { const data = await response.json() setMessage(data.error || "שגיאה באיפוס סיסמה") } } catch (err) { setMessage("שגיאה בחיבור לשרת") } } const getStatusText = (status?: string) => { switch (status) { case "yes": return { text: "במקלט/חדר מוגן", color: "text-green-600" } case "no": return { text: "לא במקלט", color: "text-orange-600" } case "no_alarm": return { text: "אין אזעקה", color: "text-blue-600" } case "safe_after_exit": return { text: "אני בטוח (אחרי יציאה מהמקלט)", color: "text-purple-600" } default: return { text: "לא דיווח", color: "text-gray-500" } } } const getScopeText = () => { if (!admin) return "" switch (admin.role) { case "global_admin": return "כל המערכת" case "field_admin": return `תחום ${admin.field}` case "department_admin": return `מסגרת ${admin.department}` case "team_admin": return `צוות ${admin.team}` default: return "" } } if (!admin) return null return (
ניהול תפקידים ודיווחים

{ROLE_NAMES[admin.role]} - {getScopeText()}

{message && ( {message} )} ניהול משתמשים ({filteredUsers.length})
setSearchTerm(e.target.value)} className="max-w-md" />
{loading ? (
טוען משתמשים...
) : (
שם מזהה תפקיד תחום מסגרת צוות פעולות {filteredUsers.map((user) => { const status = getStatusText(user.in_shelter) return ( {user.name} {user.national_id} {ROLE_NAMES[user.role] || user.role} {user.field || "לא הוגדר"} {user.department || "לא הוגדר"} {user.team || "לא הוגדר"}
האם אתה בטוח? פעולה זו בלתי הפיכה. האם אתה בטוח שברצונך למחוק את {user.name}? ביטול { if (user.national_id === admin?.national_id) { setMessage("לא ניתן למחוק את עצמך") return } handleDeleteUser(user.national_id) }} > מחיקה איפוס סיסמה האם אתה בטוח שברצונך לאפס את הסיסמה של {user.name}? הסיסמה החדשה תהיה: password123 ביטול handleResetPassword(user.national_id, user.name)}> איפוס סיסמה
) })}
{filteredUsers.length === 0 && (
{searchTerm ? "לא נמצאו משתמשים התואמים לחיפוש" : "אין משתמשים"}
)}
)}
setRoleModalOpen(false)} user={selectedUser} adminRole={admin.role} onRoleChange={handleRoleChange} /> setReportModalOpen(false)} user={selectedUser} onReport={handleReportOnBehalf} />
) }