import { WebApplication } from '@/ui_models/application'; import { AppState } from '@/ui_models/app_state'; import { observer } from 'mobx-react-lite'; import { Icon } from '../Icon'; import { formatLastSyncDate } from '@/preferences/panes/account/Sync'; import { SyncQueueStrategy } from '@standardnotes/snjs'; import { STRING_GENERIC_SYNC_ERROR } from '@/strings'; import { useEffect, useRef, useState } from 'preact/hooks'; import { AccountMenuPane } from '.'; import { FunctionComponent } from 'preact'; import { JSXInternal } from 'preact/src/jsx'; import { AppVersion } from '@/version'; type Props = { appState: AppState; application: WebApplication; setMenuPane: (pane: AccountMenuPane) => void; closeMenu: () => void; }; const iconClassName = 'color-grey-1 mr-2'; export const GeneralAccountMenu: FunctionComponent = observer( ({ application, appState, setMenuPane, closeMenu }) => { const [isSyncingInProgress, setIsSyncingInProgress] = useState(false); const [lastSyncDate, setLastSyncDate] = useState( formatLastSyncDate(application.getLastSyncDate() as Date) ); const [currentFocusedIndex, setCurrentFocusedIndex] = useState(0); const buttonRefs = useRef<(HTMLButtonElement | null)[]>([]); const doSynchronization = async () => { setIsSyncingInProgress(true); application .sync({ queueStrategy: SyncQueueStrategy.ForceSpawnNew, checkIntegrity: true, }) .then((res) => { if (res && res.error) { throw new Error(); } else { setLastSyncDate( formatLastSyncDate(application.getLastSyncDate() as Date) ); } }) .catch(() => { application.alertService.alert(STRING_GENERIC_SYNC_ERROR); }) .finally(() => { setIsSyncingInProgress(false); }); }; const user = application.getUser(); const accountMenuRef = useRef(); const handleKeyDown: JSXInternal.KeyboardEventHandler = ( event ) => { switch (event.key) { case 'ArrowDown': setCurrentFocusedIndex((index) => { console.log(index, buttonRefs.current.length); if (index + 1 < buttonRefs.current.length) { return index + 1; } else { return 0; } }); break; case 'ArrowUp': setCurrentFocusedIndex((index) => { if (index - 1 > -1) { return index - 1; } else { return buttonRefs.current.length - 1; } }); break; } }; useEffect(() => { if (buttonRefs.current[currentFocusedIndex]) { buttonRefs.current[currentFocusedIndex]?.focus(); } }, [currentFocusedIndex]); const pushRefToArray = (ref: HTMLButtonElement | null) => { if (ref && !buttonRefs.current.includes(ref)) { buttonRefs.current.push(ref); } }; 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 ? ( ) : ( <> )} {user ? ( <>
) : null}
); } );