import React, { useState, useRef, useEffect, useCallback } from 'react'; import { createPortal } from 'react-dom'; import { signOut } from 'next-auth/react'; interface UserMenuProps { userEmail?: string | null; onOpenSettings: () => void; trigger?: React.ReactNode; language?: string; } export default function UserMenu({ userEmail, onOpenSettings, trigger, language = 'en' }: UserMenuProps) { const [isOpen, setIsOpen] = useState(false); const menuRef = useRef(null); const triggerRef = useRef(null); const [position, setPosition] = useState<{ top: number; right: number } | null>(null); const labels = { en: { signedIn: 'Signed in as', settings: 'Settings', signOut: 'Sign Out' }, de: { signedIn: 'Angemeldet als', settings: 'Einstellungen', signOut: 'Abmelden' }, fr: { signedIn: 'Connecté en tant que', settings: 'Paramètres', signOut: 'Se déconnecter' }, es: { signedIn: 'Conectado como', settings: 'Ajustes', signOut: 'Cerrar sesión' }, it: { signedIn: 'Connesso come', settings: 'Impostazioni', signOut: 'Esci' }, }[language] || { signedIn: 'Signed in as', settings: 'Settings', signOut: 'Sign Out' }; const updatePosition = useCallback(() => { if (triggerRef.current) { const rect = triggerRef.current.getBoundingClientRect(); setPosition({ top: rect.bottom + 8, right: window.innerWidth - rect.right, }); } }, []); useEffect(() => { if (!isOpen) return; updatePosition(); window.addEventListener('resize', updatePosition); window.addEventListener('scroll', updatePosition, true); return () => { window.removeEventListener('resize', updatePosition); window.removeEventListener('scroll', updatePosition, true); }; }, [isOpen, updatePosition]); useEffect(() => { if (!isOpen) return; const handleClickOutside = (event: MouseEvent) => { if ( menuRef.current && !menuRef.current.contains(event.target as Node) && triggerRef.current && !triggerRef.current.contains(event.target as Node) ) { setIsOpen(false); } }; document.addEventListener('mousedown', handleClickOutside); return () => document.removeEventListener('mousedown', handleClickOutside); }, [isOpen]); const menuContent = isOpen && position ? createPortal(

{labels.signedIn}

{userEmail || 'User'}

, document.body ) : null; return ( <>
{trigger ? (
setIsOpen(!isOpen)}>{trigger}
) : ( )}
{menuContent} ); }