import { useQuery, useMutation, gql } from '@apollo/client' import Grid from '@mui/material/Grid' import Paper from '@mui/material/Paper' import { Field, Form, Formik } from 'formik' import React, { useState } from 'react' import { useLocation, useSearchParams } from 'wouter' import { H2, Label3, P } from '../../components/typography' import Logo from '../../styling/icons/menu/logo.svg?react' import * as Yup from 'yup' import { Button } from '../../components/buttons' import { SecretInput } from '../../components/inputs/formik' import classes from './Authentication.module.css' const VALIDATE_RESET_PASSWORD_LINK = gql` query validateResetPasswordLink($token: String!) { validateResetPasswordLink(token: $token) { id } } ` const RESET_PASSWORD = gql` mutation resetPassword($token: String!, $userID: ID!, $newPassword: String!) { resetPassword(token: $token, userID: $userID, newPassword: $newPassword) } ` const validationSchema = Yup.object().shape({ password: Yup.string() .required('A new password is required') .test( 'len', 'New password must contain more than 8 characters', val => val.length >= 8, ), confirmPassword: Yup.string().oneOf( [Yup.ref('password'), null], 'Passwords must match', ), }) const initialValues = { password: '', confirmPassword: '', } const getErrorMsg = (formikErrors, formikTouched, mutationError) => { if (!formikErrors || !formikTouched) return null if (mutationError) return 'Internal server error' if (formikErrors.password && formikTouched.password) return formikErrors.password if (formikErrors.confirmPassword && formikTouched.confirmPassword) return formikErrors.confirmPassword return null } const ResetPassword = () => { const [, navigate] = useLocation() const [searchParams] = useSearchParams() const token = searchParams.get('t') const [userID, setUserID] = useState(null) const [isLoading, setLoading] = useState(true) const [wasSuccessful, setSuccess] = useState(false) useQuery(VALIDATE_RESET_PASSWORD_LINK, { variables: { token: token }, onCompleted: ({ validateResetPasswordLink: info }) => { setLoading(false) if (!info) { setSuccess(false) } else { setSuccess(true) setUserID(info.id) } }, onError: () => { setLoading(false) setSuccess(false) }, }) const [resetPassword, { error }] = useMutation(RESET_PASSWORD, { onCompleted: ({ resetPassword: success }) => { if (success) navigate('/') }, }) return (

Lamassu Admin

{!isLoading && wasSuccessful && ( { resetPassword({ variables: { token: token, userID: userID, newPassword: values.confirmPassword, }, }) }}> {({ errors, touched }) => (
{getErrorMsg(errors, touched, error) && (

{getErrorMsg(errors, touched, error)}

)}
)}
)} {!isLoading && !wasSuccessful && ( <> Link has expired )}
) } export default ResetPassword