import { useCallback, useEffect, useState } from "react"; import { Button } from "@/components/ui/button"; import { Card, CardContent} from "@/components/ui/card"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { Trash2 } from "lucide-react"; import { useAuthStore } from "@/store/authStore"; import { HotelStaffRole } from "@/lib/types"; import type { RegisterHotelStaffDto, StaffAccess } from "@/lib/types"; import { getStaffAccess, postStaff, deleteStaffAccess } from "@/lib/auth-api"; import { Spinner } from "@/components/ui/spinner"; export function ManageUsersPage() { const token = useAuthStore((s) => s.accessToken); const selectedPropertyId = useAuthStore((s) => s.selectedPropertyId); const [staff, setStaff] = useState([]); const [loading, setLoading] = useState(true); const [submitting, setSubmitting] = useState(false); const [open, setOpen] = useState(false); const [formData, setFormData] = useState({ name: "", email: "", phone: "", password: "", hotelRole: HotelStaffRole.FRONT_DESK, }); const loadStaff = useCallback(async () => { if (!token) return; setLoading(true); try { const data = await getStaffAccess(token); setStaff(data); } catch (error) { console.error("Failed to load staff", error); } finally { setLoading(false); } }, [token, selectedPropertyId]); useEffect(() => { loadStaff(); }, [loadStaff]); const handleInputChange = (e: React.ChangeEvent) => { const { name, value } = e.target; setFormData({ ...formData, [name]: value }); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!token) return; setSubmitting(true); try { await postStaff(token, formData); setOpen(false); setFormData({ name: "", email: "", phone: "", password: "", hotelRole: HotelStaffRole.FRONT_DESK }); loadStaff(); } catch (error) { console.error("Failed to create staff", error); } finally { setSubmitting(false); } }; const handleDelete = async (id: string) => { if (!token || !confirm("Are you sure you want to delete this user?")) return; try { await deleteStaffAccess(token, id); loadStaff(); } catch (error) { console.error("Failed to delete staff", error); } }; if (loading) return (
); return (

Manage Users

Add New Staff Member
Name Email Phone Role Created Actions {staff.map((user) => ( {user.user.name} {user.user.email} {user.user.phone || "-"} {user.user.role} {new Date(user.createdAt).toLocaleDateString()} ))} {staff.length === 0 && ( No staff members found. Add one above. )}
); }