import type { ActionCreator } from 'easy-peasy'; import { useFormikContext, withFormik } from 'formik'; import { useState } from 'react'; import type { Location, RouteProps } from 'react-router-dom'; import { Link, useLocation, useNavigate } from 'react-router-dom'; import tw from 'twin.macro'; import loginCheckpoint from '@/api/auth/loginCheckpoint'; import LoginFormContainer from '@/components/auth/LoginFormContainer'; import Button from '@/components/elements/Button'; import Field from '@/components/elements/Field'; import useFlash from '@/plugins/useFlash'; import type { FlashStore } from '@/state/flashes'; interface Values { code: string; recoveryCode: ''; } type OwnProps = RouteProps; type Props = OwnProps & { clearAndAddHttpError: ActionCreator; }; function LoginCheckpointContainer() { const { isSubmitting, setFieldValue } = useFormikContext(); const [isMissingDevice, setIsMissingDevice] = useState(false); return (
{ setFieldValue('code', ''); setFieldValue('recoveryCode', ''); setIsMissingDevice(s => !s); }} css={tw`cursor-pointer text-xs text-neutral-500 tracking-wide uppercase no-underline hover:text-neutral-700`} > {!isMissingDevice ? "I've Lost My Device" : 'I Have My Device'}
Return to Login
); } const EnhancedForm = withFormik({ handleSubmit: ({ code, recoveryCode }, { setSubmitting, props: { clearAndAddHttpError, location } }) => { loginCheckpoint(location.state?.token || '', code, recoveryCode) .then(response => { if (response.complete) { // @ts-expect-error this is valid window.location = response.intended || '/'; return; } setSubmitting(false); }) .catch(error => { console.error(error); setSubmitting(false); clearAndAddHttpError({ error }); }); }, mapPropsToValues: () => ({ code: '', recoveryCode: '', }), })(LoginCheckpointContainer); export default ({ ...props }: OwnProps) => { const { clearAndAddHttpError } = useFlash(); const location = useLocation(); const navigate = useNavigate(); if (!location.state?.token) { navigate('/auth/login'); return null; } return ; };