@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
60 lines (54 loc) • 1.88 kB
text/typescript
import { create } from 'zustand';
import { createJSONStorage, persist } from 'zustand/middleware';
import { MMKV } from 'react-native-mmkv';
import type { AdsPlayerStore, AdState } from './adsPlayer.type';
export const adsStorage = new MMKV({
id: 'adsPlayerStorage',
encryptionKey: 'adsPlayerKey',
});
export const adsMmkvStorage = {
setItem: (key: string, value: string) => adsStorage.set(key, value),
getItem: (key: string) => adsStorage.getString(key) ?? null,
removeItem: (key: string) => adsStorage.delete(key),
};
const adsStoreDataDefaults: AdState = {
currentAd: null,
isAdPlaying: false,
isAdPaused: false,
isAdMuted: false,
isAdBuffering: false,
adCurrentTime: 0,
adDuration: 0,
pendingMidRollAds: [],
showSkipButton: false,
resumeTime: null,
};
export const useAdsPlayerStore = create<AdsPlayerStore>()(
persist(
(set) => ({
...adsStoreDataDefaults,
setCurrentAd: (currentAd) => set({ currentAd }),
setIsAdPlaying: (isAdPlaying) => set({ isAdPlaying }),
setIsAdPaused: (isAdPaused) => set({ isAdPaused }),
setIsAdMuted: (isAdMuted) => set({ isAdMuted }),
setIsAdBuffering: (isAdBuffering) => set({ isAdBuffering }),
setAdCurrentTime: (adCurrentTime) => set({ adCurrentTime }),
setAdDuration: (adDuration) => set({ adDuration }),
setShowSkipButton: (showSkipButton) => set({ showSkipButton }),
setResumeTime: (resumeTime) => set({ resumeTime }),
addPendingMidRollAd: (ad) =>
set((state) => ({
pendingMidRollAds: [...state.pendingMidRollAds, ad],
})),
clearPendingMidRollAds: () => set({ pendingMidRollAds: [] }),
resetAdsStore: () => {
set(adsStoreDataDefaults);
adsStorage.clearAll();
},
}),
{
name: 'AdsPlayerStorage',
storage: createJSONStorage(() => adsMmkvStorage),
}
)
);