@nitin15j/plugin-dora-frontend
Version:
Welcome to the dora-frontend plugin!
109 lines (106 loc) • 3.87 kB
JavaScript
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