diff --git a/src/app/portfolio/[slug]/(portfolio)/reporting/ReportingClientArea.tsx b/src/app/portfolio/[slug]/(portfolio)/reporting/ReportingClientArea.tsx
index 6f586e6..6ca578b 100644
--- a/src/app/portfolio/[slug]/(portfolio)/reporting/ReportingClientArea.tsx
+++ b/src/app/portfolio/[slug]/(portfolio)/reporting/ReportingClientArea.tsx
@@ -1,6 +1,6 @@
"use client";
-import { useState } from "react";
+import { useState, useMemo } from "react";
import { useQuery } from "@tanstack/react-query";
import { ScenarioSelectorWrapper } from "./scenarioSelectorWrapper";
import { DashboardSummaryCards } from "./DashboardSummaryCards";
@@ -124,6 +124,7 @@ export function ReportingClientArea({
scenarioId: selectedScenarioId!,
}),
enabled: measuresOpen && !!selectedScenarioId,
+ keepPreviousData: true,
});
const scenarioLoading = isLoading && !!selectedScenarioId;
@@ -160,37 +161,40 @@ export function ReportingClientArea({
// Scenario specific metrics that appear in the drawer (from API) and cannot be overlayed on baseline
// ----------------------------------------
- const scenarioSpecific = scenarioData
- ? {
- constructionCost: scenarioData.construction_cost,
- pcCost: scenarioData.pc_cost,
- contingency: scenarioData.contingency,
- funding: scenarioData.total_funding,
- costPerSap:
- scenarioData.total_sap_uplift && scenarioData.total_sap_uplift > 0
- ? (scenarioData.construction_cost + scenarioData.pc_cost) /
- scenarioData.total_sap_uplift
- : 0,
- costPerCo2:
- scenarioData.construction_cost > 0
- ? (scenarioData.construction_cost + scenarioData.pc_cost) /
- ((baseline.totals.total_carbon ?? 0) - scenarioData.total_carbon)
- : 0,
- netCost: scenarioData.net_cost,
- grossPerUnit: scenarioData.gross_per_unit,
- nUnits: scenarioData.n_units_upgraded,
- totalCarbonSaved:
- (baseline.totals.total_carbon ?? 0) - scenarioData.total_carbon,
- totalBillsSaved:
- (baseline.totals.total_bills ?? 0) - scenarioData.total_bills,
- averageCaribonSaved:
- ((baseline.totals.total_carbon ?? 0) - scenarioData.total_carbon) /
- scenarioData.n_units_upgraded,
- averageBillsSaved:
- ((baseline.totals.total_bills ?? 0) - scenarioData.total_bills) /
- scenarioData.n_units_upgraded,
- }
- : null;
+ const scenarioSpecific = useMemo(() => {
+ if (!scenarioData) return null;
+
+ return {
+ constructionCost: scenarioData.construction_cost,
+ pcCost: scenarioData.pc_cost,
+ contingency: scenarioData.contingency,
+ funding: scenarioData.total_funding,
+ costPerSap:
+ scenarioData.total_sap_uplift && scenarioData.total_sap_uplift > 0
+ ? (scenarioData.construction_cost + scenarioData.pc_cost) /
+ scenarioData.total_sap_uplift
+ : 0,
+ costPerCo2:
+ scenarioData.construction_cost > 0
+ ? (scenarioData.construction_cost + scenarioData.pc_cost) /
+ ((baseline.totals.total_carbon ?? 0) - scenarioData.total_carbon)
+ : 0,
+ netCost: scenarioData.net_cost,
+ grossPerUnit: scenarioData.gross_per_unit,
+ nUnits: scenarioData.n_units_upgraded,
+ totalCarbonSaved:
+ (baseline.totals.total_carbon ?? 0) - scenarioData.total_carbon,
+ totalBillsSaved:
+ (baseline.totals.total_bills ?? 0) - scenarioData.total_bills,
+ averageCaribonSaved:
+ ((baseline.totals.total_carbon ?? 0) - scenarioData.total_carbon) /
+ scenarioData.n_units_upgraded,
+ averageBillsSaved:
+ ((baseline.totals.total_bills ?? 0) - scenarioData.total_bills) /
+ scenarioData.n_units_upgraded,
+ };
+ }, [scenarioData, baseline]);
+
// Baseline stays baseline
const activeMetrics = baseline;
@@ -272,7 +276,11 @@ export function ReportingClientArea({
subtitle="High-level insights on performance, energy, and EPC quality."
/>
-
{primary.label}
-- {primary.value} -
+ {loading ? ( +{secondary.label}
-- {secondary.value} -
-{primary.label}
++ {primary.value} +
+{secondary.label}
++ {secondary.value} +
+