Skip to content

Commit e5648e8

Browse files
authored
Wait to experiment until state is hydrated (#9488)
1 parent 16f8d30 commit e5648e8

File tree

2 files changed

+66
-1
lines changed

2 files changed

+66
-1
lines changed

webview-ui/src/App.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,12 +86,17 @@ const App = () => {
8686
const [useProviderSignupView, setUseProviderSignupView] = useState(false)
8787

8888
// Check PostHog feature flag for provider signup view
89+
// Wait for telemetry to be initialized before checking feature flags
8990
useEffect(() => {
91+
if (!didHydrateState || telemetrySetting === "disabled") {
92+
return
93+
}
94+
9095
posthog.onFeatureFlags(function () {
9196
// Feature flag for new provider-focused welcome view
9297
setUseProviderSignupView(posthog?.getFeatureFlag("welcome-provider-signup") === "test")
9398
})
94-
}, [])
99+
}, [didHydrateState, telemetrySetting])
95100

96101
// Create a persistent state manager
97102
const marketplaceStateManager = useMemo(() => new MarketplaceViewStateManager(), [])

webview-ui/src/__tests__/App.spec.tsx

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,18 @@
22

33
import React from "react"
44
import { render, screen, act, cleanup } from "@/utils/test-utils"
5+
import posthog from "posthog-js"
56

67
import AppWithProviders from "../App"
78

9+
// Mock posthog
10+
vi.mock("posthog-js", () => ({
11+
default: {
12+
onFeatureFlags: vi.fn(),
13+
getFeatureFlag: vi.fn(),
14+
},
15+
}))
16+
817
vi.mock("@src/utils/vscode", () => ({
918
vscode: {
1019
postMessage: vi.fn(),
@@ -189,6 +198,7 @@ describe("App", () => {
189198
shouldShowAnnouncement: false,
190199
experiments: {},
191200
language: "en",
201+
telemetrySetting: "enabled",
192202
})
193203
})
194204

@@ -338,4 +348,54 @@ describe("App", () => {
338348
expect(chatView.getAttribute("data-hidden")).toBe("false")
339349
expect(screen.queryByTestId("marketplace-view")).not.toBeInTheDocument()
340350
})
351+
352+
describe("PostHog feature flag initialization", () => {
353+
it("waits for state hydration before checking feature flags", () => {
354+
mockUseExtensionState.mockReturnValue({
355+
didHydrateState: false,
356+
showWelcome: false,
357+
shouldShowAnnouncement: false,
358+
experiments: {},
359+
language: "en",
360+
telemetrySetting: "enabled",
361+
})
362+
363+
render(<AppWithProviders />)
364+
365+
// PostHog feature flag check should not be called before hydration
366+
expect(posthog.onFeatureFlags).not.toHaveBeenCalled()
367+
})
368+
369+
it("checks feature flags after state hydration when telemetry is enabled", () => {
370+
mockUseExtensionState.mockReturnValue({
371+
didHydrateState: true,
372+
showWelcome: false,
373+
shouldShowAnnouncement: false,
374+
experiments: {},
375+
language: "en",
376+
telemetrySetting: "enabled",
377+
})
378+
379+
render(<AppWithProviders />)
380+
381+
// PostHog feature flag check should be called after hydration
382+
expect(posthog.onFeatureFlags).toHaveBeenCalled()
383+
})
384+
385+
it("does not check feature flags when telemetry is disabled", () => {
386+
mockUseExtensionState.mockReturnValue({
387+
didHydrateState: true,
388+
showWelcome: false,
389+
shouldShowAnnouncement: false,
390+
experiments: {},
391+
language: "en",
392+
telemetrySetting: "disabled",
393+
})
394+
395+
render(<AppWithProviders />)
396+
397+
// PostHog feature flag check should not be called when telemetry is disabled
398+
expect(posthog.onFeatureFlags).not.toHaveBeenCalled()
399+
})
400+
})
341401
})

0 commit comments

Comments
 (0)