import { useCallback, useEffect, useState,useMemo } from "react"; import getGreetingMessage from "../../utils/greetingHandler"; import { cacheData, clearAllCache, getCachedData, useSelectedProject, } 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 { useProjectName } from "../../hooks/useProjects"; import eventBus from "../../services/eventBus"; import { useHasUserPermission } from "../../hooks/useHasUserPermission"; import { ALLOW_PROJECTSTATUS_ID, MANAGE_PROJECT, UUID_REGEX } from "../../utils/constants"; import { useAuthModal, useLogout } from "../../hooks/useAuth"; const Header = () => { const { profile } = useProfile(); const { data: masterData } = useMaster(); const location = useLocation(); const dispatch = useDispatch(); const navigate = useNavigate(); const { mutate: logout, isPending: logouting } = useLogout(); const { onOpen } = useAuthModal(); const { openChangePassword } = useChangePassword(); const HasManageProjectPermission = useHasUserPermission(MANAGE_PROJECT); const pathname = location.pathname; // ======= MEMO CHECKS ======= const isDashboardPath = pathname === "/" || pathname === "/dashboard"; const isProjectPath = pathname === "/projects"; const isDirectory = pathname === "/directory"; const isEmployeeList = pathname === "/employees"; // const isExpense = pathname === "/expenses"; const isEmployeeProfile = UUID_REGEX.test(pathname); const hideDropPaths = isDirectory || isEmployeeList || isEmployeeProfile; const showProjectDropdown = !hideDropPaths; // ===== Project Names & Selected Project ===== const { projectNames, loading: projectLoading, fetchData } = useProjectName(); const selectedProject = useSelectedProject(); const projectsForDropdown = useMemo( () => isDashboardPath ? projectNames : projectNames?.filter((project) => ALLOW_PROJECTSTATUS_ID.includes(project.projectStatusId) ), [projectNames, isDashboardPath] ); const currentProjectDisplayName = useMemo(() => { if (projectLoading) return "Loading..."; if (!projectNames?.length) return "No Projects Assigned"; if (projectNames.length === 1) return projectNames[0].name; if (selectedProject === null) return "All Projects"; const selectedObj = projectNames.find((p) => p.id === selectedProject); return selectedObj ? selectedObj.name : projectNames[0]?.name || "No Projects Assigned"; }, [projectLoading, projectNames, selectedProject]); // ===== Role Helper ===== const getRole = (roles, joRoleId) => { if (!Array.isArray(roles)) return "User"; return roles.find((r) => r.id === joRoleId)?.name || "User"; }; // ===== Navigate to Profile ===== const handleProfilePage = () => navigate(`/employee/${profile?.employeeInfo?.id}`); // ===== Set default project on load ===== useEffect(() => { if ( projectNames?.length && selectedProject === undefined && !getCachedData("hasReceived") ) { if (projectNames.length === 1) { dispatch(setProjectId(projectNames[0].id || null)); } else { if (isDashboardPath) { dispatch(setProjectId(null)); } else { const firstAllowed = projectNames.find((project) => ALLOW_PROJECTSTATUS_ID.includes(project.projectStatusId) ); dispatch(setProjectId(firstAllowed?.id || null)); } } } }, [projectNames, selectedProject, dispatch, isDashboardPath]); // ===== Event Handlers ===== const handler = useCallback( async (data) => { if (!HasManageProjectPermission) { await fetchData(); if (data.projectIds?.includes(selectedProject)) { cacheData("hasReceived", false); } } }, [fetchData, selectedProject, HasManageProjectPermission] ); const newProjectHandler = useCallback( async (msg) => { if ( msg.keyword === "Create_Project" || projectNames?.some((p) => p.id === msg.response?.id) ) { await fetchData(); cacheData("hasReceived", false); } }, [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]); // ===== Project Change ===== const handleProjectChange = (projectId) => { dispatch(setProjectId(projectId)); if (isProjectPath && projectId !== null) { navigate("/projects/details"); } }; const shouldShowDropdown = projectNames && projectNames.length > 1; return ( ); }; export default Header;