import React, { useEffect, useState } from "react"; import showToast from "../../services/toastService"; import EmployeeRepository from "../../repositories/EmployeeRepository"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; import useMaster from "../../hooks/masterHook/useMaster"; import { useDispatch } from "react-redux"; import { changeMaster } from "../../slices/localVariablesSlice"; import { Link, useNavigate, useParams } from "react-router-dom"; import { formatDate } from "../../utils/dateUtils"; import { useEmployeeProfile } from "../../hooks/useEmployees"; import { clearCacheKey, getCachedData } from "../../slices/apiDataManager"; import { clearApiCacheKey } from "../../slices/apiCacheSlice"; const mobileNumberRegex = /^[7-9]\d{9}$/; const ManageEmployee = () => { const dispatch = useDispatch(); const { employeeId } = useParams(); const { employee, error, loading: empLoading, } = useEmployeeProfile( employeeId ); dispatch( changeMaster( "Job Role" ) ); const [disabledEmail, setDisabledEmail] = useState(false); const { data: job_role, loading } = useMaster(); const [isloading, setLoading] = useState(false); const navigation = useNavigate(); const [currentEmployee, setCurrentEmployee] = useState(); const [currentAddressLength, setCurrentAddressLength] = useState(0); const [permanentAddressLength, setPermanentAddressLength] = useState(0); const userSchema = z.object({ ...(employeeId ? { Id: z.number().optional() } : {}), FirstName: z.string().min(1, { message: "First Name is required" }), MiddleName: z.string().optional(), LastName: z.string().min(1, { message: "Last Name is required" }), Email: z .string().max(80,"Email cannot exceed 80 characters") .optional() .refine((val) => !val || /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(val), { message: "Invalid email format", }) .refine( (val) => { if (!val) return true; const [local, domain] = val.split("@"); return ( val.length <= 320 && local?.length <= 64 && domain?.length <= 255 ); }, { message: "Email local or domain part is too long", } ), CurrentAddress: z .string() .min(1, { message: "Current Address is required" }) .max(500, { message: "Address cannot exceed 500 characters" }), BirthDate: z .string() .min(1, { message: "Birth Date is required" }) .refine( (date, ctx) => { return new Date(date) <= new Date(); }, { message: "Birth date cannot be in the future", } ), JoiningDate: z .string() .min(1, { message: "Joining Date is required" }) .refine( (date, ctx) => { return new Date(date) <= new Date(); }, { message: "Joining date cannot be in the future", } ), EmergencyPhoneNumber: z .string() .min(1, { message: "Phone Number is required" }) .regex(mobileNumberRegex, { message: "Invalid phone number " }), EmergencyContactPerson: z .string() .min(1, { message: "Emergency Contact Person is required" }) .regex(/^[A-Za-z\s]+$/, { message: "Emergency Contact Person must contain only letters", }), AadharNumber: z .string() .regex(/^\d{12}$/, "Aadhar card must be exactly 12 digits long") .nonempty("Aadhar card is required"), Gender: z .string() .min(1, { message: "Gender is required" }) .refine((val) => val !== "Select Gender", { message: "Please select a gender", }), PanNumber: z .string() .optional() .refine((val) => !val || /^[A-Z]{5}[0-9]{4}[A-Z]{1}$/.test(val), { message: "Invalid PAN number", }), PermanentAddress: z .string() .min(1, { message: "Permanent Address is required" }) .max(500, { message: "Address cannot exceed 500 characters" }), PhoneNumber: z .string() .min(1, { message: "Phone Number is required" }) .regex(mobileNumberRegex, { message: "Invalid phone number " }), JobRoleId: z.string().min(1, { message: "Role is required" }), }); const { register, control, handleSubmit, watch, formState: { errors }, reset, getValues, } = useForm({ resolver: zodResolver(userSchema), defaultValues: { Id: currentEmployee?.id || "", FirstName: currentEmployee?.firstName || "", MiddleName: currentEmployee?.middleName || "", LastName: currentEmployee?.lastName || "", Email: currentEmployee?.email || "", CurrentAddress: currentEmployee?.currentAddress || "", BirthDate: formatDate(currentEmployee?.birthDate) || "", JoiningDate: formatDate(currentEmployee?.joiningDate) || "", EmergencyPhoneNumber: currentEmployee?.emergencyPhoneNumber || "", EmergencyContactPerson: currentEmployee?.emergencyContactPerson || "", AadharNumber: currentEmployee?.aadharNumber || "", Gender: currentEmployee?.gender || "", PanNumber: currentEmployee?.panNumber || "", PermanentAddress: currentEmployee?.permanentAddress || "", PhoneNumber: currentEmployee?.phoneNumber || "", JobRoleId: currentEmployee?.jobRoleId || "", }, mode: "onChange", }); const AadharNumberValue = watch( "AadharNumber" ) || ""; const onSubmit = (data) => { setLoading(true); const formData = getValues(); const formDataToSend = new FormData(); if (!employeeId) { delete formData["Id"]; } for (const key in formData) { formDataToSend.append(key, formData[key]); // if (key === "Documents") { // formData[key]?.forEach((file, index) => { // formDataToSend.append(`Documents`, file); // }); // } else if (key === "Photo" && formData[key]) { // formDataToSend.append("Photo", formData[key]); // } else{ // formDataToSend.append(key, formData[key]); // } } EmployeeRepository.manageEmployee(formDataToSend) .then((response) => { showToast("Employee details updated successfully.", "success"); clearCacheKey("employeeListByProject"); clearCacheKey( "allEmployeeList" ); clearCacheKey("employeeProfile") setLoading( false ); reset() navigation("/employees"); }) .catch((error) => { showToast(error.message, "error"); setLoading(false); }); }; useEffect(() => { if (!loading && !error && employee) { setCurrentEmployee(employee); } }, [loading, error, employee]); dispatch(changeMaster("Job Role")); useEffect(() => { reset( currentEmployee ? { Id: currentEmployee.id || "", FirstName: currentEmployee.firstName || "", MiddleName: currentEmployee.middleName || "", LastName: currentEmployee.lastName || "", Email: currentEmployee.email || "", CurrentAddress: currentEmployee.currentAddress || "", BirthDate: formatDate(currentEmployee.birthDate) || "", JoiningDate: formatDate(currentEmployee.joiningDate) || "", EmergencyPhoneNumber: currentEmployee.emergencyPhoneNumber || "", EmergencyContactPerson: currentEmployee.emergencyContactPerson || "", AadharNumber: currentEmployee.aadharNumber || "", Gender: currentEmployee.gender || "", PanNumber: currentEmployee.panNumber || "", PermanentAddress: currentEmployee.permanentAddress || "", PhoneNumber: currentEmployee.phoneNumber || "", JobRoleId: currentEmployee.jobRoleId?.toString() || "", } : {} // Empty object resets the form ); setCurrentAddressLength(currentEmployee?.currentAddress?.length || 0); setPermanentAddressLength(currentEmployee?.permanentAddress?.length || 0); }, [currentEmployee, reset]); return ( <>
Loading Employee Data...
)}