"use client"; import React, { useEffect, useState } from "react"; import Link from "next/link"; import Cookies from "js-cookie"; // import { close, error, loading } from "@/config/swal"; import { useRouter } from "next/navigation"; import withReactContent from "sweetalert2-react-content"; import { Input } from "../ui/input"; import { Button } from "../ui/button"; import { Label } from "../ui/label"; import { Select, SelectTrigger, SelectValue, SelectContent, SelectItem, } from "@/components/ui/select"; // import { saveActivity } from "@/service/activity-log"; import Swal from "sweetalert2"; import { error } from "console"; import { EyeFilledIcon, EyeSlashFilledIcon } from "../icons"; import { RadioGroup, RadioGroupItem } from "../ui/radio-group"; import { createUser, registerTenant } from "@/service/auth"; import { getTenantList } from "@/service/tenant"; interface Tenant { id: string; name: string; } export default function SignUp() { const router = useRouter(); const [isVisible, setIsVisible] = useState(false); const [isVisibleSetup, setIsVisibleSetup] = useState([false, false]); const toggleVisibility = () => setIsVisible(!isVisible); const [otpValue, setOtpValue] = useState(""); const [username, setUsername] = useState(""); const [password, setPassword] = useState(""); const MySwal = withReactContent(Swal); const [fullname, setFullname] = useState(""); const [userLevelId, setUserLevelId] = useState(""); const [userRoleId, setUserRoleId] = useState(""); const [step, setStep] = useState<"login" | "otp">("login"); const [email, setEmail] = useState(""); const [role, setRole] = useState("umum"); const [otp, setOtp] = useState(["", "", "", "", "", ""]); const [membership, setMembership] = useState(""); const [certNumber, setCertNumber] = useState(""); const [membershipType, setMembershipType] = useState(""); const [nrp, setNrp] = useState(""); const [firstName, setFirstName] = useState(""); const [lastName, setLastName] = useState(""); const [whatsapp, setWhatsapp] = useState(""); const [namaTenant, setNamaTenant] = useState(""); const [tenantPassword, setTenantPassword] = useState(""); const [tenantUsername, setTenantUsername] = useState(""); const [confirmTenantPassword, setConfirmTenantPassword] = useState(""); const [firstNameKontributor, setFirstNameKontributor] = useState(""); const [lastNameKontributor, setLastNameKontributor] = useState(""); const [whatsappKontributor, setWhatsappKontributor] = useState(""); const [namaPerusahaan, setNamaPerusahaan] = useState(""); const [kategoriPerusahaan, setKategoriPerusahaan] = useState(""); const [kontributorPassword, setKontributorPassword] = useState(""); const [confirmKontributorPassword, setConfirmKontributorPassword] = useState(""); const [isLoading, setIsLoading] = useState(false); const [formErrors, setFormErrors] = useState({}); const [tenantList, setTenantList] = useState([]); const [usernameKontributor, setUsernameKontributor] = useState(""); useEffect(() => { getTenant(); }, []); const getTenant = async () => { const res = await getTenantList(); setTenantList(res.data.data); console.log("LLLLLL", res.data.data); }; const handleSendOtp = async (e: React.FormEvent) => { e.preventDefault(); // Tenant → gunakan API registerTenant if (role === "tenant") { await handleTenantRegistration(e); return; } // Umum dan Jurnalis → gunakan API createUser if (role === "umum" || role === "jurnalis") { await handleCreateUserUmum(e); return; } // Kontributor (sementara ikut umum) if (role === "kontributor") { await handleCreateUserKontributor(e); return; } // Default (fallback ke OTP flow jika ada tambahan nanti) setStep("otp"); }; useEffect(() => { if (role === "kontributor" && firstNameKontributor && lastNameKontributor) { const generatedUsername = `${firstNameKontributor}-${lastNameKontributor}` .toLowerCase() .replace(/\s+/g, "-") .replace(/[^a-z0-9-]/g, ""); setUsernameKontributor((prev) => prev || generatedUsername); } }, [role, firstNameKontributor, lastNameKontributor]); const handleVerifyOtp = (e: React.FormEvent) => { e.preventDefault(); const code = otp.join(""); // Verifikasi kode OTP console.log("Kode OTP:", code); }; const handleOtpChange = (index: number, value: string) => { if (!/^[0-9]?$/.test(value)) return; const newOtp = [...otp]; newOtp[index] = value; setOtp(newOtp); // Fokus otomatis ke input selanjutnya const nextInput = document.getElementById(`otp-${index + 1}`); if (value && nextInput) nextInput.focus(); }; const validateName = (value: string) => { const nameRegex = /^[A-Za-z\s]+$/; return nameRegex.test(value.trim()); }; const validateEmail = (email: string) => { const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; return emailRegex.test(email); }; const validatePhone = (phone: string) => { const phoneRegex = /^[0-9+\-\s()]+$/; return phoneRegex.test(phone) && phone.length >= 10; }; const validatePassword = (password: string) => { return password.length >= 8; }; const validateUsername = (username: string) => { const usernameRegex = /^[a-z0-9_-]+$/; return usernameRegex.test(username); }; const handleCreateUserKontributor = async (e: React.FormEvent) => { e.preventDefault(); if (!firstNameKontributor.trim() || !lastNameKontributor.trim()) { MySwal.fire( "Peringatan", "Nama depan dan belakang wajib diisi", "warning", ); return; } if (!validateEmail(email)) { MySwal.fire("Peringatan", "Email tidak valid", "warning"); return; } if (!validatePassword(kontributorPassword)) { MySwal.fire("Peringatan", "Password minimal 8 karakter", "warning"); return; } const fullName = `${firstNameKontributor} ${lastNameKontributor}`; const payload = { address: "", clientId: "78356d32-52fa-4dfc-b836-6cebf4e3eead", email, fullName, password: kontributorPassword, phoneNumber: whatsappKontributor, // username: fullName.toLowerCase().replace(/\s+/g, "-"), username: usernameKontributor, userLevelId: 1, userRoleId: 5, // MISAL role kontributor }; try { setIsLoading(true); const res = await createUser(payload); if (res?.error) { MySwal.fire("Gagal", res?.message || "Gagal mendaftar", "error"); } else { MySwal.fire("Berhasil", "Akun kontributor berhasil dibuat", "success"); router.push("/auth"); } } catch (err) { MySwal.fire("Error", "Terjadi kesalahan server", "error"); } finally { setIsLoading(false); } }; const handleCreateUserUmum = async (e: React.FormEvent) => { e.preventDefault(); if (!fullname.trim()) { MySwal.fire("Peringatan", "Nama lengkap wajib diisi", "warning"); return; } if (!validateEmail(email)) { MySwal.fire("Peringatan", "Email tidak valid", "warning"); return; } if (!validatePassword(password)) { MySwal.fire("Peringatan", "Password minimal 8 karakter", "warning"); return; } if (!userLevelId || !userRoleId) { MySwal.fire("Peringatan", "Level dan Role wajib diisi", "warning"); return; } // ✅ Generate username otomatis const autoUsername = fullname.trim().replace(/\s+/g, "-").toLowerCase() || email.split("@")[0]; const payload = { address: "", clientId: "78356d32-52fa-4dfc-b836-6cebf4e3eead", dateOfBirth: "", email, fullName: fullname, genderType: "", identityGroup: "", identityGroupNumber: "", identityNumber: "", identityType: "", lastEducation: "", password, phoneNumber: "", userLevelId: 1, userRoleId: 4, username: autoUsername, workType: "", }; console.log("📦 createUser payload:", payload); try { setIsLoading(true); const res = await createUser(payload); if (res?.error) { MySwal.fire("Gagal", res?.message || "Gagal mendaftar", "error"); } else { MySwal.fire({ title: "Berhasil!", text: "Akun berhasil dibuat, Anda akan diarahkan ke halaman login.", icon: "success", showConfirmButton: false, timer: 2000, }); setTimeout(() => router.push("/auth"), 2000); } } catch (err) { console.error("Error createUser:", err); MySwal.fire("Error", "Terjadi kesalahan server.", "error"); } finally { setIsLoading(false); } }; const validateTenantForm = () => { const errors: any = {}; // if (!firstName.trim()) { // errors.firstName = "First name is required"; // } if (!firstName.trim()) { errors.firstName = "First name wajib diisi"; } else if (!validateName(firstName)) { errors.firstName = "First name hanya boleh huruf dan spasi"; } // if (!lastName.trim()) { // errors.lastName = "Last name is required"; // } if (!lastName.trim()) { errors.lastName = "Last name wajib diisi"; } else if (!validateName(lastName)) { errors.lastName = "Last name hanya boleh huruf dan spasi"; } if (!tenantUsername.trim()) { errors.tenantUsername = "Username wajib diisi"; } else if (!validateUsername(tenantUsername)) { errors.tenantUsername = "Username hanya boleh huruf kecil, angka, tanpa spasi"; } if (!email.trim()) { errors.email = "Email is required"; } else if (!validateEmail(email)) { errors.email = "Please enter a valid email address"; } if (!whatsapp.trim()) { errors.whatsapp = "WhatsApp number is required"; } else if (!validatePhone(whatsapp)) { errors.whatsapp = "Please enter a valid phone number"; } if (!namaTenant.trim()) { errors.namaTenant = "Tenant name is required"; } if (!tenantPassword) { errors.tenantPassword = "Password is required"; } else if (!validatePassword(tenantPassword)) { errors.tenantPassword = "Password must be at least 8 characters"; } if (!confirmTenantPassword) { errors.confirmTenantPassword = "Please confirm your password"; } else if (tenantPassword !== confirmTenantPassword) { errors.confirmTenantPassword = "Passwords do not match"; } setFormErrors(errors); return Object.keys(errors).length === 0; }; const handleTenantRegistration = async (e: React.FormEvent) => { e.preventDefault(); if (!validateTenantForm()) return; setIsLoading(true); setFormErrors({}); try { const registrationData = { adminUser: { address: "Jakarta", email: email.trim(), fullname: `${firstName.trim()} ${lastName.trim()}`, password: tenantPassword, phoneNumber: whatsapp.trim(), username: tenantUsername.trim(), }, client: { clientType: "sub_client", name: namaTenant.trim(), parentClientId: "78356d32-52fa-4dfc-b836-6cebf4e3eead", }, }; const response = await registerTenant(registrationData); console.log("📦 registerTenant response:", response); /** * ❗ KUNCI UTAMA * Backend gagal → error === true */ if (response.error === true) { const backendMessage = typeof response.message === "string" ? response.message : JSON.stringify(response.message); // 🔴 Duplicate tenant / slug if ( backendMessage.includes("clients_slug_key") || backendMessage.toLowerCase().includes("duplicate") ) { MySwal.fire({ title: "Tenant Sudah Terdaftar", text: "Nama tenant sudah digunakan. Silakan gunakan nama tenant lain.", icon: "warning", confirmButtonText: "OK", }); return; } // 🔴 General error MySwal.fire({ title: "Registrasi Gagal", text: backendMessage || "Tenant gagal dibuat", icon: "error", confirmButtonText: "OK", }); return; } /** * ✅ SUCCESS * HANYA jika error === false */ await MySwal.fire({ title: "Registrasi Berhasil 🎉", text: "Akun tenant berhasil dibuat. Silakan login.", icon: "success", confirmButtonText: "OK", }); router.push("/auth"); } catch (err) { console.error("❌ Tenant registration error:", err); MySwal.fire({ title: "Terjadi Kesalahan", text: "Terjadi kesalahan server. Silakan coba lagi.", icon: "error", confirmButtonText: "OK", }); } finally { setIsLoading(false); } }; // const handleTenantRegistration = async (e: React.FormEvent) => { // e.preventDefault(); // if (!validateTenantForm()) { // return; // } // setIsLoading(true); // setFormErrors({}); // try { // const registrationData = { // adminUser: { // address: "Jakarta", // email: email, // fullname: `${firstName} ${lastName}`, // password: tenantPassword, // phoneNumber: whatsapp, // // username: `${firstName}-${lastName}`, // username: tenantUsername, // }, // client: { // clientType: "sub_client", // name: namaTenant, // parentClientId: "78356d32-52fa-4dfc-b836-6cebf4e3eead", // }, // }; // const response = await registerTenant(registrationData); // if (response.error) { // MySwal.fire({ // title: "Registration Failed", // text: response.message || "An error occurred during registration", // icon: "error", // confirmButtonText: "OK", // }); // } else { // MySwal.fire({ // title: "Registration Successful", // text: "Your tenant account has been created successfully!", // icon: "success", // confirmButtonText: "OK", // }).then(() => { // router.push("/auth"); // }); // } // } catch (error) { // console.error("Registration error:", error); // MySwal.fire({ // title: "Registration Failed", // text: "An unexpected error occurred. Please try again.", // icon: "error", // confirmButtonText: "OK", // }); // } finally { // setIsLoading(false); // } // }; // Generate username otomatis dari nama lengkap React.useEffect(() => { if (fullname.trim()) { const generated = fullname .toLowerCase() .replace(/\s+/g, "-") .replace(/[^a-z0-9_]/g, "-"); setUsername(generated); } }, [fullname]); return (
{/* Left Side - Logo Section */}
Mikul News Logo

Portal NetIdhub

Platform beyond classic

{/* Decorative elements */}
{/* Right Side - Login Form */}
netidhub Logo

MENYATUKAN INDONESIA

{step === "login" ? (
{/* Radio Buttons */} setRole(val)} >
{role === "umum" && (
{/* Nama Lengkap */} setFullname(e.target.value)} /> {/* Username (auto generated) */} {/* Email */} {/* setEmail(e.target.value)} /> */} {/* Password */}
setPassword(e.target.value)} className="pr-10" />
{/* Level dan Role */} {/* */} {/* */}
)} {/* Jurnalis: Select Keanggotaan */} {role === "jurnalis" && (
{/* Nomor Sertifikasi */} setCertNumber(e.target.value)} />
)} {/* Kontributor: Form Fields */} {role === "kontributor" && (
setFirstNameKontributor(e.target.value) } /> setLastNameKontributor(e.target.value)} />
setUsernameKontributor(e.target.value)} />

Username dibuat otomatis dari nama, tetapi dapat diubah.

setEmail(e.target.value)} /> setWhatsappKontributor(e.target.value)} /> {/* setNamaPerusahaan(e.target.value)} /> */}
setKontributorPassword(e.target.value)} className="pr-10" />
setConfirmKontributorPassword(e.target.value) } className="pr-10" />
)} {/* Tenant: Form Fields */} {role === "tenant" && (
setFirstName(e.target.value)} className={ formErrors.firstName ? "border-red-500" : "" } />

Hanya huruf dan spasi.

{formErrors.firstName && (

{formErrors.firstName}

)}
setLastName(e.target.value)} className={ formErrors.lastName ? "border-red-500" : "" } /> {formErrors.lastName && (

{formErrors.lastName}

)}
setTenantUsername(e.target.value.toLowerCase()) } className={ formErrors.tenantUsername ? "border-red-500" : "" } />

Username harus huruf kecil, tanpa spasi. Contoh:{" "} netidhub-admin

{formErrors.tenantUsername && (

{formErrors.tenantUsername}

)}
setEmail(e.target.value)} className={formErrors.email ? "border-red-500" : ""} /> {formErrors.email && (

{formErrors.email}

)}
setWhatsapp(e.target.value)} className={formErrors.whatsapp ? "border-red-500" : ""} /> {formErrors.whatsapp && (

{formErrors.whatsapp}

)}
{/*
{formErrors.namaTenant && (

{formErrors.namaTenant}

)}
*/}
setNamaTenant(e.target.value)} className={ formErrors.namaTenant ? "border-red-500" : "" } /> {formErrors.namaTenant && (

{formErrors.namaTenant}

)}
setTenantPassword(e.target.value)} className={`pr-10 ${ formErrors.tenantPassword ? "border-red-500" : "" }`} /> {formErrors.tenantPassword && (

{formErrors.tenantPassword}

)}
setConfirmTenantPassword(e.target.value) } className={`pr-10 ${ formErrors.confirmTenantPassword ? "border-red-500" : "" }`} /> {formErrors.confirmTenantPassword && (

{formErrors.confirmTenantPassword}

)}
)} {/* Email Field (Selalu Ada, tapi posisi bergantung role) */} {role !== "tenant" && role !== "kontributor" && ( setEmail(e.target.value)} /> )} {/* Note */}

Dengan mendaftar, saya telah menyetujui{" "} Syarat dan Ketentuan {" "} serta{" "} Kebijakan Privasi

{/* Submit */} {/* Link Login */}

Sudah punya akun?{" "} Login

) : (

Masukkan Kode OTP

Silahkan cek inbox atau kotak spam pada email Anda.

{otp.map((value, index) => ( handleOtpChange(index, e.target.value)} className="w-10 h-12 text-center border border-gray-300 rounded-md text-lg focus:outline-none focus:ring-2 focus:ring-[#B89445]" /> ))}

Kirim Ulang OTP

)}
); }