203 lines
5.6 KiB
JavaScript
203 lines
5.6 KiB
JavaScript
import { useEffect, useState } from "react";
|
|
import { cacheData, getCachedData } from "../slices/apiDataManager";
|
|
import ProjectRepository from "../repositories/ProjectRepository";
|
|
import { useProfile } from "./useProfile";
|
|
import { useDispatch, useSelector } from "react-redux";
|
|
import { setProjectId } from "../slices/localVariablesSlice";
|
|
import EmployeeList from "../components/Directory/EmployeeList";
|
|
|
|
export const useProjects = () => {
|
|
|
|
const loggedUser = useSelector( ( store ) => store.globalVariables.loginUser )
|
|
const [projects, setProjects] = useState([]);
|
|
const [loading, setLoading] = useState(true);
|
|
const [error, setError] = useState("");
|
|
|
|
const fetchData = async () => {
|
|
const projectIds = loggedUser?.projects || [];
|
|
|
|
const filterProjects = (projectsList) => {
|
|
return projectsList
|
|
.filter((proj) => projectIds.includes(String(proj.id)))
|
|
.sort((a, b) => a.name.localeCompare(b.name));
|
|
};
|
|
|
|
const projects_cache = getCachedData("projectslist");
|
|
|
|
if (!projects_cache) {
|
|
setLoading(true);
|
|
try {
|
|
const response = await ProjectRepository.getProjectList();
|
|
const allProjects = response.data;
|
|
const filtered = filterProjects(allProjects);
|
|
setProjects(filtered);
|
|
cacheData("projectslist", allProjects);
|
|
} catch (err) {
|
|
setError("Failed to fetch data.");
|
|
} finally {
|
|
setLoading(false);
|
|
}
|
|
} else {
|
|
if (!projects.length) {
|
|
const filtered = filterProjects(projects_cache);
|
|
setProjects(filtered);
|
|
setLoading(false);
|
|
}
|
|
}
|
|
};
|
|
useEffect(() => {
|
|
if (loggedUser) {
|
|
fetchData();
|
|
}
|
|
}, [loggedUser]);
|
|
|
|
return { projects, loading, error, refetch: fetchData };
|
|
};
|
|
|
|
export const useEmployeesByProjectAllocated = (selectedProject) => {
|
|
const [projectEmployees, setEmployeeList] = useState([]);
|
|
const [loading, setLoading] = useState(true);
|
|
const [projects, setProjects] = useState([]);
|
|
|
|
const fetchData = async (projectid) => {
|
|
try {
|
|
let EmployeeByProject_Cache = getCachedData("empListByProjectAllocated");
|
|
if (
|
|
!EmployeeByProject_Cache ||
|
|
!EmployeeByProject_Cache.projectId === projectid
|
|
) {
|
|
let response = await ProjectRepository.getProjectAllocation(projectid);
|
|
setEmployeeList(response.data);
|
|
cacheData("empListByProjectAllocated", {
|
|
data: response.data,
|
|
projectId: projectid,
|
|
});
|
|
setLoading(false);
|
|
} else {
|
|
setEmployeeList(EmployeeByProject_Cache.data);
|
|
setLoading(false);
|
|
}
|
|
} catch (err) {
|
|
setError("Failed to fetch data.");
|
|
setLoading(false);
|
|
}
|
|
};
|
|
|
|
useEffect(() => {
|
|
if (selectedProject) {
|
|
fetchData(selectedProject);
|
|
}
|
|
}, [selectedProject]);
|
|
|
|
return { projectEmployees, loading, projects };
|
|
};
|
|
|
|
export const useProjectDetails = (projectId) => {
|
|
const { profile } = useProfile();
|
|
const [projects_Details, setProject_Details] = useState(null);
|
|
const [loading, setLoading] = useState(true);
|
|
const [error, setError] = useState("");
|
|
|
|
const fetchData = async () => {
|
|
setLoading(true);
|
|
|
|
const project_cache = getCachedData("projectInfo");
|
|
if (!project_cache || project_cache?.projectId != projectId) {
|
|
ProjectRepository.getProjectByprojectId(projectId)
|
|
.then((response) => {
|
|
setProject_Details(response.data);
|
|
cacheData("projectInfo", {
|
|
projectId: projectId,
|
|
data: response.data,
|
|
});
|
|
setLoading(false);
|
|
})
|
|
.catch((error) => {
|
|
console.error(error);
|
|
setError("Failed to fetch data.");
|
|
setLoading(false);
|
|
});
|
|
} else {
|
|
setProject_Details(project_cache.data);
|
|
setLoading(false);
|
|
}
|
|
};
|
|
|
|
useEffect(() => {
|
|
if (profile && projectId != undefined) {
|
|
fetchData();
|
|
}
|
|
}, [projectId, profile]);
|
|
|
|
return { projects_Details, loading, error, refetch: fetchData }
|
|
}
|
|
|
|
|
|
export const useProjectsByEmployee = ( employeeId ) =>
|
|
{
|
|
const [projectList, setProjectList] = useState([]);
|
|
const [loading, setLoading] = useState(false);
|
|
const [error, setError] = useState('');
|
|
|
|
const fetchProjects = async (id) => {
|
|
try {
|
|
setLoading(true);
|
|
setError(''); // clear previous error
|
|
const res = await ProjectRepository.getProjectsByEmployee(id);
|
|
setProjectList(res.data);
|
|
cacheData( 'ProjectsByEmployee', {data: res.data, employeeId: id} );
|
|
setLoading(false)
|
|
} catch (err) {
|
|
setError( err?.message || 'Failed to fetch projects' );
|
|
setLoading(false)
|
|
}
|
|
};
|
|
|
|
useEffect(() => {
|
|
if (!employeeId) return;
|
|
|
|
const cache_project = getCachedData('ProjectsByEmployee');
|
|
|
|
if (
|
|
!cache_project?.data ||
|
|
cache_project?.employeeId !== employeeId
|
|
) {
|
|
fetchProjects(employeeId);
|
|
} else {
|
|
setProjectList(cache_project.data);
|
|
}
|
|
}, [employeeId]);
|
|
|
|
return {
|
|
projectList,
|
|
loading,
|
|
error,
|
|
refetch : fetchProjects
|
|
}
|
|
};
|
|
|
|
export const useProjectName = () => {
|
|
const [loading, setLoading] = useState(true);
|
|
const [projectNames, setProjectName] = useState([]);
|
|
const[Error,setError] = useState()
|
|
|
|
const fetchData = async () => {
|
|
try {
|
|
let response = await ProjectRepository.projectNameList();
|
|
console.log(response)
|
|
setProjectName(response.data);
|
|
cacheData("basicProjectNameList",response.data);
|
|
setLoading(false);
|
|
} catch (err) {
|
|
setError("Failed to fetch data.");
|
|
setLoading(false);
|
|
}
|
|
};
|
|
useEffect(() => {
|
|
fetchData();
|
|
}, []);
|
|
|
|
return { projectNames, loading, Error };
|
|
};
|
|
|