UNPKG

@nitin15j/plugin-dora-frontend

Version:
109 lines (106 loc) 3.87 kB
import { useState, useEffect } from 'react'; import { useApi } from '@backstage/core-plugin-api'; import { doraBackendApiRef } from '../../../../api/DORABackendClient.esm.js'; import { MetricType } from '../../common/types/metrics.esm.js'; import { useDoraConfig } from '../../common/utils/config.esm.js'; import { determineTrend, determineOverallTrend } from '../../common/utils/calculations.esm.js'; import { formatMetricValue } from '../../common/utils/formatters.esm.js'; function useAllTeamsMetrics(teamSlugs, timeRange) { const doraApi = useApi(doraBackendApiRef); const [teamsData, setTeamsData] = useState([]); const [overallLoading, setOverallLoading] = useState(true); const [overallError, setOverallError] = useState(null); const baseConfig = useDoraConfig(); const transformTeamData = (teamResponse) => { const { name, currentRange, previousRange } = teamResponse; const frequencyTrend = determineTrend( currentRange.numOfDeploysPerDay, previousRange.numOfDeploysPerDay, MetricType.Frequency ); const leadTimeTrend = determineTrend( currentRange.avgLeadTimeInSec, previousRange.avgLeadTimeInSec, MetricType.LeadTime ); const failureRateTrend = determineTrend( currentRange.failureRatePercent, previousRange.failureRatePercent, MetricType.FailureRate ); const overallTrend = determineOverallTrend(frequencyTrend, leadTimeTrend, failureRateTrend); return { name, metrics: { deploymentFrequency: formatMetricValue(currentRange.numOfDeploysPerDay, MetricType.Frequency), leadTime: formatMetricValue(currentRange.avgLeadTimeInSec, MetricType.LeadTime), failureRate: formatMetricValue(currentRange.failureRatePercent, MetricType.FailureRate), mttr: formatMetricValue(currentRange.avgMttrDurationInSec, MetricType.Mttr) }, trend: overallTrend, loading: false }; }; useEffect(() => { const fetchAllTeamsMetrics = async () => { if (!teamSlugs || teamSlugs.length === 0) { setTeamsData([]); setOverallLoading(false); return; } setOverallLoading(true); setOverallError(null); const initialTeamsData = teamSlugs.map((slug) => ({ name: slug, metrics: { deploymentFrequency: "0/day", leadTime: "0h", failureRate: "0%", mttr: "0m" }, trend: "stable", loading: true })); setTeamsData(initialTeamsData); try { const result = await doraApi.getBatchTeamDORAMetrics( teamSlugs, baseConfig.environment, baseConfig.deployment, timeRange ); if (!result || !result.teams) { throw new Error("No team metrics data available"); } const transformedTeams = result.teams.map(transformTeamData); setTeamsData(transformedTeams); } catch (err) { const errorMessage = err instanceof Error ? err.message : "Failed to fetch team metrics"; setOverallError("We are facing challenges at the moment. Please come back later."); const errorTeamsData = teamSlugs.map((slug) => ({ name: slug, metrics: { deploymentFrequency: "0/day", leadTime: "0h", failureRate: "0%", mttr: "0m" }, trend: "stable", loading: false, error: errorMessage })); setTeamsData(errorTeamsData); } finally { setOverallLoading(false); } }; fetchAllTeamsMetrics(); }, [teamSlugs, baseConfig.environment, baseConfig.deployment, timeRange]); return { teams: teamsData, loading: overallLoading, error: overallError }; } export { useAllTeamsMetrics }; //# sourceMappingURL=useAllTeamsMetrics.esm.js.map