import getGreetingMessage from "../../utils/greetingHandler"; import { cacheData, clearAllCache, getCachedData, } from "../../slices/apiDataManager"; import AuthRepository from "../../repositories/AuthRepository"; import { useDispatch, useSelector } from "react-redux"; import { changeMaster, setProjectId } from "../../slices/localVariablesSlice"; import useMaster from "../../hooks/masterHook/useMaster"; import { useProfile } from "../../hooks/useProfile"; import { useLocation, useNavigate, useParams } from "react-router-dom"; import Avatar from "../../components/common/Avatar"; import { useChangePassword } from "../Context/ChangePasswordContext"; import { useProjects } from "../../hooks/useProjects"; import { useCallback, useEffect, useState } from "react"; import { useProjectName } from "../../hooks/useProjects"; import eventBus from "../../services/eventBus"; import { useHasUserPermission } from "../../hooks/useHasUserPermission"; import { MANAGE_PROJECT } from "../../utils/constants"; const Header = () => { const { profile } = useProfile(); const location = useLocation(); const dispatch = useDispatch(); const { data, loading } = useMaster(); const navigate = useNavigate(); const HasManageProjectPermission = useHasUserPermission(MANAGE_PROJECT); const isDirectoryPath = /^\/directory$/.test(location.pathname); const isProjectPath = /^\/projects$/.test(location.pathname); const isDashboard = /^\/dashboard$/.test(location.pathname) || /^\/$/.test(location.pathname); // Define the specific project status IDs you want to filter by const allowedProjectStatusIds = [ "603e994b-a27f-4e5d-a251-f3d69b0498ba", // On Hold "cdad86aa-8a56-4ff4-b633-9c629057dfef", // In Progress "ef1c356e-0fe0-42df-a5d3-8daee355492d", // Inactive "b74da4c2-d07e-46f2-9919-e75e49b12731", // Active ]; const getRole = (roles, joRoleId) => { if (!Array.isArray(roles)) return "User"; let role = roles.find((role) => role.id === joRoleId); return role ? role.name : "User"; }; const handleLogout = (e) => { e.preventDefault(); logout(); }; const logout = async () => { try { let data = { refreshToken: localStorage.getItem("refreshToken"), }; AuthRepository.logout(data) .then((response) => { localStorage.removeItem("jwtToken"); localStorage.removeItem("refreshToken"); localStorage.removeItem("user"); localStorage.clear(); clearAllCache(); window.location.href = "/auth/login"; }) .catch((error) => { // Even if logout API fails, clear local storage and redirect localStorage.removeItem("jwtToken"); localStorage.removeItem("refreshToken"); localStorage.removeItem("user"); clearAllCache(); window.location.href = "/auth/login"; }); } catch (error) { console.error( "Error during logout:", error?.response?.data || error.message ); } }; const handleProfilePage = () => { navigate(`/employee/${profile?.employeeInfo?.id}?for=attendance`); }; const { projectNames, loading: projectLoading, fetchData } = useProjectName(); const selectedProject = useSelector( (store) => store.localVariables.projectId ); // Conditional filtering for projectsForDropdown // If on Dashboard, show all projects. Otherwise, filter by allowedProjectStatusIds. const projectsForDropdown = isDashboard ? projectNames // On dashboard, show all projects : projectNames?.filter(project => allowedProjectStatusIds.includes(project.projectStatusId) ); // Determine the display text for the project dropdown let displayText = "All Projects"; if (selectedProject === null) { displayText = "All Projects"; } else if (selectedProject) { // Find the selected project from the full projectNames list const selectedProjectObj = projectNames?.find( (p) => p?.id === selectedProject ); // Fallback to selectedProject ID if name not found during loading or mismatch displayText = selectedProjectObj ? selectedProjectObj.name : selectedProject; } else if (projectLoading) { displayText = "Loading..."; } const { openChangePassword } = useChangePassword(); useEffect(() => { if ( projectNames && // Use the original projectNames for initial setting to ensure all are considered for initial state if needed projectNames.length > 0 && selectedProject === undefined && !getCachedData("hasReceived") ) { if (isDashboard) { dispatch(setProjectId(null)); // Always set to null for "All Projects" on Dashboard initial load } else { // If not dashboard, set to the first project that matches the allowed statuses if available const firstAllowedProject = projectNames.find(project => allowedProjectStatusIds.includes(project.projectStatusId)); dispatch(setProjectId(firstAllowedProject?.id || null)); // Fallback to null if no allowed projects } } }, [projectNames, selectedProject, dispatch, isDashboard]); const handler = useCallback( async (data) => { if (!HasManageProjectPermission) { await fetchData(); const projectExist = data.projectIds.some( (item) => item === selectedProject ); if (projectExist) { cacheData("hasReceived", false); } } }, [fetchData, selectedProject, HasManageProjectPermission] ); const newProjectHandler = useCallback( async (msg) => { if (HasManageProjectPermission && msg.keyword === "Create_Project") { await fetchData(); } else if (projectNames?.some((item) => item.id === msg.response.id)) { await fetchData(); } cacheData("hasReceived", false); }, [HasManageProjectPermission, projectNames, fetchData] ); useEffect(() => { dispatch(changeMaster("Job Role")); }, [dispatch]); useEffect(() => { eventBus.on("assign_project_one", handler); eventBus.on("project", newProjectHandler); return () => { eventBus.off("assign_project_one", handler); eventBus.off("project", newProjectHandler); }; }, [handler, newProjectHandler]); const handleProjectChange = (project) => { dispatch(setProjectId(project)); // Always set the projectId if (isProjectPath && project !== null) { navigate("/projects/details"); // Navigate only if on /projects and a specific project is selected } // No navigation if on dashboard or if "All Projects" is selected }; console.log("Kartik sharma", projectNames); return ( ); }; export default Header;