import { Button, HStack, PinInput, PinInputField, Spinner } from "@chakra-ui/react" import { useRouter } from "next/router" import { useEffect, useState } from "react" import { useMutation } from "react-query" import { useCountdown } from "usehooks-ts" import { Modal } from "~/components/ui/modal" import { setAuth } from "~/libs/auth" import { ActivationOtpProps, ActivationReqProps } from "~/types/auth" import { activationReq, activationUserOTP } from "~/services/auth" const FormOTP = () => { const router = useRouter() const { query } = router const [active, setActive] = useState(false) const [email, setEmail] = useState('') const [otp, setOtp] = useState('') const [count, { startCountdown, resetCountdown }] = useCountdown({ countStart: 60 * 1, intervalMs: 1000, }) useEffect(() => { setEmail((query?.email || '') as string) }, [query?.email]) useEffect(() => { setActive(query?.activation === 'otp') }, [query.activation]) useEffect(() => { !!active && startCountdown() }, [active, startCountdown]) const mutationActivationReq = useMutation({ mutationFn: (data: ActivationReqProps) => activationReq(data), onSuccess: () => { resetCountdown() startCountdown() } }) const mutationActivation = useMutation({ mutationFn: (data: ActivationOtpProps) => activationUserOTP(data) }) useEffect(() => { if (otp.length === 4 && !mutationActivation.data?.activation) { mutationActivation.mutate({ email, otp }) } //eslint-disable-next-line }, [otp]) useEffect(() => { if (mutationActivation.data?.user) { setAuth(mutationActivation.data.user) router.push((query?.redirect || '/') as string) } }, [mutationActivation.data, router, query.redirect]) return ( setActive(false)} mode="desktop">
Masukan Kode OTP
setOtp(val)}>
{mutationActivation.isLoading && } {!mutationActivation.isLoading && mutationActivation.data?.reason === 'INVALID_OTP' && ( Mohon maaf kode OTP yand anda masukan salah ) }
{!mutationActivation.data?.activation && (
Kode verifikasi telah dikirimkan ke alamat email {email}. Silakan periksa kotak masuk atau folder spam.
)}
{!mutationActivation.data?.activation && ( <> {count > 0 && timeFormat(count)} {!mutationActivation.data?.activation && count == 0 && ( <>
Belum menerima kode apapun?
)} )}
) } const timeFormat = (time: number): string => { const minute = Math.floor(time / 60); const second = time % 60; const minuteFormat = minute < 10 ? `0${minute}` : `${minute}` const secondFormat = second < 10 ? `0${second}` : `${second}` return `${minuteFormat}:${secondFormat}` } export default FormOTP