"use client"; import { Pencil } from "lucide-react"; import { useEffect, useRef, useState } from "react"; import { Input } from "@/components/ui/input"; import { DEFAULT_AVATAR_NAME, saveAvatarName, } from "@/lib/avatar-customization-storage"; import { cn } from "@/lib/utils"; type PetNameHeaderProps = { name: string; moodLabel: string; editable?: boolean; onNameChange?: (name: string) => void; className?: string; }; export function PetNameHeader({ name, moodLabel, editable = true, onNameChange, className, }: PetNameHeaderProps) { const [displayName, setDisplayName] = useState(name); const [isEditing, setIsEditing] = useState(false); const [draft, setDraft] = useState(name); const [isSaving, setIsSaving] = useState(false); const [error, setError] = useState(null); const inputRef = useRef(null); useEffect(() => { setDisplayName(name); if (!isEditing) { setDraft(name); } }, [name, isEditing]); useEffect(() => { if (isEditing) { inputRef.current?.focus(); inputRef.current?.select(); } }, [isEditing]); const startEditing = () => { if (!editable || isSaving) { return; } setDraft(displayName); setError(null); setIsEditing(true); }; const cancelEditing = () => { setDraft(displayName); setError(null); setIsEditing(false); }; const commitName = async () => { const trimmed = draft.trim() || DEFAULT_AVATAR_NAME; if (trimmed === displayName) { setIsEditing(false); return; } if (!editable) { setIsEditing(false); return; } setIsSaving(true); setError(null); try { const saved = await saveAvatarName(trimmed); setDisplayName(saved); onNameChange?.(saved); setIsEditing(false); } catch (commitError) { setError( commitError instanceof Error ? commitError.message : "Could not save pet name.", ); setDraft(displayName); } finally { setIsSaving(false); } }; return (
{ if (isEditing) { event.stopPropagation(); } }} > {isEditing ? (
setDraft(event.target.value)} onKeyDown={(event) => { if (event.key === "Enter") { event.preventDefault(); void commitName(); } if (event.key === "Escape") { event.preventDefault(); cancelEditing(); } }} onBlur={() => { void commitName(); }} /> {error ?

{error}

: null}
) : (

{displayName}

{editable ? ( ) : null}
)}

{moodLabel}

); }