import { useDispatch } from 'react-redux'; import styled from 'styled-components'; import { useRef } from 'react'; import useAsyncFn from 'react-use/lib/useAsyncFn'; import useMount from 'react-use/lib/useMount'; import { ToastUtils } from '../../session/utils'; import { updateEnterPasswordModal } from '../../state/ducks/modalDialog'; import { SpacerSM } from '../basic/Text'; import { useHotkey } from '../../hooks/useHotkey'; import { SessionWrapperModal } from '../SessionWrapperModal'; import { SessionButton, SessionButtonColor, SessionButtonType } from '../basic/SessionButton'; const StyledModalContainer = styled.div` margin: var(--margins-md) var(--margins-sm); `; export type EnterPasswordModalProps = { setPasswordValid: (value: boolean) => void; onClickOk?: () => void; onClickClose?: () => void; }; export const EnterPasswordModal = (props: EnterPasswordModalProps) => { const { setPasswordValid, onClickOk, onClickClose } = props; const title = window.i18n('sessionRecoveryPassword'); const passwordInputRef = useRef(null); const dispatch = useDispatch(); const onPasswordVerified = () => { onClickOk?.(); dispatch(updateEnterPasswordModal(null)); }; const [, verifyPassword] = useAsyncFn(async () => { try { const passwordValue = passwordInputRef.current?.value; if (!passwordValue) { ToastUtils.pushToastError( 'enterPasswordErrorToast', window.i18n.stripped('passwordIncorrect') ); return; } // this throws if the password is invalid. await window.onTryPassword(passwordValue); setPasswordValid(true); onPasswordVerified(); } catch (e) { window.log.error('window.onTryPassword failed with', e); ToastUtils.pushToastError( 'enterPasswordErrorToast', window.i18n.stripped('passwordIncorrect') ); } }); const onClose = () => { if (onClickClose) { onClickClose(); } dispatch(updateEnterPasswordModal(null)); }; useMount(() => { if (passwordInputRef.current) { passwordInputRef.current.focus(); } }); useHotkey('Enter', (event: KeyboardEvent) => { if (event.target === passwordInputRef.current) { void verifyPassword(); } }); return (
); };