import React, { useState } from 'react'; import { useTranslation } from 'react-i18next'; import Button from '../ui/Button'; import Modal from '../ui/Modal'; import { useForm, SubmitHandler } from 'react-hook-form'; import Plus from '../icons/Plus'; export interface Props { pwdOrTokens: null | 'password' | 'tokens'; setPwdOrTokens: (state: null | 'password' | 'tokens') => void; onFinish?: (values: AuthInputs) => Promise; minimumNumberOfRecoveryTokens?: number; showTokens?: boolean; withModal?: boolean; openModal?: boolean; } type AuthInputs = { password?: string; tokens?: string[]; }; function createArrayWithNumbers(length: number) { return Array.from({ length }, (_, i) => i); } export const AuthWidget = ({ pwdOrTokens, setPwdOrTokens, onFinish, minimumNumberOfRecoveryTokens = 1, showTokens = true, openModal = false, withModal = false, }: Props) => { const { t } = useTranslation(); const { register, handleSubmit, formState: { errors }, setError, } = useForm(); const [numTokens, setNumTokens] = useState(1); const [showModal, setShowModal] = useState(!!pwdOrTokens); const [isSubmitting, setIsSubmitting] = useState(false); const onSubmit: SubmitHandler = data => { const missingPassword = pwdOrTokens === 'password' && !data.password?.length; const invalidTokens = pwdOrTokens === 'tokens' && ((data?.tokens?.length || 0) < minimumNumberOfRecoveryTokens || !data?.tokens?.every(t => t.length)); if (missingPassword) { setError('password', { type: 'required', message: t('auth.passwordRequired') || 'Password required', }); return; } if (invalidTokens) { setError('tokens', { type: 'minLength', message: t('auth.tokens') || 'Tokens', }); return; } if (onFinish) { setIsSubmitting(true); onFinish(data) .then(() => { setShowModal(false); }) .catch(() => { if (pwdOrTokens === 'password') { setError('password', { type: 'auth', message: t('auth.invalidCredentials') || 'Invalid credentials', }); } else if (pwdOrTokens === 'tokens') { setError('tokens', { type: 'auth', message: t('auth.invalidCredentials') || 'Invalid credentials', }); } }) .finally(() => { setIsSubmitting(false); }); } }; const form = (
{(pwdOrTokens === 'password' || !showTokens) && (
{showTokens && ( <>
)}
)} {pwdOrTokens === 'tokens' && showTokens && (
{t('auth.tokens')}: {createArrayWithNumbers(numTokens).map(idx => { return ( ); })}
)} {errors.tokens?.type === 'minLength' && (
{t('auth.atLeast') || 'At least'} {minimumNumberOfRecoveryTokens}
)} {errors.password?.type === 'auth' && (
{errors.password.message}
)} {errors.tokens?.type === 'auth' && (
{errors.tokens.message}
)}
); return withModal ? ( setPwdOrTokens(null)} closable={false} > {form} ) : ( form ); }; export default AuthWidget;