diff --git a/packages/react-native-video/src/core/VideoPlayer.ts b/packages/react-native-video/src/core/VideoPlayer.ts index f77d23a5..ee972242 100644 --- a/packages/react-native-video/src/core/VideoPlayer.ts +++ b/packages/react-native-video/src/core/VideoPlayer.ts @@ -56,8 +56,8 @@ class VideoPlayer extends VideoPlayerEvents implements VideoPlayerBase { const parsedError = tryParseNativeVideoError(error); if ( - parsedError instanceof VideoRuntimeError - && this.triggerEvent('onError', parsedError) + parsedError instanceof VideoRuntimeError && + this.triggerEvent('onError', parsedError) ) { // We don't throw errors if onError is provided return; diff --git a/packages/react-native-video/src/core/VideoPlayerEvents.ts b/packages/react-native-video/src/core/VideoPlayerEvents.ts index c7d6a07d..771a7357 100644 --- a/packages/react-native-video/src/core/VideoPlayerEvents.ts +++ b/packages/react-native-video/src/core/VideoPlayerEvents.ts @@ -1,35 +1,21 @@ import type { VideoPlayerEventEmitter } from '../spec/nitro/VideoPlayerEventEmitter.nitro'; -import type { AllPlayerEvents as PlayerEvents } from './types/Events'; +import { + ALL_PLAYER_EVENTS, + type AllPlayerEvents as PlayerEvents, +} from './types/Events'; export class VideoPlayerEvents { protected eventEmitter: VideoPlayerEventEmitter; - protected eventListeners: Partial void>>> = {}; + protected eventListeners: Partial< + Record void>> + > = {}; - protected readonly supportedEvents: (keyof PlayerEvents)[] = [ - 'onAudioBecomingNoisy', - 'onAudioFocusChange', - 'onBandwidthUpdate', - 'onBuffer', - 'onControlsVisibleChange', - 'onEnd', - 'onExternalPlaybackChange', - 'onLoad', - 'onLoadStart', - 'onPlaybackRateChange', - 'onPlaybackStateChange', - 'onProgress', - 'onReadyToDisplay', - 'onSeek', - 'onStatusChange', - 'onTextTrackDataChanged', - 'onTimedMetadata', - 'onTrackChange', - 'onVolumeChange', - ]; + protected readonly supportedEvents: (keyof PlayerEvents)[] = + ALL_PLAYER_EVENTS; constructor(eventEmitter: VideoPlayerEventEmitter) { this.eventEmitter = eventEmitter; - for (let event of this.supportedEvents){ + for (let event of this.supportedEvents) { // @ts-expect-error we narrow the type of the event this.eventEmitter[event] = this.triggerEvent.bind(this, event); } @@ -39,8 +25,7 @@ export class VideoPlayerEvents { event: Event, ...params: Parameters ): boolean { - if (!this.eventListeners[event]?.size) - return false; + if (!this.eventListeners[event]?.size) return false; for (let fn of this.eventListeners[event]) { fn(...params); } @@ -59,7 +44,7 @@ export class VideoPlayerEvents { event: Event, callback: PlayerEvents[Event] ) { - this.eventListeners[event]!.delete(callback); + this.eventListeners[event]?.delete(callback); } /** diff --git a/packages/react-native-video/src/core/hooks/useEvent.ts b/packages/react-native-video/src/core/hooks/useEvent.ts index 9a9482e2..fd970965 100644 --- a/packages/react-native-video/src/core/hooks/useEvent.ts +++ b/packages/react-native-video/src/core/hooks/useEvent.ts @@ -18,6 +18,5 @@ export const useEvent = ( player.addEventListener(event, callback); return () => player.removeEventListener(event, callback); - ; }, [player, event, callback]); }; diff --git a/packages/react-native-video/src/core/types/Events.ts b/packages/react-native-video/src/core/types/Events.ts index b109f61b..6d681d92 100644 --- a/packages/react-native-video/src/core/types/Events.ts +++ b/packages/react-native-video/src/core/types/Events.ts @@ -97,7 +97,6 @@ export interface AllPlayerEvents extends VideoPlayerEvents { onError: (error: VideoRuntimeError) => void; } - export interface VideoViewEvents { /** * Called when the video view's picture in picture state changes. @@ -226,3 +225,42 @@ export interface onVolumeChangeData { */ muted: boolean; } + +type CheckAllAndOnly = + // Missing keys? + Exclude extends never + ? // Extra keys? + Exclude extends never + ? A + : ['Extra keys', Exclude] + : ['Missing keys', Exclude]; + +function allKeysOf() { + return (...arr: A): CheckAllAndOnly => { + return arr as CheckAllAndOnly; + }; +} + +export const ALL_PLAYER_EVENTS: (keyof AllPlayerEvents)[] = + allKeysOf()( + 'onAudioBecomingNoisy', + 'onAudioFocusChange', + 'onBandwidthUpdate', + 'onBuffer', + 'onControlsVisibleChange', + 'onEnd', + 'onError', + 'onExternalPlaybackChange', + 'onLoad', + 'onLoadStart', + 'onPlaybackStateChange', + 'onPlaybackRateChange', + 'onProgress', + 'onReadyToDisplay', + 'onSeek', + 'onTimedMetadata', + 'onTextTrackDataChanged', + 'onTrackChange', + 'onVolumeChange', + 'onStatusChange' + );