import { WebApplication } from '@/Application/Application' import { ViewControllerManager } from '@/Services/ViewControllerManager' 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 MenuItemSeparator from '@/Components/Menu/MenuItemSeparator' import { MenuItemType } from '@/Components/Menu/MenuItemType' import WorkspaceSwitcherOption from './WorkspaceSwitcher/WorkspaceSwitcherOption' import { ApplicationGroup } from '@/Application/ApplicationGroup' import { formatLastSyncDate } from '@/Utils/FormatLastSyncDate' type Props = { viewControllerManager: ViewControllerManager application: WebApplication mainApplicationGroup: ApplicationGroup setMenuPane: (pane: AccountMenuPane) => void closeMenu: () => void } const iconClassName = 'color-neutral mr-2' const GeneralAccountMenu: FunctionComponent = ({ application, viewControllerManager, setMenuPane, closeMenu, mainApplicationGroup, }) => { 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.alertService.alert(STRING_GENERIC_SYNC_ERROR).catch(console.error) }) .finally(() => { setIsSyncingInProgress(false) }) }, [application]) const user = useMemo(() => application.getUser(), [application]) const openPreferences = useCallback(() => { viewControllerManager.accountMenuController.closeAccountMenu() viewControllerManager.preferencesController.setCurrentPane('account') viewControllerManager.preferencesController.openPreferences() }, [viewControllerManager]) const openHelp = useCallback(() => { viewControllerManager.accountMenuController.closeAccountMenu() viewControllerManager.preferencesController.setCurrentPane('help-feedback') viewControllerManager.preferencesController.openPreferences() }, [viewControllerManager]) const signOut = useCallback(() => { viewControllerManager.accountMenuController.setSigningOut(true) }, [viewControllerManager]) const activateRegisterPane = useCallback(() => { setMenuPane(AccountMenuPane.Register) }, [setMenuPane]) const activateSignInPane = useCallback(() => { setMenuPane(AccountMenuPane.SignIn) }, [setMenuPane]) const CREATE_ACCOUNT_INDEX = 1 const SWITCHER_INDEX = 0 return ( <>
Account
{user ? ( <>
You're signed in as:
{user.email}
{application.getHost()}
{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 )}
Help & feedback
v{application.version}
{user ? ( <> Sign out workspace ) : null}
) } export default observer(GeneralAccountMenu)