diff --git a/src/events.tsx b/src/events.tsx index 5674113..c820a90 100644 --- a/src/events.tsx +++ b/src/events.tsx @@ -52,6 +52,9 @@ export function usePlayerState( case "status": em.addPlayerStatusListener(setState); return () => em.removePlayerStatusListener(setState); + case "castStatus": + // TODO: implement this + return; } }, [player, key]); diff --git a/src/events.web.tsx b/src/events.web.tsx index 67091f6..db3bee0 100644 --- a/src/events.web.tsx +++ b/src/events.web.tsx @@ -6,6 +6,7 @@ import { selectPlayback, selectPlaybackRate, selectQuality, + selectRemotePlayback, selectTextTrack, selectTime, selectVolume, @@ -177,6 +178,13 @@ export const stateMapper = { if (!q) return true; return !q.videoRenditionList.some((r) => r.selected); }), + ...createMapper("castStatus", selectRemotePlayback, (r) => { + if (!r) return "unavailable"; + if (r.remotePlaybackState === "connecting") return "connecting"; + if (r.remotePlaybackState === "connected") return "connected"; + if (r.remotePlaybackAvailability === "available") return "available"; + return "unavailable"; + }), }; export function usePlayerState( diff --git a/src/index.ts b/src/index.ts index be8e45a..43a52ec 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,6 +2,7 @@ export { useEvent, usePlayerState } from "./events"; export { OmniProvider, usePlayer } from "./provider"; export type { OmniEvents } from "./types/events"; export type { + CastStatus, OmniPlayer, OmniPlayerState, PlayerStatus, diff --git a/src/player.web.tsx b/src/player.web.tsx index 5227fed..83e6cbf 100644 --- a/src/player.web.tsx +++ b/src/player.web.tsx @@ -7,6 +7,7 @@ import { } from "@videojs/react"; import { stateMapper } from "./events.web"; import type { + CastStatus, OmniPlayer, PlayerStatus, Rendition, @@ -51,6 +52,14 @@ export class WebOmniPlayer implements OmniPlayer { this._store = store; } + get castStatus(): CastStatus { + return stateMapper.castStatus.mapper(this._store.state); + } + + toggleCastStatus(): void { + this._store.state.toggleRemotePlayback(); + } + _source: Source | null = null; private _showNotification = false; diff --git a/src/types/player.ts b/src/types/player.ts index 6425308..142b7fd 100644 --- a/src/types/player.ts +++ b/src/types/player.ts @@ -5,6 +5,8 @@ export interface OmniPlayer extends OmniPlayerState { pause(): void; seekBy(offset: number): void; + toggleCastStatus(): void; + // trigger the prev/next event manually, the user has to implement the event playPrev(): void; playNext(): void; @@ -32,10 +34,17 @@ export interface OmniPlayerState { volume: number; muted: boolean; readonly isAutoQuality: boolean; + readonly castStatus: CastStatus; } export type PlayerStatus = "idle" | "loading" | "readyToPlay" | "error"; +export type CastStatus = + | "connecting" + | "connected" + | "available" + | "unavailable"; + export interface Track { readonly id: string; readonly label?: string;