'use client'; import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { useTranslations } from 'next-intl'; import { Link } from '@/i18n/navigation'; import { Settings, AlertTriangle, Building2, CreditCard, User, LogOut, ChevronDown, } from 'lucide-react'; import { useAuth } from '@/lib/hooks/useAuth'; import { authApi } from '@/lib/api/auth'; import type { SubscriptionAlertData } from '@/types/subscription'; function warningTooltip( data: SubscriptionAlertData | null, t: ReturnType>, ): string { if (!data?.showWarning) return ''; if (data.noActiveSubscription) return t('noActiveSubscription'); if (data.trialExpired) return t('trialEnded'); if (data.trialEndingSoon) return t('trialEndingSoon'); if (data.seatsLow) return t('seatsLow'); return t('reviewSubscriptions'); } export function DashboardAccountMenu() { const t = useTranslations('auth'); const tAccount = useTranslations('accountMenu'); const { user, currentOrganization, logout } = useAuth(); const [open, setOpen] = useState(false); const menuRef = useRef(null); const [alert, setAlert] = useState(null); const isOwner = currentOrganization?.isOwner ?? false; useEffect(() => { const onDocClick = (e: MouseEvent) => { if (menuRef.current && !menuRef.current.contains(e.target as Node)) { setOpen(false); } }; document.addEventListener('mousedown', onDocClick); return () => document.removeEventListener('mousedown', onDocClick); }, []); useEffect(() => { if (!isOwner || !currentOrganization) { setAlert(null); return; } let cancelled = false; void (async () => { try { const res = await authApi.getSubscriptionAlert(); if (!cancelled && res.success) setAlert(res.data); } catch { if (!cancelled) setAlert(null); } })(); return () => { cancelled = true; }; }, [isOwner, currentOrganization?.id]); const showWarning = Boolean(isOwner && alert?.showWarning); const tooltip = useMemo(() => warningTooltip(alert, tAccount), [alert, tAccount]); const handleLogout = useCallback(() => { setOpen(false); void logout(); }, [logout]); return (
{open && (

{t('signedIn')}

{user?.email}

{currentOrganization?.name}

setOpen(false)} > {t('switchOrganization')} {isOwner && ( setOpen(false)} > {t('subscriptions')} )} setOpen(false)} > {t('account')}
)}
); }