import React, { createContext, useContext, useEffect, useState } from "react"; import Breadcrumb from "../../components/common/Breadcrumb"; import { ITEMS_PER_PAGE, MANAGE_PROJECT, PROJECT_STATUS, } from "../../utils/constants"; import ProjectListView from "../../components/Project/ProjectListView"; import GlobalModel from "../../components/common/GlobalModel"; import ManageProjectInfo from "../../components/Project/ManageProjectInfo"; import ProjectCardView from "../../components/Project/ProjectCardView"; import usePagination from "../../hooks/usePagination"; import { useProjects } from "../../hooks/useProjects"; import Loader from "../../components/common/Loader"; import { useHasUserPermission } from "../../hooks/useHasUserPermission"; const ProjectContext = createContext(); export const useProjectContext = () => { const context = useContext(ProjectContext); if (!context) { throw new Error("useProjectContext must be used within an ProjectProvider"); } return context; }; const ProjectPage = () => { const [manageProject, setMangeProject] = useState({ isOpen: false, Project: null, }); const [projectList, setProjectList] = useState([]); const [listView, setListView] = useState(false); const [searchTerm, setSearchTerm] = useState(""); const HasManageProject = useHasUserPermission(MANAGE_PROJECT); const [selectedStatuses, setSelectedStatuses] = useState( PROJECT_STATUS.map((s) => s.id) ); const { data, isLoading, isError, error } = useProjects(); const contextDispatcher = { setMangeProject, }; const filteredProjects = projectList.filter((project) => { const matchesStatus = selectedStatuses.includes(project.projectStatusId); const matchesSearch = project.name .toLowerCase() .includes(searchTerm.toLowerCase()); return matchesStatus && matchesSearch; }); const totalPages = Math.ceil(filteredProjects.length / ITEMS_PER_PAGE); const { currentItems, currentPage, paginate, setCurrentPage } = usePagination( filteredProjects, ITEMS_PER_PAGE ); const handleStatusChange = (statusId) => { setCurrentPage(1); setSelectedStatuses((prev) => prev.includes(statusId) ? prev.filter((id) => id !== statusId) : [...prev, statusId] ); }; const sortingProject = (projects) => { if (!isLoading && Array.isArray(projects)) { const grouped = {}; projects.forEach((project) => { const statusId = project.projectStatusId; if (!grouped[statusId]) grouped[statusId] = []; grouped[statusId].push(project); }); const sortedGrouped = selectedStatuses .filter((statusId) => grouped[statusId]) .flatMap((statusId) => grouped[statusId].sort((a, b) => a.name.toLowerCase().localeCompare(b.name.toLowerCase()) ) ); setProjectList((prev) => { const isSame = JSON.stringify(prev) === JSON.stringify(sortedGrouped); return isSame ? prev : sortedGrouped; }); } }; useEffect(() => { if (!isLoading && data) { sortingProject(data); } }, [data, isLoading, selectedStatuses]); if (isLoading) return (
{error.message}