diff --git a/packages/web/components/templates/PrimaryDropdown.tsx b/packages/web/components/templates/PrimaryDropdown.tsx new file mode 100644 index 000000000..a8633564b --- /dev/null +++ b/packages/web/components/templates/PrimaryDropdown.tsx @@ -0,0 +1,69 @@ +import { useRouter } from 'next/router' +import { useCallback } from 'react' +import { useGetViewerQuery } from '../../lib/networking/queries/useGetViewerQuery' +import { updateTheme } from '../../lib/themeUpdater' +import { AvatarDropdown } from '../elements/AvatarDropdown' +import { DropdownMenu, HeaderDropdownAction } from '../patterns/DropdownMenu' +import { ThemeId } from '../tokens/stitches.config' + +export function PrimaryDropdown(): JSX.Element { + const { viewerData } = useGetViewerQuery() + const router = useRouter() + + const headerDropdownActionHandler = useCallback( + (action: HeaderDropdownAction) => { + switch (action) { + case 'apply-darker-theme': + updateTheme(ThemeId.Darker) + break + case 'apply-dark-theme': + updateTheme(ThemeId.Dark) + break + case 'apply-lighter-theme': + updateTheme(ThemeId.Lighter) + break + case 'apply-light-theme': + updateTheme(ThemeId.Light) + break + case 'navigate-to-install': + router.push('/settings/installation') + break + case 'navigate-to-emails': + router.push('/settings/emails') + break + case 'navigate-to-labels': + router.push('/settings/labels') + 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 'logout': + document.dispatchEvent(new Event('logout')) + break + default: + break + } + }, + [updateTheme, router] + ) + + if (!viewerData?.me) { + return <> + } + + return ( + + } + actionHandler={headerDropdownActionHandler} + /> + ) +} diff --git a/packages/web/components/templates/PrimaryLayout.tsx b/packages/web/components/templates/PrimaryLayout.tsx index 090f23b94..490864528 100644 --- a/packages/web/components/templates/PrimaryLayout.tsx +++ b/packages/web/components/templates/PrimaryLayout.tsx @@ -1,6 +1,12 @@ import { PageMetaData, PageMetaDataProps } from '../patterns/PageMetaData' import { Box } from '../elements/LayoutPrimitives' -import { ReactNode, MutableRefObject, useEffect, useState } from 'react' +import { + ReactNode, + MutableRefObject, + useEffect, + useState, + useCallback, +} from 'react' import { PrimaryHeader } from './../patterns/PrimaryHeader' import { useGetViewerQuery } from '../../lib/networking/queries/useGetViewerQuery' import { navigationCommands } from '../../lib/keyboardShortcuts/navigationShortcuts' @@ -65,6 +71,18 @@ export function PrimaryLayout(props: PrimaryLayoutProps): JSX.Element { } } + const showLogout = useCallback(() => { + setShowLogoutConfirmation(true) + }, [showLogoutConfirmation, setShowLogoutConfirmation, logoutMutation]) + + useEffect(() => { + document.addEventListener('logout', showLogout) + + return () => { + document.removeEventListener('logout', showLogout) + } + }, [showLogout]) + return ( <> {props.pageMetaDataProps ? ( diff --git a/packages/web/components/templates/homeFeed/LibraryHeader.tsx b/packages/web/components/templates/homeFeed/LibraryHeader.tsx index 0741f5da7..9d8e3c555 100644 --- a/packages/web/components/templates/homeFeed/LibraryHeader.tsx +++ b/packages/web/components/templates/homeFeed/LibraryHeader.tsx @@ -25,6 +25,7 @@ import { LayoutType } from './HomeFeedContainer' import { DropdownMenu, HeaderDropdownAction } from '../../patterns/DropdownMenu' import { updateTheme } from '../../../lib/themeUpdater' import { useRouter } from 'next/router' +import { PrimaryDropdown } from '../PrimaryDropdown' type LibraryHeaderProps = { layout: LayoutType @@ -259,51 +260,6 @@ type ControlButtonBoxProps = { } function ControlButtonBox(props: ControlButtonBoxProps): JSX.Element { - const router = useRouter() - - const headerDropdownActionHandler = useCallback( - (action: HeaderDropdownAction) => { - switch (action) { - case 'apply-darker-theme': - updateTheme(ThemeId.Darker) - break - case 'apply-dark-theme': - updateTheme(ThemeId.Dark) - break - case 'apply-lighter-theme': - updateTheme(ThemeId.Lighter) - break - case 'apply-light-theme': - updateTheme(ThemeId.Light) - break - case 'navigate-to-install': - router.push('/settings/installation') - break - case 'navigate-to-emails': - router.push('/settings/emails') - break - case 'navigate-to-labels': - router.push('/settings/labels') - 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 'logout': - // props.setShowLogoutConfirmation(true) - break - default: - break - } - }, - [updateTheme, router] - ) - return ( <> - } - actionHandler={headerDropdownActionHandler} - /> +