import { useMemo, useState, VFC } from 'react'; import { Box, styled, Typography, useMediaQuery, useTheme, } from '@mui/material'; import { PageHeader } from 'component/common/PageHeader/PageHeader'; import { UsersChart } from './UsersChart/UsersChart'; import { FlagsChart } from './FlagsChart/FlagsChart'; import { useExecutiveDashboard } from 'hooks/api/getters/useExecutiveSummary/useExecutiveSummary'; import { UserStats } from './UserStats/UserStats'; import { FlagStats } from './FlagStats/FlagStats'; import { Widget } from './Widget/Widget'; import { FlagsProjectChart } from './FlagsProjectChart/FlagsProjectChart'; import { ProjectHealthChart } from './ProjectHealthChart/ProjectHealthChart'; import { TimeToProductionChart } from './TimeToProductionChart/TimeToProductionChart'; import { TimeToProduction } from './TimeToProduction/TimeToProduction'; import { ProjectSelect, allOption } from './ProjectSelect/ProjectSelect'; import { MetricsSummaryChart } from './MetricsSummaryChart/MetricsSummaryChart'; import { ExecutiveSummarySchemaMetricsSummaryTrendsItem, ExecutiveSummarySchemaProjectFlagTrendsItem, } from '../../openapi'; import { HealthStats } from './HealthStats/HealthStats'; import { Badge } from 'component/common/Badge/Badge'; const StyledGrid = styled(Box)(({ theme }) => ({ display: 'grid', gridTemplateColumns: `300px 1fr`, gridAutoRows: 'auto', gap: theme.spacing(2), })); const useDashboardGrid = () => { const theme = useTheme(); const isMediumScreen = useMediaQuery(theme.breakpoints.down('lg')); const isSmallScreen = useMediaQuery(theme.breakpoints.down('sm')); if (isSmallScreen) { return { gridTemplateColumns: `1fr`, chartSpan: 1, userTrendsOrder: 3, flagStatsOrder: 2, largeChartSpan: 1, }; } if (isMediumScreen) { return { gridTemplateColumns: `1fr 1fr`, chartSpan: 2, userTrendsOrder: 3, flagStatsOrder: 2, largeChartSpan: 2, }; } return { gridTemplateColumns: `300px auto`, chartSpan: 1, userTrendsOrder: 2, flagStatsOrder: 3, largeChartSpan: 2, }; }; interface FilteredProjectData { filteredProjectFlagTrends: ExecutiveSummarySchemaProjectFlagTrendsItem[]; filteredMetricsSummaryTrends: ExecutiveSummarySchemaMetricsSummaryTrendsItem[]; } export const ExecutiveDashboard: VFC = () => { const { executiveDashboardData, loading, error } = useExecutiveDashboard(); const [projects, setProjects] = useState([allOption.id]); const flagPerUsers = useMemo(() => { if ( executiveDashboardData.users.total === 0 || executiveDashboardData.flags.total === 0 ) return '0'; return ( executiveDashboardData.flags.total / executiveDashboardData.users.total ).toFixed(1); }, [executiveDashboardData]); const { filteredProjectFlagTrends, filteredMetricsSummaryTrends } = useMemo(() => { if (projects[0] === allOption.id) { return { filteredProjectFlagTrends: executiveDashboardData.projectFlagTrends, filteredMetricsSummaryTrends: executiveDashboardData.metricsSummaryTrends, }; } const filteredProjectFlagTrends = executiveDashboardData.projectFlagTrends.filter((trend) => projects.includes(trend.project), ) as ExecutiveSummarySchemaProjectFlagTrendsItem[]; const filteredImpressionsSummary = executiveDashboardData.metricsSummaryTrends.filter((summary) => projects.includes(summary.project), ) as ExecutiveSummarySchemaMetricsSummaryTrendsItem[]; return { filteredProjectFlagTrends, filteredMetricsSummaryTrends: filteredImpressionsSummary, }; }, [executiveDashboardData, projects]); const { gridTemplateColumns, chartSpan, userTrendsOrder, flagStatsOrder, largeChartSpan, } = useDashboardGrid(); return ( <> ({ paddingBottom: theme.spacing(4) })}> ({ display: 'flex', alignItems: 'center', gap: theme.spacing(1), })} > Insights{' '} Beta } /> ); };