2023-07-29 21:15:55 +02:00
|
|
|
import { Avatar, Badge, Menu, UnstyledButton, useMantineTheme } from '@mantine/core';
|
|
|
|
|
import { useDisclosure } from '@mantine/hooks';
|
|
|
|
|
import {
|
|
|
|
|
IconDashboard,
|
|
|
|
|
IconInfoCircle,
|
|
|
|
|
IconLogin,
|
|
|
|
|
IconLogout,
|
2023-07-29 22:06:21 +02:00
|
|
|
IconMoonStars,
|
2023-07-29 21:15:55 +02:00
|
|
|
IconSun,
|
2023-07-29 23:03:40 +02:00
|
|
|
IconUserCog,
|
2023-07-29 21:15:55 +02:00
|
|
|
} from '@tabler/icons-react';
|
|
|
|
|
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/Dashboard/Modals/AboutModal/AboutModal';
|
2023-07-29 22:06:21 +02:00
|
|
|
import { useColorScheme } from '~/hooks/use-colorscheme';
|
2023-07-29 21:15:55 +02:00
|
|
|
|
|
|
|
|
export const AvatarMenu = () => {
|
|
|
|
|
const newVersionAvailable = '0.13.0';
|
|
|
|
|
const [aboutModalOpened, aboutModal] = useDisclosure(false);
|
|
|
|
|
const { data: sessionData } = useSession();
|
2023-07-29 22:06:21 +02:00
|
|
|
const { colorScheme, toggleColorScheme } = useColorScheme();
|
|
|
|
|
|
|
|
|
|
const Icon = colorScheme === 'dark' ? IconSun : IconMoonStars;
|
2023-07-29 21:15:55 +02:00
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<>
|
|
|
|
|
<UnstyledButton>
|
|
|
|
|
<Menu>
|
|
|
|
|
<Menu.Target>
|
|
|
|
|
<CurrentUserAvatar user={sessionData?.user ?? null} />
|
|
|
|
|
</Menu.Target>
|
|
|
|
|
<Menu.Dropdown>
|
2023-07-29 22:06:21 +02:00
|
|
|
<Menu.Item icon={<Icon size="1rem" />} onClick={toggleColorScheme}>
|
|
|
|
|
Switch theme
|
|
|
|
|
</Menu.Item>
|
2023-07-29 21:18:41 +02:00
|
|
|
{sessionData?.user && (
|
|
|
|
|
<>
|
2023-07-29 23:03:40 +02:00
|
|
|
<Menu.Item
|
|
|
|
|
component={Link}
|
|
|
|
|
href="/manage/preferences"
|
|
|
|
|
icon={<IconUserCog size="1rem" />}
|
|
|
|
|
>
|
|
|
|
|
Settings
|
|
|
|
|
</Menu.Item>
|
|
|
|
|
<Menu.Item component={Link} href="/board" icon={<IconDashboard size="1rem" />}>
|
|
|
|
|
Default Dashboard
|
|
|
|
|
</Menu.Item>
|
2023-07-29 21:18:41 +02:00
|
|
|
<Menu.Divider />
|
|
|
|
|
</>
|
|
|
|
|
)}
|
2023-07-29 21:15:55 +02:00
|
|
|
<Menu.Item
|
|
|
|
|
icon={<IconInfoCircle size="1rem" />}
|
|
|
|
|
rightSection={
|
|
|
|
|
newVersionAvailable && (
|
|
|
|
|
<Badge variant="light" color="blue">
|
|
|
|
|
New
|
|
|
|
|
</Badge>
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
onClick={() => aboutModal.open()}
|
|
|
|
|
>
|
|
|
|
|
About
|
|
|
|
|
</Menu.Item>
|
|
|
|
|
{sessionData?.user ? (
|
|
|
|
|
<Menu.Item icon={<IconLogout size="1rem" />} color="red" onClick={() => signOut()}>
|
|
|
|
|
Logout
|
|
|
|
|
</Menu.Item>
|
|
|
|
|
) : (
|
|
|
|
|
<Menu.Item icon={<IconLogin size="1rem" />} component={Link} href="/auth/login">
|
|
|
|
|
Login
|
|
|
|
|
</Menu.Item>
|
|
|
|
|
)}
|
|
|
|
|
</Menu.Dropdown>
|
|
|
|
|
</Menu>
|
|
|
|
|
</UnstyledButton>
|
|
|
|
|
|
|
|
|
|
<AboutModal
|
|
|
|
|
opened={aboutModalOpened}
|
|
|
|
|
closeModal={aboutModal.close}
|
|
|
|
|
newVersionAvailable={newVersionAvailable}
|
|
|
|
|
/>
|
|
|
|
|
</>
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
type CurrentUserAvatarProps = {
|
|
|
|
|
user: User | null;
|
|
|
|
|
};
|
|
|
|
|
const CurrentUserAvatar = forwardRef<HTMLDivElement, CurrentUserAvatarProps>(
|
|
|
|
|
({ user, ...others }, ref) => {
|
|
|
|
|
const { primaryColor } = useMantineTheme();
|
|
|
|
|
if (!user) return <Avatar ref={ref} {...others} />;
|
|
|
|
|
return (
|
|
|
|
|
<Avatar ref={ref} color={primaryColor} {...others}>
|
|
|
|
|
{user.name?.slice(0, 2).toUpperCase()}
|
|
|
|
|
</Avatar>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
);
|