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, useUpdateEmployee } from "../../hooks/useEmployees"; import { cacheData, clearCacheKey, getCachedData, } from "../../slices/apiDataManager"; import { clearApiCacheKey } from "../../slices/apiCacheSlice"; import { useMutation } from "@tanstack/react-query"; const mobileNumberRegex = /^[0-9]\d{9}$/; const ManageEmployee = ({ employeeId, onClosed, IsAllEmployee }) => { const dispatch = useDispatch(); const { mutate: updateEmployee, isPending } = useUpdateEmployee(); const { employee, error, loading: empLoading, refetch } = useEmployeeProfile(employeeId); useEffect(() => { dispatch(changeMaster("Job Role")); }, [employeeId]); const [disabledEmail, setDisabledEmail] = useState(false); const { data: job_role, loading } = useMaster(); const [isloading, setLoading] = useState(false); const navigation = useNavigate(); const [currentEmployee, setCurrentEmployee] = useState(null); const [currentAddressLength, setCurrentAddressLength] = useState(0); const [permanentAddressLength, setPermanentAddressLength] = useState(0); const userSchema = z.object({ ...(employeeId ? { id: z.string().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() .optional() .refine((val) => !val || /^\d{12}$/.test(val), { message: "Aadhar card must be exactly 12 digits long", }), 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" }), }); useEffect(() => { refetch() }, []) const { register, control, handleSubmit, watch, formState: { errors }, reset, getValues, } = useForm({ resolver: zodResolver(userSchema), defaultValues: { id: currentEmployee?.id || null, 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() || null, }, mode: "onChange", }); const AadharNumberValue = watch("aadharNumber") || ""; const onSubmit = (data) => { if (data.email === "") { data.email = null; } updateEmployee({ ...data, IsAllEmployee }, { onSuccess: () => { reset(); onClosed(); }, }); }; useEffect(() => { if (!loading && !error && employee) { setCurrentEmployee(employee); } }, [loading, error, employee]); useEffect(() => { reset( currentEmployee ? { id: currentEmployee.id || null, 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() || "", } : {} ); setCurrentAddressLength(currentEmployee?.currentAddress?.length || 0); setPermanentAddressLength(currentEmployee?.permanentAddress?.length || 0); }, [currentEmployee, reset]); return ( <>
> ); }; export default ManageEmployee;