"use client"; import React from "react"; import { Button } from "@/components/ui/button"; import { Checkbox } from "@/components/ui/checkbox"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import Image from "next/image"; import { close, error, loading, registerConfirm } from "@/config/swal"; import { Link, useRouter } from "@/i18n/routing"; import { getDataByNIK, getDataByNRP, getDataJournalist, getDataPersonil, listCity, listDistricts, listInstitusi, listProvince, postRegistration, requestOTP, saveInstitutes, verifyOTP } from "@/service/auth"; import { yupResolver } from "@hookform/resolvers/yup"; import { useParams, useSearchParams } from "next/navigation"; import { useEffect, useState } from "react"; import { useForm, SubmitHandler } from "react-hook-form"; import Swal from "sweetalert2"; import withReactContent from "sweetalert2-react-content"; import * as Yup from "yup"; import { InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot } from "@/components/ui/input-otp"; import { Textarea } from "@/components/ui/textarea"; import { Icon } from "@/components/ui/icon"; import dynamic from "next/dynamic"; import sanitizeHtml from "sanitize-html"; import { useTranslations } from "next-intl"; type Inputs = { example: string; exampleRequired: string; }; const PasswordChecklist = dynamic(() => import("react-password-checklist"), { ssr: false, }); const page = () => { const params = useParams(); const [stepOneActive, setStepOneActive] = useState(true); const [stepTwoActive, setStepTwoActive] = useState(false); const [stepThreeActive, setStepThreeActive] = useState(false); const [typePass, setTypePass] = useState("password"); const [typePassConf, setTypePassConf] = useState("password"); const searchParams = useSearchParams(); const [formProfile, setFormProfile] = useState(false); const [journalistCertificate, setJournalistCertificate] = useState(); const [personilNRP, setPersonilNRP] = useState(); const [journalistData, setJournalistData] = useState(); const [personilData, setPersonilData] = useState(); const [userIdentity] = useState(); const [userIdentityValidate, setUserIdentityValidate] = useState(""); const [email, setEmail] = useState(); const [emailValidate, setEmailValidate] = useState(""); const [otpValidate, setOtpValidate] = useState(""); const [password, setPassword] = useState(""); const [city, setCity] = useState([]); const [isValidPassword, setIsValidPassword] = useState(false); const MySwal = withReactContent(Swal); const [isCustomActive, setIsCustomActive] = useState(false); const [institusi, setInstitusi] = useState(); const [customInstituteName, setCustomInstituteName] = useState(""); const [institusiAddress, setInstitusiAddress] = useState(); const [institution, setInstitution] = useState([]); const [province, setProvince] = useState([]); const router = useRouter(); const category = searchParams?.get("category"); const [districts, setDistricts] = useState([]); const [, setAssociation] = useState(); const [warningPassConf] = useState(); const [otpValue, setOtpValue] = useState(""); const t = useTranslations("LandingPage"); const [otp1, setOtp1] = useState(); const [otp2, setOtp2] = useState(); const [otp3, setOtp3] = useState(); const [otp4, setOtp4] = useState(); const [otp5, setOtp5] = useState(); const [otp6, setOtp6] = useState(); const nMinuteSeconds = 60; const nSecondInMiliseconds = 1000; const [, setRefreshTimer] = useState(false); const [passwordType, setPasswordType] = React.useState("password"); const [passwordConf, setPasswordConf] = React.useState("password"); const togglePasswordType = () => { setPasswordType((prevType) => (prevType === "password" ? "text" : "password")); setPasswordConf((prevType) => (prevType === "same password" ? "text" : "same password")); }; const validationSchema = Yup.object().shape({ firstName: Yup.string().required(t("nameEmpty")), username: Yup.string().required(t("usernameEmpty")), phoneNumber: Yup.string().required(t("numberEmpty")), address: Yup.string().required(t("addressEmpty")), email: Yup.string().required(t("emailEmpty")), provinsi: Yup.string().required(t("provinceEmpty")), kota: Yup.string().required(t("cityEmpty")), kecamatan: Yup.string().required(t("subdistrictEmpty")), password: Yup.string().required(t("passwordEmpty")), passwordConf: Yup.string().required(t("confirmEmpty")), }); const formOptions = { resolver: yupResolver(validationSchema), }; const { register, handleSubmit, formState, setValue } = useForm(formOptions); const convertMinutesToMiliseconds = (minute: any) => minute * nMinuteSeconds * nSecondInMiliseconds; const convertMilisecondsToHour = (miliseconds: any) => new Date(miliseconds).toISOString().slice(17, -5); let [timerCount, setTimerCount] = useState(convertMinutesToMiliseconds(1)); let interval: any; const setValUsername = (e: any) => { const uname = e.replaceAll(/[^\w.-]/g, ""); setValue("username", uname.toLowerCase()); }; const setValPassword = (e: any) => { setValue("password", e); setPassword(e); }; const setValPasswordConf = (e: any) => { setPasswordConf(e); }; const { errors }: any = formState; async function save(data: any) { // loading(); let institutionId = 1; if (Number(category) == 6) { const dataInstitution = isCustomActive == true ? { name: customInstituteName, address: institusiAddress, categoryRoleId: Number(category), } : { id: institusi, address: institusiAddress, }; console.log(dataInstitution); const resInstitution = await saveInstitutes(dataInstitution); institutionId = resInstitution?.data?.data?.id; if (resInstitution?.error) { error(resInstitution?.message); return false; } } const sanitizedFirstName = sanitizeHtml(data.firstName); if (sanitizedFirstName == "") { error("Invalid Name"); } else { const datas = { firstName: sanitizedFirstName, lastName: sanitizedFirstName, username: data.username, phoneNumber: data.phoneNumber, email, address: data.address, memberIdentity: userIdentity, provinceId: Number(data.provinsi), cityId: Number(data.kota), districtId: Number(data.kecamatan), password: data.password, instituteId: Number(institutionId), roleId: Number(category), }; const response = await postRegistration(datas); console.log(response); if (response?.error) { error(response?.message); return false; } registerConfirm(); return false; } } const handleSendOTP = async () => { console.log(userIdentity, email); if (Number(category) == 6) { // const journalist = await handleJournalistCertificate(); console.log(email, journalistCertificate); if (email != "" && journalistCertificate != undefined) { const data = { memberIdentity: journalistCertificate, email, category: 6, }; loading(); const response = await requestOTP(data); if (response?.error) { error(response.message); return false; } close(); handleJournalistCertificate(); setStepTwoActive(true); } else { console.log("identity empty"); setUserIdentityValidate("Nomor identitas tidak boleh kosong"); } } else if (Number(category) == 7) { console.log(email, personilNRP); if (email != "" && personilNRP != undefined) { const data = { memberIdentity: personilNRP, email, category: 7, }; loading(); const response = await requestOTP(data); if (response?.error) { error(response?.message); return false; } close(); handleDataNRP(); setStepTwoActive(true); } else { console.log("identity empty"); setUserIdentityValidate("Nomor identitas tidak boleh kosong"); } } else { console.log("UMUM"); if (email != "") { const data = { memberIdentity: null, email, category, }; loading(); const response = await requestOTP(data); if (response?.error) { error(response?.message); return false; } close(); setStepTwoActive(true); } } }; const handleJournalistCertificate = async () => { const response = await getDataJournalist(journalistCertificate); const data = response?.data?.data; console.log(data); if (data) { setJournalistData(data[0]); } console.log("Data jurnalis:", data); return data; }; const handleTypeOTP = (event: any) => { const { form } = event.target; const index = [...form].indexOf(event.target); form.elements[index + 1].focus(); event.preventDefault(); }; const handleResendOTP = async () => { const timer = convertMilisecondsToHour(timerCount); if (timer == "00") { handleSendOTP(); restartTimer(); } }; function restartTimer() { setTimerCount(60_000); setRefreshTimer(true); startInterval(); } function startInterval() { interval = setInterval(() => { if (timerCount == 1000 && interval) { clearInterval(interval); console.log("Reset"); } timerCount = timerCount == 0 ? 60_000 : timerCount; setTimerCount((timerCount -= nSecondInMiliseconds)); }, nSecondInMiliseconds); } const handleDataNRP = async () => { const response = await getDataPersonil(personilNRP); const data = response?.data?.data; setPersonilData(data); console.log("Data personil:", data); return data; }; const handleInstituteOption = (e: any) => { if (e.target.value == "0") { setIsCustomActive(true); } else { setIsCustomActive(false); setInstitusi(e.target.value); } }; // const { // register, // handleSubmit, // watch, // formState: { errors }, // } = useForm(); // const onSubmit: SubmitHandler = (data) => console.log(data); // console.log(watch("example")); function setDataToForm() { if (Number(category) == 6 && journalistData) { setValue("firstName", journalistData.journalistName); setValue("memberIdentity", journalistData.certNumber); const selectedProvince = province.find((o: any) => o.provName == journalistData.province?.toUpperCase()); if (selectedProvince !== undefined) { setValue("provinsi", selectedProvince.id); } } else if (Number(category) == 7 && personilData) { setValue("firstName", personilData.lastName); setValue("memberIdentity", personilData.nrp); } } const checkEmail = (e: any) => { const regEmail = /^(([^\s"(),.:;<>@[\\\]]+(\.[^\s"(),.:;<>@[\\\]]+)*)|(".+"))@((\[(?:\d{1,3}\.){3}\d{1,3}])|(([\dA-Za-z\-]+\.)+[A-Za-z]{2,}))$/; if (regEmail.test(e)) { setEmailValidate(""); setEmail(e); } else { setEmailValidate(t("emailValid")); setEmail(""); } }; async function onSubmit(data: any) { console.log("Submit"); if (isValidPassword) { MySwal.fire({ title: "Buat akun", text: "", icon: "warning", showCancelButton: true, cancelButtonColor: "#d33", confirmButtonColor: "#3085d6", confirmButtonText: "Buat", }).then((result) => { if (result.isConfirmed) { save(data); } }); } else { error("Kata Sandi harus sama"); } } const handleIdentity = async (e: any) => { const id = e; console.log(id); await new Promise((resolve) => setTimeout(resolve, 2000)); // 2 sec if (Number(category) == 5) { const reqId = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dlZF9pbiI6ImxvZ2luX3RydWUiLCJpZF91c2VyX2FjY291bnQiOiJJRDExMyIsInVzZXJuYW1lIjoiaXdhbjc0M0BnbWFpbC5jb20iLCJub21lcktUUCI6bnVsbCwicm9sZSI6IjEiLCJyZWRpcmVjdF9sb2dpbl92YWxpZCI6IjM0IiwiY29udHJvbGxlciI6InN5c3RlbXMiLCJuYW1hX2xlbmdrYXAiOiJJd2FuIEphZWxhbmksIFMuS29tIiwiaWRXYXJnYSI6IjIwMTgxMjA2MTMwNTQ1Iiwia29kZV9yYWhhc2lhIjoiWGJqMHRRR2djWXdVMnYiLCJpZF9zZXNzaW9uIjoiMnRwMTZUV2VpTEhQN1o0RGpyYkt2TlVBelhHIiwicGVyc29uYWxfYXRhdV9sZW1iYWdhIjoiTEVNQkFHQSIsImV4cGlyZV9zZXNzaW9uIjoiMjAyMi0wMS0yNyAxNTowMzozNiJ9.Nzq3QqAlKaeKAdDujI9fGuj_mJcIIyWe8lvBI_Ui06o"; const response = await getDataByNIK(reqId, id); const data = response?.data?.data_return[0]; console.log(data); if (data !== undefined) { setValue("firstName", data.nama_lengkap); setValue("address", data.alamat); const selectedProvince = province.find((o: any) => o.provName == data.prov?.toUpperCase()); if (selectedProvince !== undefined) { setValue("provinsi", selectedProvince.id); } const selectedCity: any = city.find((o: any) => o.cityName == data.kab_kota?.toUpperCase()); if (selectedCity !== undefined) { setValue("kota", selectedCity?.id); } const selectedDistrict: any = districts.find((o: any) => o.disName == data.kec?.toUpperCase()); if (selectedDistrict !== undefined) { setValue("kecamatan", selectedDistrict?.id); } } } else if (Number(category) == 7) { const reqId = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dlZF9pbiI6ImxvZ2luX3RydWUiLCJpZF91c2VyX2FjY291bnQiOiJJRDExMyIsInVzZXJuYW1lIjoiaXdhbjc0M0BnbWFpbC5jb20iLCJub21lcktUUCI6bnVsbCwicm9sZSI6IjEiLCJyZWRpcmVjdF9sb2dpbl92YWxpZCI6IjM0IiwiY29udHJvbGxlciI6InN5c3RlbXMiLCJuYW1hX2xlbmdrYXAiOiJJd2FuIEphZWxhbmksIFMuS29tIiwiaWRXYXJnYSI6IjIwMTgxMjA2MTMwNTQ1Iiwia29kZV9yYWhhc2lhIjoiWGJqMHRRR2djWXdVMnYiLCJpZF9zZXNzaW9uIjoiMnRwMTZUV2VpTEhQN1o0RGpyYkt2TlVBelhHIiwicGVyc29uYWxfYXRhdV9sZW1iYWdhIjoiTEVNQkFHQSIsImV4cGlyZV9zZXNzaW9uIjoiMjAyMi0wMS0yNyAxNTowMzozNiJ9.Nzq3QqAlKaeKAdDujI9fGuj_mJcIIyWe8lvBI_Ui06o"; const response = await getDataByNRP(reqId, id); const data = response?.data?.data_return[0]; console.log("Data :", data); if (data !== undefined) { setValue("firstName", data.nama); setValue("address", data.lokasi); } } }; const getCity = async (e: any) => { const res = await listCity(e); setCity(res?.data.data); }; const getDistricts = async (e: any) => { const res = await listDistricts(e); setDistricts(res?.data.data); }; const handleVerifyOTP = async () => { const otp = `${otp1}${otp2}${otp3}${otp4}${otp5}${otp6}`; const dummyOtp = "123456"; if (email != "" && otpValue.length == 6) { console.log("verify otp"); loading(); // const response = { // message: "success", // }; const response = { message: otpValue == dummyOtp ? "success" : "failed", }; // const response = await verifyOTP(email, otp); // if (response?.error) { // error(response?.message); // return false; // } close(); // console.log(response); if (response?.message == "success") { console.log("success"); setStepTwoActive(false); setStepThreeActive(true); setFormProfile(true); setOtpValidate(""); setValue("email", email); setValue("memberIdentity", userIdentity); handleIdentity(userIdentity); setDataToForm(); } else { setOtpValidate("Kode OTP Tidak Valid"); } } }; useEffect(() => { async function initState() { if (category != undefined) { const resInstiution = await listInstitusi(category); const res = await listProvince(); setInstitution(resInstiution?.data?.data); setProvince(res?.data?.data); } } initState(); }, [category]); useEffect(() => { function initState() { for (const element of institution) { const { id } = element; if (id == institusi) { setInstitusiAddress(element.address); } } } initState(); }, [institusi]); return (
  • 1
  • 2
  • 3

{stepThreeActive ? t("userData") : t("registerFirst")}

{t("alreadyHave")}{" "} {t("logIn")}

{t("enterOTP")}

{t("checkInbox")}

{errors.association?.message}
{Number(category) == 7 ? (
setPersonilNRP(event.target.value)} />

{userIdentityValidate}

) : ( "" )} {Number(category) == 6 ? (
setJournalistCertificate(event.target.value)} />
) : ( "" )}
checkEmail(event.target.value)} />

{emailValidate}

setOtpValue(e)}> setOtp1(e.target.value)} onKeyUp={handleTypeOTP} /> setOtp2(e.target.value)} onKeyUp={handleTypeOTP} /> setOtp3(e.target.value)} onKeyUp={handleTypeOTP} /> setOtp4(e.target.value)} onKeyUp={handleTypeOTP} /> setOtp5(e.target.value)} onKeyUp={handleTypeOTP} /> setOtp6(e.target.value)} onKeyUp={handleTypeOTP} />

{otpValidate}

{Number(category) == 6 || Number(category) == 7 ? (
handleIdentity(e.target.value)} disabled />
{errors.memberIdentity?.message}
) : ( "" )}
{errors.firstName?.message}
{ setValUsername(e.target.value.trim()); }} onPaste={(e: any) => { setValUsername(e.target.value.trim()); }} onCopy={(e: any) => { setValUsername(e.target.value.trim()); }} />
{errors.username?.message}
{errors.email?.message}
{errors.phoneNumber?.message}