1import type { MobileThemeId } from "../../lib/mobileTheme";
2import type { ShowcaseScene } from "./nativeShowcaseScene";
3
4export type ShowcaseRenderSignal = Readonly<{
5 scene: ShowcaseScene;
6 themeId: MobileThemeId;
7}>;
8
9const listeners = new Set<() => void>();
10let renderSignal: ShowcaseRenderSignal | null = null;
11
12export function getShowcaseRenderSignal(): ShowcaseRenderSignal | null {
13 return renderSignal;
14}
15
16export function subscribeToShowcaseRenderSignal(listener: () => void): () => void {
17 listeners.add(listener);
18 return () => listeners.delete(listener);
19}
20
21export function reportShowcaseSceneRendered(signal: ShowcaseRenderSignal): void {
22 renderSignal = signal;
23 for (const listener of listeners) listener();
24}
25
26export function clearShowcaseRenderSignal(): void {
27 if (renderSignal === null) return;
28 renderSignal = null;
29 for (const listener of listeners) listener();
30}
31
32export function isShowcaseNativeContentReady(input: {
33 readonly scene: ShowcaseScene;
34 readonly themeId: MobileThemeId;
35 readonly renderSignal: ShowcaseRenderSignal | null;
36}): boolean {
37 if (input.scene !== "review") return true;
38 return input.renderSignal?.scene === "review" && input.renderSignal.themeId === input.themeId;
39}