fix(glucose): state band edges in the reader's glucose unit

The time-in-range labels in the doctor report, the target caption on
the glucose panel, the glucose page description and the fasting
explainer printed fixed mg/dL figures, so a reader on mmol/L saw
"Low (< 70 mg/dL)" beside values in mmol/L.

The cut-points now live in one place (`GLUCOSE_TIR_CUT_POINTS`,
`GLUCOSE_FASTING_CUT_POINTS`) with the SI figure each guideline prints,
the analytics engine counts its bands from the same constants, and
every sentence takes the band edges and unit as parameters through
`glucoseBandParams`, formatted with the reader's number format.

The unit-preference guard now also reads the locale bundles: a string
that names mg/dL or mmol/L fails unless it is allowlisted with a
reason.

Refs #1067
This commit is contained in:
Marc-André Bombeck committed 2026-10-01 22:07:07 +02:00
1 parent fc47006c88
commit 75361d0666
19 files changed
+357 -70

No files matched your search

+10 -2
View File
@@ -5,8 +5,12 @@ import { Droplet } from "lucide-react";
import { HealthKitMetricPage } from "@/components/insights/healthkit-metric-page";
import { GlucoseClinicalPanel } from "@/components/insights/glucose/glucose-clinical-panel";
import { useAuth } from "@/hooks/use-auth";
import { useTranslations } from "@/lib/i18n/context";
import { MGDL_PER_MMOL, resolveGlucoseUnit } from "@/lib/glucose";
import { useFormatters, useTranslations } from "@/lib/i18n/context";
import {
glucoseBandParams,
MGDL_PER_MMOL,
resolveGlucoseUnit,
} from "@/lib/glucose";
/**
* v1.7.0 — `/insights/blood-glucose`.
@@ -27,6 +31,7 @@ import { MGDL_PER_MMOL, resolveGlucoseUnit } from "@/lib/glucose";
export default function InsightsBlutzuckerPage() {
const { user } = useAuth();
const { t } = useTranslations();
const fmt = useFormatters();
const glucoseUnit = resolveGlucoseUnit(user?.glucoseUnit ?? null);
const isMmol = glucoseUnit === "mmol/L";
@@ -38,6 +43,9 @@ export default function InsightsBlutzuckerPage() {
chartKey="bloodGlucose"
i18nPrefix="insights.bloodGlucose"
explainerMetric="bloodGlucose"
// The definition names the fasting cut-points; they follow the
// reader's glucose unit like the chart does.
explainerParams={glucoseBandParams(glucoseUnit, fmt.number)}
color="var(--chart-3)"
unit={glucoseUnit}
yAxisUnit={glucoseUnit}