From 92ef211ac9d885606f345d86605c2b9c4b0e1682 Mon Sep 17 00:00:00 2001 From: Thomas Kosiewski Date: Fri, 19 Dec 2025 12:33:15 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=A4=96=20refactor:=20simplify=20stats=20t?= =?UTF-8?q?ab=20experiment=20to=20toggle?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Convert the Stats Tab experiment setting from a 3-option dropdown (Default/Always on/Always off) to a simple on/off toggle, matching the UX pattern used for other experiments like Post-Compaction Context. Changes: - Replace dropdown with Switch component in ExperimentsSection - Simplify FeatureFlagsContext API: setStatsTabOverride → setStatsTabEnabled - Remove PostHog implementation details from user-facing description - Backend schema unchanged (preserves flexibility) Change-Id: I3dfad1c229690a4806cdbcf2ebb2d758f205c14f Signed-off-by: Thomas Kosiewski --- .../Settings/sections/ExperimentsSection.tsx | 42 ++++++++----------- src/browser/contexts/FeatureFlagsContext.tsx | 27 +++++------- 2 files changed, 29 insertions(+), 40 deletions(-) diff --git a/src/browser/components/Settings/sections/ExperimentsSection.tsx b/src/browser/components/Settings/sections/ExperimentsSection.tsx index 54905783b..cc761a1a9 100644 --- a/src/browser/components/Settings/sections/ExperimentsSection.tsx +++ b/src/browser/components/Settings/sections/ExperimentsSection.tsx @@ -6,7 +6,7 @@ import { type ExperimentId, } from "@/common/constants/experiments"; import { Switch } from "@/browser/components/ui/switch"; -import { useFeatureFlags, type StatsTabOverride } from "@/browser/contexts/FeatureFlagsContext"; +import { useFeatureFlags } from "@/browser/contexts/FeatureFlagsContext"; import { useWorkspaceContext } from "@/browser/contexts/WorkspaceContext"; import { useTelemetry } from "@/browser/hooks/useTelemetry"; @@ -48,35 +48,29 @@ function ExperimentRow(props: ExperimentRowProps) { ); } -function StatsTabOverrideRow() { - const { statsTabState, setStatsTabOverride } = useFeatureFlags(); +function StatsTabRow() { + const { statsTabState, setStatsTabEnabled } = useFeatureFlags(); - const onChange = (e: React.ChangeEvent) => { - const value = e.target.value as StatsTabOverride; - setStatsTabOverride(value).catch(() => { - // ignore - }); - }; + const handleToggle = useCallback( + (enabled: boolean) => { + setStatsTabEnabled(enabled).catch(() => { + // ignore + }); + }, + [setStatsTabEnabled] + ); return (
Stats tab
-
- PostHog experiment-gated timing stats sidebar. Experiment variant:{" "} - {statsTabState?.variant ?? "—"}. -
+
Show timing statistics in the right sidebar
- +
); } @@ -105,7 +99,7 @@ export function ExperimentsSection() { Experimental features that are still in development. Enable at your own risk.

- + {experiments.map((exp) => ( Promise; - setStatsTabOverride: (override: StatsTabOverride) => Promise; + setStatsTabEnabled: (enabled: boolean) => Promise; } const FeatureFlagsContext = createContext(null); @@ -53,7 +48,7 @@ export function FeatureFlagsProvider(props: { children: ReactNode }) { const { api } = useAPI(); const [statsTabState, setStatsTabState] = useState(() => { if (isStorybook()) { - return { enabled: true, variant: "stats", override: "default" }; + return { enabled: true }; } return null; @@ -61,21 +56,21 @@ export function FeatureFlagsProvider(props: { children: ReactNode }) { const refreshStatsTabState = async (): Promise => { if (!api) { - setStatsTabState({ enabled: false, variant: "control", override: "default" }); + setStatsTabState({ enabled: false }); return; } const state = await api.features.getStatsTabState(); - setStatsTabState(state); + setStatsTabState({ enabled: state.enabled }); }; - const setStatsTabOverride = async (override: StatsTabOverride): Promise => { + const setStatsTabEnabled = async (enabled: boolean): Promise => { if (!api) { throw new Error("ORPC client not initialized"); } - const state = await api.features.setStatsTabOverride({ override }); - setStatsTabState(state); + const state = await api.features.setStatsTabOverride({ override: enabled ? "on" : "off" }); + setStatsTabState({ enabled: state.enabled }); }; useEffect(() => { @@ -86,22 +81,22 @@ export function FeatureFlagsProvider(props: { children: ReactNode }) { (async () => { try { if (!api) { - setStatsTabState({ enabled: false, variant: "control", override: "default" }); + setStatsTabState({ enabled: false }); return; } const state = await api.features.getStatsTabState(); - setStatsTabState(state); + setStatsTabState({ enabled: state.enabled }); } catch { // Treat as disabled if we can't fetch. - setStatsTabState({ enabled: false, variant: "control", override: "default" }); + setStatsTabState({ enabled: false }); } })(); }, [api]); return ( {props.children}