import { observer } from 'mobx-react-lite' import Icon from '@/Components/Icon/Icon' import { SyncQueueStrategy } from '@standardnotes/snjs' import { STRING_GENERIC_SYNC_ERROR } from '@/Constants/Strings' import { useCallback, useMemo, useState, FunctionComponent } from 'react' import { AccountMenuPane } from './AccountMenuPane' import Menu from '@/Components/Menu/Menu' import MenuItem from '@/Components/Menu/MenuItem' import WorkspaceSwitcherOption from './WorkspaceSwitcher/WorkspaceSwitcherOption' import { WebApplicationGroup } from '@/Application/WebApplicationGroup' import { formatLastSyncDate } from '@/Utils/DateUtils' import Spinner from '@/Components/Spinner/Spinner' import { MenuItemIconSize } from '@/Constants/TailwindClassNames' import { useApplication } from '../ApplicationProvider' import MenuSection from '../Menu/MenuSection' import { TOGGLE_COMMAND_PALETTE, TOGGLE_KEYBOARD_SHORTCUTS_MODAL, isMobilePlatform } from '@standardnotes/ui-services' import { KeyboardShortcutIndicator } from '../KeyboardShortcutIndicator/KeyboardShortcutIndicator' type Props = { mainApplicationGroup: WebApplicationGroup setMenuPane: (pane: AccountMenuPane) => void closeMenu: () => void } const iconClassName = `text-neutral mr-2 ${MenuItemIconSize}` const GeneralAccountMenu: FunctionComponent = ({ setMenuPane, closeMenu, mainApplicationGroup }) => { const application = useApplication() const [isSyncingInProgress, setIsSyncingInProgress] = useState(false) const [lastSyncDate, setLastSyncDate] = useState(formatLastSyncDate(application.sync.getLastSyncDate() as Date)) const doSynchronization = useCallback(async () => { setIsSyncingInProgress(true) application.sync .sync({ queueStrategy: SyncQueueStrategy.ForceSpawnNew, checkIntegrity: true, }) .then((res) => { if (res && (res as any).error) { throw new Error() } else { setLastSyncDate(formatLastSyncDate(application.sync.getLastSyncDate() as Date)) } }) .catch(() => { application.alerts.alert(STRING_GENERIC_SYNC_ERROR).catch(console.error) }) .finally(() => { setIsSyncingInProgress(false) }) }, [application]) const user = useMemo(() => application.sessions.getUser(), [application]) const openPreferences = useCallback(() => { application.accountMenuController.closeAccountMenu() application.preferencesController.setCurrentPane('account') application.preferencesController.openPreferences() }, [application]) const openHelp = useCallback(() => { application.accountMenuController.closeAccountMenu() application.preferencesController.setCurrentPane('help-feedback') application.preferencesController.openPreferences() }, [application]) const openEmail = useCallback(() => { const subject = 'Standard Notes Feedback' const body = `App Version: ${application.version}` application.device.openUrl( `mailto:help@standardnotes.com?subject=${encodeURIComponent(subject)}&body=${encodeURIComponent(body)}`, ) }, [application.device, application.version]) const signOut = useCallback(() => { application.accountMenuController.setSigningOut(true) }, [application]) const activateRegisterPane = useCallback(() => { setMenuPane(AccountMenuPane.Register) }, [setMenuPane]) const activateSignInPane = useCallback(() => { setMenuPane(AccountMenuPane.SignIn) }, [setMenuPane]) const CREATE_ACCOUNT_INDEX = 1 const SWITCHER_INDEX = 0 const keyboardShortcutsHelpShortcut = useMemo(() => { return application.keyboardService.keyboardShortcutForCommand(TOGGLE_KEYBOARD_SHORTCUTS_MODAL) }, [application.keyboardService]) const commandPaletteShortcut = useMemo(() => { return application.keyboardService.keyboardShortcutForCommand(TOGGLE_COMMAND_PALETTE) }, [application.keyboardService]) return ( <>
Account
{user ? ( <>
You're signed in as:
{user.email}
{application.getHost.execute().getValue()}
{isSyncingInProgress ? (
Syncing...
) : (
Last synced:
{lastSyncDate}
)}
) : ( <>
You’re offline. Sign in to sync your notes and preferences across all your devices and enable end-to-end encryption.
Offline
)} {user ? ( Account settings ) : ( <> Create free account Sign in )} { application.importModalController.setIsVisible(true) application.accountMenuController.closeAccountMenu() }} > Import {application.isNativeMobileWeb() && ( Email us )}
Help & feedback
v{application.version}
{!isMobilePlatform(application.platform) && ( <> { application.keyboardService.triggerCommand(TOGGLE_KEYBOARD_SHORTCUTS_MODAL) }} > Keyboard shortcuts {keyboardShortcutsHelpShortcut && ( )} { application.keyboardService.triggerCommand(TOGGLE_COMMAND_PALETTE) }} > Command palette {commandPaletteShortcut && ( )} )}
{user ? ( Sign out workspace ) : null}
) } export default observer(GeneralAccountMenu)