"use client"; import { useEffect, useState } from "react"; import { useUser } from "@clerk/nextjs"; interface User { id: string; firstName: string; lastName: string; email: string; } interface Recommendation { id: string; userId: string; content: string; activityPlan: string; dietPlan: string; status: string; createdAt: Date; } export default function RecommendationsPage() { const { user } = useUser(); const [users, setUsers] = useState([]); const [pendingRecommendations, setPendingRecommendations] = useState([]); const [loading, setLoading] = useState(true); const [generating, setGenerating] = useState(null); const [useExternalModel, setUseExternalModel] = useState(false); useEffect(() => { fetchData(); }, []); const fetchData = async () => { try { // Fetch users const usersRes = await fetch("/api/users"); const usersData = await usersRes.json(); setUsers(usersData.users || []); // Fetch pending recommendations const recsRes = await fetch("/api/recommendations"); const recsData = await recsRes.json(); const allRecs = recsData.recommendations || []; setPendingRecommendations(allRecs.filter((r: any) => r.status === 'pending')); } catch (error) { console.error("Error fetching data:", error); } finally { setLoading(false); } }; const handleGenerate = async (userId: string) => { setGenerating(userId); try { const res = await fetch("/api/recommendations/generate", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ userId, useExternalModel }), }); if (!res.ok) { const error = await res.json(); alert(`Error: ${error.error}`); } else { alert("Recommendation generated successfully!"); fetchData(); // Refresh data } } catch (error) { console.error(error); alert("Failed to generate recommendation."); } finally { setGenerating(null); } }; const handleApprove = async (recommendationId: string, status: "approved" | "rejected") => { try { const res = await fetch("/api/recommendations/approve", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ recommendationId, status, approvedBy: user?.id || "admin", }), }); if (!res.ok) { const errorData = await res.json(); alert(`Failed to update status: ${errorData.error || 'Unknown error'}`); } else { fetchData(); // Refresh data } } catch (error) { console.error(error); alert("Error processing request"); } }; const handleEdit = async (rec: Recommendation) => { const newContent = prompt("Edit Advice:", rec.content); const newActivityPlan = prompt("Edit Activity Plan:", rec.activityPlan); const newDietPlan = prompt("Edit Diet Plan:", rec.dietPlan); if (newContent === null || newActivityPlan === null || newDietPlan === null) { // User cancelled one of the prompts return; } try { const res = await fetch("/api/recommendations", { method: "PUT", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ id: rec.id, content: newContent, activityPlan: newActivityPlan, dietPlan: newDietPlan, }), }); if (!res.ok) { const errorData = await res.json(); alert(`Failed to update recommendation: ${errorData.error || 'Unknown error'}`); } else { alert("Recommendation updated successfully!"); fetchData(); // Refresh data } } catch (error) { console.error("Error updating recommendation:", error); alert("Failed to update recommendation."); } }; if (loading) { return (
Loading...
); } return (

AI Recommendations

{/* Model Selection Toggle */}
{useExternalModel ? "DeepSeek AI" : "Local Ollama"} {useExternalModel ? "External" : "Local"}
{/* Generate Section */}

Generate Recommendations

Select a user to generate a new daily recommendation.

    {users.map((user) => (
  • {user.firstName} {user.lastName}

    {user.email}

  • ))} {users.length === 0 && (

    No users found.

    )}
{/* Pending Approvals Section */}

Pending Approvals

{pendingRecommendations.length === 0 ? (

No pending recommendations.

) : (
    {pendingRecommendations.map((rec) => (
  • For: User {rec.userId}

    {new Date(rec.createdAt).toLocaleDateString()}
    Advice: {rec.content}
    Activity: {rec.activityPlan}
    Diet: {rec.dietPlan}
  • ))}
)}
); }