import { WebApplication } from '@/UIModels/Application' import { AppState } from '@/UIModels/AppState' import { observer } from 'mobx-react-lite' import { Icon } from '@/Components/Icon/Icon' import { formatLastSyncDate } from '@/Components/Preferences/Panes/Account/Sync' import { SyncQueueStrategy } from '@standardnotes/snjs' import { STRING_GENERIC_SYNC_ERROR } from '@/Strings' import { useCallback, useMemo, useState } from 'preact/hooks' import { AccountMenuPane } from './AccountMenuPane' import { FunctionComponent } from 'preact' import { Menu } from '@/Components/Menu/Menu' import { MenuItem, MenuItemSeparator, MenuItemType } from '@/Components/Menu/MenuItem' import { WorkspaceSwitcherOption } from './WorkspaceSwitcher/WorkspaceSwitcherOption' import { ApplicationGroup } from '@/UIModels/ApplicationGroup' type Props = { appState: AppState application: WebApplication mainApplicationGroup: ApplicationGroup setMenuPane: (pane: AccountMenuPane) => void closeMenu: () => void } const iconClassName = 'color-neutral mr-2' export const GeneralAccountMenu: FunctionComponent = observer( ({ application, appState, 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(() => { appState.accountMenu.closeAccountMenu() appState.preferences.setCurrentPane('account') appState.preferences.openPreferences() }, [appState]) const openHelp = useCallback(() => { appState.accountMenu.closeAccountMenu() appState.preferences.setCurrentPane('help-feedback') appState.preferences.openPreferences() }, [appState]) const signOut = useCallback(() => { appState.accountMenu.setSigningOut(true) }, [appState]) 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{appState.version}
{user ? ( <> Sign out workspace ) : null}
) }, )