import { allOption } from 'component/common/ProjectSelect/ProjectSelect'; import { format, subMonths } from 'date-fns'; import { useInsights } from 'hooks/api/getters/useInsights/useInsights'; import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig'; import { usePersistentTableState } from 'hooks/usePersistentTableState'; import type { FC } from 'react'; import { withDefault } from 'use-query-params'; import { FilterItemParam } from 'utils/serializeQueryParams'; import { WidgetTitle } from 'component/insights/components/WidgetTitle/WidgetTitle'; import { FlagsChart } from 'component/insights/componentsChart/FlagsChart/FlagsChart'; import { FlagsProjectChart } from 'component/insights/componentsChart/FlagsProjectChart/FlagsProjectChart'; import { MetricsSummaryChart } from 'component/insights/componentsChart/MetricsSummaryChart/MetricsSummaryChart'; import { ProjectHealthChart } from 'component/insights/componentsChart/ProjectHealthChart/ProjectHealthChart'; import { UpdatesPerEnvironmentTypeChart } from 'component/insights/componentsChart/UpdatesPerEnvironmentTypeChart/UpdatesPerEnvironmentTypeChart'; import { FlagStats } from 'component/insights/componentsStat/FlagStats/FlagStats'; import { HealthStats } from 'component/insights/componentsStat/HealthStats/HealthStats'; import { useInsightsData } from 'component/insights/hooks/useInsightsData'; import { InsightsSection } from 'component/insights/sections/InsightsSection'; import { InsightsFilters } from 'component/insights/InsightsFilters'; import { StyledChartContainer, StyledWidget, StyledWidgetContent, StyledWidgetStats, StatsExplanation, } from '../InsightsCharts.styles'; import { useUiFlag } from 'hooks/useUiFlag'; import { NewProductionFlagsChart } from '../componentsChart/NewProductionFlagsChart/NewProductionFlagsChart.tsx'; import Lightbulb from '@mui/icons-material/LightbulbOutlined'; export const PerformanceInsights: FC = () => { const statePrefix = 'performance-'; const stateConfig = { [`${statePrefix}project`]: FilterItemParam, [`${statePrefix}from`]: withDefault(FilterItemParam, { values: [format(subMonths(new Date(), 1), 'yyyy-MM-dd')], operator: 'IS', }), [`${statePrefix}to`]: withDefault(FilterItemParam, { values: [format(new Date(), 'yyyy-MM-dd')], operator: 'IS', }), }; const [state, setState] = usePersistentTableState('insights', stateConfig, [ 'performance-from', 'performance-to', ]); const { insights, loading } = useInsights( state[`${statePrefix}from`]?.values[0], state[`${statePrefix}to`]?.values[0], ); const projects = state[`${statePrefix}project`]?.values ?? [allOption.id]; const showAllProjects = projects[0] === allOption.id; const { flagTrends, summary, groupedProjectsData, groupedLifecycleData, userTrends, groupedMetricsData, allMetricsDatapoints, environmentTypeTrends, } = useInsightsData(insights, projects); const { isEnterprise } = useUiConfig(); const lastUserTrend = userTrends[userTrends.length - 1]; const usersTotal = lastUserTrend?.total ?? 0; const lastFlagTrend = flagTrends[flagTrends.length - 1]; const flagsTotal = lastFlagTrend?.total ?? 0; function getFlagsPerUser(flagsTotal: number, usersTotal: number) { const flagsPerUserCalculation = flagsTotal / usersTotal; return Number.isNaN(flagsPerUserCalculation) ? 'N/A' : flagsPerUserCalculation.toFixed(2); } const isLifecycleGraphsEnabled = useUiFlag('lifecycleGraphs'); return ( } > {isLifecycleGraphsEnabled && isEnterprise() ? ( How often do flags go live in production? ) : null} {showAllProjects ? ( ) : ( )} {isEnterprise() ? ( } /> ) : null} {isEnterprise() ? ( <> ) : null} ); };