import { useForm } from '@tanstack/react-form' import { createFileRoute, Link, useNavigate } from '@tanstack/react-router' import { useState } from 'react' import { TextField } from '~/components/form/text-field' import { Button } from '~/components/ui/button' import { Spinner } from '~/components/ui/spinner' import { AuthCard } from '~/features/auth/auth-card' import { FormAlert } from '~/features/auth/form-alert' import { ResetPasswordSchema } from '~/features/auth/schemas' import { authClient } from '~/server/better-auth/client' interface ResetPasswordSearch { token?: string error?: string } export const Route = createFileRoute('/auth/reset-password')({ validateSearch: (search: Record): ResetPasswordSearch => ({ token: typeof search.token === 'string' ? search.token : undefined, error: typeof search.error === 'string' ? search.error : undefined, }), component: ResetPassword, }) function ResetPassword() { const navigate = useNavigate() const { token, error: tokenError } = Route.useSearch() const [formError, setFormError] = useState(null) const invalidToken = !token || tokenError === 'INVALID_TOKEN' const form = useForm({ defaultValues: { password: '', confirmPassword: '' }, validators: { onBlur: ResetPasswordSchema }, onSubmit: async ({ value }) => { if (!token) return setFormError(null) const { error } = await authClient.resetPassword({ newPassword: value.password, token, }) if (error) { setFormError(error.message ?? 'Could not reset password.') return } await navigate({ to: '/auth/sign-in' }) }, }) return ( Request a new link } title="New password" > {invalidToken ? ( This reset link is invalid or expired. Please request a new one. ) : (
{ e.preventDefault() form.handleSubmit() }} > {formError ? {formError} : null} {(field) => ( )} {(field) => ( )} [s.canSubmit, s.isSubmitting]}> {([canSubmit, isSubmitting]) => ( )}
)}
) }