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}