337 lines
8.4 KiB
JavaScript
337 lines
8.4 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 useEmployee = (employeeId) => {
|
|
return useQuery({
|
|
queryKey: ["employeeProfile", employeeId],
|
|
queryFn: async () => {
|
|
const res = await EmployeeRepository.getEmployeeProfile(employeeId)
|
|
return res.data;
|
|
},
|
|
enabled:!!employeeId
|
|
});
|
|
};
|
|
|
|
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,
|
|
};
|
|
};
|
|
|
|
export const useEmployeesName = (projectId, search) => {
|
|
return useQuery({
|
|
queryKey: ["employees", projectId, search],
|
|
queryFn: async () =>
|
|
await EmployeeRepository.getEmployeeName(projectId, search),
|
|
|
|
staleTime: 5 * 60 * 1000, // Optional: cache for 5 minutes
|
|
});
|
|
};
|
|
|
|
export const useEmployeesNameByProject = (projectId) => {
|
|
return useQuery({
|
|
queryKey: ["Projectemployees", projectId],
|
|
queryFn: async () => {
|
|
const response = await EmployeeRepository.getEmployeeName(projectId);
|
|
return response?.data || []; // handle undefined/null response
|
|
},
|
|
enabled: !!projectId, // only fetch if projectId is truthy
|
|
staleTime: 5 * 60 * 1000, // cache for 5 minutes
|
|
});
|
|
};
|
|
|
|
// 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: ["employeeProfile",id] });
|
|
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 selectedProjectId = useSelector(
|
|
(store) => store.localVariables.projectId
|
|
);
|
|
|
|
return useMutation({
|
|
// Expect both employeeId and active status
|
|
mutationFn: async ({ employeeId, active }) => {
|
|
setemployeeLodaing(true);
|
|
return await EmployeeRepository.deleteEmployee(employeeId, active);
|
|
},
|
|
|
|
onSuccess: (_, { employeeId, active }) => {
|
|
const message =
|
|
active === false
|
|
? "Employee suspended successfully."
|
|
: "Employee reactivated successfully.";
|
|
|
|
showToast(message, "success");
|
|
setIsDeleteModalOpen(false);
|
|
|
|
// Invalidate relevant queries
|
|
queryClient.invalidateQueries({ queryKey: ["employee", employeeId] });
|
|
queryClient.invalidateQueries({ queryKey: ["allEmployees"] });
|
|
|
|
if (selectedProjectId) {
|
|
queryClient.invalidateQueries({
|
|
queryKey: ["projectEmployees", selectedProjectId],
|
|
});
|
|
}
|
|
},
|
|
|
|
onError: (error) => {
|
|
showToast(
|
|
error.response?.data?.message ||
|
|
error.message ||
|
|
"An unexpected error occurred",
|
|
"error"
|
|
);
|
|
setIsDeleteModalOpen(false);
|
|
},
|
|
|
|
onSettled: () => {
|
|
setemployeeLodaing(false);
|
|
},
|
|
});
|
|
};
|
|
|
|
|
|
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,
|
|
};
|
|
}; |