"use client"; import { CheckCircle2 } from "lucide-react"; import { useCallback, useEffect, useState } from "react"; import { WellnessSlider } from "@/components/daily-quiz/wellness-slider"; import { DailyQuizCountdown } from "@/components/daily-quiz/daily-quiz-countdown"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { Label } from "@/components/ui/label"; import { defaultDailyQuizAnswers, formatSleepHours, SLEEP_HOURS_MAX, SLEEP_HOURS_MIN, SLEEP_HOURS_STEP, type DailyQuizAnswers, type DailyQuizSubmission, } from "@/lib/avatar-state"; import { getCachedQuizTabData, prefetchQuizTabData, } from "@/lib/app-tab-data-cache"; import { HABIT_PET_DATA_UPDATED_EVENT } from "@/lib/app-events"; import { saveDailyEntry } from "@/lib/daily-quiz-storage"; import { JOURNAL_MAX_LENGTH } from "@/lib/journal-safety"; export function DailyQuizForm() { const cachedQuiz = getCachedQuizTabData(); const [answers, setAnswers] = useState( cachedQuiz?.submission?.answers ?? defaultDailyQuizAnswers, ); const [journal, setJournal] = useState(cachedQuiz?.submission?.journal ?? ""); const [submission, setSubmission] = useState( cachedQuiz?.submission ?? null, ); const [isSubmitting, setIsSubmitting] = useState(false); const [error, setError] = useState(null); const [isReady, setIsReady] = useState(cachedQuiz !== null); const applyQuizData = useCallback( (data: NonNullable>) => { if (data.submission) { setSubmission(data.submission); setAnswers(data.submission.answers); setJournal(data.submission.journal); } else { setSubmission(null); } }, [], ); useEffect(() => { let cancelled = false; async function loadDailyCheckIn() { try { const data = await prefetchQuizTabData({ force: true }); if (cancelled) { return; } applyQuizData(data); } catch (loadError) { if (cancelled) { return; } setError( loadError instanceof Error ? loadError.message : "Could not load today's check-in.", ); } finally { if (!cancelled) { setIsReady(true); } } } void loadDailyCheckIn(); const handleDataUpdated = () => { void loadDailyCheckIn(); }; window.addEventListener(HABIT_PET_DATA_UPDATED_EVENT, handleDataUpdated); return () => { cancelled = true; window.removeEventListener(HABIT_PET_DATA_UPDATED_EVENT, handleDataUpdated); }; }, [applyQuizData]); const isCompleted = submission !== null; const canSubmit = !isCompleted && !isSubmitting; const updateAnswer = ( key: K, value: DailyQuizAnswers[K], ) => { setAnswers((current) => ({ ...current, [key]: value, })); }; const handleSubmit = async () => { if (!canSubmit) { return; } setIsSubmitting(true); setError(null); try { const savedEntry = await saveDailyEntry(answers, journal); setSubmission(savedEntry); } catch (submitError) { setError( submitError instanceof Error ? submitError.message : "Could not save your daily check-in.", ); } finally { setIsSubmitting(false); } }; if (!isReady) { return (

Loading today's check-in...

); } return (
{isCompleted && submission ? (

Today's check-in is complete

Your answers are saved below. Come back tomorrow for your next check-in. How you did today affects your bit.

{ void prefetchQuizTabData({ force: true }).then(applyQuizData); }} />
) : (
Today's check-in Not completed
)} {isCompleted ? "Your answers today" : "Wellness"} {isCompleted ? "What you answered today." : "Rate your wellness from 1 to 5. Sleep length uses hours."} updateAnswer("feeling", value)} /> updateAnswer("stress", value)} /> updateAnswer("energy", value)} /> updateAnswer("sleepLength", value)} /> updateAnswer("sleepQuality", value)} /> Daily journal {isCompleted ? "What you wrote today." : "Write about your day."}