"use client"; import React, { useEffect, useState } from "react"; import { useForm, Controller } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import * as z from "zod"; import { Card } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Button } from "@/components/ui/button"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import Swal from "sweetalert2"; import withReactContent from "sweetalert2-react-content"; import { errorAutoClose, loading, successAutoClose } from "@/lib/swal"; import { close } from "@/config/swal"; import { createUser, updateUser, getUserDetail, CreateUserRequest, UpdateUserRequest, } from "@/service/management-user/management-user"; import { getInfoProfile } from "@/service/auth"; import { getUserLevels } from "@/service/approval-workflows"; import { Eye, EyeOff } from "lucide-react"; const createUserSchema = z.object({ address: z.string().trim().min(1, { message: "Address wajib diisi" }), clientId: z.string().trim().min(1, { message: "Client ID wajib diisi" }), dateOfBirth: z .string() .trim() .min(1, { message: "Date of Birth wajib diisi" }), email: z.string().email({ message: "Email tidak valid" }), fullname: z.string().trim().min(1, { message: "Full Name wajib diisi" }), password: z.string().min(6, { message: "Password minimal 6 karakter" }), phoneNumber: z .string() .trim() .min(1, { message: "Phone Number wajib diisi" }), userLevelId: z.number({ invalid_type_error: "User Level harus dipilih" }), username: z.string().trim().min(1, { message: "Username wajib diisi" }), }); const editUserSchema = z.object({ address: z.string().trim().min(1, { message: "Address wajib diisi" }), clientId: z.string().trim().min(1, { message: "Client ID wajib diisi" }), dateOfBirth: z .string() .trim() .min(1, { message: "Date of Birth wajib diisi" }), email: z.string().email({ message: "Email tidak valid" }), fullname: z.string().trim().min(1, { message: "Full Name wajib diisi" }), password: z .string() .min(6, { message: "Password minimal 6 karakter" }) .optional(), phoneNumber: z .string() .trim() .min(1, { message: "Phone Number wajib diisi" }), userLevelId: z.number({ invalid_type_error: "User Level harus dipilih" }), username: z.string().trim().min(1, { message: "Username wajib diisi" }), }); type CreateUserSchema = z.infer; type EditUserSchema = z.infer; type UserSchema = CreateUserSchema | EditUserSchema; interface UserFormProps { id?: number; initialData?: CreateUserRequest; onSuccess?: () => void; onCancel?: () => void; mode?: "create" | "edit"; } export default function UserForm({ id, onSuccess, onCancel, mode = "create", }: UserFormProps) { const MySwal = withReactContent(Swal); const [loadingData, setLoadingData] = useState(false); const [userLevels, setUserLevels] = useState<{ id: number; name: string }[]>( [], ); const [currentClientId, setCurrentClientId] = useState(""); const [showPassword, setShowPassword] = useState(false); const { control, handleSubmit, setValue, formState: { errors }, } = useForm({ resolver: zodResolver( mode === "create" ? createUserSchema : editUserSchema, ), defaultValues: { address: "", clientId: "", dateOfBirth: "", email: "", fullname: "", password: "", phoneNumber: "", userLevelId: 0, username: "", }, }); useEffect(() => { async function loadData() { setLoadingData(true); try { const [userLevelsResponse, userInfoResponse] = await Promise.all([ getUserLevels(), getInfoProfile(), ]); if (!userLevelsResponse?.error) { setUserLevels(userLevelsResponse?.data?.data || []); } // Get clientId from current user info if (!userInfoResponse?.error && userInfoResponse?.data?.data) { const userInfo = userInfoResponse.data.data; const clientId = userInfo.instituteId || "78356d32-52fa-4dfc-b836-6cebf4e3eead"; // fallback to default setCurrentClientId(clientId); setValue("clientId", clientId); } else { // Fallback to default clientId if UserInfo fails const defaultClientId = "78356d32-52fa-4dfc-b836-6cebf4e3eead"; setCurrentClientId(defaultClientId); setValue("clientId", defaultClientId); } // Load user detail if in edit mode if (mode === "edit" && id) { try { const userResponse = await getUserDetail(id); if (userResponse && !userResponse.error && userResponse.data) { const user = userResponse.data; setValue("address", user.address || ""); setValue("clientId", user.clientId || ""); setValue("dateOfBirth", user.dateOfBirth || ""); setValue("email", user.email || ""); setValue("fullname", user.fullname || ""); setValue("phoneNumber", user.phoneNumber || ""); setValue("userLevelId", user.userLevelId || 0); setValue("username", user.username || ""); // Don't set password for edit mode } else { console.error( "Gagal mengambil detail user:", userResponse?.message || "Unknown error", ); } } catch (error) { console.error("Error loading user detail:", error); } } } catch (err) { console.error("Error loading data:", err); } finally { setLoadingData(false); } } loadData(); }, [id, setValue, mode]); const onSubmit = async (data: UserSchema) => { try { loading(); const payload: CreateUserRequest = { address: data.address, clientId: data.clientId, dateOfBirth: data.dateOfBirth, email: data.email, fullname: data.fullname, password: data.password || "", phoneNumber: data.phoneNumber, userLevelId: data.userLevelId, userRoleId: 3, username: data.username, }; console.log("Payload dikirim ke API:", payload); let response; if (mode === "edit" && id) { response = await updateUser(id, payload); } else { response = await createUser(payload); } close(); if (response?.error) { errorAutoClose( response.message || `Gagal ${mode === "edit" ? "memperbarui" : "menyimpan"} data.`, ); return; } successAutoClose( `Data berhasil ${mode === "edit" ? "diperbarui" : "disimpan"}.`, ); setTimeout(() => { if (onSuccess) onSuccess(); }, 3000); } catch (err) { close(); errorAutoClose( `Terjadi kesalahan saat ${mode === "edit" ? "memperbarui" : "menyimpan"} data.`, ); console.error("User operation error:", err); } }; if (loadingData) { return (

Loading data...

); } return (

{mode === "edit" ? "Edit User" : "Add New User"}

{/* Full Name */}
( )} /> {errors.fullname && (

{errors.fullname.message}

)}
{/* Username */}
( )} /> {errors.username && (

{errors.username.message}

)}
{/* Email */}
( )} /> {errors.email && (

{errors.email.message}

)}
{/* Password - Only show for create mode */} {mode === "create" && (
( )} />
{errors.password && (

{errors.password.message}

)}
)} {/* {mode === "create" && (
( )} /> {errors.password && (

{errors.password.message}

)}
)} */} {/* Phone Number */}
( )} /> {errors.phoneNumber && (

{errors.phoneNumber.message}

)}
{/* Address */}
( )} /> {errors.address && (

{errors.address.message}

)}
{/* Date of Birth */}
} /> {errors.dateOfBirth && (

{errors.dateOfBirth.message}

)}
{/* Client ID */} {/*
( )} /> {errors.clientId && (

{errors.clientId.message}

)}

Client ID diambil dari profil pengguna yang sedang login

*/} {/* User Level */}
( )} /> {errors.userLevelId && (

{errors.userLevelId.message}

)}
{/* Action Buttons */}
); }