"use client"; import { useEffect, useState } from "react"; import TaskCard from "./TaskCard"; interface Task { id: string; name: string; description: string; points: number; type: "daily" | "quiz" | "survey" | "referral" | "learning"; completed?: boolean; } export default function TaskList() { const [tasks, setTasks] = useState([]); const [loading, setLoading] = useState(true); const [filter, setFilter] = useState("all"); useEffect(() => { fetchTasks(); }, []); const fetchTasks = async () => { try { const token = localStorage.getItem("token"); const response = await fetch("/api/tasks", { headers: { Authorization: `Bearer ${token}` }, }); const data = await response.json(); if (data.success && data.data) { // API returns { available: Task[], completed: CompletedTask[] } const availableTasks = data.data.available || []; const completedIds = new Set((data.data.completed || []).map((c: { taskId: string }) => c.taskId)); // Mark tasks as completed if in completed list const tasksWithStatus = availableTasks.map((task: Task) => ({ ...task, completed: completedIds.has(task.id), })); setTasks(tasksWithStatus); } else if (Array.isArray(data)) { setTasks(data); } } catch (error) { console.error("Failed to fetch tasks:", error); } finally { setLoading(false); } }; const handleComplete = async (taskId: string) => { try { const token = localStorage.getItem("token"); const response = await fetch(`/api/tasks/${taskId}/complete`, { method: "POST", headers: { Authorization: `Bearer ${token}` }, }); if (response.ok) { setTasks(tasks.map(task => task.id === taskId ? { ...task, completed: true } : task )); } } catch (error) { console.error("Failed to complete task:", error); } }; const groupedTasks = tasks.reduce((acc, task) => { if (!acc[task.type]) { acc[task.type] = []; } acc[task.type].push(task); return acc; }, {} as Record); const filteredTasks = filter === "all" ? tasks : tasks.filter(task => task.type === filter); const categories = [ { id: "all", label: "All Tasks", count: tasks.length }, { id: "daily", label: "Daily", count: groupedTasks.daily?.length || 0 }, { id: "quiz", label: "Quizzes", count: groupedTasks.quiz?.length || 0 }, { id: "survey", label: "Surveys", count: groupedTasks.survey?.length || 0 }, { id: "referral", label: "Referrals", count: groupedTasks.referral?.length || 0 }, { id: "learning", label: "Learning", count: groupedTasks.learning?.length || 0 }, ]; if (loading) { return (
); } return (
{categories.map(category => ( ))}
{filteredTasks.length === 0 ? (

No tasks available in this category

) : (
{filteredTasks.map(task => ( ))}
)}
); }