import { zodResolver } from "@hookform/resolvers/zod"; import { type LoaderFunctionArgs, json } from "@remix-run/node"; import { Link, useFetcher, useNavigate } from "@remix-run/react"; import { jwtDecode } from "jwt-decode"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import { z } from "zod"; import { Button } from "~/components/ui/button"; import { Card, CardContent, CardFooter, CardHeader, CardTitle } from "~/components/ui/card"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "~/components/ui/form"; import { InputOTP, InputOTPGroup, InputOTPSlot } from "~/components/ui/input-otp"; import { httpClient } from "~/lib/http"; import { useVerifyOtp } from "~/services/user/verify-otp"; import { authenticator } from "~/sessions/auth.server"; import type { AnggotaResponse } from "~/types/api/anggota"; import type { BaseResponse } from "~/types/constants/base-response"; import type { AuthJwtPayload } from "~/types/constants/jwt-payload"; export async function loader({ request }: LoaderFunctionArgs) { const user = await authenticator.isAuthenticated(request); if (!user) { throw json( { message: "Anda belum terdaftar sebagai anggota koperasi.", }, { status: 401, statusText: "Anda tidak memiliki akses ke halaman ini" }, ); } const decoded = jwtDecode(user); const userData = await httpClient.get>(`/user/${decoded.id}`); if (userData.data.data?.status !== "OTP TERKIRIM") { throw json( { message: "Anda belum terdaftar sebagai anggota koperasi.", }, { status: 401, statusText: "Anda tidak memiliki akses ke halaman ini" }, ); } return json({ data: userData.data.data }); } const FormSchema = z.object({ otp: z.string().min(4, { message: "Kode OTP harus terdiri dari 4 karakter.", }), }); export default function MemberOtpPage() { const fetcher = useFetcher(); const navigate = useNavigate(); const { mutateAsync } = useVerifyOtp(); const form = useForm>({ resolver: zodResolver(FormSchema), defaultValues: { otp: "", }, }); async function onSubmit(data: z.infer) { try { await mutateAsync(data.otp); toast.success("OTP berhasil diverifikasi, Silahkan Login Kembali"); fetcher.submit({}, { method: "post", action: "/action/logout" }); navigate("/"); } catch (error) { if (error instanceof Error) { toast.error("Terjadi kesalahan saat memverifikasi OTP, silahkan coba lagi."); } } } return ( Silahkan Masukkan Kode OTP
Wallet
( One-Time Password )} />

OTP error atau tidak menerima OTP?{" "} Chat Admin

); }