"use client"; import { useState, useEffect } from "react"; import { User, TrainerClientAssignment } from "@fitai/shared"; import { Card, CardHeader, CardTitle, CardContent } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Badge } from "@/components/ui/badge"; import { Plus, Trash2, UserCheck, UserX } from "lucide-react"; export default function TrainerClientsPage() { const [trainers, setTrainers] = useState([]); const [clients, setClients] = useState([]); const [assignments, setAssignments] = useState< (TrainerClientAssignment & { trainer?: User; client?: User })[] >([]); const [loading, setLoading] = useState(true); const [selectedTrainer, setSelectedTrainer] = useState(""); const [selectedClient, setSelectedClient] = useState(""); useEffect(() => { fetchData(); }, []); const fetchData = async () => { try { setLoading(true); // Fetch trainers const trainersRes = await fetch("/api/users?role=trainer"); if (trainersRes.ok) { const trainersData = await trainersRes.json(); setTrainers(trainersData.users || []); } // Fetch clients const clientsRes = await fetch("/api/users?role=client"); if (clientsRes.ok) { const clientsData = await clientsRes.json(); setClients(clientsData.users || []); } // Fetch all assignments const assignmentsRes = await fetch("/api/trainer-client"); if (assignmentsRes.ok) { const assignmentsData = await assignmentsRes.json(); // Enrich assignments with user data const enrichedAssignments = await Promise.all( (assignmentsData.assignments || []).map( async (assignment: TrainerClientAssignment) => { const trainer = trainers.find( (t: User) => t.id === assignment.trainerId, ); const client = clients.find( (c: User) => c.id === assignment.clientId, ); return { ...assignment, trainer, client }; }, ), ); setAssignments(enrichedAssignments); } } catch (error) { console.error("Failed to fetch data:", error); } finally { setLoading(false); } }; const handleAssign = async () => { if (!selectedTrainer || !selectedClient) { alert("Please select both a trainer and a client"); return; } try { const response = await fetch("/api/trainer-client", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ trainerId: selectedTrainer, clientId: selectedClient, }), }); if (response.ok) { alert("Assignment created successfully!"); setSelectedTrainer(""); setSelectedClient(""); fetchData(); // Refresh } else { const error = await response.json(); alert(error.error || "Failed to create assignment"); } } catch (error) { console.error("Failed to create assignment:", error); alert("Failed to create assignment"); } }; const handleRemoveAssignment = async (id: string) => { if (!confirm("Are you sure you want to remove this assignment?")) { return; } try { const response = await fetch(`/api/trainer-client/${id}`, { method: "DELETE", }); if (response.ok) { alert("Assignment removed successfully!"); fetchData(); // Refresh } else { const error = await response.json(); alert(error.error || "Failed to remove assignment"); } } catch (error) { console.error("Failed to remove assignment:", error); alert("Failed to remove assignment"); } }; const getActiveAssignments = () => assignments.filter((a) => a.isActive); const getInactiveAssignments = () => assignments.filter((a) => !a.isActive); if (loading) { return (
Loading...
); } return (

Trainer-Client Assignments

{/* Create Assignment Form */} Assign Trainer to Client
{/* Active Assignments */}
Active Assignments {getActiveAssignments().length}
{getActiveAssignments().length === 0 ? (

No active assignments

) : (
{getActiveAssignments().map((assignment) => (
{assignment.trainer?.firstName}{" "} {assignment.trainer?.lastName}
{assignment.client?.firstName}{" "} {assignment.client?.lastName}
Assigned{" "} {new Date(assignment.assignedAt).toLocaleDateString()}
))}
)}
{/* Inactive Assignments */} {getInactiveAssignments().length > 0 && (
Inactive Assignments {getInactiveAssignments().length}
{getInactiveAssignments().map((assignment) => (
{assignment.trainer?.firstName}{" "} {assignment.trainer?.lastName} {assignment.client?.firstName}{" "} {assignment.client?.lastName}
Inactive
))}
)}
); }