import React, { FC, useEffect } from 'react'; import useProject, { useProjectNameOrId, } from 'hooks/api/getters/useProject/useProject'; import { Box, styled } from '@mui/material'; import { ProjectFeatureToggles } from './ProjectFeatureToggles/ProjectFeatureToggles'; import ProjectInfo from './ProjectInfo/ProjectInfo'; import { usePageTitle } from 'hooks/usePageTitle'; import { useRequiredPathParam } from 'hooks/useRequiredPathParam'; import { useLastViewedProject } from 'hooks/useLastViewedProject'; import { ProjectStats } from './ProjectStats/ProjectStats'; import { useUiFlag } from 'hooks/useUiFlag'; import { DEFAULT_PAGE_LIMIT, useFeatureSearch, } from 'hooks/api/getters/useFeatureSearch/useFeatureSearch'; import { ProjectTableState, PaginatedProjectFeatureToggles, } from './ProjectFeatureToggles/PaginatedProjectFeatureToggles'; import { useTableState } from 'hooks/useTableState'; const refreshInterval = 15 * 1000; const StyledContainer = styled('div')(({ theme }) => ({ display: 'flex', gap: theme.spacing(2), [theme.breakpoints.down('md')]: { flexDirection: 'column', }, })); const StyledProjectToggles = styled('div')(() => ({ width: '100%', minWidth: 0, })); const StyledContentContainer = styled(Box)(({ theme }) => ({ display: 'flex', flexDirection: 'column', gap: theme.spacing(2), width: '100%', minWidth: 0, })); const PaginatedProjectOverview: FC<{ fullWidth?: boolean; storageKey?: string; }> = ({ fullWidth, storageKey = 'project-overview' }) => { const projectId = useRequiredPathParam('projectId'); const { project, loading: projectLoading } = useProject(projectId, { refreshInterval, }); const [tableState, setTableState] = useTableState( {}, `${storageKey}-${projectId}`, ); const page = parseInt(tableState.page || '1', 10); const pageSize = tableState?.pageSize ? parseInt(tableState.pageSize, 10) || DEFAULT_PAGE_LIMIT : DEFAULT_PAGE_LIMIT; const { features: searchFeatures, total, refetch, loading, initialLoad, } = useFeatureSearch( { offset: `${(page - 1) * pageSize}`, limit: `${pageSize}`, sortBy: tableState.sortBy || 'createdAt', sortOrder: tableState.sortOrder === 'desc' ? 'desc' : 'asc', favoritesFirst: tableState.favorites, project: projectId ? `IS:${projectId}` : '', query: tableState.search, }, { refreshInterval, }, ); const { members, features, health, description, environments, stats } = project; return ( ); }; /** * @deprecated remove when flag `featureSearchFrontend` is removed */ const ProjectOverview = () => { const projectId = useRequiredPathParam('projectId'); const projectName = useProjectNameOrId(projectId); const { project, loading, refetch } = useProject(projectId, { refreshInterval, }); const { members, features, health, description, environments, stats } = project; usePageTitle(`Project overview – ${projectName}`); const { setLastViewed } = useLastViewedProject(); const featureSearchFrontend = useUiFlag('featureSearchFrontend'); useEffect(() => { setLastViewed(projectId); }, [projectId, setLastViewed]); if (featureSearchFrontend) return ; return ( ); }; export default ProjectOverview;