import { Trans } from "@lingui/macro" import { Box, Divider, Group, type MantineColorScheme, Menu, SegmentedControl, type SegmentedControlItem, useMantineColorScheme, } from "@mantine/core" import { showNotification } from "@mantine/notifications" import { client } from "app/client" import { redirectToAbout, redirectToAdminUsers, redirectToDonate, redirectToMetrics, redirectToSettings } from "app/redirect/thunks" import { useAppDispatch, useAppSelector } from "app/store" import { type ViewMode } from "app/types" import { useViewMode } from "hooks/useViewMode" import { type ReactNode, useState } from "react" import { TbChartLine, TbHeartFilled, TbHelp, TbLayoutList, TbList, TbListDetails, TbMoon, TbNotes, TbPower, TbSettings, TbSun, TbSunMoon, TbUsers, TbWorldDownload, } from "react-icons/tb" interface ProfileMenuProps { control: React.ReactElement } const ProfileMenuControlItem = ({ icon, label }: { icon: ReactNode; label: ReactNode }) => { return ( {icon} {label} ) } const iconSize = 16 interface ColorSchemeControlItem extends SegmentedControlItem { value: MantineColorScheme } const colorSchemeData: ColorSchemeControlItem[] = [ { value: "light", label: } label={Light} />, }, { value: "dark", label: } label={Dark} />, }, { value: "auto", label: } label={System} />, }, ] interface ViewModeControlItem extends SegmentedControlItem { value: ViewMode } const viewModeData: ViewModeControlItem[] = [ { value: "title", label: } label={Compact} />, }, { value: "cozy", label: } label={Cozy} />, }, { value: "detailed", label: } label={Detailed} />, }, { value: "expanded", label: } label={Expanded} />, }, ] export function ProfileMenu(props: ProfileMenuProps) { const [opened, setOpened] = useState(false) const { viewMode, setViewMode } = useViewMode() const profile = useAppSelector(state => state.user.profile) const admin = useAppSelector(state => state.user.profile?.admin) const dispatch = useAppDispatch() const { colorScheme, setColorScheme } = useMantineColorScheme() const logout = () => { window.location.href = "logout" } return ( {props.control} {profile && {profile.name}} } onClick={() => { dispatch(redirectToSettings()) setOpened(false) }} > Settings } onClick={async () => await client.feed.refreshAll().then(() => { showNotification({ message: Your feeds have been queued for refresh., color: "green", autoClose: 1000, }) setOpened(false) }) } > Fetch all my feeds now Theme setColorScheme(e as MantineColorScheme)} mb="xs" /> Display setViewMode(e as ViewMode)} mb="xs" /> {admin && ( <> Admin } onClick={() => { dispatch(redirectToAdminUsers()) setOpened(false) }} > Manage users } onClick={() => { dispatch(redirectToMetrics()) setOpened(false) }} > Metrics )} } onClick={() => { dispatch(redirectToDonate()) setOpened(false) }} > Donate } onClick={() => { dispatch(redirectToAbout()) setOpened(false) }} > About } onClick={logout}> Logout ) }