import { useDispatch } from 'react-redux'; import styled from 'styled-components'; import { useRef } from 'react'; import useMount from 'react-use/lib/useMount'; import { ToastUtils } from '../../session/utils'; import { matchesHash } from '../../util/passwordUtils'; 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 = { passwordHash: string; passwordValid: boolean; setPasswordValid: (value: boolean) => void; onClickOk?: () => any; onClickClose?: () => any; title?: string; }; export const EnterPasswordModal = (props: EnterPasswordModalProps) => { const { passwordHash, setPasswordValid, onClickOk, onClickClose, title } = props; const passwordInputRef = useRef(null); const dispatch = useDispatch(); const onClose = () => { if (onClickClose) { onClickClose(); } dispatch(updateEnterPasswordModal(null)); }; const confirmPassword = () => { const passwordValue = passwordInputRef.current?.value; if (!passwordValue) { ToastUtils.pushToastError('enterPasswordErrorToast', window.i18n('noGivenPassword')); return; } const isPasswordValid = matchesHash(passwordValue as string, passwordHash); if (passwordHash && !isPasswordValid) { ToastUtils.pushToastError('enterPasswordErrorToast', window.i18n('invalidPassword')); return; } setPasswordValid(true); if (onClickOk) { void onClickOk(); } }; useMount(() => { if (passwordInputRef.current) { passwordInputRef.current.focus(); } }); useHotkey('Enter', (event: KeyboardEvent) => { if (event.target === passwordInputRef.current) { confirmPassword(); } }); return (
); };