import { useState, useRef, useEffect } from 'react' import { Link } from 'react-router-dom' import { useAuth } from '../context/AuthContext' import { useTutorialOptional } from '../context/TutorialContext' import { SampleDataMenuItem } from './SampleDataMenuItem' import { SpeechSettingsMenuItem } from './SpeechSettingsPanel' type Props = { onProfile: () => void onAccount: () => void onClearData: () => void } /** * Account menu: hover opens transiently; click pins until click again, * menu item action, Escape, or outside click. */ export function UserMenu({ onProfile, onAccount, onClearData }: Props) { const { user, signOut } = useAuth() const tutorial = useTutorialOptional() const [hoverOpen, setHoverOpen] = useState(false) const [pinned, setPinned] = useState(false) const [speechOpen, setSpeechOpen] = useState(false) const [sampleDataOpen, setSampleDataOpen] = useState(false) const ref = useRef(null) const open = pinned || hoverOpen const closeAll = () => { setPinned(false) setHoverOpen(false) setSpeechOpen(false) setSampleDataOpen(false) } useEffect(() => { if (!open) return function onPointerDown(e: MouseEvent) { if (ref.current && !ref.current.contains(e.target as Node)) { closeAll() } } function onKeyDown(e: KeyboardEvent) { if (e.key === 'Escape') closeAll() } document.addEventListener('mousedown', onPointerDown) document.addEventListener('keydown', onKeyDown) return () => { document.removeEventListener('mousedown', onPointerDown) document.removeEventListener('keydown', onKeyDown) } }, [open]) const label = user ? user.firstName || user.email : 'Guest' return (
setHoverOpen(true)} onMouseLeave={() => { if (!pinned) { setHoverOpen(false) setSpeechOpen(false) setSampleDataOpen(false) } }} > {open && (
{ setSampleDataOpen((s) => !s) setSpeechOpen(false) }} onActionComplete={closeAll} />
{tutorial && ( <>
)} { setSpeechOpen((s) => !s) setSampleDataOpen(false) }} /> {user ? ( ) : ( Sign In / Create Account )}
)}
) }