"use client"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { useTranslations } from "next-intl"; import { FormField } from "@/components/auth/form-field"; import { IdentityFormProps, JournalistRegistrationData, PersonnelRegistrationData, GeneralRegistrationData, UserCategory, journalistRegistrationSchema, personnelRegistrationSchema, generalRegistrationSchema, } from "@/types/registration"; import { useUserDataValidation } from "@/hooks/use-registration"; import { ASSOCIATIONS } from "@/lib/registration-utils"; import React, { useState, useRef } from "react"; export const IdentityForm: React.FC = ({ category, onSuccess, onError, className, }) => { const t = useTranslations("LandingPage"); const { validateJournalistData, validatePersonnelData, loading: validationLoading, } = useUserDataValidation(); const [memberIdentity, setMemberIdentity] = useState(""); const [memberIdentityError, setMemberIdentityError] = useState(""); const [personelName, setPersonelName] = useState(""); const [loadingPersonel, setLoadingPersonel] = useState(false); const fetchPersonelByNRP = async (nrp: string) => { setLoadingPersonel(true); try { const res = await fetch( `https://mediahub.polri.go.id/api/v2/public/users/search-personil?nrp=${nrp}&timemilis=${Date.now()}` // `https://mediahub.polri.go.id/api/v2/public/users/search-personil?nrp=${nrp}}` ); if (!res.ok) { throw new Error("Personel not found"); } const json = await res.json(); // asumsi responseData ada di json.data const name = json?.data?.nama; if (!name) { throw new Error("Nama personel tidak ditemukan"); } setPersonelName(name); setValue("policeNumber" as keyof PersonnelRegistrationData, nrp); } catch (err: any) { setPersonelName(""); setMemberIdentityError(err.message || "NRP tidak valid"); } finally { setLoadingPersonel(false); } }; // Determine which schema to use based on category const getSchema = () => { switch (category) { case "6": return journalistRegistrationSchema; case "7": return personnelRegistrationSchema; default: return generalRegistrationSchema; } }; const { register, handleSubmit, formState: { errors, isSubmitting }, setValue, watch, } = useForm< | JournalistRegistrationData | PersonnelRegistrationData | GeneralRegistrationData >({ resolver: zodResolver(getSchema()), mode: "onChange", }); const watchedEmail = watch("email"); // const handleMemberIdentityChange = async (value: string) => { // setMemberIdentity(value); // setMemberIdentityError(""); // if (!value.trim()) { // return; // } // try { // if (category === "6") { // await validateJournalistData(value); // setValue( // "journalistCertificate" as keyof JournalistRegistrationData, // value // ); // } else if (category === "7") { // await validatePersonnelData(value); // setValue("policeNumber" as keyof PersonnelRegistrationData, value); // } // } catch (error: any) { // setMemberIdentityError(error.message || "Invalid identity number"); // } // }; const handleMemberIdentityChange = (value: string) => { setMemberIdentity(value); setMemberIdentityError(""); // reset nama personel jika input kosong if (!value.trim()) { setPersonelName(""); return; } // hanya debounce untuk PERSONNEL (category 7) if (category !== "7") return; // clear timer sebelumnya if (debounceTimerRef.current) { clearTimeout(debounceTimerRef.current); } // set timer baru (3 detik) debounceTimerRef.current = setTimeout(async () => { try { await fetchPersonelByNRP(value); } catch (error: any) { setMemberIdentityError(error.message || "NRP tidak valid"); } }, 2000); }; const onSubmit = async ( data: | JournalistRegistrationData | PersonnelRegistrationData | GeneralRegistrationData ) => { try { if (category === "7") { if (!memberIdentity.trim()) { setMemberIdentityError("NRP wajib diisi"); return; } if (!personelName) { setMemberIdentityError("Data personel belum valid"); return; } } const payload = { ...data, nrp: memberIdentity, personelName, }; // simpan sementara untuk step OTP & next page sessionStorage.setItem("registration_identity", JSON.stringify(payload)); onSuccess?.(payload); } catch (error: any) { onError?.(error.message || "Form submission failed"); } }; // const onSubmit = async ( // data: // | JournalistRegistrationData // | PersonnelRegistrationData // | GeneralRegistrationData // ) => { // try { // // Additional validation for member identity // if ((category === "6" || category === "7") && !memberIdentity.trim()) { // setMemberIdentityError("Identity number is required"); // return; // } // if (memberIdentityError) { // onError?.(memberIdentityError); // return; // } // onSuccess?.(data); // } catch (error: any) { // onError?.(error.message || "Form submission failed"); // } // }; const renderJournalistFields = () => ( <>
{/* {errors.association && (
{errors.association.message}
)} */}
handleMemberIdentityChange(e.target.value)} /> {memberIdentityError && (

{memberIdentityError}

)}
); const debounceTimerRef = useRef(null); const renderPersonnelFields = () => (
handleMemberIdentityChange(e.target.value)} /> {memberIdentityError && (

{memberIdentityError}

)} {personelName && (
)}
); return (
{/* Category-specific fields */} {category === "6" && renderJournalistFields()} {category === "7" && renderPersonnelFields()} {/* Email field - common for all categories */}
{errors.email && (

{errors.email.message}

)}
{/* Terms and conditions */}

{t("byRegis", { defaultValue: "By registering, you agree to our", })}{" "}
{" "} {t("terms", { defaultValue: "Terms of Service" })} {" "} {t("and", { defaultValue: "and" })}{" "} {t("privacy", { defaultValue: "Privacy Policy" })}

{/* Submit button */}
); };