@zezosoft/zezo-ott-react-native-video-player
Version:
React Native OTT Video Player for Android & iOS. Supports playlists, seasons, auto-next playback, subtitles, theming, analytics, fullscreen mode, and custom controls. 🚀 Powered by ZezoSoft.
102 lines (96 loc) • 3.61 kB
text/typescript
/**
* @author Naresh Dhamu
* @lastModified Sat 16 Aug 2025 at 10:26 AM
*/
import { create } from 'zustand';
import { createJSONStorage, persist } from 'zustand/middleware';
import { MMKV } from 'react-native-mmkv';
import { ResizeMode, type EnumValues } from 'react-native-video';
import type { SettingsAction, VideoPlayerStore } from './videoPlayer.type';
export const storage = new MMKV({
id: 'videoPlayerStorage',
encryptionKey: 'videoPlayerKey',
});
export const mmkvStorage = {
setItem: (key: string, value: string) => storage.set(key, value),
getItem: (key: string) => storage.getString(key) ?? null,
removeItem: (key: string) => storage.delete(key),
};
const storeDataDefaults = {
currentTime: 0,
duration: 0,
isPaused: false,
isBuffering: false,
resizeMode: ResizeMode.CONTAIN,
controlsVisible: true,
controlsTimer: 6,
activeTrack: null,
playableDuration: 0,
settingsModal: { isVisible: false, action: 'none' as SettingsAction },
playBackRate: 1,
playBackRateLabel: null,
onLoad: null,
selectedAudioTrack: null,
selectedSubtitleTrack: null,
selectedVideoTrack: null,
activeSubtitle: null,
maxBitRate: null,
startWatchTime: null,
playList: [],
currentTrackIndex: 0,
contentSeasons: null,
activeSeason: null,
error: null,
isViewCounted: false,
isSkipIntroVisible: false,
isNextEpisodeVisible: false,
};
export const useVideoPlayerStore = create<VideoPlayerStore>()(
persist(
(set) => ({
...storeDataDefaults,
setCurrentTime: (currentTime) => set({ currentTime }),
setDuration: (duration) => set({ duration }),
setIsPaused: (isPaused) => set({ isPaused }),
setIsBuffering: (isBuffering) => set({ isBuffering }),
setResizeMode: (resizeMode: EnumValues<ResizeMode>) =>
set({ resizeMode }),
setControlsVisible: (controlsVisible) => set({ controlsVisible }),
setControlsTimer: (controlsTimer) => set({ controlsTimer }),
setActiveTrack: (activeTrack) => set({ activeTrack }),
setPlayableDuration: (playableDuration) => set({ playableDuration }),
setSettingsModal: ({ isVisible, action }) =>
set({ settingsModal: { isVisible, action } }),
setPlayBackRate: (playBackRate, playBackRateLabel) =>
set({ playBackRate, playBackRateLabel }),
setOnLoad: (onLoad) => set({ onLoad }),
setSelectedAudioTrack: (selectedAudioTrack) =>
set({ selectedAudioTrack }),
setSelectedSubtitleTrack: (selectedSubtitleTrack: any) =>
set({ selectedSubtitleTrack }),
setSelectedVideoTrack: (selectedVideoTrack) =>
set({ selectedVideoTrack }),
setActiveSubtitle: (activeSubtitle) => set({ activeSubtitle }),
setMaxBitRate: (maxBitRate) => set({ maxBitRate }),
setStartWatchTime: (startWatchTime) => set({ startWatchTime }),
setPlayList: (playList) => set({ playList }),
setCurrentTrackIndex: (currentTrackIndex) => set({ currentTrackIndex }),
setContentSeasons: (contentSeasons) => set({ contentSeasons }),
setActiveSeason: (activeSeason) => set({ activeSeason }),
setError: (error) => set({ error }),
setIsViewCounted: (isViewCounted) => set({ isViewCounted }),
setIsSkipIntroVisible: (isSkipIntroVisible) =>
set({ isSkipIntroVisible }),
setIsNextEpisodeVisible: (isNextEpisodeVisible) =>
set({ isNextEpisodeVisible }),
resetStore: () => {
set(storeDataDefaults);
storage.clearAll();
},
}),
{
name: 'VideoPlayerStorage',
storage: createJSONStorage(() => mmkvStorage),
}
)
);