-
- {t("settings.sections.integrations.channels.description")}
-
-
{/* v1.4.27 MB3 — `scroll-mt-28` keeps each channel card's anchor
diff --git a/src/components/settings/medications-section.tsx b/src/components/settings/medications-section.tsx
index 54abf90c7..c19d5c261 100644
--- a/src/components/settings/medications-section.tsx
+++ b/src/components/settings/medications-section.tsx
@@ -19,9 +19,11 @@ import { useMedicationListLayout } from "@/lib/queries/use-medication-list-layou
/**
* v1.16.10 — the "Medikamente" settings section. v1.18.0 (S5) promoted it
- * from a Layout-hub child to its own standalone nav entry (always shown —
- * medications is a CORE domain) and gathered the medication-specific
- * preferences here. Hosts three blocks:
+ * from a Layout-hub child to its own standalone nav entry and gathered the
+ * medication-specific preferences here. v1.18.1 (D3) made medications a
+ * toggleable fail-open module, so this nav entry hides when the account
+ * turns the module off (the medication data routes stay live). Hosts three
+ * blocks:
* 1. The list VIEW preference — cards vs table, written optimistically
* through the same `PUT /api/medications/layout` the page header
* toggle uses (the toggle component is shared).
diff --git a/src/components/settings/notifications-section.tsx b/src/components/settings/notifications-section.tsx
index 82a06fbb4..ff979d0c5 100644
--- a/src/components/settings/notifications-section.tsx
+++ b/src/components/settings/notifications-section.tsx
@@ -17,9 +17,9 @@ import { MoodReminderCard } from "@/components/settings/mood-reminder-card";
*
* Each reminder-type card is shown ONLY when its module is enabled, read from
* the resolved `useAuth().user.modules` map (the same `/auth/me` map nav and
- * Insights pills gate off). Mood → `mood`, Coach nudge → `coach`. Low-stock
- * runway maps to medications, which fails open (a missing key reads as
- * enabled) so a stale `/me` payload never blanks a card.
+ * Insights pills gate off). Mood → `mood`, Coach nudge → `coach`, low-stock
+ * runway → `medications` (a toggleable fail-open module since D3, so a missing
+ * key reads as enabled and a stale `/me` payload never blanks a card).
*
* v1.18.1 (D5) — the page is intentionally lean: the section blurb, the
* channels / inbox cross-links, and the embedded Vorsorge (preventive-care)
@@ -35,6 +35,7 @@ export function NotificationsSection() {
// so a stale `/me` payload without the module map keeps every card visible.
const moodEnabled = user?.modules?.mood !== false;
const coachEnabled = user?.modules?.coach !== false;
+ const medsEnabled = user?.modules?.medications !== false;
return (
) : null}
- {/* Medication low-stock runway — medications is a CORE domain, so this
- is always shown. */}
-
-
-
+ {/* Medication low-stock runway — only when the medications module is
+ enabled (toggleable, fail-open, since D3). */}
+ {medsEnabled ? (
+
+
+
+ ) : null}
{/* Proactive Coach nudge — only when the coach module is enabled. */}
{coachEnabled ? (
diff --git a/src/components/settings/sources-section.tsx b/src/components/settings/sources-section.tsx
index d9ce95c3d..077b6de04 100644
--- a/src/components/settings/sources-section.tsx
+++ b/src/components/settings/sources-section.tsx
@@ -111,31 +111,16 @@ const DEVICE_TYPE_LABEL_KEYS: Record = {
unknown: "settings.sections.sources.deviceLabels.unknown",
};
-export interface SourcesSectionProps {
- /**
- * `"standalone"` (the default) renders the full page header + the
- * cross-link back to Integrations — the shape used while Sources had its
- * own `/settings/sources` route. `"subtab"` (v1.18.0 S3) suppresses both:
- * Sources now renders inside the Integrations → Sources sub-tab, so the
- * page header is the parent section's and a cross-link back to the page
- * that already contains it would be circular.
- */
- variant?: "standalone" | "subtab";
-}
-
/**
* `` — the per-metric source-priority + device-type ladders.
*
* v1.18.1 (D4) — Sources is a standalone `/settings/sources` left-side entry
- * again (split back out of the Integrations sub-tabs). The default
- * `variant="standalone"` renders the section header + the cross-link back to
- * Integrationen; `variant="subtab"` is retained for any embedded use and
- * suppresses the header.
+ * again (split back out of the Integrations sub-tabs). It renders its own
+ * section header + the cross-link back to Integrationen.
*/
-export function SourcesSection({ variant = "standalone" }: SourcesSectionProps = {}) {
+export function SourcesSection() {
const { t } = useTranslations();
const queryClient = useQueryClient();
- const isSubtab = variant === "subtab";
const { data: remote, isLoading } = useQuery({
queryKey: queryKeys.sourcePriority(),
@@ -298,27 +283,25 @@ export function SourcesSection({ variant = "standalone" }: SourcesSectionProps =
aria-labelledby="settings-section-sources-title"
className="space-y-6"
>
- {isSubtab ? null : (
- // v1.18.1 (D0/D4) — standalone left-side entry again. The section
- // blurb is dropped for consistent top alignment; the cross-link back
- // to Integrationen (where the sources this ladder ranks are added /
- // removed) stays as a quiet pointer.
-
- )}
+ {/* v1.18.1 (D0/D4) — standalone left-side entry again. The section
+ blurb is dropped for consistent top alignment; the cross-link back
+ to Integrationen (where the sources this ladder ranks are added /
+ removed) stays as a quiet pointer. */}
+