"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"; import { toast } from "@/lib/toast"; interface Recommendation { id: string; userId: string; fitnessProfileId: string; recommendationText: string; activityPlan: string; dietPlan: string; status: "pending" | "approved" | "rejected"; generatedAt: string; approvedAt?: string | null; approvedBy?: string | null; createdAt: string; updatedAt: string; } interface RecommendationsProps { userId: string; } export function Recommendations({ userId }: RecommendationsProps) { const [recommendations, setRecommendations] = useState([]); const [loading, setLoading] = useState(true); const [generating, setGenerating] = useState(false); useEffect(() => { fetchRecommendations(); }, [userId]); const fetchRecommendations = async () => { setLoading(true); try { const response = await fetch(`/api/recommendations?userId=${userId}`); if (response.ok) { const result = await response.json(); // API returns { success: true, data: [...], meta: {...} } // Extract the recommendations array from the data field const recsArray = Array.isArray(result.data) ? result.data : result.data?.recommendations || []; setRecommendations(recsArray); } } catch (error) { log.error("Failed to fetch recommendations", error); } finally { setLoading(false); } }; const handleGenerateRecommendation = async () => { setGenerating(true); try { const response = await fetch("/api/recommendations/generate", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ userId }), }); if (response.ok) { fetchRecommendations(); toast.success("AI recommendation generated successfully"); } else { const error = await response.json(); toast.error(error.error || "Failed to generate recommendation"); } } catch (error) { log.error("Failed to generate recommendation", error); toast.error("Failed to generate recommendation"); } finally { setGenerating(false); } }; const handleApproveRecommendation = async (recommendationId: string) => { try { const response = await fetch("/api/recommendations/approve", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ recommendationId, status: "approved", }), }); if (response.ok) { fetchRecommendations(); toast.success("Recommendation approved"); } else { toast.error("Failed to approve recommendation"); } } catch (error) { log.error("Failed to approve recommendation", error); toast.error("Failed to approve recommendation"); } }; const handleRejectRecommendation = async (recommendationId: string) => { try { const response = await fetch("/api/recommendations", { method: "PUT", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ recommendationId, status: "rejected", }), }); if (response.ok) { fetchRecommendations(); toast.success("Recommendation rejected"); } else { toast.error("Failed to reject recommendation"); } } catch (error) { log.error("Failed to reject recommendation", error); toast.error("Failed to reject recommendation"); } }; if (loading) return
Loading recommendations...
; return (

AI Fitness Recommendations

{recommendations.length === 0 ? (

No recommendations yet. Click "Generate New Recommendation" to create one.

) : (
{recommendations.map((rec) => (

Recommendation

{rec.recommendationText}

{rec.activityPlan && (

Activity Plan

{rec.activityPlan}

)} {rec.dietPlan && (

Diet Plan

{rec.dietPlan}

)}
Generated: {new Date(rec.generatedAt).toLocaleString()} {rec.approvedAt && ( <> {" "} • Approved:{" "} {new Date(rec.approvedAt).toLocaleString()} )}
{rec.status.charAt(0).toUpperCase() + rec.status.slice(1)} {rec.status === "pending" && (
)}
))}
)}
); }