diff --git a/app/[locale]/(admin)/admin/content/audio-visual/components/pending-approval-columns.tsx b/app/[locale]/(admin)/admin/content/audio-visual/components/pending-approval-columns.tsx index 43ea171..d1d00d7 100644 --- a/app/[locale]/(admin)/admin/content/audio-visual/components/pending-approval-columns.tsx +++ b/app/[locale]/(admin)/admin/content/audio-visual/components/pending-approval-columns.tsx @@ -186,7 +186,7 @@ const usePendingApprovalColumns = () => { View - {canApprove && ( + {/* {canApprove && ( { @@ -197,7 +197,7 @@ const usePendingApprovalColumns = () => { Approve - )} + )} */} ); diff --git a/app/[locale]/(admin)/admin/content/audio/components/pending-approval-columns.tsx b/app/[locale]/(admin)/admin/content/audio/components/pending-approval-columns.tsx index 7f66720..5a1baa6 100644 --- a/app/[locale]/(admin)/admin/content/audio/components/pending-approval-columns.tsx +++ b/app/[locale]/(admin)/admin/content/audio/components/pending-approval-columns.tsx @@ -186,7 +186,7 @@ const usePendingApprovalColumns = () => { View - {canApprove && ( + {/* {canApprove && ( { @@ -197,7 +197,7 @@ const usePendingApprovalColumns = () => { Approve - )} + )} */} ); diff --git a/app/[locale]/(admin)/admin/content/document/components/pending-approval-columns.tsx b/app/[locale]/(admin)/admin/content/document/components/pending-approval-columns.tsx index 8362ba4..200fee8 100644 --- a/app/[locale]/(admin)/admin/content/document/components/pending-approval-columns.tsx +++ b/app/[locale]/(admin)/admin/content/document/components/pending-approval-columns.tsx @@ -186,7 +186,7 @@ const usePendingApprovalColumns = () => { View - {canApprove && ( + {/* {canApprove && ( { @@ -197,7 +197,7 @@ const usePendingApprovalColumns = () => { Approve - )} + )} */} ); diff --git a/app/[locale]/(admin)/admin/content/image/components/pending-approval-columns.tsx b/app/[locale]/(admin)/admin/content/image/components/pending-approval-columns.tsx index 9ebe593..317536f 100644 --- a/app/[locale]/(admin)/admin/content/image/components/pending-approval-columns.tsx +++ b/app/[locale]/(admin)/admin/content/image/components/pending-approval-columns.tsx @@ -192,7 +192,7 @@ const usePendingApprovalColumns = () => { View - {canApprove && ( + {/* {canApprove && ( { @@ -203,7 +203,7 @@ const usePendingApprovalColumns = () => { Approve - )} + )} */} ); diff --git a/components/form/content/audio-visual/video-detail-form.tsx b/components/form/content/audio-visual/video-detail-form.tsx index 99a0d1c..c0cdc18 100644 --- a/components/form/content/audio-visual/video-detail-form.tsx +++ b/components/form/content/audio-visual/video-detail-form.tsx @@ -294,31 +294,19 @@ export default function FormVideoDetail() { async function save() { const data = { - mediaUploadId: id, - statusId: status, + action: status == "2" ? "approve" : status == "3" ? "revision" : "reject", message: description, - files: isUserMabesApprover ? getPlacement() : [], }; + setModalOpen(false); loading(); - const response = await submitApproval(data); + const response = await submitApproval(id, data); if (response?.error) { error(response.message); return false; } - const dataReject = { - listFiles: rejectedFiles, - }; - - const resReject = await rejectFiles(dataReject); - - if (resReject?.error) { - error(resReject.message); - return false; - } - close(); submitApprovalSuccesss(); @@ -403,7 +391,7 @@ export default function FormVideoDetail() { confirmButtonText: "OK", }).then((result) => { if (result.isConfirmed) { - router.push("/contributor/content/video"); + router.push("/admin/content/video"); } }); }; diff --git a/components/form/content/audio/audio-detail-form.tsx b/components/form/content/audio/audio-detail-form.tsx index c8847b7..5340472 100644 --- a/components/form/content/audio/audio-detail-form.tsx +++ b/components/form/content/audio/audio-detail-form.tsx @@ -366,32 +366,19 @@ export default function FormAudioDetail() { async function save() { const data = { - mediaUploadId: id, - statusId: status, + action: status == "2" ? "approve" : status == "3" ? "revision" : "reject", message: description, - // files: [], - files: isUserMabesApprover ? getPlacement() : [], }; + setModalOpen(false); loading(); - const response = await submitApproval(data); + const response = await submitApproval(id, data); if (response?.error) { error(response.message); return false; } - const dataReject = { - listFiles: rejectedFiles, - }; - - const resReject = await rejectFiles(dataReject); - - if (resReject?.error) { - error(resReject.message); - return false; - } - close(); submitApprovalSuccesss(); @@ -471,7 +458,7 @@ export default function FormAudioDetail() { confirmButtonColor: "#3085d6", confirmButtonText: "OK", }).then(() => { - router.push("/in/contributor/content/audio"); + router.push("/admin/content/audio"); }); }; diff --git a/components/form/content/document/teks-detail-form.tsx b/components/form/content/document/teks-detail-form.tsx index c02e616..b6df303 100644 --- a/components/form/content/document/teks-detail-form.tsx +++ b/components/form/content/document/teks-detail-form.tsx @@ -321,32 +321,19 @@ export default function FormTeksDetail() { async function save() { const data = { - mediaUploadId: id, - statusId: status, + action: status == "2" ? "approve" : status == "3" ? "revision" : "reject", message: description, - files: isUserMabesApprover ? getPlacement() : [], }; - setModalOpen(false); + setModalOpen(false); loading(); - const response = await submitApproval(data); + const response = await submitApproval(id, data); if (response?.error) { error(response.message); return false; } - const dataReject = { - listFiles: rejectedFiles, - }; - - const resReject = await rejectFiles(dataReject); - - if (resReject?.error) { - error(resReject.message); - return false; - } - close(); submitApprovalSuccesss(); diff --git a/components/form/content/image/image-detail-form.tsx b/components/form/content/image/image-detail-form.tsx index 59d83dd..5bd4bb9 100644 --- a/components/form/content/image/image-detail-form.tsx +++ b/components/form/content/image/image-detail-form.tsx @@ -452,34 +452,19 @@ export default function FormImageDetail() { async function save() { const data = { - mediaUploadId: id, - statusId: status, + action: status == "2" ? "approve" : status == "3" ? "revision" : "reject", message: description, - files: isUserMabesApprover ? getPlacement() : [], }; setModalOpen(false); loading(); - const response = await submitApproval(data); + const response = await submitApproval(id, data); if (response?.error) { error(response.message); return false; } - const dataReject = { - listFiles: rejectedFiles, - }; - - console.log("reject", dataReject); - - const resReject = await rejectFiles(dataReject); - - if (resReject?.error) { - error(resReject.message); - return false; - } - close(); submitApprovalSuccesss(); @@ -551,7 +536,7 @@ export default function FormImageDetail() { confirmButtonText: "OK", }).then((result) => { if (result.isConfirmed) { - router.push("/contributor/content/image"); + router.push("/admin/content/image"); } }); }; diff --git a/components/form/sign-up.tsx b/components/form/sign-up.tsx index 32d7c55..e684008 100644 --- a/components/form/sign-up.tsx +++ b/components/form/sign-up.tsx @@ -9,9 +9,11 @@ import { Input } from "../ui/input"; import { Button } from "../ui/button"; import { Label } from "../ui/label"; import { RadioGroup, RadioGroupItem } from "../ui/radio-group"; +import { registerTenant } from "@/service/auth"; // ✅ import services import { requestOTP, createUser } from "@/service/auth"; +import { EyeFilledIcon, EyeSlashFilledIcon } from "../icons"; export default function SignUp() { const router = useRouter(); @@ -21,6 +23,32 @@ export default function SignUp() { const [role, setRole] = useState("umum"); const [email, setEmail] = useState(""); 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 [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({}); + // di atas, bareng useState lainnya + const [isVisible, setIsVisible] = useState(false); + const [isVisibleSetup, setIsVisibleSetup] = useState([false, false]); + + // fungsi helper + const toggleVisibility = () => setIsVisible(!isVisible); // data user lengkap const [fullname, setFullname] = useState(""); @@ -54,6 +82,15 @@ export default function SignUp() { console.error("Error send otp:", err); MySwal.fire("Error", "Terjadi kesalahan server", "error"); } + + // If role is tenant, handle tenant registration directly + if (role === "tenant") { + handleTenantRegistration(e); + return; + } + + // For other roles, proceed with OTP flow + setStep("otp"); }; // 🔹 Handle OTP Verification (dummy → lanjut form) @@ -73,26 +110,25 @@ export default function SignUp() { const handleRegister = async (e: React.FormEvent) => { e.preventDefault(); - const payload = { - address, - clientId: "web-app", // contoh default - dateOfBirth, - email, - fullName: fullname, // 🔥 fix disini (bukan fullname) - genderType, - identityGroup: "", - identityGroupNumber: "", - identityNumber: "", - identityType: "", - lastEducation: "", - password, - phoneNumber, - userLevelId: 1, - userRoleId: 1, - username, - workType, -}; - + const payload = { + address, + clientId: "web-app", // contoh default + dateOfBirth, + email, + fullName: fullname, // 🔥 fix disini (bukan fullname) + genderType, + identityGroup: "", + identityGroupNumber: "", + identityNumber: "", + identityType: "", + lastEducation: "", + password, + phoneNumber, + userLevelId: 1, + userRoleId: 1, + username, + workType, + }; try { const res = await createUser(payload); @@ -117,6 +153,124 @@ export default function SignUp() { if (value && nextInput) nextInput.focus(); }; + // Form validation functions + 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 validateTenantForm = () => { + const errors: any = {}; + + if (!firstName.trim()) { + errors.firstName = "First name is required"; + } + + if (!lastName.trim()) { + errors.lastName = "Last name is required"; + } + + 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", // Default address as per API requirement + email: email, + fullname: `${firstName} ${lastName}`, + password: tenantPassword, + phoneNumber: whatsapp, + username: `${firstName}-${lastName}`, // Using firstName + lastName as username + }, + client: { + clientType: "sub_client", // Hardcoded as per API requirement + name: namaTenant, + parentClientId: "78356d32-52fa-4dfc-b836-6cebf4e3eead", // Hardcoded as per API requirement + }, + }; + + 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(() => { + // Redirect to login page or dashboard + 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); + } + }; + return (
{/* Left Side Logo */} @@ -185,12 +339,6 @@ export default function SignUp() { {/* Step 3: Form Lengkap */} {step === "form" && (
- setFullname(e.target.value)} - /> setDateOfBirth(e.target.value)} />