fix(ui): defensive optional chains on all remaining var?.x.y sites

Marc reported many residual TypeError crashes after the targeted fix
in 680b001. A comprehensive perl regex sweep across src/app and
src/components turned up 19 more occurrences of the same anti-
pattern: `var?.x.y` only protects the outer object, so when the
inner field is undefined the access throws.

Touched files:
  - src/app/api/dashboard/summary/route.ts (server-side null guards)
  - src/app/api/health/route.ts (session check)
  - src/components/admin/feedback-inbox-section.tsx
  - src/components/medications/medication-card.tsx (compliance rates)
  - src/components/medications/medication-form.tsx
  - src/components/medications/intake-history-list.tsx
  - src/components/measurements/measurement-list.tsx
  - src/components/mood/mood-list.tsx
  - src/components/ui/password-strength.tsx

Pattern applied: `var?.outer.inner` → `var?.outer?.inner`. Tests
green, typecheck clean. Lint untouched (the rule we already enforce
catches set-state-in-effect, not optional-chain depth).
This commit is contained in:
Marc-André Bombeck committed 2026-05-08 18:47:00 +02:00
1 parent 680b0019c1
commit 0810a859e1
10 files changed
+22 -22

No files matched your search

@@ -49,7 +49,7 @@ export function FeedbackInboxSection({ id }: { id: string }) {
const { t } = useTranslations();
const queryClient = useQueryClient();
const { data: status } = useSystemStatus();
const githubConfigured = Boolean(status?.integrations.bugReport?.configured);
const githubConfigured = Boolean(status?.integrations?.bugReport?.configured);
const [activeStatus, setActiveStatus] = useState<FeedbackStatusType>("OPEN");
const [selected, setSelected] = useState<FeedbackItem | null>(null);
@@ -65,7 +65,7 @@ export function FeedbackInboxSection({ id }: { id: string }) {
},
});
const counts = data?.meta.countsByStatus ?? {};
const counts = data?.meta?.countsByStatus ?? {};
function refresh() {
queryClient.invalidateQueries({ queryKey: ["admin", "feedback"] });
@@ -113,7 +113,7 @@ export function FeedbackInboxSection({ id }: { id: string }) {
{t("admin.feedback.loading")}
</span>
</div>
) : !data?.items.length ? (
) : !data?.items?.length ? (
<p className="text-muted-foreground text-sm">
{t("admin.feedback.noEntries")}
</p>