"use client"; import { useState, useEffect } from "react"; import { Button } from "@/components/ui/button"; import { Card, CardHeader, CardContent } from "@/components/ui/card"; import log from "@/lib/logger"; interface Recommendation { id: string; userId: string; type: "short_term" | "medium_term" | "long_term" | "ai_plan"; recommendationText: string; activityPlan?: string; dietPlan?: string; status: "pending" | "completed" | "approved" | "rejected"; createdAt: string; } interface RecommendationsProps { userId: string; } export function Recommendations({ userId }: RecommendationsProps) { const [recommendations, setRecommendations] = useState([]); const [loading, setLoading] = useState(true); const [newRec, setNewRec] = useState<{ type: "short_term" | "medium_term" | "long_term"; content: string; }>({ type: "short_term", content: "" }); useEffect(() => { fetchRecommendations(); }, [userId]); const fetchRecommendations = async () => { setLoading(true); try { const response = await fetch(`/api/recommendations?userId=${userId}`); if (response.ok) { const data = await response.json(); setRecommendations(data); } } catch (error) { log.error("Failed to fetch recommendations", error); } finally { setLoading(false); } }; const handleAddRecommendation = async (e: React.FormEvent) => { e.preventDefault(); try { const response = await fetch("/api/recommendations", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ userId, type: newRec.type, content: newRec.content, }), }); if (response.ok) { setNewRec({ ...newRec, content: "" }); fetchRecommendations(); } else { alert("Failed to add recommendation"); } } catch (error) { log.error("Failed to add recommendation", error); } }; const groupedRecs = { ai_plan: recommendations.filter((r) => r.type === "ai_plan"), short_term: recommendations.filter((r) => r.type === "short_term"), medium_term: recommendations.filter((r) => r.type === "medium_term"), long_term: recommendations.filter((r) => r.type === "long_term"), }; const renderSection = ( title: string, type: "short_term" | "medium_term" | "long_term" | "ai_plan", items: Recommendation[], ) => (

{title}

{items.length === 0 && (

No recommendations yet.

)} {items.map((rec) => (

{rec.recommendationText}

{rec.type === "ai_plan" && (
{rec.activityPlan && (

Activity:{" "} {rec.activityPlan}

)} {rec.dietPlan && (

Diet:{" "} {rec.dietPlan}

)}
)}

{new Date(rec.createdAt).toLocaleDateString()} -{" "} {rec.status === "completed" ? "Completed" : rec.status === "approved" ? "Approved" : "Pending"}

))}
{type !== "ai_plan" && (
setNewRec({ ...newRec, type: type as any })} /> {newRec.type === type && ( <> setNewRec({ ...newRec, content: e.target.value }) } required /> )} {newRec.type !== type && ( )}
)}
); if (loading) return
Loading recommendations...
; return (

Fitness Recommendations

{renderSection("Daily AI Plan", "ai_plan", groupedRecs.ai_plan)} {renderSection( "Short Term Goals", "short_term", groupedRecs.short_term, )} {renderSection( "Medium Term Goals", "medium_term", groupedRecs.medium_term, )} {renderSection("Long Term Goals", "long_term", groupedRecs.long_term)}
); }