import { Avatar, Badge, Indicator, Menu, UnstyledButton, useMantineTheme } from '@mantine/core'; import { useDisclosure } from '@mantine/hooks'; import { IconDashboard, IconHomeShare, IconInfoCircle, IconLogin, IconLogout, IconMoonStars, IconSun, IconUserCog, } from '@tabler/icons-react'; import { useQuery } from '@tanstack/react-query'; import { User } from 'next-auth'; import { signOut, useSession } from 'next-auth/react'; import { useTranslation } from 'next-i18next'; import Link from 'next/link'; import { forwardRef } from 'react'; import { AboutModal } from '~/components/layout/header/About/AboutModal'; import { useColorScheme } from '~/hooks/use-colorscheme'; import { usePackageAttributesStore } from '~/tools/client/zustands/usePackageAttributesStore'; import { REPO_URL } from '../../../../data/constants'; import { useBoardLink } from '../Templates/BoardLayout'; export const AvatarMenu = () => { const { t } = useTranslation('layout/header'); const [aboutModalOpened, aboutModal] = useDisclosure(false); const { data: sessionData } = useSession(); const { colorScheme, toggleColorScheme } = useColorScheme(); const newVersionAvailable = useNewVersionAvailable(); const Icon = colorScheme === 'dark' ? IconSun : IconMoonStars; const defaultBoardHref = useBoardLink('/board'); return ( <> } onClick={toggleColorScheme} > {t('actions.avatar.switchTheme')} {sessionData?.user && ( <> } > {t('actions.avatar.preferences')} } > {t('actions.avatar.defaultBoard')} }> {t('actions.avatar.manage')} )} } rightSection={ newVersionAvailable && ( {t('actions.avatar.about.new')} ) } onClick={() => aboutModal.open()} > {t('actions.avatar.about.label')} {sessionData?.user ? ( } color="red" onClick={() => signOut({ redirect: false, }).then(() => window.location.reload()) } > {t('actions.avatar.logout', { username: sessionData.user.name, })} ) : ( } component={Link} href="/auth/login"> {t('actions.avatar.login')} )} ); }; type CurrentUserAvatarProps = { newVersionAvailable: boolean; user: User | null; }; const CurrentUserAvatar = forwardRef( ({ user, newVersionAvailable, ...others }, ref) => { const { primaryColor } = useMantineTheme(); if (!user) return ; if (!newVersionAvailable) return ( {user.name?.slice(0, 2).toUpperCase()} ); return ( {user.name?.slice(0, 2).toUpperCase()} ); } ); const useNewVersionAvailable = () => { const { attributes } = usePackageAttributesStore(); const { data } = useQuery({ queryKey: ['github/latest'], cacheTime: 1000 * 60 * 60 * 24, staleTime: 1000 * 60 * 60 * 5, queryFn: () => fetch(`https://api.github.com/repos/${REPO_URL}/releases/latest`).then((res) => res.json()), }); return data?.tag_name > `v${attributes.packageVersion}` ? data?.tag_name : undefined; };