import React from 'react' import { Avatar } from './Avatar' import { DropdownMenu, type DropdownMenuItemProps } from './DropdownMenu' import { cn } from '@/utils/cn' export interface UserMenuUser { name?: string | null email: string avatarUrl?: string | null } export interface UserMenuIntegration { label: string status: 'connected' | 'disconnected' | 'warning' helperText?: string } export interface UserMenuExtraItem { label: string leftIcon?: string description?: string tone?: DropdownMenuItemProps['tone'] disabled?: boolean onSelect?: () => void } export interface UserMenuProps { user: UserMenuUser integrations?: UserMenuIntegration[] placement?: 'sidebar' | 'topbar' onSettingsClick?: () => void onLogout?: () => void extraItems?: UserMenuExtraItem[] className?: string } const integrationConfig: Record< UserMenuIntegration['status'], { label: string; dot: string; text: string; avatarStatus: 'online' | 'offline' | 'warning' } > = { connected: { label: '연결됨', dot: 'bg-teal-500', text: 'text-teal-700', avatarStatus: 'online', }, disconnected: { label: '미연결', dot: 'bg-slate-300', text: 'text-slate-500', avatarStatus: 'offline', }, warning: { label: '확인 필요', dot: 'bg-amber-500', text: 'text-amber-700', avatarStatus: 'warning', }, } const getAvatarStatus = (integrations: UserMenuIntegration[]): 'online' | 'offline' | 'warning' | 'none' => { if (integrations.some((integration) => integration.status === 'warning')) return 'warning' if (integrations.some((integration) => integration.status === 'connected')) return 'online' if (integrations.length > 0) return 'offline' return 'none' } export const UserMenu: React.FC = ({ user, integrations = [], placement = 'sidebar', onSettingsClick, onLogout, extraItems = [], className, }) => { const displayName = user.name || user.email const avatarStatus = getAvatarStatus(integrations) const isSidebar = placement === 'sidebar' const trigger = ( ) return (

{displayName}

{user.email}

{integrations.length > 0 && ( <> 연동 상태
{integrations.map((integration) => { const cfg = integrationConfig[integration.status] return (
{integration.label} {cfg.label}
{integration.helperText && (

{integration.helperText}

)}
) })}
)} {(extraItems.length > 0 || onSettingsClick || onLogout) && } {extraItems.map((item) => ( {item.label} ))} {onSettingsClick && ( 계정 설정 )} {onLogout && ( 로그아웃 )}
) }