"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, 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); const [trainersRes, clientsRes, assignmentsRes] = await Promise.all([ fetch("/api/users?role=trainer"), fetch("/api/users?role=client"), fetch("/api/trainer-client"), ]); const fetchedTrainers: User[] = trainersRes.ok ? (await trainersRes.json()).data?.users || [] : []; const fetchedClients: User[] = clientsRes.ok ? (await clientsRes.json()).data?.users || [] : []; setTrainers(fetchedTrainers); setClients(fetchedClients); if (assignmentsRes.ok) { const assignmentsData = await assignmentsRes.json(); const enrichedAssignments = (assignmentsData.assignments || []).map( (assignment: TrainerClientAssignment) => { return { ...assignment, trainer: fetchedTrainers.find( (t) => t.id === assignment.trainerId, ), client: fetchedClients.find((c) => c.id === assignment.clientId), }; }, ); 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(); } 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(); } 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

Assign Trainer to Client
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()}
))}
)}
{getInactiveAssignments().length > 0 && (
Inactive Assignments {getInactiveAssignments().length}
{getInactiveAssignments().map((assignment) => (
{assignment.trainer?.firstName}{" "} {assignment.trainer?.lastName} → {assignment.client?.firstName}{" "} {assignment.client?.lastName}
Inactive
))}
)}
); }