import {ReactElement, useContext} from 'react'; import {ListboxItemProps} from '@common/ui/forms/listbox/item'; import {SiteConfigContext} from '@common/core/settings/site-config-context'; import {useLogout} from '@common/auth/requests/logout'; import {useCustomMenu} from '@common/menus/use-custom-menu'; import {useSettings} from '@common/core/settings/use-settings'; import {useAuth} from '@common/auth/use-auth'; import {useNavigate} from '@common/utils/hooks/use-navigate'; import {useThemeSelector} from '@common/ui/themes/theme-selector-context'; import { Menu, MenuItem, MenuTrigger, } from '@common/ui/navigation/menu/menu-trigger'; import {NotificationsIcon} from '@common/icons/material/Notifications'; import {Trans} from '@common/i18n/trans'; import {PaymentsIcon} from '@common/icons/material/Payments'; import {createSvgIconFromTree} from '@common/icons/create-svg-icon'; import {AccountCircleIcon} from '@common/icons/material/AccountCircle'; import {DarkModeIcon} from '@common/icons/material/DarkMode'; import {LightModeIcon} from '@common/icons/material/LightMode'; import {ExitToAppIcon} from '@common/icons/material/ExitToApp'; interface Props { children: ReactElement; items?: ReactElement[]; } export function NavbarAuthMenu({children, items}: Props) { const {auth} = useContext(SiteConfigContext); const logout = useLogout(); const menu = useCustomMenu('auth-dropdown'); const {notifications, themes} = useSettings(); const {user, isSubscribed} = useAuth(); const navigate = useNavigate(); const {selectedTheme, selectTheme} = useThemeSelector(); if (!selectedTheme || !user) return null; const hasUnreadNotif = !!user.unread_notifications_count; const notifMenuItem = ( } onSelected={() => { navigate('/notifications'); }} > {hasUnreadNotif ? ` (${user.unread_notifications_count})` : undefined} ); const billingMenuItem = ( } onSelected={() => { navigate('/billing'); }} > ); return ( {children} {menu && menu.items.map(item => { const Icon = item.icon && createSvgIconFromTree(item.icon); return ( } onSelected={() => { if (item.type === 'link') { window.open(item.action, '_blank'); } else { navigate(item.action); } }} > ); })} {auth.getUserProfileLink && ( } onSelected={() => { navigate(auth.getUserProfileLink!(user)); }} > )} {items?.map(item => item)} {notifications?.integrated ? notifMenuItem : undefined} {isSubscribed && billingMenuItem} {themes?.user_change && !selectedTheme.is_dark && ( } onSelected={() => { selectTheme('dark'); }} > )} {themes?.user_change && selectedTheme.is_dark && ( } onSelected={() => { selectTheme('light'); }} > )} } onSelected={() => { logout.mutate(); }} > ); }