@zezosoft/zezo-ott-react-native-video-player
Version:
Production-ready React Native OTT video player library for Android & iOS. Features: playlists, seasons, auto-next playback, subtitles (SRT/VTT), custom theming, analytics tracking, fullscreen mode, gesture controls, ads player (pre-roll/mid-roll/post-roll
98 lines (85 loc) • 2.63 kB
text/typescript
import type {
OnBufferData,
OnLoadData,
OnLoadStartData,
OnProgressData,
} from 'react-native-video';
import { mmkvStorage, useVideoPlayerStore } from '../../store/videoPlayerStore';
import { handleNext } from '../video/videoControl';
import type { MediaEpisode } from '../../store/videoPlayer.type';
import type { ExtendedWatchProgress } from './useWatchReporter';
export const createPlayerEvents = () => {
const onProgress = ({
currentTime = 0,
playableDuration = 0,
}: OnProgressData) => {
const store = useVideoPlayerStore.getState();
store.setCurrentTime(currentTime);
store.setPlayableDuration(playableDuration);
try {
mmkvStorage.setItem('currentTime', String(currentTime));
} catch (e) {
console.warn('MMKV save failed', e);
}
if (store.isBuffering) store.setIsBuffering(false);
};
const onLoad = (data: OnLoadData) => {
const store = useVideoPlayerStore.getState();
store.setDuration(data.duration || 0);
store.setOnLoad(data);
mmkvStorage.setItem('current_watch_time', '0');
store.setError(null);
store.setIsViewCounted(false);
store.setStartWatchTime(Date.now());
store.setIsNextEpisodeVisible(true);
store.setIsSkipIntroVisible(true);
store.setIsBuffering(false);
};
const onBuffer = ({ isBuffering }: OnBufferData) => {
const store = useVideoPlayerStore.getState();
if (isBuffering) store.setIsBuffering(true);
else setTimeout(() => store.setIsBuffering(false), 150);
};
const onEnd = ({
onPressEpisode,
reportProgress,
autoNext,
}: {
reportProgress: (event: ExtendedWatchProgress['event']) => void;
onPressEpisode: ({
episode,
}: {
episode: MediaEpisode;
}) => Promise<boolean>;
autoNext: boolean;
}) => {
reportProgress('COMPLETED');
const store = useVideoPlayerStore.getState();
if (!store.activeTrack?.isTrailer && store.activeTrack?.type === 'series') {
handleNext({ onPressEpisode, autoNext });
} else {
store.setIsPaused(true);
}
};
const onLoadStart = (_: OnLoadStartData) => {
const store = useVideoPlayerStore.getState();
store.setIsBuffering(true);
};
const LeaveVideoPlayer = () => {
const store = useVideoPlayerStore.getState();
store.setDuration(0);
store.setCurrentTime(0);
store.setPlayableDuration(0);
store.setIsPaused(false);
store.setSettingsModal({ isVisible: false, action: 'none' });
store.setIsBuffering(false);
};
return {
onProgress,
onLoad,
onBuffer,
onEnd,
onLoadStart,
LeaveVideoPlayer,
};
};