mirror of
https://github.com/zoriya/react-native-video.git
synced 2026-08-16 02:56:22 +00:00
101 lines
3.9 KiB
JavaScript
101 lines
3.9 KiB
JavaScript
"use strict";
|
|
|
|
import { ALL_PLAYER_EVENTS } from "./types/Events.js";
|
|
import { Platform } from "react-native";
|
|
export class VideoPlayerEvents {
|
|
jsEventListeners = {};
|
|
supportedEvents = ALL_PLAYER_EVENTS;
|
|
constructor(eventEmitter) {
|
|
this.eventEmitter = eventEmitter;
|
|
}
|
|
triggerJSEvent(event, ...params) {
|
|
if (!this.jsEventListeners[event]) return false;
|
|
this.jsEventListeners[event]?.forEach(fn => fn(...params));
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Adds a listener for a player event.
|
|
* @throw Error if the event is not supported.
|
|
* @param event - The event to add a listener for.
|
|
* @param callback - The callback to call when the event is triggered.
|
|
* @returns A subscription object that can be used to remove the listener.
|
|
*/
|
|
addEventListener(event, callback) {
|
|
switch (event) {
|
|
// ----------------- JS Events -----------------
|
|
case 'onError':
|
|
this.jsEventListeners.onError ??= new Set();
|
|
this.jsEventListeners.onError.add(callback);
|
|
return {
|
|
remove: () => this.jsEventListeners.onError?.delete(callback)
|
|
};
|
|
// ----------------- Native Events -----------------
|
|
case 'onAudioBecomingNoisy':
|
|
return this.eventEmitter.addOnAudioBecomingNoisyListener(callback);
|
|
case 'onAudioFocusChange':
|
|
return this.eventEmitter.addOnAudioFocusChangeListener(callback);
|
|
case 'onBandwidthUpdate':
|
|
return this.eventEmitter.addOnBandwidthUpdateListener(callback);
|
|
case 'onBuffer':
|
|
return this.eventEmitter.addOnBufferListener(callback);
|
|
case 'onControlsVisibleChange':
|
|
return this.eventEmitter.addOnControlsVisibleChangeListener(callback);
|
|
case 'onEnd':
|
|
return this.eventEmitter.addOnEndListener(callback);
|
|
case 'onExternalPlaybackChange':
|
|
return this.eventEmitter.addOnExternalPlaybackChangeListener(callback);
|
|
case 'onLoad':
|
|
return this.eventEmitter.addOnLoadListener(callback);
|
|
case 'onLoadStart':
|
|
return this.eventEmitter.addOnLoadStartListener(callback);
|
|
case 'onPlaybackStateChange':
|
|
return this.eventEmitter.addOnPlaybackStateChangeListener(callback);
|
|
case 'onPlaybackRateChange':
|
|
return this.eventEmitter.addOnPlaybackRateChangeListener(callback);
|
|
case 'onProgress':
|
|
return this.eventEmitter.addOnProgressListener(callback);
|
|
case 'onReadyToDisplay':
|
|
return this.eventEmitter.addOnReadyToDisplayListener(callback);
|
|
case 'onSeek':
|
|
return this.eventEmitter.addOnSeekListener(callback);
|
|
case 'onTimedMetadata':
|
|
return this.eventEmitter.addOnTimedMetadataListener(callback);
|
|
case 'onTextTrackDataChanged':
|
|
return this.eventEmitter.addOnTextTrackDataChangedListener(callback);
|
|
case 'onTrackChange':
|
|
return this.eventEmitter.addOnTrackChangeListener(callback);
|
|
case 'onVolumeChange':
|
|
return this.eventEmitter.addOnVolumeChangeListener(callback);
|
|
case 'onStatusChange':
|
|
return this.eventEmitter.addOnStatusChangeListener(callback);
|
|
// ----------------- Web Events -----------------
|
|
case 'onAudioTrackChange':
|
|
if (Platform.OS !== "web") return {
|
|
remove: () => {}
|
|
};
|
|
return this.eventEmitter.addOnAudioTrackChangeListener(callback);
|
|
case 'onVideoTrackChange':
|
|
if (Platform.OS !== "web") return {
|
|
remove: () => {}
|
|
};
|
|
return this.eventEmitter.addOnVideoTrackChangeListener(callback);
|
|
case 'onQualityChange':
|
|
if (Platform.OS !== "web") return {
|
|
remove: () => {}
|
|
};
|
|
return this.eventEmitter.addOnQualityChangeListener(callback);
|
|
default:
|
|
throw new Error(`[React Native Video] Unsupported event: ${event}`);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Clears all events from the event emitter.
|
|
*/
|
|
clearAllEvents() {
|
|
this.jsEventListeners = {};
|
|
this.eventEmitter.clearAllListeners();
|
|
}
|
|
}
|
|
//# sourceMappingURL=VideoPlayerEvents.js.map
|