marco.pms.web/src/hooks/useEmployees.js

279 lines
7.0 KiB
JavaScript

import { useEffect, useState } from "react";
import { cacheData, getCachedData } from "../slices/apiDataManager";
import { RolesRepository } from "../repositories/MastersRepository";
import EmployeeRepository from "../repositories/EmployeeRepository";
import ProjectRepository from "../repositories/ProjectRepository";
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
import showToast from "../services/toastService";
import {useSelector} from "react-redux";
import {store} from "../store/store";
import {queryClient} from "../layouts/AuthLayout";
// Query ---------------------------------------------------------------------------
export const useAllEmployees = ( showInactive ) =>
{
const {
data = [],
isLoading,
error,
refetch, // optional if you want recall functionality
} = useQuery({
queryKey: ['allEmployee', showInactive],
queryFn: async () => {
const res = await EmployeeRepository.getAllEmployeeList(showInactive);
return res.data;
},
});
return {
employeesList: data,
loading: isLoading,
error,
recallEmployeeData: refetch,
};
};
// ManageBucket.jsx
export const useEmployees = ( selectedProject ) =>
{
const {
data = [],
isLoading,
error,
refetch,
} = useQuery({
queryKey: ["employeeListByProject", selectedProject],
queryFn: async () => {
const res = await EmployeeRepository.getEmployeeListByproject(selectedProject);
return res.data || res;
},
enabled: !!selectedProject,
});
return {
employees: data,
loading: isLoading,
projects: [], // if needed, pass this separately or manage from another hook
reCallAllEmployee: refetch,
error,
};
};
// ManageRole.jsx
export const useEmployeeRoles = (employeeId) => {
const {
data = [],
isLoading: loading,
error,
} = useQuery({
queryKey: ['employeeRoles', employeeId],
queryFn: async () => {
const res = await RolesRepository.getEmployeeRoles(employeeId);
return res.data;
},
enabled: !!employeeId,
});
return {
employeeRoles: data,
loading,
error,
};
};
// EmployeeProfile.jsx
export const useEmployeesByProject = (projectId) => {
const {
data = [],
isLoading: loading,
error,
refetch: recallProjectEmplloyee,
} = useQuery({
queryKey: ['projectEmployees', projectId],
queryFn: async () => {
const res = await ProjectRepository.getEmployeesByProject(projectId);
return res.data;
},
enabled: !!projectId,
});
return {
employees: data,
loading,
error,
recallProjectEmplloyee,
};
};
// EmployeeList.jsx
export const useEmployeesAllOrByProjectId = (showAllEmployees ,projectId,
showInactive) => {
const queryKey = showAllEmployees
? ['allEmployees', showInactive]
: ['projectEmployees', projectId, showInactive];
const queryFn = async () => {
if (showAllEmployees) {
const res = await EmployeeRepository.getAllEmployeeList(showInactive);
return res.data;
} else {
if (!projectId) return [];
const res = await EmployeeRepository.getEmployeeListByproject(projectId);
return res.data;
}
};
const {
data: employees = [],
isLoading,
error,
refetch,
} = useQuery({
queryKey,
queryFn,
enabled:typeof showInactive === "boolean" && (showAllEmployees || !!projectId),
});
return {
employees,
loading: isLoading,
error,
recallEmployeeData: refetch,
};
};
// ManageEmployee.jsx
export const useEmployeeProfile = ( employeeId ) =>
{
const isEnabled = !!employeeId;
const {
data = null,
isLoading: loading,
error,
refetch
} = useQuery({
queryKey: ['employeeProfile', employeeId],
queryFn: async () => {
if (!employeeId) return null;
const res = await EmployeeRepository.getEmployeeProfile(employeeId);
return res.data;
},
enabled: isEnabled,
});
return {
employee: data,
loading,
error,
refetch
};
};
// Mutation------------------------------------------------------------------
export const useUpdateEmployee = () =>
{
const selectedProject = useSelector((store)=>store.localVariables.projectId)
const queryClient = useQueryClient();
return useMutation({
mutationFn: (employeeData) => EmployeeRepository.manageEmployee(employeeData),
onSuccess: (_, variables) => {
const id = variables.id || variables.employeeId;
const isAllEmployee = variables.IsAllEmployee;
// Cache invalidation
queryClient.invalidateQueries( {queryKey:[ 'allEmployees'] });
// queryClient.invalidateQueries(['employeeProfile', id]);
queryClient.invalidateQueries( {queryKey: [ 'projectEmployees' ]} );
queryClient.removeQueries( {queryKey: [ "empListByProjectAllocated" ]} );
// queryClient.invalidateQueries( {queryKey:[ 'employeeListByProject']} );
showToast( `Employee ${ id ? 'updated' : 'created' } successfully`, 'success' );
},
onError: (error) => {
const msg = error?.response?.data?.message || error.message || 'Something went wrong';
showToast(msg, 'error');
},
});
};
export const useSuspendEmployee = ({ setIsDeleteModalOpen, setemployeeLodaing }) => {
const queryClient = useQueryClient();
const selectedProject = useSelector((store)=>store.localVariables.projectId)
return useMutation({
mutationFn: (id) => {
setemployeeLodaing(true);
return EmployeeRepository.deleteEmployee(id);
},
onSuccess: () => {
// queryClient.invalidateQueries( ['allEmployee',false]);
queryClient.invalidateQueries( {queryKey: [ 'projectEmployees' ]} );
queryClient.invalidateQueries( {queryKey:[ 'employeeListByProject' ,selectedProject]} );
showToast("Employee deleted successfully.", "success");
setIsDeleteModalOpen(false);
},
onError: (error) => {
const message =
error.response?.data?.message ||
error.message ||
"An unexpected error occurred";
showToast(message, "error");
setIsDeleteModalOpen(false);
},
onSettled: () => {
setemployeeLodaing(false);
},
});
};
// Manage Role
export const useUpdateEmployeeRoles = ({ onClose, resetForm, onSuccessCallback } = {}) => {
const queryClient = useQueryClient();
const mutation = useMutation({
mutationFn: (updates) => RolesRepository.createEmployeeRoles(updates),
onSuccess: () => {
showToast("Roles updated successfully", "success");
resetForm?.();
onClose?.();
onSuccessCallback?.();
queryClient.invalidateQueries( {queryKey: [ "employeeRoles" ]} );
queryClient.invalidateQueries( {queryKey: [ "profile" ]} );
},
onError: (err) => {
const message =
err?.response?.data?.message || err?.message || "Error occurred while updating roles";
showToast(message, "error");
},
});
return {
updateRoles: mutation.mutate,
isPending: mutation.isPending,
isError: mutation.isError,
error: mutation.error,
};
};