2022-08-13 10:56:07 +02:00
|
|
|
import { Trans } from "@lingui/macro"
|
2022-08-23 13:42:28 +02:00
|
|
|
import { Box, Divider, Group, Menu, SegmentedControl, SegmentedControlItem, useMantineColorScheme } from "@mantine/core"
|
2022-08-15 13:26:45 +02:00
|
|
|
import { redirectToAbout, redirectToAdminUsers, redirectToMetrics, redirectToSettings } from "app/slices/redirect"
|
2022-08-23 13:42:28 +02:00
|
|
|
import { changeViewMode } from "app/slices/user"
|
2022-08-13 10:56:07 +02:00
|
|
|
import { useAppDispatch, useAppSelector } from "app/store"
|
2022-08-23 13:42:28 +02:00
|
|
|
import { ViewMode } from "app/types"
|
2022-08-13 10:56:07 +02:00
|
|
|
import { useState } from "react"
|
2022-09-05 13:52:28 +02:00
|
|
|
import { TbChartLine, TbHelp, TbLayoutList, TbList, TbMoon, TbNotes, TbPower, TbSettings, TbSun, TbUsers } from "react-icons/tb"
|
2022-08-13 10:56:07 +02:00
|
|
|
|
|
|
|
|
interface ProfileMenuProps {
|
|
|
|
|
control: React.ReactElement
|
|
|
|
|
}
|
|
|
|
|
|
2022-08-23 13:42:28 +02:00
|
|
|
interface ViewModeControlItem extends SegmentedControlItem {
|
|
|
|
|
value: ViewMode
|
|
|
|
|
}
|
|
|
|
|
|
2022-09-05 13:52:28 +02:00
|
|
|
const iconSize = 16
|
|
|
|
|
|
2022-08-23 13:42:28 +02:00
|
|
|
const viewModeData: ViewModeControlItem[] = [
|
|
|
|
|
{
|
|
|
|
|
value: "title",
|
|
|
|
|
label: (
|
|
|
|
|
<Group>
|
2022-09-05 13:52:28 +02:00
|
|
|
<TbList size={iconSize} />
|
2022-08-23 13:42:28 +02:00
|
|
|
<Box ml={6}>
|
|
|
|
|
<Trans>Compact</Trans>
|
|
|
|
|
</Box>
|
|
|
|
|
</Group>
|
|
|
|
|
),
|
|
|
|
|
},
|
2022-09-05 13:52:28 +02:00
|
|
|
{
|
|
|
|
|
value: "cozy",
|
|
|
|
|
label: (
|
|
|
|
|
<Group>
|
|
|
|
|
<TbLayoutList size={iconSize} />
|
|
|
|
|
<Box ml={6}>
|
|
|
|
|
<Trans>Cozy</Trans>
|
|
|
|
|
</Box>
|
|
|
|
|
</Group>
|
|
|
|
|
),
|
|
|
|
|
},
|
2022-08-23 13:42:28 +02:00
|
|
|
{
|
|
|
|
|
value: "expanded",
|
|
|
|
|
label: (
|
|
|
|
|
<Group>
|
2022-09-05 13:52:28 +02:00
|
|
|
<TbNotes size={iconSize} />
|
2022-08-23 13:42:28 +02:00
|
|
|
<Box ml={6}>
|
|
|
|
|
<Trans>Expanded</Trans>
|
|
|
|
|
</Box>
|
|
|
|
|
</Group>
|
|
|
|
|
),
|
|
|
|
|
},
|
|
|
|
|
]
|
|
|
|
|
|
2022-08-13 10:56:07 +02:00
|
|
|
export function ProfileMenu(props: ProfileMenuProps) {
|
|
|
|
|
const [opened, setOpened] = useState(false)
|
2022-08-23 13:42:28 +02:00
|
|
|
const viewMode = useAppSelector(state => state.user.settings?.viewMode)
|
2022-08-13 10:56:07 +02:00
|
|
|
const admin = useAppSelector(state => state.user.profile?.admin)
|
|
|
|
|
const dispatch = useAppDispatch()
|
|
|
|
|
const { colorScheme, toggleColorScheme } = useMantineColorScheme()
|
|
|
|
|
const dark = colorScheme === "dark"
|
|
|
|
|
|
|
|
|
|
const logout = () => {
|
|
|
|
|
window.location.href = "logout"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<Menu position="bottom-end" closeOnItemClick={false} opened={opened} onChange={setOpened}>
|
|
|
|
|
<Menu.Target>{props.control}</Menu.Target>
|
|
|
|
|
<Menu.Dropdown>
|
|
|
|
|
<Menu.Item
|
2022-09-05 13:52:28 +02:00
|
|
|
icon={<TbSettings size={iconSize} />}
|
2022-08-13 10:56:07 +02:00
|
|
|
onClick={() => {
|
|
|
|
|
dispatch(redirectToSettings())
|
|
|
|
|
setOpened(false)
|
|
|
|
|
}}
|
|
|
|
|
>
|
|
|
|
|
<Trans>Settings</Trans>
|
|
|
|
|
</Menu.Item>
|
2022-08-23 13:42:28 +02:00
|
|
|
|
|
|
|
|
<Divider />
|
|
|
|
|
<Menu.Label>
|
2022-08-13 10:56:07 +02:00
|
|
|
<Trans>Theme</Trans>
|
2022-10-27 14:45:22 +02:00
|
|
|
</Menu.Label>
|
|
|
|
|
<Menu.Item icon={dark ? <TbSun size={iconSize} /> : <TbMoon size={iconSize} />} onClick={() => toggleColorScheme()}>
|
|
|
|
|
{dark ? <Trans>Switch to light theme</Trans> : <Trans>Switch to dark theme</Trans>}
|
2022-08-13 10:56:07 +02:00
|
|
|
</Menu.Item>
|
2022-10-27 14:45:22 +02:00
|
|
|
|
|
|
|
|
<Divider />
|
|
|
|
|
<Menu.Label>
|
|
|
|
|
<Trans>Display</Trans>
|
|
|
|
|
</Menu.Label>
|
2022-08-23 13:42:28 +02:00
|
|
|
<SegmentedControl
|
|
|
|
|
fullWidth
|
|
|
|
|
orientation="vertical"
|
|
|
|
|
data={viewModeData}
|
|
|
|
|
value={viewMode}
|
|
|
|
|
onChange={e => dispatch(changeViewMode(e as ViewMode))}
|
|
|
|
|
mb="xs"
|
|
|
|
|
/>
|
2022-08-13 10:56:07 +02:00
|
|
|
|
|
|
|
|
{admin && (
|
|
|
|
|
<>
|
|
|
|
|
<Divider />
|
|
|
|
|
<Menu.Label>
|
|
|
|
|
<Trans>Admin</Trans>
|
|
|
|
|
</Menu.Label>
|
|
|
|
|
<Menu.Item
|
2022-09-05 13:52:28 +02:00
|
|
|
icon={<TbUsers size={iconSize} />}
|
2022-08-13 10:56:07 +02:00
|
|
|
onClick={() => {
|
|
|
|
|
dispatch(redirectToAdminUsers())
|
|
|
|
|
setOpened(false)
|
|
|
|
|
}}
|
|
|
|
|
>
|
|
|
|
|
<Trans>Manage users</Trans>
|
|
|
|
|
</Menu.Item>
|
2022-08-14 18:15:40 +02:00
|
|
|
<Menu.Item
|
2022-09-05 13:52:28 +02:00
|
|
|
icon={<TbChartLine size={iconSize} />}
|
2022-08-14 18:15:40 +02:00
|
|
|
onClick={() => {
|
|
|
|
|
dispatch(redirectToMetrics())
|
|
|
|
|
setOpened(false)
|
|
|
|
|
}}
|
|
|
|
|
>
|
|
|
|
|
<Trans>Metrics</Trans>
|
|
|
|
|
</Menu.Item>
|
2022-08-13 10:56:07 +02:00
|
|
|
</>
|
|
|
|
|
)}
|
|
|
|
|
|
|
|
|
|
<Divider />
|
2022-08-15 13:26:45 +02:00
|
|
|
<Menu.Item
|
2022-09-05 13:52:28 +02:00
|
|
|
icon={<TbHelp size={iconSize} />}
|
2022-08-15 13:26:45 +02:00
|
|
|
onClick={() => {
|
|
|
|
|
dispatch(redirectToAbout())
|
|
|
|
|
setOpened(false)
|
|
|
|
|
}}
|
|
|
|
|
>
|
|
|
|
|
<Trans>About</Trans>
|
|
|
|
|
</Menu.Item>
|
2022-09-05 13:52:28 +02:00
|
|
|
<Menu.Item icon={<TbPower size={iconSize} />} onClick={logout}>
|
2022-08-13 10:56:07 +02:00
|
|
|
<Trans>Logout</Trans>
|
|
|
|
|
</Menu.Item>
|
|
|
|
|
</Menu.Dropdown>
|
|
|
|
|
</Menu>
|
|
|
|
|
)
|
|
|
|
|
}
|