"use client"; import { useSearchParams } from "next/navigation"; import { useCallback, useEffect, useState } from "react"; import { CharacterCreator } from "@/components/character/character-creator"; import { AvatarStatusCard } from "@/components/avatar/avatar-status-card"; import { DailyQuizLinkButton } from "@/components/daily-quiz/daily-quiz-link-button"; import { HabitTracker } from "@/components/habits/habit-tracker"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { useToast } from "@/components/ui/toast-provider"; import { HABIT_PET_DATA_UPDATED_EVENT } from "@/lib/app-events"; import { getAvatarCustomization, saveAvatarCustomization, saveAvatarName, type AvatarCustomization, } from "@/lib/avatar-customization-storage"; import { getOwnedItemIds } from "@/lib/shop-storage"; import { cn } from "@/lib/utils"; type AvatarTab = "home" | "customize"; export function AvatarPageContent() { const { toast } = useToast(); const searchParams = useSearchParams(); const [activeTab, setActiveTab] = useState("home"); const [customization, setCustomization] = useState( null, ); const [avatarName, setAvatarName] = useState(""); const [isSavingName, setIsSavingName] = useState(false); const [isSavingAvatar, setIsSavingAvatar] = useState(false); const [ownedVariantIds, setOwnedVariantIds] = useState([]); useEffect(() => { if (searchParams.get("tab") === "customize") { setActiveTab("customize"); } }, [searchParams]); const [loadError, setLoadError] = useState(null); const loadCustomization = useCallback(async () => { try { setLoadError(null); const [next, owned] = await Promise.all([ getAvatarCustomization(), getOwnedItemIds(), ]); setCustomization(next); setAvatarName(next.name); setOwnedVariantIds(owned); } catch (error) { setLoadError( error instanceof Error ? error.message : "Could not load your avatar.", ); } }, []); useEffect(() => { void loadCustomization(); window.addEventListener(HABIT_PET_DATA_UPDATED_EVENT, loadCustomization); return () => { window.removeEventListener(HABIT_PET_DATA_UPDATED_EVENT, loadCustomization); }; }, [loadCustomization]); const handleSaveName = async () => { setIsSavingName(true); try { const savedName = await saveAvatarName(avatarName); setAvatarName(savedName); toast("Pet name saved.", "success"); } catch (error) { toast( error instanceof Error ? error.message : "Could not save name.", "error", ); } finally { setIsSavingName(false); } }; const handleSaveAvatar = async (nextCustomization: AvatarCustomization) => { setIsSavingAvatar(true); try { await saveAvatarCustomization({ ...nextCustomization, name: avatarName.trim() || nextCustomization.name, equippedItems: customization?.equippedItems ?? [], }); toast("Avatar updated.", "success"); setActiveTab("home"); await loadCustomization(); } catch (error) { toast( error instanceof Error ? error.message : "Could not save avatar.", "error", ); throw error; } finally { setIsSavingAvatar(false); } }; if (loadError) { return

{loadError}

; } if (!customization) { return (

Loading your pet...

); } return (
{( [ { id: "home", label: "Overview" }, { id: "customize", label: "Customize" }, ] as const ).map((tab) => ( ))}
setAvatarName(event.target.value)} />
{activeTab === "home" ? ( <> ) : ( )}
); }