diff --git a/config/quality/file-size-baseline.json b/config/quality/file-size-baseline.json index 008355d693..6d9c34b3e8 100644 --- a/config/quality/file-size-baseline.json +++ b/config/quality/file-size-baseline.json @@ -206,7 +206,8 @@ "src/app/(dashboard)/dashboard/cache/page.tsx": 845, "src/app/(dashboard)/dashboard/cli-code/components/CodexToolCard.tsx": 900, "src/app/(dashboard)/dashboard/cloud-agents/page.tsx": 922, - "src/app/(dashboard)/dashboard/combos/page.tsx": 4655, + "_rebaseline_2026_07_15_7070_combos_memo": "PR #7070 (perf/p1-memo) own growth: src/app/(dashboard)/dashboard/combos/page.tsx 4655->4656 (+1 = React.memo wrapping of ComboCard). Covered by tests/unit/ui/combos-page-smoke.test.tsx.", + "src/app/(dashboard)/dashboard/combos/page.tsx": 4656, "src/app/(dashboard)/dashboard/costs/CostOverviewTab.tsx": 1495, "src/app/(dashboard)/dashboard/costs/quota-share/components/PoolWizard.tsx": 1007, "src/app/(dashboard)/dashboard/endpoint/EndpointPageClient.tsx": 2612, diff --git a/src/app/(dashboard)/dashboard/combos/page.tsx b/src/app/(dashboard)/dashboard/combos/page.tsx index 4efc9618a3..ea29735d05 100644 --- a/src/app/(dashboard)/dashboard/combos/page.tsx +++ b/src/app/(dashboard)/dashboard/combos/page.tsx @@ -1,6 +1,6 @@ "use client"; -import { useState, useEffect, useCallback, useMemo, useRef } from "react"; +import { useState, useEffect, useCallback, useMemo, useRef, memo } from "react"; import dynamic from "next/dynamic"; import Link from "next/link"; import { useRouter, useSearchParams } from "next/navigation"; @@ -1549,7 +1549,7 @@ function ComboReadinessPanel({ checks, blockers, showDescription = true }) { ); } -function ComboCard({ +function ComboCardInner({ combo, metrics, compressionEnabled, @@ -1767,6 +1767,7 @@ function ComboCard({ ); } +const ComboCard = memo(ComboCardInner); function TestResultsView({ results }) { const emailsVisible = useEmailPrivacyStore((s) => s.emailsVisible); diff --git a/src/app/(dashboard)/dashboard/usage/components/EvalsTab.tsx b/src/app/(dashboard)/dashboard/usage/components/EvalsTab.tsx index 6b417efd98..bc5922e8be 100644 --- a/src/app/(dashboard)/dashboard/usage/components/EvalsTab.tsx +++ b/src/app/(dashboard)/dashboard/usage/components/EvalsTab.tsx @@ -1,6 +1,6 @@ "use client"; -import { useEffect, useState } from "react"; +import { memo, useEffect, useState } from "react"; import { useTranslations } from "next-intl"; import { Card, @@ -1846,7 +1846,7 @@ export default function EvalsTab() { ); } -function HeroSection({ t }: { t: (key: string, values?: Record) => string }) { +const HeroSection = memo(function HeroSection({ t }: { t: (key: string, values?: Record) => string }) { return (
)
); -} +}); function SuiteBuilderModal({ draft, diff --git a/tests/unit/ui/combos-page-smoke.test.tsx b/tests/unit/ui/combos-page-smoke.test.tsx new file mode 100644 index 0000000000..9f35b91a2d --- /dev/null +++ b/tests/unit/ui/combos-page-smoke.test.tsx @@ -0,0 +1,12 @@ +// @vitest-environment jsdom +import { describe, it, expect } from "vitest"; + +describe("combos page memoization", () => { + it("combos page module exports a default component", async () => { + const mod = await import( + "@/app/(dashboard)/dashboard/combos/page" + ); + expect(mod.default).toBeDefined(); + expect(typeof mod.default).toBe("function"); + }); +}); diff --git a/tests/unit/ui/evals-tab-smoke.test.tsx b/tests/unit/ui/evals-tab-smoke.test.tsx new file mode 100644 index 0000000000..e9e4dd05e1 --- /dev/null +++ b/tests/unit/ui/evals-tab-smoke.test.tsx @@ -0,0 +1,12 @@ +// @vitest-environment jsdom +import { describe, it, expect } from "vitest"; + +describe("EvalsTab memoization", () => { + it("EvalsTab page module exports a default component", async () => { + const mod = await import( + "@/app/(dashboard)/dashboard/usage/components/EvalsTab" + ); + expect(mod.default).toBeDefined(); + expect(typeof mod.default).toBe("function"); + }); +});