Skip to content
Source
Sign inSign up
Open History to see the last commit

showcaseRenderSignal.ts

45 lines1.5 KB

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>();
10export type ShowcaseRenderSnapshot = Readonly<{
11 signal: ShowcaseRenderSignal | null;
12 // A redraw can repeat the same scene and theme; counting reports lets it restart the settle delay.
13 reports: number;
14}>;
15​
16let snapshot: ShowcaseRenderSnapshot = { signal: null, reports: 0 };
17​
18export function getShowcaseRenderSnapshot(): ShowcaseRenderSnapshot {
19 return snapshot;
21​
22export function subscribeToShowcaseRenderSignal(listener: () => void): () => void {
23 listeners.add(listener);
24 return () => listeners.delete(listener);
26​
27export function reportShowcaseSceneRendered(signal: ShowcaseRenderSignal): void {
28 snapshot = { signal, reports: snapshot.reports + 1 };
29 for (const listener of listeners) listener();
31​
32export function clearShowcaseRenderSignal(): void {
33 if (snapshot.signal === null) return;
34 snapshot = { signal: null, reports: snapshot.reports + 1 };
35 for (const listener of listeners) listener();
37​
38export function isShowcaseNativeContentReady(input: {
39 readonly scene: ShowcaseScene;
40 readonly themeId: MobileThemeId;
41 readonly renderSignal: ShowcaseRenderSignal | null;
42}): boolean {
43 if (input.scene !== "review") return true;
44 return input.renderSignal?.scene === "review" && input.renderSignal.themeId === input.themeId;