import { useRouter } from 'next/router' import { Moon, Sun } from '@phosphor-icons/react' import { ReactNode, useCallback } from 'react' import { useGetViewerQuery } from '../../lib/networking/queries/useGetViewerQuery' import { Avatar } from '../elements/Avatar' import { AvatarDropdown } from '../elements/AvatarDropdown' import { Dropdown, DropdownOption, DropdownSeparator, } from '../elements/DropdownElements' import GridLayoutIcon from '../elements/images/GridLayoutIcon' import ListLayoutIcon from '../elements/images/ListLayoutIcon' import { Box, HStack, SpanBox, VStack } from '../elements/LayoutPrimitives' import { StyledText } from '../elements/StyledText' import { styled, theme, ThemeId } from '../tokens/stitches.config' import { LayoutType } from './homeFeed/HomeFeedContainer' import { useCurrentTheme } from '../../lib/hooks/useCurrentTheme' import { ThemeSelector } from './article/ReaderSettingsControl' import { useGetViewer } from '../../lib/networking/viewer/useGetViewer' type PrimaryDropdownProps = { children?: ReactNode layout?: LayoutType updateLayout?: (layout: LayoutType) => void } export type HeaderDropdownAction = | 'navigate-to-install' | 'navigate-to-feeds' | 'navigate-to-emails' | 'navigate-to-labels' | 'navigate-to-rules' | 'navigate-to-profile' | 'navigate-to-subscriptions' | 'navigate-to-api' | 'navigate-to-integrations' | 'navigate-to-saved-searches' | 'increaseFontSize' | 'decreaseFontSize' | 'logout' type TriggerButtonProps = { name?: string } const TriggerButton = (props: TriggerButtonProps): JSX.Element => { return ( {props.name ?? 'Settings'} ) } export function PrimaryDropdown(props: PrimaryDropdownProps): JSX.Element { const { data: viewerData } = useGetViewer() const router = useRouter() const headerDropdownActionHandler = useCallback( (action: HeaderDropdownAction) => { switch (action) { case 'navigate-to-install': router.push('/settings/installation') break case 'navigate-to-feeds': router.push('/settings/feeds') break case 'navigate-to-emails': router.push('/settings/emails') break case 'navigate-to-labels': router.push('/settings/labels') break case 'navigate-to-rules': router.push('/settings/rules') break case 'navigate-to-subscriptions': router.push('/settings/subscriptions') break case 'navigate-to-api': router.push('/settings/api') break case 'navigate-to-integrations': router.push('/settings/integrations') break case 'navigate-to-saved-searches': router.push('/settings/saved-searches') break case 'logout': document.dispatchEvent(new Event('logout')) break default: break } }, [router] ) return ( } css={{ width: '240px', ml: '15px', bg: '$thNavMenuFooter' }} > { router.push('/settings/account') event.preventDefault() }} > {viewerData && ( <> {viewerData.name} {`@${viewerData.profile.username}`} )} router.push('/settings/installation')} title="Install" /> router.push('/settings/feeds')} title="Feeds" /> router.push('/settings/emails')} title="Emails" /> router.push('/settings/labels')} title="Labels" /> router.push('/settings/account')} title="Settings" /> window.open('https://docs.omnivore.app', '_blank')} title="Documentation" /> window.Intercom('show')} title="Feedback" /> headerDropdownActionHandler('logout')} title="Logout" /> ) } export const StyledToggleButton = styled('button', { display: 'flex', alignItems: 'center', justifyContent: 'center', color: '$thTextContrast2', backgroundColor: 'transparent', border: 'none', cursor: 'pointer', width: '70px', height: '100%', borderRadius: '5px', fontSize: '12px', fontFamily: '$inter', gap: '5px', m: '2px', '&:hover': { opacity: 0.8, }, '&[data-state="on"]': { bg: '$thBackground', }, }) const ThemeSection = (props: PrimaryDropdownProps): JSX.Element => { const { currentTheme, setCurrentTheme, currentThemeIsDark } = useCurrentTheme() return ( <> ) } function LegacyMenuThemeSection(props: PrimaryDropdownProps): JSX.Element { const { currentTheme, setCurrentTheme, currentThemeIsDark } = useCurrentTheme() return ( <> Mode { setCurrentTheme(ThemeId.Light) }} > Light { setCurrentTheme(ThemeId.Dark) }} > Dark {props.layout && ( Layout { props.updateLayout && props.updateLayout('LIST_LAYOUT') }} > { props.updateLayout && props.updateLayout('GRID_LAYOUT') }} > )} ) }