import { STRING_NON_MATCHING_PASSWORDS } from '@/Constants/Strings' import { WebApplication } from '@/Application/Application' import { ViewControllerManager } from '@/Services/ViewControllerManager' import { observer } from 'mobx-react-lite' import { FunctionComponent, KeyboardEventHandler, useCallback, useEffect, useRef, useState } from 'react' import { AccountMenuPane } from './AccountMenuPane' import Button from '@/Components/Button/Button' import Checkbox from '@/Components/Checkbox/Checkbox' import DecoratedPasswordInput from '@/Components/Input/DecoratedPasswordInput' import Icon from '@/Components/Icon/Icon' import IconButton from '@/Components/Button/IconButton' type Props = { viewControllerManager: ViewControllerManager application: WebApplication setMenuPane: (pane: AccountMenuPane) => void email: string password: string } const ConfirmPassword: FunctionComponent = ({ application, viewControllerManager, setMenuPane, email, password, }) => { const { notesAndTagsCount } = viewControllerManager.accountMenuController const [confirmPassword, setConfirmPassword] = useState('') const [isRegistering, setIsRegistering] = useState(false) const [isEphemeral, setIsEphemeral] = useState(false) const [shouldMergeLocal, setShouldMergeLocal] = useState(true) const [error, setError] = useState('') const passwordInputRef = useRef(null) useEffect(() => { passwordInputRef.current?.focus() }, []) const handlePasswordChange = useCallback((text: string) => { setConfirmPassword(text) }, []) const handleEphemeralChange = useCallback(() => { setIsEphemeral(!isEphemeral) }, [isEphemeral]) const handleShouldMergeChange = useCallback(() => { setShouldMergeLocal(!shouldMergeLocal) }, [shouldMergeLocal]) const handleConfirmFormSubmit = useCallback( (e) => { e.preventDefault() if (!password) { passwordInputRef.current?.focus() return } if (password === confirmPassword) { setIsRegistering(true) application .register(email, password, isEphemeral, shouldMergeLocal) .then((res) => { if (res.error) { throw new Error(res.error.message) } viewControllerManager.accountMenuController.closeAccountMenu() viewControllerManager.accountMenuController.setCurrentPane(AccountMenuPane.GeneralMenu) }) .catch((err) => { console.error(err) setError(err.message) }) .finally(() => { setIsRegistering(false) }) } else { setError(STRING_NON_MATCHING_PASSWORDS) setConfirmPassword('') passwordInputRef.current?.focus() } }, [viewControllerManager, application, confirmPassword, email, isEphemeral, password, shouldMergeLocal], ) const handleKeyDown: KeyboardEventHandler = useCallback( (e) => { if (error.length) { setError('') } if (e.key === 'Enter') { handleConfirmFormSubmit(e) } }, [handleConfirmFormSubmit, error], ) const handleGoBack = useCallback(() => { setMenuPane(AccountMenuPane.Register) }, [setMenuPane]) return ( <>
Confirm password
Because your notes are encrypted using your password,{' '} Standard Notes does not have a password reset option. If you forget your password, you will permanently lose access to your data.
]} onChange={handlePasswordChange} onKeyDown={handleKeyDown} placeholder="Confirm password" ref={passwordInputRef} value={confirmPassword} /> {error ?
{error}
: null}