fix: align frontend tube/liquid container semantics (#364)

* fix: align frontend tube/liquid container semantics

* test(frontend): fix PR #364 CI regressions
This commit is contained in:
Daniel Volz
2026-03-02 00:23:32 +01:00
committed by GitHub
parent cd18581bdd
commit da004b5c3e
29 changed files with 5286 additions and 526 deletions
+8 -11
View File
@@ -6,7 +6,7 @@ import { useCollapsedDays, useDoses, useMedications, useRefill, useSettings, use
import type { Coverage, FormState, Medication, ScheduleEvent, StockThresholds } from "../types";
import { getSystemLocale } from "../utils/formatters";
import { log } from "../utils/logger";
import { buildSchedulePreview, calculateCoverage, computeMissedPastDoseIds } from "../utils/schedule";
import { buildSchedulePreview, calculateCoverage, computeMissedPastDoseIds, getStockStatus } from "../utils/schedule";
// =============================================================================
// Types
@@ -17,6 +17,7 @@ export type DoseInfo = {
timeStr: string;
when: number;
usage: number;
intakeUnit?: "ml" | "tsp" | "tbsp" | null;
takenBy: string[];
intakeRemindersEnabled: boolean;
};
@@ -384,6 +385,7 @@ export function AppProvider({ children }: { children: React.ReactNode }) {
(dayMeds: { medName: string; lastWhen: number }[]): "success" | "warning" | "danger" => {
const statuses = dayMeds.map((item) => {
const cov = coverageByMed[item.medName];
const med = activeMeds.find((m) => m.name === item.medName || m.genericName === item.medName);
const depletionTime = depletionByMed[item.medName];
// Will be out of stock by this day?
@@ -392,21 +394,15 @@ export function AppProvider({ children }: { children: React.ReactNode }) {
}
if (!cov) return "success";
const { daysLeft, medsLeft } = cov;
// Currently out of stock
if (medsLeft <= 0 || daysLeft === 0) return "danger";
// No schedule (can't calculate)
if (daysLeft === null) return "success";
// Low stock: < lowStockDays (warning)
if (daysLeft < settingsHook.settings.lowStockDays) return "warning";
// Normal/High stock
const status = getStockStatus(cov.daysLeft, cov.medsLeft, stockThresholds, med?.packageType);
if (status.className === "danger") return "danger";
if (status.className === "warning") return "warning";
return "success";
});
const fallbackStatus = statuses.includes("warning") ? "warning" : "success";
return statuses.includes("danger") ? "danger" : fallbackStatus;
},
[coverageByMed, depletionByMed, settingsHook.settings.lowStockDays]
[coverageByMed, depletionByMed, activeMeds, stockThresholds]
);
const groupedSchedule = useMemo(() => {
@@ -439,6 +435,7 @@ export function AppProvider({ children }: { children: React.ReactNode }) {
timeStr: event.timeStr,
when: event.when,
usage: event.usage,
intakeUnit: event.intakeUnit ?? null,
takenBy: event.takenBy ? [event.takenBy] : [],
intakeRemindersEnabled: event.intakeRemindersEnabled,
});