diff --git a/frontend/hooks/useDailyQuest.ts b/frontend/hooks/useDailyQuest.ts new file mode 100644 index 0000000..8c52254 --- /dev/null +++ b/frontend/hooks/useDailyQuest.ts @@ -0,0 +1,27 @@ +import { useQuery, useMutation } from "@tanstack/react-query"; +import { dailyQuestApi } from "../lib/api/dailyQuestApi"; +import { DailyQuest, DailyQuestStatus } from "../lib/types/dailyQuest"; + +// Fetch today's quest +export function useDailyQuest() { + return useQuery({ + queryKey: ["dailyQuest"], + queryFn: dailyQuestApi.getDailyQuest, + }); +} + +// Poll quest status +export function useDailyQuestStatus() { + return useQuery({ + queryKey: ["dailyQuestStatus"], + queryFn: dailyQuestApi.getDailyQuestStatus, + refetchInterval: 5000, // poll every 5s + }); +} + +// Complete quest mutation +export function useCompleteDailyQuest() { + return useMutation({ + mutationFn: dailyQuestApi.completeDailyQuest, + }); +} diff --git a/frontend/lib/api/dailyQuestApi.ts b/frontend/lib/api/dailyQuestApi.ts new file mode 100644 index 0000000..4c0ee4f --- /dev/null +++ b/frontend/lib/api/dailyQuestApi.ts @@ -0,0 +1,23 @@ +import { DailyQuest, DailyQuestStatus } from "../types/dailyQuest"; + +const BASE_URL = "/daily-quest"; + +export const dailyQuestApi = { + async getDailyQuest(): Promise { + const res = await fetch(BASE_URL, { method: "GET" }); + if (!res.ok) throw new Error("Failed to fetch daily quest"); + return res.json(); + }, + + async getDailyQuestStatus(): Promise { + const res = await fetch(`${BASE_URL}/status`, { method: "GET" }); + if (!res.ok) throw new Error("Failed to fetch daily quest status"); + return res.json(); + }, + + async completeDailyQuest(): Promise<{ success: boolean; pointsEarned: number }> { + const res = await fetch(`${BASE_URL}/complete`, { method: "POST" }); + if (!res.ok) throw new Error("Failed to complete daily quest"); + return res.json(); + }, +}; diff --git a/frontend/lib/types/dailyQuest.ts b/frontend/lib/types/dailyQuest.ts new file mode 100644 index 0000000..6fac307 --- /dev/null +++ b/frontend/lib/types/dailyQuest.ts @@ -0,0 +1,23 @@ +export interface Puzzle { + id: string; + question: string; + options: string[]; + correctAnswer: string; +} + +export interface DailyQuest { + id: string; + questDate: string; + totalQuestions: number; + completedQuestions: number; + isCompleted: boolean; + pointsEarned: number; + puzzles: Puzzle[]; +} + +export interface DailyQuestStatus { + totalQuestions: number; + completedQuestions: number; + isCompleted: boolean; + progressPercentage: number; +}