"use client"; import { api } from "@/lib/api"; import { formatCurrency, formatTimeRemaining } from "@/lib/utils"; import { Task, TaskStatus, TaskType } from "@/types"; import { useQuery } from "@tanstack/react-query"; import { motion } from "framer-motion"; import { Filter } from "lucide-react"; import Link from "next/link"; import { useState } from "react"; import { LoadingSpinner } from "@/components/ui/LoadingSpinner"; function TaskCard({ task, index }: { task: Task; index: number }) { const taskTypeLabels: Record = { [TaskType.TEXT_VERIFICATION]: "Text", [TaskType.IMAGE_LABELING]: "Image", [TaskType.SURVEY]: "Survey", [TaskType.CONTENT_MODERATION]: "Moderation", }; const taskTypeColors: Record = { [TaskType.TEXT_VERIFICATION]: "from-green-500 to-green-600", [TaskType.IMAGE_LABELING]: "from-green-600 to-green-700", [TaskType.SURVEY]: "from-green-400 to-green-500", [TaskType.CONTENT_MODERATION]: "from-green-500 to-green-700", }; return (
{/* Header */}

{task.title}

{task.paymentAmount >= 5 && ( 💰 High )}
{/* Description */}

{task.description}

{/* Stats */}
{formatCurrency(task.paymentAmount)}
{task.spotsRemaining} /{task.maxSubmissions} spots
{/* Progress Bar */}
{/* Footer */}
{taskTypeLabels[task.taskType]} ⏰ {formatTimeRemaining(task.expiresAt)}
); } export default function TasksPage() { const [filters, setFilters] = useState({ status: TaskStatus.OPEN, taskType: undefined as TaskType | undefined, }); const { data, isLoading } = useQuery({ queryKey: ["tasks", filters], queryFn: () => api.tasks.list(filters), }); const tasks = data?.data || []; if (isLoading) { return (
); } return (
{/* Animated Background */}
{/* Header */}
{tasks.length} Tasks Available

Available Tasks

Complete AI-verified tasks and earn cUSD instantly on Celo Sepolia

{/* Filters */}

Filter Tasks

{/* Task Grid */} {tasks.length > 0 ? (
{tasks.map((task: Task, index: number) => ( ))}
) : (

No tasks available

Check back soon for new opportunities!

)}
); }