import React, { useEffect, useCallback, FormEventHandler } from 'react'; import { Dialog, Text, Box, Button, config, Input, color, Spinner } from 'folds'; import { AuthType, MatrixError } from 'matrix-js-sdk'; import { StageComponentProps } from './types'; import { AsyncState, AsyncStatus } from '../../hooks/useAsyncCallback'; import { RequestEmailTokenCallback, RequestEmailTokenResponse } from '../../hooks/types'; function EmailErrorDialog({ title, message, defaultEmail, onRetry, onCancel, }: { title: string; message: string; defaultEmail?: string; onRetry: (email: string) => void; onCancel: () => void; }) { const handleFormSubmit: FormEventHandler = (evt) => { evt.preventDefault(); const { retryEmailInput } = evt.target as HTMLFormElement & { retryEmailInput: HTMLInputElement; }; const t = retryEmailInput.value; onRetry(t); }; return ( {title} {message} Email ); } export function EmailStageDialog({ email, clientSecret, stageData, emailTokenState, requestEmailToken, submitAuthDict, onCancel, }: StageComponentProps & { email?: string; clientSecret: string; emailTokenState: AsyncState; requestEmailToken: RequestEmailTokenCallback; }) { const { errorCode, error, session } = stageData; const handleSubmit = useCallback( (sessionId: string) => { const threepIDCreds = { sid: sessionId, client_secret: clientSecret, }; submitAuthDict({ type: AuthType.Email, threepid_creds: threepIDCreds, threepidCreds: threepIDCreds, session, }); }, [submitAuthDict, session, clientSecret] ); const handleEmailSubmit = useCallback( (userEmail: string) => { requestEmailToken(userEmail, clientSecret); }, [clientSecret, requestEmailToken] ); useEffect(() => { if (email && !errorCode && emailTokenState.status === AsyncStatus.Idle) { requestEmailToken(email, clientSecret); } }, [email, errorCode, clientSecret, emailTokenState, requestEmailToken]); if (emailTokenState.status === AsyncStatus.Loading) { return ( Sending verification email... ); } if (emailTokenState.status === AsyncStatus.Error) { return ( ); } if (emailTokenState.status === AsyncStatus.Success) { return ( Verification Request Sent {`Please check your email "${emailTokenState.data.email}" and validate before continuing further.`} {errorCode && ( {`${errorCode}: ${error}`} )} ); } if (!email) { return ( ); } return null; }