"use client"; import { useState, useEffect } from "react"; import { UserGrid } from "@/components/users/UserGrid"; // import { Button } from "@/components/ui/button"; import { Card, CardHeader, CardContent } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; interface User { id: string; email: string; firstName: string; lastName: string; role: string; phone?: string; createdAt: Date; isCheckedIn?: boolean; checkInTime?: Date; lastCheckInTime?: Date; checkInsThisWeek?: number; checkInsThisMonth?: number; client?: { id: string; membershipType: string; membershipStatus: string; joinDate: Date; lastVisit?: Date; }; } export function UserManagement() { const [users, setUsers] = useState([]); const [loading, setLoading] = useState(true); const [filter, setFilter] = useState("all"); const [selectedUser, setSelectedUser] = useState(null); const [isEditing, setIsEditing] = useState(false); const [isDeleting, setIsDeleting] = useState(false); const [editForm, setEditForm] = useState<{ firstName: string; lastName: string; email: string; role: string; phone: string; } | null>(null); useEffect(() => { fetchUsers(); }, [filter]); const fetchUsers = async () => { setLoading(true); try { const url = filter === "all" ? "/api/users" : `/api/users?role=${filter}`; const response = await fetch(url); const data = await response.json(); setUsers(data.users || []); } catch (error) { console.error("Failed to fetch users:", error); } finally { setLoading(false); } }; const handleUserSelect = (user: User | null) => { setSelectedUser(user); }; const handleEditUser = (user: User) => { setSelectedUser(user); setEditForm({ firstName: user.firstName, lastName: user.lastName, email: user.email, role: user.role, phone: user.phone || "", }); setIsEditing(true); }; const handleDeleteUser = (user: User) => { setSelectedUser(user); setIsDeleting(true); }; const handleBulkDelete = async (users: User[]) => { if (users.length === 0) return; if (!confirm(`Are you sure you want to delete ${users.length} users?`)) return; try { const response = await fetch("/api/users", { method: "DELETE", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ ids: users.map((u) => u.id) }), }); if (response.ok) { fetchUsers(); } else { alert("Error deleting users"); } } catch (error) { console.error(error); } }; const handleExport = () => { const csvContent = [ [ "Name", "Email", "Role", "Phone", "Membership", "Status", "Join Date", "Last Visit", ], ...users.map((user) => [ `${user.firstName} ${user.lastName}`, user.email, user.role, user.phone || "", user.client?.membershipType || "", user.client?.membershipStatus || "", user.client?.joinDate || user.createdAt, user.client?.lastVisit || "", ]), ] .map((row) => row.join(",")) .join("\n"); const blob = new Blob([csvContent], { type: "text/csv" }); const url = window.URL.createObjectURL(blob); const a = document.createElement("a"); a.href = url; a.download = `users_${new Date().toISOString().split("T")[0]}.csv`; a.click(); window.URL.revokeObjectURL(url); }; const handleRefresh = () => { fetchUsers(); }; const handleSaveEdit = async () => { if (!editForm) return; try { if (selectedUser) { // Update existing user const response = await fetch("/api/users", { method: "PUT", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ id: selectedUser.id, ...editForm }), }); if (response.ok) { setIsEditing(false); setEditForm(null); fetchUsers(); } else { alert("Error updating user"); } } else { // Create (Invite) new user const response = await fetch("/api/users", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(editForm), }); if (response.ok) { setIsEditing(false); setEditForm(null); fetchUsers(); alert("Invitation sent successfully!"); } else { const errorData = await response.json(); alert(`Error sending invitation: ${errorData.error}`); } } } catch (error) { console.error(error); alert("An unexpected error occurred"); } }; const handleDeleteConfirm = async () => { if (!selectedUser) return; try { const response = await fetch(`/api/users?id=${selectedUser.id}`, { method: "DELETE", }); if (response.ok) { setIsDeleting(false); setSelectedUser(null); fetchUsers(); } else { alert("Error deleting user"); } } catch (error) { console.error(error); } }; return (

User Management

Showing {users.length} users {selectedUser && ( Selected: {selectedUser.firstName} {selectedUser.lastName} )}
handleUserSelect(user)} onEditUser={handleEditUser} onDeleteUser={handleDeleteUser} onBulkDelete={handleBulkDelete} loading={loading} /> {isEditing && editForm && (

{selectedUser ? 'Edit User' : 'Invite New User'}

{ e.preventDefault(); handleSaveEdit(); }} >
setEditForm({ ...editForm, firstName: e.target.value }) } className="w-full border border-gray-300 rounded px-3 py-2" required />
setEditForm({ ...editForm, lastName: e.target.value }) } className="w-full border border-gray-300 rounded px-3 py-2" required />
setEditForm({ ...editForm, email: e.target.value }) } className="w-full border border-gray-300 rounded px-3 py-2" required disabled={!!selectedUser} // Disable email edit for existing users if desired, or keep enabled />

Note: You can only assign roles lower than your own.

setEditForm({ ...editForm, phone: e.target.value }) } className="w-full border border-gray-300 rounded px-3 py-2" />
)} {isDeleting && selectedUser && (

Delete User

Are you sure you want to delete {selectedUser.firstName}{" "} {selectedUser.lastName}? This action cannot be undone.

)} {selectedUser && (

User Details

View Full Profile & Recommendations

Basic Information

Name:{" "} {selectedUser.firstName} {selectedUser.lastName}

Email:{" "} {selectedUser.email}

Phone:{" "} {selectedUser.phone || "N/A"}

Role:{" "} {selectedUser.role}

Joined:{" "} {new Date(selectedUser.createdAt).toLocaleDateString()}

{selectedUser.client && (

Client Information

Membership:{" "} {selectedUser.client.membershipType}

Status:{" "} {selectedUser.client.membershipStatus}

Member Since:{" "} {new Date( selectedUser.client.joinDate, ).toLocaleDateString()}

Last Visit:{" "} {selectedUser.client.lastVisit ? new Date( selectedUser.client.lastVisit, ).toLocaleDateString() : "Never"}

)}

Check-In Statistics

Last Check-In:{" "} {selectedUser.lastCheckInTime ? new Date( selectedUser.lastCheckInTime, ).toLocaleString() : "Never"}

This Week:{" "} {selectedUser.checkInsThisWeek || 0} check-ins

This Month:{" "} {selectedUser.checkInsThisMonth || 0} check-ins

)}
); }