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')
}}
>
)}
>
)
}