diff --git a/src/components/Layout/Header.jsx b/src/components/Layout/Header.jsx index f3c4dda3..bc6d4981 100644 --- a/src/components/Layout/Header.jsx +++ b/src/components/Layout/Header.jsx @@ -13,18 +13,18 @@ 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, useProjectName } from "../../hooks/useProjects"; // Make sure useProjects is imported if needed elsewhere +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"; -import { useMemo } from "react"; const Header = () => { const { profile } = useProfile(); const location = useLocation(); const dispatch = useDispatch(); - const { data, loading: masterLoading } = useMaster(); // Renamed loading to masterLoading for clarity + const { data, loading } = useMaster(); const navigate = useNavigate(); const HasManageProjectPermission = useHasUserPermission(MANAGE_PROJECT); @@ -33,11 +33,10 @@ const Header = () => { 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 - "b74da4c2-d07e-46f2-9919-e75e49b12731", // Active + "603e994b-a27f-4e5d-a251-f3d69b0498ba", + "cdad86aa-8a56-4ff4-b633-9c629057dfef", + "b74da4c2-d07e-46f2-9919-e75e49b12731", ]; const getRole = (roles, joRoleId) => { @@ -58,7 +57,7 @@ const Header = () => { }; AuthRepository.logout(data) - .then((response) => { + .then(() => { localStorage.removeItem("jwtToken"); localStorage.removeItem("refreshToken"); localStorage.removeItem("user"); @@ -66,10 +65,11 @@ const Header = () => { clearAllCache(); window.location.href = "/auth/login"; }) - .catch((error) => { + .catch(() => { localStorage.removeItem("jwtToken"); localStorage.removeItem("refreshToken"); localStorage.removeItem("user"); + localStorage.clear(); clearAllCache(); window.location.href = "/auth/login"; }); @@ -85,52 +85,55 @@ const Header = () => { navigate(`/employee/${profile?.employeeInfo?.id}?for=attendance`); }; - const { projectNames, loading: projectLoading, fetchData } = useProjectName(); // Renamed loading to projectLoading + const { projectNames, loading: projectLoading, fetchData } = useProjectName(); const selectedProject = useSelectedproject(); - // Filter projects for the dropdown based on the current path and allowed statuses - const projectsForDropdown = useMemo(() => { - if (!projectNames) return []; // Return empty array if projectNames is not yet fetched + const projectsForDropdown = isDashboard + ? projectNames + : projectNames?.filter(project => + allowedProjectStatusIds.includes(project.projectStatusId) + ); - return isDashboard - ? projectNames - : projectNames?.filter(project => allowedProjectStatusIds.includes(project.projectStatusId)); - }, [projectNames, isDashboard, allowedProjectStatusIds]); - - - // Determine the display text for the project dropdown - let displayText = "Loading..."; // Default to loading - if (!projectLoading && projectNames) { // Only update if not loading and projectNames is available + let currentProjectDisplayName; + if (projectLoading) { + currentProjectDisplayName = "Loading..."; + } else if (!projectNames || projectNames.length === 0) { + currentProjectDisplayName = "No Projects Assigned"; + } else if (projectNames.length === 1) { + currentProjectDisplayName = projectNames[0].name; + } else { if (selectedProject === null) { - displayText = "All Projects"; + currentProjectDisplayName = "All Projects"; } else { - // Find the selected project from the full projectNames list - const selectedProjectObj = projectNames.find( // Use projectNames directly here + const selectedProjectObj = projectNames.find( (p) => p?.id === selectedProject ); - displayText = selectedProjectObj ? selectedProjectObj.name : "All Projects"; // Fallback to "All Projects" if selected project is not found + currentProjectDisplayName = selectedProjectObj ? selectedProjectObj.name : "Unknown Project"; } } - const { openChangePassword } = useChangePassword(); useEffect(() => { if ( projectNames && projectNames.length > 0 && - selectedProject === undefined && // Only set default if no project is currently selected - !getCachedData("hasReceived") // Check if this flag is still relevant for your caching strategy + selectedProject === undefined && + !getCachedData("hasReceived") ) { - if (isDashboard) { - dispatch(setProjectId(null)); // Always set to null for "All Projects" on Dashboard initial load + if (projectNames.length === 1) { + dispatch(setProjectId(projectNames[0]?.id || null)); } else { - const firstAllowedProject = projectNames.find(project => allowedProjectStatusIds.includes(project.projectStatusId)); - dispatch(setProjectId(firstAllowedProject?.id || null)); // Fallback to null if no allowed projects + if (isDashboard) { + dispatch(setProjectId(null)); + } else { + const firstAllowedProject = projectNames.find(project => allowedProjectStatusIds.includes(project.projectStatusId)); + dispatch(setProjectId(firstAllowedProject?.id || null)); + } } } - }, [projectNames, selectedProject, dispatch, isDashboard, allowedProjectStatusIds]); + }, [projectNames, selectedProject, dispatch, isDashboard]); const handler = useCallback( @@ -151,7 +154,7 @@ const Header = () => { const newProjectHandler = useCallback( async (msg) => { if (HasManageProjectPermission && msg.keyword === "Create_Project") { - await fetchData(); + await fetchData(); } else if (projectNames?.some((item) => item.id === msg.response.id)) { await fetchData(); } @@ -174,19 +177,15 @@ const Header = () => { }; }, [handler, newProjectHandler]); + const handleProjectChange = (project) => { + dispatch(setProjectId(project)); - const handleProjectChange = (projectId) => { - dispatch(setProjectId(projectId)); - if (isProjectPath && projectId !== null) { - navigate(`/projects/details?resetDates=true`); - } else if (isProjectPath && projectId === null) { - navigate("/projects"); - } else if (isDashboard) { + if (isProjectPath && project !== null) { + navigate("/projects/details"); } }; - const shouldShowDropdown = - isDashboard || (projectsForDropdown && projectsForDropdown.length > 1); + const shouldShowDropdown = projectNames && projectNames.length > 1; return (