| 1 | import type { MobileThemeId } from "../../lib/mobileTheme"; |
| 2 | import type { ShowcaseScene } from "./nativeShowcaseScene"; |
| 3 | |
| 4 | export type ShowcaseRenderSignal = Readonly<{ |
| 5 | scene: ShowcaseScene; |
| 6 | themeId: MobileThemeId; |
| 7 | }>; |
| 8 | |
| 9 | const listeners = new Set<() => void>(); |
| 10 | let renderSignal: ShowcaseRenderSignal | null = null; |
| 11 | |
| 12 | export function getShowcaseRenderSignal(): ShowcaseRenderSignal | null { |
| 13 | return renderSignal; |
| 14 | } |
| 15 | |
| 16 | export function subscribeToShowcaseRenderSignal(listener: () => void): () => void { |
| 17 | listeners.add(listener); |
| 18 | return () => listeners.delete(listener); |
| 19 | } |
| 20 | |
| 21 | export function reportShowcaseSceneRendered(signal: ShowcaseRenderSignal): void { |
| 22 | renderSignal = signal; |
| 23 | for (const listener of listeners) listener(); |
| 24 | } |
| 25 | |
| 26 | export function clearShowcaseRenderSignal(): void { |
| 27 | if (renderSignal === null) return; |
| 28 | renderSignal = null; |
| 29 | for (const listener of listeners) listener(); |
| 30 | } |
| 31 | |
| 32 | export 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 | } |