umami/src/app/(main)/NavBar.tsx

98 lines
2.9 KiB
TypeScript
Raw Normal View History

2023-09-29 12:29:22 +00:00
import { Icon, Text } from 'react-basics';
import Link from 'next/link';
import classNames from 'classnames';
import HamburgerButton from 'components/common/HamburgerButton';
2023-09-29 12:29:22 +00:00
import ThemeButton from 'components/input/ThemeButton';
import LanguageButton from 'components/input/LanguageButton';
import ProfileButton from 'components/input/ProfileButton';
import TeamsButton from 'components/input/TeamsButton';
import Icons from 'components/icons';
2024-02-05 02:03:26 +00:00
import { useLogin, useMessages, useNavigation, useTeamUrl } from 'components/hooks';
2023-09-29 12:29:22 +00:00
import styles from './NavBar.module.css';
export function NavBar() {
const { user } = useLogin();
2023-09-29 12:29:22 +00:00
const { formatMessage, labels } = useMessages();
2024-02-03 01:49:17 +00:00
const { pathname } = useNavigation();
2024-02-05 02:03:26 +00:00
const { teamId, renderTeamUrl } = useTeamUrl();
2024-02-03 01:49:17 +00:00
2023-10-30 22:18:48 +00:00
const cloudMode = Boolean(process.env.cloudMode);
2023-09-29 12:29:22 +00:00
const links = [
2024-01-30 08:10:25 +00:00
{ label: formatMessage(labels.dashboard), url: renderTeamUrl('/dashboard') },
{ label: formatMessage(labels.websites), url: renderTeamUrl('/websites') },
{ label: formatMessage(labels.reports), url: renderTeamUrl('/reports') },
{ label: formatMessage(labels.settings), url: renderTeamUrl('/settings') },
2023-09-29 12:29:22 +00:00
].filter(n => n);
2023-10-30 22:18:48 +00:00
const menuItems = [
{
label: formatMessage(labels.dashboard),
2024-01-30 08:10:25 +00:00
url: renderTeamUrl('/dashboard'),
2023-10-30 22:18:48 +00:00
},
!cloudMode && {
label: formatMessage(labels.settings),
2024-01-30 08:10:25 +00:00
url: renderTeamUrl('/settings'),
2023-10-30 22:18:48 +00:00
children: [
{
label: formatMessage(labels.websites),
url: '/settings/websites',
},
{
label: formatMessage(labels.teams),
url: '/settings/teams',
},
{
label: formatMessage(labels.users),
url: '/settings/users',
},
{
label: formatMessage(labels.profile),
2024-02-05 06:35:14 +00:00
url: '/profile',
2023-10-30 22:18:48 +00:00
},
],
},
cloudMode && {
label: formatMessage(labels.profile),
2024-02-05 06:35:14 +00:00
url: '/profile',
2023-10-30 22:18:48 +00:00
},
!cloudMode && { label: formatMessage(labels.logout), url: '/logout' },
].filter(n => n);
2023-09-29 12:29:22 +00:00
return (
<div className={styles.navbar}>
<div className={styles.logo}>
<Icon size="lg">
<Icons.Logo />
</Icon>
<Text>umami</Text>
</div>
<div className={styles.links}>
{links.map(({ url, label }) => {
return (
<Link
key={url}
href={url}
className={classNames({ [styles.selected]: pathname.startsWith(url) })}
2023-12-20 21:57:31 +00:00
prefetch={url !== '/settings'}
2023-09-29 12:29:22 +00:00
>
<Text>{label}</Text>
</Link>
);
})}
</div>
<div className={styles.actions}>
{user?.teams?.length && <TeamsButton teamId={teamId} />}
2023-09-29 12:29:22 +00:00
<ThemeButton />
<LanguageButton />
<ProfileButton />
</div>
<div className={styles.mobile}>
2023-10-30 22:18:48 +00:00
<HamburgerButton menuItems={menuItems} />
2023-09-29 12:29:22 +00:00
</div>
</div>
);
}
export default NavBar;