diff --git a/components/form/sign-up.tsx b/components/form/sign-up.tsx index 7656475..65fb26f 100644 --- a/components/form/sign-up.tsx +++ b/components/form/sign-up.tsx @@ -16,7 +16,7 @@ import Swal from "sweetalert2"; import { error } from "console"; import { EyeFilledIcon, EyeSlashFilledIcon } from "../icons"; import { RadioGroup, RadioGroupItem } from "../ui/radio-group"; -import { registerTenant } from "@/service/auth"; +import { createUser, registerTenant } from "@/service/auth"; export default function SignUp() { const router = useRouter(); @@ -39,7 +39,9 @@ export default function SignUp() { const [isResetPassword, setIsResetPassword] = useState(false); const [checkUsernameValue, setCheckUsernameValue] = useState(""); const MySwal = withReactContent(Swal); - + const [fullname, setFullname] = useState(""); + const [userLevelId, setUserLevelId] = useState(""); + const [userRoleId, setUserRoleId] = useState(""); const setValUsername = (e: any) => { const uname = e.replaceAll(/[^\w.-]/g, ""); setUsername(uname.toLowerCase()); @@ -81,16 +83,28 @@ export default function SignUp() { const [isLoading, setIsLoading] = useState(false); const [formErrors, setFormErrors] = useState({}); - const handleSendOtp = (e: React.FormEvent) => { + const handleSendOtp = async (e: React.FormEvent) => { e.preventDefault(); - // If role is tenant, handle tenant registration directly + // Tenant → gunakan API registerTenant if (role === "tenant") { - handleTenantRegistration(e); + await handleTenantRegistration(e); return; } - // For other roles, proceed with OTP flow + // Umum dan Jurnalis → gunakan API createUser + if (role === "umum" || role === "jurnalis") { + await handleCreateUserUmum(e); + return; + } + + // Kontributor (sementara ikut umum) + if (role === "kontributor") { + await handleCreateUserUmum(e); + return; + } + + // Default (fallback ke OTP flow jika ada tambahan nanti) setStep("otp"); }; @@ -126,6 +140,76 @@ export default function SignUp() { return password.length >= 8; }; + 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: parseInt(userLevelId), + userRoleId: 3, + 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 = {}; @@ -182,17 +266,17 @@ export default function SignUp() { try { const registrationData = { adminUser: { - address: "Jakarta", // Default address as per API requirement + address: "Jakarta", email: email, fullname: `${firstName} ${lastName}`, password: tenantPassword, phoneNumber: whatsapp, - username: `${firstName}-${lastName}`, // Using firstName + lastName as username + username: `${firstName}-${lastName}`, }, client: { - clientType: "sub_client", // Hardcoded as per API requirement + clientType: "sub_client", name: namaTenant, - parentClientId: "78356d32-52fa-4dfc-b836-6cebf4e3eead", // Hardcoded as per API requirement + parentClientId: "78356d32-52fa-4dfc-b836-6cebf4e3eead", }, }; @@ -229,6 +313,17 @@ export default function SignUp() { } }; + // 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 */} @@ -300,6 +395,86 @@ export default function SignUp() {
+ {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" && ( @@ -644,6 +819,12 @@ export default function SignUp() { ) : role === "tenant" ? ( "Daftar Tenant" + ) : role === "umum" ? ( + "Daftar Umum" + ) : role === "jurnalis" ? ( + "Daftar Jurnalis" + ) : role === "kontributor" ? ( + "Daftar Kontributor" ) : ( "Kirim OTP" )} diff --git a/components/table/management-user/management-user-internal-table.tsx b/components/table/management-user/management-user-internal-table.tsx index 1eab1cc..84293e6 100644 --- a/components/table/management-user/management-user-internal-table.tsx +++ b/components/table/management-user/management-user-internal-table.tsx @@ -15,7 +15,6 @@ import { useReactTable, } from "@tanstack/react-table"; import { Button } from "@/components/ui/button"; - import { Table, TableBody, @@ -46,7 +45,9 @@ import { import { Checkbox } from "@/components/ui/checkbox"; import { close, loading } from "@/config/swal"; import { Link, useRouter } from "@/i18n/routing"; -import { AdministrationUserList } from "@/service/service/management-user/management-user"; +import { getAllUsers } from "@/service/management-user/management-user"; + +// ✅ Import service baru dari Swagger const UserInternalTable = () => { const router = useRouter(); @@ -69,11 +70,11 @@ const UserInternalTable = () => { pageSize: Number(showData), }); const [search, setSearch] = React.useState(""); - const [categoryFilter, setCategoryFilter] = React.useState([]); const [statusFilter, setStatusFilter] = React.useState([]); const [page, setPage] = React.useState(1); const [totalPage, setTotalPage] = React.useState(1); + const table = useReactTable({ data: dataTable, columns, @@ -131,31 +132,41 @@ const UserInternalTable = () => { }); }, [page, showData]); + // === 🔥 Implementasi service getAllUsers dari Swagger === async function fetchData() { try { loading(); - const res = await AdministrationUserList( - String(levelId), - page - 1, - search, - showData, - "1", - statusFilter?.sort().join(",") - ); - const data = res?.data?.data; - const contentData = data?.content ?? []; + + const res = await getAllUsers({ + count: 1, + limit: Number(showData), + nextPage: page + 1, + page: page, + previousPage: page - 1, + sort: "desc", + sortBy: "id", + totalPage: 10, + }); + + const data = res?.data; + const contentData = Array.isArray(data) + ? data + : data?.content || data?.items || []; + + // Tambahkan nomor urut contentData.forEach((item: any, index: number) => { item.no = (page - 1) * Number(showData) + index + 1; }); - console.log("contentData : ", contentData); + console.log("📦 contentData:", contentData); setDataTable(contentData); - setTotalData(data?.totalElements ?? 0); - setTotalPage(data?.totalPages ?? 0); + setTotalData(data?.totalElements ?? contentData.length ?? 0); + setTotalPage(data?.totalPages ?? 1); close(); } catch (error) { - console.error("Error fetching tasks:", error); + console.error("❌ Error fetching users:", error); + close(); } } @@ -336,6 +347,8 @@ const UserInternalTable = () => { + + {/* === TABLE === */} {table.getHeaderGroups().map((headerGroup) => ( @@ -377,6 +390,7 @@ const UserInternalTable = () => { )}
+