"use client"; import { useState } from "react"; import { UserGrid, type User } from "@/components/users/UserGrid"; import { Card, CardHeader, CardContent } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { useUser } from "@clerk/nextjs"; import log from "@/lib/logger"; import { toast } from "@/lib/toast"; import { CreateUserModal } from "./CreateUserModal"; import { useUsers, useGyms, useUpdateUser, useDeleteUser, useSendInvitation, } from "@/hooks/use-api"; interface UserManagementProps { gymId?: string; } export function UserManagement({ gymId }: UserManagementProps) { const { user } = useUser(); const [filter, setFilter] = useState("all"); const [selectedUser, setSelectedUser] = useState(null); const [isEditing, setIsEditing] = useState(false); const [isDeleting, setIsDeleting] = useState(false); const [createModalOpen, setCreateModalOpen] = useState(false); const [editForm, setEditForm] = useState<{ firstName: string; lastName: string; email: string; role: string; phone: string; gymId: string; } | null>(null); const { data: users = [], isLoading, refetch, } = useUsers({ role: filter !== "all" ? filter : undefined, gymId, }); const { data: gyms = [] } = useGyms(); const updateUser = useUpdateUser(); const deleteUser = useDeleteUser(); const sendInvitation = useSendInvitation(); 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 || "", gymId: user.gymId || "", }); 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 deletePromises = users.map((u) => fetch(`/api/users?id=${u.id}`, { method: "DELETE" }), ); await Promise.all(deletePromises); refetch(); toast.success("Users deleted successfully"); } catch (error) { log.error("Failed to delete users", 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 = () => { refetch(); }; const handleSaveEdit = async () => { if (!editForm) return; try { if (selectedUser) { const payload = { id: selectedUser.id, email: editForm.email, firstName: editForm.firstName, lastName: editForm.lastName, role: editForm.role, phone: editForm.phone, gymId: editForm.gymId === "" ? null : editForm.gymId, }; await updateUser.mutateAsync(payload); setIsEditing(false); setEditForm(null); refetch(); toast.success("User updated successfully"); } else { await sendInvitation.mutateAsync({ email: editForm.email, role: editForm.role, }); setIsEditing(false); setEditForm(null); refetch(); toast.success("Invitation sent successfully!"); } } catch (error) { console.error(error); toast.error("An unexpected error occurred"); } }; const handleDeleteConfirm = async () => { if (!selectedUser) return; try { await deleteUser.mutateAsync(selectedUser.id); setIsDeleting(false); setSelectedUser(null); refetch(); toast.success("User deleted successfully"); } catch (error) { log.error("Failed to delete user", error); } }; return (

User Management

Showing {users.length} users {selectedUser && ( Selected: {selectedUser.firstName} {selectedUser.lastName} )}
handleUserSelect(user)} onEditUser={handleEditUser} onDeleteUser={handleDeleteUser} onBulkDelete={handleBulkDelete} loading={isLoading} /> {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" />

Select an active gym or proceed without a gym.

)} {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:{" "} {selectedUser.createdAt ? new Date(selectedUser.createdAt).toLocaleDateString() : "N/A"}

{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

)} refetch()} />
); }