import type { TurboModule } from "react-native"; import { TurboModuleRegistry } from "react-native"; export interface Spec extends TurboModule { // Void methods - playback control play(viewTag: number): void; pause(viewTag: number): void; seek(viewTag: number, position: number): void; seekRelative(viewTag: number, offsetSeconds: number): void; setMuted(viewTag: number, muted: boolean): void; setVolume(viewTag: number, volume: number): void; // Void methods - fullscreen control enterFullscreen(viewTag: number): void; enterFullscreenLandscape(viewTag: number): void; exitFullscreen(viewTag: number): void; presentModal(viewTag: number): void; closeModal(viewTag: number): void; // Void methods - layout control collapse(viewTag: number): void; expand(viewTag: number): void; // Void methods - other commands autoPlayNextCancel(viewTag: number): void; destroy(viewTag: number): void; unload(viewTag: number): void; showCastPicker(viewTag: number): void; updatePlayout(viewTag: number, playoutJson: string): void; // Load methods loadWithClipId( viewTag: number, clipId: string, initiator: string | null, autoPlay: boolean, seekTo: number, contextJson: string | null ): void; loadWithClipListId( viewTag: number, clipListId: string, initiator: string | null, autoPlay: boolean, seekTo: number, contextJson: string | null ): void; loadWithProjectId( viewTag: number, projectId: string, initiator: string | null, autoPlay: boolean, seekTo: number, contextJson: string | null ): void; loadWithClipJson( viewTag: number, clipJson: string, initiator: string | null, autoPlay: boolean, seekTo: number, contextJson: string | null ): void; loadWithClipListJson( viewTag: number, clipListJson: string, initiator: string | null, autoPlay: boolean, seekTo: number, contextJson: string | null ): void; loadWithProjectJson( viewTag: number, projectJson: string, initiator: string | null, autoPlay: boolean, seekTo: number, contextJson: string | null ): void; loadWithJsonUrl(viewTag: number, jsonUrl: string, autoPlay: boolean, contextJson: string | null): void; loadWithContentIdAndType(viewTag: number, contentId: string, contentType: string, autoPlay: boolean, contextJson: string | null): void; // Void methods - viewability setInView(viewTag: number, inView: boolean): void; // Promise getters getDuration(viewTag: number): Promise; getMuted(viewTag: number): Promise; getVolume(viewTag: number): Promise; getPhase(viewTag: number): Promise; getState(viewTag: number): Promise; getMode(viewTag: number): Promise; getClipData(viewTag: number): Promise; getProjectData(viewTag: number): Promise; getPlayoutData(viewTag: number): Promise; getInView(viewTag: number): Promise; getAdMediaWidth(viewTag: number): Promise; getAdMediaHeight(viewTag: number): Promise; // Cast state getIsCasting(viewTag: number): Promise; getCastDeviceName(viewTag: number): Promise; endCastSession(viewTag: number): void; // Modal player (module-level, no React view needed) presentModalPlayer(jsonUrl: string, optionsJson: string | null, contextJson: string | null): void; dismissModalPlayer(): void; // Continue Watching — storage-only lookup for rendering "% watched" badges in carousels without // instantiating a player. Resolves to null when the clip has no stored progress, or when the // underlying native SDK on the consumer's pinned version doesn't yet expose the accessor (it // gracefully degrades). See ADO #19144 / #19099 / #19143 / #19149. getLastKnownPosition(clipId: string): Promise; // Event emitter support (required for NativeEventEmitter) addListener(eventName: string): void; removeListeners(count: number): void; } // Use get() instead of getEnforcing() to avoid crash when module not registered export default TurboModuleRegistry.get("BBPlayerModule");