import { useState } from 'react' import { Field, Form, Formik } from 'formik' import { Link, useNavigate, useSearchParams } from 'react-router-dom' import { Helmet } from 'react-helmet-async' import IVInputField from '~/components/IVInputField' import IVButton from '~/components/IVButton' import { tryPasswordReset } from '~/utils/auth' interface FormState { isError: boolean isLoading: boolean isExpired: boolean } export default function ResetPasswordPage() { const [state, setState] = useState({ isError: false, isLoading: false, isExpired: false, }) const [searchParams] = useSearchParams() const navigate = useNavigate() const seal = searchParams.get('seal') if (!seal) { return (

Sorry, this link is invalid.

) } return (
Reset password | Interval

Reset password

Please enter your new password below. Please note, resetting your password will log you out of any existing sessions.

initialValues={{ password: '', passwordConfirm: '', }} validate={values => { if (values.password !== values.passwordConfirm) { return { passwordConfirm: 'Passwords do not match', } } if (values.password.length && values.password.length < 6) { return { passwordConfirm: 'Password must be at least 6 characters', } } return {} }} onSubmit={async values => { setState({ isError: false, isLoading: true, isExpired: false }) try { const r = await tryPasswordReset({ seal, ...values }) if (r.ok) { navigate('/dashboard') } else { setState({ isError: true, isLoading: false, isExpired: r.status === 403, }) } } catch (err) { setState({ isError: true, isLoading: false, isExpired: false }) } }} > {({ errors, touched }) => (
{state.isExpired ? (
Sorry, that token is no longer valid. Please{' '} submit a new request.
) : ( state.isError && (

Sorry, there was a problem resetting your password. Please double check your reset link or contact us if you continue experiencing issues.

) )}
Log in instead
)}
) }