'use client'; import { useState } from 'react'; import { urls, useConceptNavigation } from '@/app'; import { isAxiosError } from '@/backend/api-transport'; import { SubmitButton } from '@/components/control'; import { type ErrorData, InfoError } from '@/components/info-error'; import { TextInput } from '@/components/input'; import { Loader } from '@/components/loader'; import { useQueryStrings } from '@/hooks/use-query-strings'; import { useResetPassword } from '../backend/use-reset-password'; function useTokenValidation(token: string, isPending: boolean) { const { validateToken } = useResetPassword(); const [isTokenValidating, setIsTokenValidating] = useState(false); const validate = async () => { if (!isTokenValidating && !isPending) { await validateToken({ token }); setIsTokenValidating(true); } }; return { isTokenValidating, validate }; } export function Component() { const router = useConceptNavigation(); const token = useQueryStrings().get('token') ?? ''; const { resetPassword, isPending, error: serverError } = useResetPassword(); const { isTokenValidating, validate } = useTokenValidation(token, isPending); const [newPassword, setNewPassword] = useState(''); const [newPasswordRepeat, setNewPasswordRepeat] = useState(''); const canSubmit = !!newPassword && !!newPasswordRepeat && newPassword === newPasswordRepeat; function handleSubmit(event: React.FormEvent) { event.preventDefault(); if (!isPending) { void resetPassword({ password: newPassword, token: token }).then(() => { router.replace({ path: urls.home }); router.push({ path: urls.login }); }); } } if (!isTokenValidating && !isPending) { void validate(); } if (isPending) { return ; } return (
{ setNewPassword(event.target.value); }} /> { setNewPasswordRepeat(event.target.value); }} /> {serverError ? : null} ); } // ====== Internals ========= function ServerError({ error }: { error: ErrorData }): React.ReactElement { if (isAxiosError(error) && error.response && error.response.status === 404) { return
Данная ссылка не действительна
; } return ; }