UNPKG

@applicaster/zapp-react-native-utils

Version:

Applicaster Zapp React Native utilities package

162 lines (125 loc) 4.14 kB
import { PlayerAnalyticsTracker } from "./playerAnalyticsTracker"; import { Player } from "../appUtils/playerManager/player"; import { AD_EVENT, GENERAL_EVENT, PLAYBACK_EVENT, QOS_EVENT } from "./events"; type Props = { analyticsTracker: any; player: any; }; /* eslint brace-style: 0 */ // --> OFF export class AnalyticPlayerListener implements QuickBrickPlayer.SharedPlayerCallBacks { static analyticsListenerID = "analytics-listener"; private analyticsTracker: PlayerAnalyticsTracker; private player: Player; private isSeeking: boolean = false; private onVideoLoadCalled; // android only constructor(props: Props) { this.analyticsTracker = props.analyticsTracker; this.player = props.player; } handleAnalyticEvent = (event, data = {}) => { if (this.analyticsTracker?.handleAnalyticEvent) { this.analyticsTracker?.handleAnalyticEvent?.(event, { ...data, player_type: this.player.playerPluginId, }); } }; onVideoEnd = () => { this.handleAnalyticEvent(PLAYBACK_EVENT.complete); }; onError = (err: QuickBrickPlayer.PlayerErrorI) => { this.handleAnalyticEvent( PLAYBACK_EVENT.error, err.toObject?.() || { message: err.message } ); }; onPlayerPause = (event) => { if (this.player?.seekController?.isSeeking()) { this.isSeeking = true; return; } this.handleAnalyticEvent(PLAYBACK_EVENT.pause, event); }; onPlayerResume = (event) => { if (this.player?.seekController?.isSeeking()) { return; } if (this.isSeeking) { // Fallback due to player resume event been async and arriving with delays this.isSeeking = false; return; } this.handleAnalyticEvent(PLAYBACK_EVENT.play, event); }; onPlayerSeekComplete = (event) => { this.handleAnalyticEvent(PLAYBACK_EVENT.seek_complete, event); }; onPlayerSeekStart = (event) => { this.handleAnalyticEvent(PLAYBACK_EVENT.seek_start, event); }; onBufferStart = (event) => { this.handleAnalyticEvent(PLAYBACK_EVENT.buffer_start, event); }; onBufferComplete = (event) => { this.handleAnalyticEvent(PLAYBACK_EVENT.buffer_complete, event); }; // Not implemented onPlayerStop = (event) => { this.handleAnalyticEvent(PLAYBACK_EVENT.stop, event); }; // TODO: Implement method on native onVideoBandwidthUpdate = (event) => { this.handleAnalyticEvent(QOS_EVENT.bitrate_changed, event); }; onAdBegin = (event) => { this.handleAnalyticEvent(AD_EVENT.ad_start, event); }; onAdBreakBegin = (event) => { this.handleAnalyticEvent(AD_EVENT.ad_break_start, event); }; onAdBreakEnd = (event) => { this.handleAnalyticEvent(AD_EVENT.ad_break_completed, event); }; onAdEnd = (event) => { this.handleAnalyticEvent(AD_EVENT.ad_complete, event); }; onAdError = (event) => { this.handleAnalyticEvent(AD_EVENT.ad_error, event); }; onAdRequest = (event) => { this.handleAnalyticEvent(AD_EVENT.ad_request, event); }; onAdClicked = (event) => { this.handleAnalyticEvent(AD_EVENT.ad_clicked, event); }; onAdTapped = (event) => { this.handleAnalyticEvent(AD_EVENT.ad_tapped, event); }; onVideoLoad = () => { // if (!this.state.isAd && !this.onVideoLoadCalled) { if (!this.player.isAd() && !this.onVideoLoadCalled) { this.onVideoLoadCalled = true; this.handleAnalyticEvent(PLAYBACK_EVENT.load_video, { player_type: this.player.playerPluginId, }); } }; onPlayerSessionEnd = () => { // TODO: Implement method on native android, ios exists this.handleAnalyticEvent(GENERAL_EVENT.session_end); }; onPlayerSessionStart = () => { // TODO: Implement method on native android, ios exists this.handleAnalyticEvent(GENERAL_EVENT.session_start); }; onPlayerNext = ({ nativeEvent }) => { // TODO: Implement method on native this.handleAnalyticEvent(PLAYBACK_EVENT.next, nativeEvent); }; onPlayerPrevious = ({ nativeEvent }) => { // TODO: Implement method on native this.handleAnalyticEvent(PLAYBACK_EVENT.previous, nativeEvent); }; }