"use client"; import { close, error, loading } from "@/config/swal"; import Link from "next/link"; import { useRouter } from "next/navigation"; import React, { useEffect, useState } from "react"; import { Controller, useForm } from "react-hook-form"; import Swal from "sweetalert2"; import withReactContent from "sweetalert2-react-content"; import { z } from "zod"; import { EyeFilledIcon, EyeSlashFilledIcon } from "../icons"; import ReactPasswordChecklist from "react-password-checklist"; import ReactSelect from "react-select"; import makeAnimated from "react-select/animated"; import { zodResolver } from "@hookform/resolvers/zod"; import { createMasterUser } from "@/service/master-user"; import { getAllUserLevels } from "@/service/user-levels-service"; import { listUserRole } from "@/service/master-user-role"; import { Card } from "../ui/card"; import { Input } from "../ui/input"; import { Label } from "../ui/label"; import { Textarea } from "../ui/textarea"; import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"; import { Button } from "../ui/button"; const userSchema = z.object({ id: z.number(), label: z.string(), value: z.string(), }); const masterUserSchema = z.object({ fullname: z.string().min(1, { message: "Required" }), username: z.string().min(1, { message: "Required" }), password: z .string() .min(8, "Password harus memiliki minimal 8 karakter.") .refine((password) => /[A-Z]/.test(password), { message: "Password harus memiliki minimal satu huruf kapital.", }) .refine((password) => /[0-9]/.test(password), { message: "Password harus memiliki minimal satu angka.", }) .refine((password) => /[!@#$%^&*(),.?":{}|<>]/.test(password), { message: "Password harus memiliki minimal satu simbol.", }), passwordValidate: z.string().min(1, { message: "Required" }), email: z.string().min(1, { message: "Required" }), identityNumber: z.string().min(1, { message: "Required" }), genderType: z.string().min(1, { message: "Required" }), phoneNumber: z.string().min(1, { message: "Required" }), address: z.string().min(1, { message: "Required" }), userLevelType: userSchema, userRoleType: userSchema, }); export default function FormMasterUser() { const router = useRouter(); const animatedComponents = makeAnimated(); const MySwal = withReactContent(Swal); const [isVisible, setIsVisible] = useState([false, false]); const [isValidPassword, setIsValidPassword] = useState(false); const [parentList, setParentList] = useState([]); const [listRole, setListRole] = useState([]); const toggleVisibility = (type: number) => { setIsVisible( type === 0 ? [!isVisible[0], isVisible[1]] : [isVisible[0], !isVisible[1]], ); }; const formOptions = { resolver: zodResolver(masterUserSchema), defaultValues: { password: "", passwordValidate: "" }, }; type MicroIssueSchema = z.infer; const { control, handleSubmit, formState: { errors }, setError, watch, setValue, } = useForm(formOptions); const passwordVal = watch("password"); const passwordConfVal = watch("passwordValidate"); async function save(data: z.infer) { const formData = { address: data.address, password: data.password, email: data.email, fullname: data.fullname, genderType: data.genderType, identityNumber: data.identityNumber, identityType: "nrp", phoneNumber: data.phoneNumber, userLevelId: data.userLevelType.id, userRoleId: data.userRoleType.id, username: data.username, }; const response = await createMasterUser(formData); if (response?.error) { error(response.message); return false; } successSubmit("/admin/master-user"); } function successSubmit(redirect: any) { MySwal.fire({ title: "Sukses", icon: "success", confirmButtonColor: "#3085d6", confirmButtonText: "OK", }).then((result) => { if (result.isConfirmed) { router.push(redirect); } }); } async function onSubmit(data: z.infer) { if (data.password === data.passwordValidate) { MySwal.fire({ title: "Simpan Data", text: "", icon: "warning", showCancelButton: true, cancelButtonColor: "#d33", confirmButtonColor: "#3085d6", confirmButtonText: "Simpan", }).then((result) => { if (result.isConfirmed) { save(data); } }); } else { setError("passwordValidate", { type: "manual", message: "Password harus sama.", }); } } const generatePassword = () => { const length = Math.floor(Math.random() * 9) + 8; const upperCaseChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; const lowerCaseChars = "abcdefghijklmnopqrstuvwxyz"; const numberChars = "0123456789"; const specialChars = "!@#$%^&*"; const allChars = upperCaseChars + lowerCaseChars + numberChars + specialChars; let generatedPassword = ""; generatedPassword += upperCaseChars[Math.floor(Math.random() * upperCaseChars.length)]; generatedPassword += specialChars[Math.floor(Math.random() * specialChars.length)]; generatedPassword += numberChars[Math.floor(Math.random() * numberChars.length)]; generatedPassword += lowerCaseChars[Math.floor(Math.random() * lowerCaseChars.length)]; for (let i = generatedPassword.length; i < length; i++) { generatedPassword += allChars[Math.floor(Math.random() * allChars.length)]; } generatedPassword = generatedPassword .split("") .sort(() => 0.5 - Math.random()) .join(""); setValue("password", generatedPassword); }; useEffect(() => { fetchUserLevel(); fetchUserRole(); }, []); const fetchUserLevel = async () => { loading(); const res = await getAllUserLevels(); close(); if (res?.data?.data) { setupParent(res?.data?.data, "level"); } }; const fetchUserRole = async () => { loading(); const request = { limit: 100, page: 1, }; const res = await listUserRole(request); close(); if (res?.data?.data) { setupParent(res?.data?.data, "role"); } }; const setupParent = (data: any, type: "level" | "role") => { const temp = []; for (const element of data) { temp.push({ id: element.id, label: element.name, value: element.aliasName || element.code, }); } if (type === "level") { setParentList(temp); } else { setListRole(temp); } }; return (
(
)} /> {errors.fullname?.message && (

{errors.fullname?.message}

)} (
)} /> {errors.username?.message && (

{errors.username?.message}

)} (
)} /> {errors.email?.message && (

{errors.email?.message}

)} (
)} /> {errors.identityNumber?.message && (

{errors.identityNumber?.message}

)} (