import { useState, useRef, useEffect } from 'react' import { SearchDropdown } from '../SearchDropdown' import { RecentPlays } from './RecentPlays' import styles from './header.module.css' type SearchResultItem = { result_type: string slug: string name: string detail?: string } type UserInfo = { sub: string name?: string email?: string } type HeaderProps = { searchOpen: boolean searchResults: SearchResultItem[] onSearchSelect: (type: string, slug: string) => void onPlayTrack: (slug: string) => void user: UserInfo } function UserMenu({ user, onShowRecent }: { user: UserInfo; onShowRecent: () => void }) { const [open, setOpen] = useState(false) const ref = useRef(null) useEffect(() => { function handleClick(e: MouseEvent) { if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false) } document.addEventListener('mousedown', handleClick) return () => document.removeEventListener('mousedown', handleClick) }, []) const initials = (user.name ?? user.sub) .split(' ') .map((w) => w[0]) .slice(0, 2) .join('') .toUpperCase() return (
{open && (
{user.name ?? user.sub}
{user.email &&
{user.email}
}
Sign out
)}
) } export function Header({ searchOpen, searchResults, onSearchSelect, onPlayTrack, user, }: HeaderProps) { const [showRecent, setShowRecent] = useState(false) return ( <>
Furumi v
setShowRecent(true)} />
{showRecent && ( setShowRecent(false)} onPlay={onPlayTrack} /> )} ) }