import Button from '@/Components/Button/Button' import { WebApplication } from '@/Application/WebApplication' import { PurchaseFlowPane } from '@/Controllers/PurchaseFlow/PurchaseFlowPane' import { observer } from 'mobx-react-lite' import { ChangeEventHandler, FunctionComponent, useEffect, useRef, useState } from 'react' import FloatingLabelInput from '@/Components/Input/FloatingLabelInput' import { isEmailValid } from '@/Utils' import { BlueDotIcon, CircleIcon, DiamondIcon } from '@standardnotes/icons' import { isErrorResponse } from '@standardnotes/snjs' type Props = { application: WebApplication } const SignIn: FunctionComponent = ({ application }) => { const { setCurrentPane } = application.purchaseFlowController const [email, setEmail] = useState('') const [password, setPassword] = useState('') const [isSigningIn, setIsSigningIn] = useState(false) const [isEmailInvalid, setIsEmailInvalid] = useState(false) const [isPasswordInvalid, setIsPasswordInvalid] = useState(false) const [otherErrorMessage, setOtherErrorMessage] = useState('') const emailInputRef = useRef(null) const passwordInputRef = useRef(null) useEffect(() => { if (emailInputRef.current) { emailInputRef.current?.focus() } }, []) const handleEmailChange: ChangeEventHandler = (e) => { setEmail(e.target.value) setIsEmailInvalid(false) } const handlePasswordChange: ChangeEventHandler = (e) => { setPassword(e.target.value) setIsPasswordInvalid(false) setOtherErrorMessage('') } const handleCreateAccountInstead = () => { if (isSigningIn) { return } setCurrentPane(PurchaseFlowPane.CreateAccount) } const handleSignIn = async () => { if (!email) { emailInputRef?.current?.focus() return } if (!isEmailValid(email)) { setIsEmailInvalid(true) emailInputRef?.current?.focus() return } if (!password) { passwordInputRef?.current?.focus() return } setIsSigningIn(true) try { const response = await application.signIn(email, password) if (isErrorResponse(response)) { throw new Error(response.data.error?.message) } else { application.purchaseFlowController.closePurchaseFlow() void application.purchaseFlowController.openPurchaseFlow() } } catch (err) { console.error(err) if ((err as Error).toString().includes('Invalid email or password')) { setIsSigningIn(false) setIsEmailInvalid(true) setIsPasswordInvalid(true) setOtherErrorMessage('Invalid email or password.') setPassword('') } else { application.alerts.alert(err as string).catch(console.error) } } } return (

Sign in

to continue to Standard Notes.
{isEmailInvalid && !otherErrorMessage ? (
Please provide a valid email.
) : null} {otherErrorMessage ?
{otherErrorMessage}
: null}
) } export default observer(SignIn)