import { Avatar, Badge, Menu, UnstyledButton, useMantineTheme } from '@mantine/core'; import { useDisclosure } from '@mantine/hooks'; import { IconDashboard, 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 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'; export const AvatarMenu = () => { const [aboutModalOpened, aboutModal] = useDisclosure(false); const { data: sessionData } = useSession(); const { colorScheme, toggleColorScheme } = useColorScheme(); const newVersionAvailable = useNewVersionAvailable(); const Icon = colorScheme === 'dark' ? IconSun : IconMoonStars; return ( <> } onClick={toggleColorScheme}> Switch theme {sessionData?.user && ( <> } > User preferences }> Default Dashboard )} } rightSection={ newVersionAvailable && ( New ) } onClick={() => aboutModal.open()} > About {sessionData?.user ? ( } color="red" onClick={() => signOut({ redirect: false, }).then(() => window.location.reload()) } > Logout from {sessionData.user.name} ) : ( } component={Link} href="/auth/login"> Login )} ); }; type CurrentUserAvatarProps = { user: User | null; }; const CurrentUserAvatar = forwardRef( ({ user, ...others }, ref) => { const { primaryColor } = useMantineTheme(); if (!user) return ; 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; };