@zezosoft/zezo-ott-react-native-video-player 1.0.4 → 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/lib/module/AdsPlayer/store/adsPlayerStore.js +3 -3
  2. package/lib/module/AdsPlayer/store/adsPlayerStore.js.map +1 -1
  3. package/lib/module/VideoPlayer/store/videoPlayerStore.js +3 -3
  4. package/lib/module/VideoPlayer/store/videoPlayerStore.js.map +1 -1
  5. package/lib/typescript/src/AdsPlayer/store/adsPlayerStore.d.ts +2 -3
  6. package/lib/typescript/src/AdsPlayer/store/adsPlayerStore.d.ts.map +1 -1
  7. package/lib/typescript/src/VideoPlayer/store/videoPlayerStore.d.ts +2 -3
  8. package/lib/typescript/src/VideoPlayer/store/videoPlayerStore.d.ts.map +1 -1
  9. package/package.json +5 -3
  10. package/src/AdsPlayer/AdsPlayer.tsx +0 -311
  11. package/src/AdsPlayer/MediaControls/AdBottomControls.tsx +0 -191
  12. package/src/AdsPlayer/MediaControls/AdMediaControls.tsx +0 -104
  13. package/src/AdsPlayer/MediaControls/AdMediaControlsProvider.tsx +0 -62
  14. package/src/AdsPlayer/MediaControls/AdMiddleControls.tsx +0 -63
  15. package/src/AdsPlayer/MediaControls/AdTopControls.tsx +0 -191
  16. package/src/AdsPlayer/MediaControls/index.ts +0 -5
  17. package/src/AdsPlayer/components/RotatingLoader.tsx +0 -79
  18. package/src/AdsPlayer/index.ts +0 -4
  19. package/src/AdsPlayer/store/adsPlayer.type.ts +0 -29
  20. package/src/AdsPlayer/store/adsPlayerStore.ts +0 -59
  21. package/src/AdsPlayer/store/index.ts +0 -2
  22. package/src/AdsPlayer/utils/adStateReset.ts +0 -29
  23. package/src/AdsPlayer/utils/controls.ts +0 -69
  24. package/src/AdsPlayer/utils/useAdControlsAutoHide.ts +0 -32
  25. package/src/AdsPlayer/utils/useAdInitialization.ts +0 -86
  26. package/src/AdsPlayer/utils/useAdTracking.ts +0 -89
  27. package/src/AdsPlayer/utils/useAdsManager.ts +0 -215
  28. package/src/VideoPlayer/MediaControls/BottomControls.tsx +0 -210
  29. package/src/VideoPlayer/MediaControls/MediaControls.tsx +0 -30
  30. package/src/VideoPlayer/MediaControls/MediaControlsProvider.tsx +0 -104
  31. package/src/VideoPlayer/MediaControls/MiddleControls.tsx +0 -259
  32. package/src/VideoPlayer/MediaControls/TopControls.tsx +0 -100
  33. package/src/VideoPlayer/Settings/AudioAndSubtitles.tsx +0 -295
  34. package/src/VideoPlayer/Settings/Episodes.tsx +0 -297
  35. package/src/VideoPlayer/Settings/SettingModal.tsx +0 -127
  36. package/src/VideoPlayer/Settings/SpeedControls.tsx +0 -130
  37. package/src/VideoPlayer/Settings/VideoPlayerSettings.tsx +0 -141
  38. package/src/VideoPlayer/VideoPlayerCore.tsx +0 -356
  39. package/src/VideoPlayer/components/ProgressBar.tsx +0 -211
  40. package/src/VideoPlayer/components/SkipAndNextControls.tsx +0 -192
  41. package/src/VideoPlayer/components/SubtitleView.tsx +0 -53
  42. package/src/VideoPlayer/components/Toast.tsx +0 -61
  43. package/src/VideoPlayer/context/VideoPlayerConfig.tsx +0 -65
  44. package/src/VideoPlayer/context/index.ts +0 -5
  45. package/src/VideoPlayer/index.ts +0 -4
  46. package/src/VideoPlayer/store/index.ts +0 -2
  47. package/src/VideoPlayer/store/videoPlayer.type.ts +0 -214
  48. package/src/VideoPlayer/store/videoPlayerStore.ts +0 -97
  49. package/src/VideoPlayer/styles/globalStyles.ts +0 -73
  50. package/src/VideoPlayer/utils/display/Display.ts +0 -10
  51. package/src/VideoPlayer/utils/display/index.ts +0 -1
  52. package/src/VideoPlayer/utils/format/index.ts +0 -1
  53. package/src/VideoPlayer/utils/format/timeFormatter.ts +0 -44
  54. package/src/VideoPlayer/utils/hooks/index.ts +0 -5
  55. package/src/VideoPlayer/utils/hooks/useAdEventHandler.ts +0 -95
  56. package/src/VideoPlayer/utils/hooks/useOrientationLock.ts +0 -29
  57. package/src/VideoPlayer/utils/hooks/usePauseVideoOnAd.ts +0 -46
  58. package/src/VideoPlayer/utils/hooks/useVideoPlayerBack.ts +0 -66
  59. package/src/VideoPlayer/utils/hooks/useVideoResolutions.ts +0 -125
  60. package/src/VideoPlayer/utils/index.ts +0 -6
  61. package/src/VideoPlayer/utils/platform/PlatformSelector.ts +0 -13
  62. package/src/VideoPlayer/utils/platform/index.ts +0 -2
  63. package/src/VideoPlayer/utils/platform/lockOrientation.ts +0 -40
  64. package/src/VideoPlayer/utils/player/index.ts +0 -2
  65. package/src/VideoPlayer/utils/player/playerEvents.ts +0 -97
  66. package/src/VideoPlayer/utils/player/useWatchReporter.ts +0 -105
  67. package/src/VideoPlayer/utils/video/index.ts +0 -5
  68. package/src/VideoPlayer/utils/video/videoControl.ts +0 -185
  69. package/src/VideoPlayer/utils/video/videoRef.ts +0 -21
  70. package/src/VideoPlayer/utils/video/videoResume.ts +0 -23
  71. package/src/VideoPlayer/utils/video/videoSource.ts +0 -23
  72. package/src/VideoPlayer.tsx +0 -181
  73. package/src/index.tsx +0 -3
@@ -2,15 +2,15 @@
2
2
 
3
3
  import { create } from 'zustand';
4
4
  import { createJSONStorage, persist } from 'zustand/middleware';
5
- import { MMKV } from 'react-native-mmkv';
6
- export const adsStorage = new MMKV({
5
+ import { createMMKV } from 'react-native-mmkv';
6
+ export const adsStorage = createMMKV({
7
7
  id: 'adsPlayerStorage',
8
8
  encryptionKey: 'adsPlayerKey'
9
9
  });
10
10
  export const adsMmkvStorage = {
11
11
  setItem: (key, value) => adsStorage.set(key, value),
12
12
  getItem: key => adsStorage.getString(key) ?? null,
13
- removeItem: key => adsStorage.delete(key)
13
+ removeItem: key => adsStorage.remove(key)
14
14
  };
15
15
  const adsStoreDataDefaults = {
16
16
  currentAd: null,
@@ -1 +1 @@
1
- {"version":3,"names":["create","createJSONStorage","persist","MMKV","adsStorage","id","encryptionKey","adsMmkvStorage","setItem","key","value","set","getItem","getString","removeItem","delete","adsStoreDataDefaults","currentAd","isAdPlaying","isAdPaused","isAdMuted","isAdBuffering","adCurrentTime","adDuration","pendingMidRollAds","showSkipButton","resumeTime","useAdsPlayerStore","setCurrentAd","setIsAdPlaying","setIsAdPaused","setIsAdMuted","setIsAdBuffering","setAdCurrentTime","setAdDuration","setShowSkipButton","setResumeTime","addPendingMidRollAd","ad","state","clearPendingMidRollAds","resetAdsStore","clearAll","name","storage"],"sourceRoot":"../../../../src","sources":["AdsPlayer/store/adsPlayerStore.ts"],"mappings":";;AAAA,SAASA,MAAM,QAAQ,SAAS;AAChC,SAASC,iBAAiB,EAAEC,OAAO,QAAQ,oBAAoB;AAC/D,SAASC,IAAI,QAAQ,mBAAmB;AAGxC,OAAO,MAAMC,UAAU,GAAG,IAAID,IAAI,CAAC;EACjCE,EAAE,EAAE,kBAAkB;EACtBC,aAAa,EAAE;AACjB,CAAC,CAAC;AAEF,OAAO,MAAMC,cAAc,GAAG;EAC5BC,OAAO,EAAEA,CAACC,GAAW,EAAEC,KAAa,KAAKN,UAAU,CAACO,GAAG,CAACF,GAAG,EAAEC,KAAK,CAAC;EACnEE,OAAO,EAAGH,GAAW,IAAKL,UAAU,CAACS,SAAS,CAACJ,GAAG,CAAC,IAAI,IAAI;EAC3DK,UAAU,EAAGL,GAAW,IAAKL,UAAU,CAACW,MAAM,CAACN,GAAG;AACpD,CAAC;AAED,MAAMO,oBAA6B,GAAG;EACpCC,SAAS,EAAE,IAAI;EACfC,WAAW,EAAE,KAAK;EAClBC,UAAU,EAAE,KAAK;EACjBC,SAAS,EAAE,KAAK;EAChBC,aAAa,EAAE,KAAK;EACpBC,aAAa,EAAE,CAAC;EAChBC,UAAU,EAAE,CAAC;EACbC,iBAAiB,EAAE,EAAE;EACrBC,cAAc,EAAE,KAAK;EACrBC,UAAU,EAAE;AACd,CAAC;AAED,OAAO,MAAMC,iBAAiB,GAAG3B,MAAM,CAAiB,CAAC,CACvDE,OAAO,CACJS,GAAG,KAAM;EACR,GAAGK,oBAAoB;EAEvBY,YAAY,EAAGX,SAAS,IAAKN,GAAG,CAAC;IAAEM;EAAU,CAAC,CAAC;EAC/CY,cAAc,EAAGX,WAAW,IAAKP,GAAG,CAAC;IAAEO;EAAY,CAAC,CAAC;EACrDY,aAAa,EAAGX,UAAU,IAAKR,GAAG,CAAC;IAAEQ;EAAW,CAAC,CAAC;EAClDY,YAAY,EAAGX,SAAS,IAAKT,GAAG,CAAC;IAAES;EAAU,CAAC,CAAC;EAC/CY,gBAAgB,EAAGX,aAAa,IAAKV,GAAG,CAAC;IAAEU;EAAc,CAAC,CAAC;EAC3DY,gBAAgB,EAAGX,aAAa,IAAKX,GAAG,CAAC;IAAEW;EAAc,CAAC,CAAC;EAC3DY,aAAa,EAAGX,UAAU,IAAKZ,GAAG,CAAC;IAAEY;EAAW,CAAC,CAAC;EAClDY,iBAAiB,EAAGV,cAAc,IAAKd,GAAG,CAAC;IAAEc;EAAe,CAAC,CAAC;EAC9DW,aAAa,EAAGV,UAAU,IAAKf,GAAG,CAAC;IAAEe;EAAW,CAAC,CAAC;EAClDW,mBAAmB,EAAGC,EAAE,IACtB3B,GAAG,CAAE4B,KAAK,KAAM;IACdf,iBAAiB,EAAE,CAAC,GAAGe,KAAK,CAACf,iBAAiB,EAAEc,EAAE;EACpD,CAAC,CAAC,CAAC;EACLE,sBAAsB,EAAEA,CAAA,KAAM7B,GAAG,CAAC;IAAEa,iBAAiB,EAAE;EAAG,CAAC,CAAC;EAC5DiB,aAAa,EAAEA,CAAA,KAAM;IACnB9B,GAAG,CAACK,oBAAoB,CAAC;IACzBZ,UAAU,CAACsC,QAAQ,CAAC,CAAC;EACvB;AACF,CAAC,CAAC,EACF;EACEC,IAAI,EAAE,kBAAkB;EACxBC,OAAO,EAAE3C,iBAAiB,CAAC,MAAMM,cAAc;AACjD,CACF,CACF,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["create","createJSONStorage","persist","createMMKV","adsStorage","id","encryptionKey","adsMmkvStorage","setItem","key","value","set","getItem","getString","removeItem","remove","adsStoreDataDefaults","currentAd","isAdPlaying","isAdPaused","isAdMuted","isAdBuffering","adCurrentTime","adDuration","pendingMidRollAds","showSkipButton","resumeTime","useAdsPlayerStore","setCurrentAd","setIsAdPlaying","setIsAdPaused","setIsAdMuted","setIsAdBuffering","setAdCurrentTime","setAdDuration","setShowSkipButton","setResumeTime","addPendingMidRollAd","ad","state","clearPendingMidRollAds","resetAdsStore","clearAll","name","storage"],"sourceRoot":"../../../../src","sources":["AdsPlayer/store/adsPlayerStore.ts"],"mappings":";;AAAA,SAASA,MAAM,QAAQ,SAAS;AAChC,SAASC,iBAAiB,EAAEC,OAAO,QAAQ,oBAAoB;AAC/D,SAASC,UAAU,QAAQ,mBAAmB;AAG9C,OAAO,MAAMC,UAAU,GAAGD,UAAU,CAAC;EACnCE,EAAE,EAAE,kBAAkB;EACtBC,aAAa,EAAE;AACjB,CAAC,CAAC;AAEF,OAAO,MAAMC,cAAc,GAAG;EAC5BC,OAAO,EAAEA,CAACC,GAAW,EAAEC,KAAa,KAAKN,UAAU,CAACO,GAAG,CAACF,GAAG,EAAEC,KAAK,CAAC;EACnEE,OAAO,EAAGH,GAAW,IAAKL,UAAU,CAACS,SAAS,CAACJ,GAAG,CAAC,IAAI,IAAI;EAC3DK,UAAU,EAAGL,GAAW,IAAKL,UAAU,CAACW,MAAM,CAACN,GAAG;AACpD,CAAC;AAED,MAAMO,oBAA6B,GAAG;EACpCC,SAAS,EAAE,IAAI;EACfC,WAAW,EAAE,KAAK;EAClBC,UAAU,EAAE,KAAK;EACjBC,SAAS,EAAE,KAAK;EAChBC,aAAa,EAAE,KAAK;EACpBC,aAAa,EAAE,CAAC;EAChBC,UAAU,EAAE,CAAC;EACbC,iBAAiB,EAAE,EAAE;EACrBC,cAAc,EAAE,KAAK;EACrBC,UAAU,EAAE;AACd,CAAC;AAED,OAAO,MAAMC,iBAAiB,GAAG3B,MAAM,CAAiB,CAAC,CACvDE,OAAO,CACJS,GAAG,KAAM;EACR,GAAGK,oBAAoB;EAEvBY,YAAY,EAAGX,SAAS,IAAKN,GAAG,CAAC;IAAEM;EAAU,CAAC,CAAC;EAC/CY,cAAc,EAAGX,WAAW,IAAKP,GAAG,CAAC;IAAEO;EAAY,CAAC,CAAC;EACrDY,aAAa,EAAGX,UAAU,IAAKR,GAAG,CAAC;IAAEQ;EAAW,CAAC,CAAC;EAClDY,YAAY,EAAGX,SAAS,IAAKT,GAAG,CAAC;IAAES;EAAU,CAAC,CAAC;EAC/CY,gBAAgB,EAAGX,aAAa,IAAKV,GAAG,CAAC;IAAEU;EAAc,CAAC,CAAC;EAC3DY,gBAAgB,EAAGX,aAAa,IAAKX,GAAG,CAAC;IAAEW;EAAc,CAAC,CAAC;EAC3DY,aAAa,EAAGX,UAAU,IAAKZ,GAAG,CAAC;IAAEY;EAAW,CAAC,CAAC;EAClDY,iBAAiB,EAAGV,cAAc,IAAKd,GAAG,CAAC;IAAEc;EAAe,CAAC,CAAC;EAC9DW,aAAa,EAAGV,UAAU,IAAKf,GAAG,CAAC;IAAEe;EAAW,CAAC,CAAC;EAClDW,mBAAmB,EAAGC,EAAE,IACtB3B,GAAG,CAAE4B,KAAK,KAAM;IACdf,iBAAiB,EAAE,CAAC,GAAGe,KAAK,CAACf,iBAAiB,EAAEc,EAAE;EACpD,CAAC,CAAC,CAAC;EACLE,sBAAsB,EAAEA,CAAA,KAAM7B,GAAG,CAAC;IAAEa,iBAAiB,EAAE;EAAG,CAAC,CAAC;EAC5DiB,aAAa,EAAEA,CAAA,KAAM;IACnB9B,GAAG,CAACK,oBAAoB,CAAC;IACzBZ,UAAU,CAACsC,QAAQ,CAAC,CAAC;EACvB;AACF,CAAC,CAAC,EACF;EACEC,IAAI,EAAE,kBAAkB;EACxBC,OAAO,EAAE3C,iBAAiB,CAAC,MAAMM,cAAc;AACjD,CACF,CACF,CAAC","ignoreList":[]}
@@ -2,16 +2,16 @@
2
2
 
3
3
  import { create } from 'zustand';
4
4
  import { createJSONStorage, persist } from 'zustand/middleware';
5
- import { MMKV } from 'react-native-mmkv';
5
+ import { createMMKV } from 'react-native-mmkv';
6
6
  import { ResizeMode } from 'react-native-video';
7
- export const storage = new MMKV({
7
+ export const storage = createMMKV({
8
8
  id: 'videoPlayerStorage',
9
9
  encryptionKey: 'videoPlayerKey'
10
10
  });
11
11
  export const mmkvStorage = {
12
12
  setItem: (key, value) => storage.set(key, value),
13
13
  getItem: key => storage.getString(key) ?? null,
14
- removeItem: key => storage.delete(key)
14
+ removeItem: key => storage.remove(key)
15
15
  };
16
16
  const storeDataDefaults = {
17
17
  currentTime: 0,
@@ -1 +1 @@
1
- {"version":3,"names":["create","createJSONStorage","persist","MMKV","ResizeMode","storage","id","encryptionKey","mmkvStorage","setItem","key","value","set","getItem","getString","removeItem","delete","storeDataDefaults","currentTime","duration","isPaused","isBuffering","resizeMode","CONTAIN","controlsVisible","controlsTimer","activeTrack","playableDuration","settingsModal","isVisible","action","playBackRate","playBackRateLabel","onLoad","selectedAudioTrack","selectedSubtitleTrack","selectedVideoTrack","activeSubtitle","maxBitRate","startWatchTime","playList","currentTrackIndex","contentSeasons","activeSeason","error","isViewCounted","isSkipIntroVisible","isNextEpisodeVisible","useVideoPlayerStore","setCurrentTime","setDuration","setIsPaused","setIsBuffering","setResizeMode","setControlsVisible","setControlsTimer","setActiveTrack","setPlayableDuration","setSettingsModal","setPlayBackRate","setOnLoad","setSelectedAudioTrack","setSelectedSubtitleTrack","setSelectedVideoTrack","setActiveSubtitle","setMaxBitRate","setStartWatchTime","setPlayList","setCurrentTrackIndex","setContentSeasons","setActiveSeason","setError","setIsViewCounted","setIsSkipIntroVisible","setIsNextEpisodeVisible","resetStore","clearAll","name"],"sourceRoot":"../../../../src","sources":["VideoPlayer/store/videoPlayerStore.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["create","createJSONStorage","persist","createMMKV","ResizeMode","storage","id","encryptionKey","mmkvStorage","setItem","key","value","set","getItem","getString","removeItem","remove","storeDataDefaults","currentTime","duration","isPaused","isBuffering","resizeMode","CONTAIN","controlsVisible","controlsTimer","activeTrack","playableDuration","settingsModal","isVisible","action","playBackRate","playBackRateLabel","onLoad","selectedAudioTrack","selectedSubtitleTrack","selectedVideoTrack","activeSubtitle","maxBitRate","startWatchTime","playList","currentTrackIndex","contentSeasons","activeSeason","error","isViewCounted","isSkipIntroVisible","isNextEpisodeVisible","useVideoPlayerStore","setCurrentTime","setDuration","setIsPaused","setIsBuffering","setResizeMode","setControlsVisible","setControlsTimer","setActiveTrack","setPlayableDuration","setSettingsModal","setPlayBackRate","setOnLoad","setSelectedAudioTrack","setSelectedSubtitleTrack","setSelectedVideoTrack","setActiveSubtitle","setMaxBitRate","setStartWatchTime","setPlayList","setCurrentTrackIndex","setContentSeasons","setActiveSeason","setError","setIsViewCounted","setIsSkipIntroVisible","setIsNextEpisodeVisible","resetStore","clearAll","name"],"sourceRoot":"../../../../src","sources":["VideoPlayer/store/videoPlayerStore.ts"],"mappings":"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","ignoreList":[]}
@@ -1,10 +1,9 @@
1
- import { MMKV } from 'react-native-mmkv';
2
1
  import type { AdsPlayerStore } from './adsPlayer.type';
3
- export declare const adsStorage: MMKV;
2
+ export declare const adsStorage: import("react-native-mmkv").MMKV;
4
3
  export declare const adsMmkvStorage: {
5
4
  setItem: (key: string, value: string) => void;
6
5
  getItem: (key: string) => string | null;
7
- removeItem: (key: string) => void;
6
+ removeItem: (key: string) => boolean;
8
7
  };
9
8
  export declare const useAdsPlayerStore: import("zustand").UseBoundStore<Omit<import("zustand").StoreApi<AdsPlayerStore>, "setState" | "persist"> & {
10
9
  setState(partial: AdsPlayerStore | Partial<AdsPlayerStore> | ((state: AdsPlayerStore) => AdsPlayerStore | Partial<AdsPlayerStore>), replace?: false | undefined): unknown;
@@ -1 +1 @@
1
- {"version":3,"file":"adsPlayerStore.d.ts","sourceRoot":"","sources":["../../../../../src/AdsPlayer/store/adsPlayerStore.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,KAAK,EAAE,cAAc,EAAW,MAAM,kBAAkB,CAAC;AAEhE,eAAO,MAAM,UAAU,MAGrB,CAAC;AAEH,eAAO,MAAM,cAAc;mBACV,MAAM,SAAS,MAAM;mBACrB,MAAM;sBACH,MAAM;CACzB,CAAC;AAeF,eAAO,MAAM,iBAAiB;;;;;;;;;;;;EA6B7B,CAAC"}
1
+ {"version":3,"file":"adsPlayerStore.d.ts","sourceRoot":"","sources":["../../../../../src/AdsPlayer/store/adsPlayerStore.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAW,MAAM,kBAAkB,CAAC;AAEhE,eAAO,MAAM,UAAU,kCAGrB,CAAC;AAEH,eAAO,MAAM,cAAc;mBACV,MAAM,SAAS,MAAM;mBACrB,MAAM;sBACH,MAAM;CACzB,CAAC;AAeF,eAAO,MAAM,iBAAiB;;;;;;;;;;;;EA6B7B,CAAC"}
@@ -1,10 +1,9 @@
1
- import { MMKV } from 'react-native-mmkv';
2
1
  import type { VideoPlayerStore } from './videoPlayer.type';
3
- export declare const storage: MMKV;
2
+ export declare const storage: import("react-native-mmkv").MMKV;
4
3
  export declare const mmkvStorage: {
5
4
  setItem: (key: string, value: string) => void;
6
5
  getItem: (key: string) => string | null;
7
- removeItem: (key: string) => void;
6
+ removeItem: (key: string) => boolean;
8
7
  };
9
8
  export declare const useVideoPlayerStore: import("zustand").UseBoundStore<Omit<import("zustand").StoreApi<VideoPlayerStore>, "setState" | "persist"> & {
10
9
  setState(partial: VideoPlayerStore | Partial<VideoPlayerStore> | ((state: VideoPlayerStore) => VideoPlayerStore | Partial<VideoPlayerStore>), replace?: false | undefined): unknown;
@@ -1 +1 @@
1
- {"version":3,"file":"videoPlayerStore.d.ts","sourceRoot":"","sources":["../../../../../src/VideoPlayer/store/videoPlayerStore.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC,OAAO,KAAK,EAAkB,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3E,eAAO,MAAM,OAAO,MAGlB,CAAC;AAEH,eAAO,MAAM,WAAW;mBACP,MAAM,SAAS,MAAM;mBACrB,MAAM;sBACH,MAAM;CACzB,CAAC;AAgCF,eAAO,MAAM,mBAAmB;;;;;;;;;;;;EAiD/B,CAAC"}
1
+ {"version":3,"file":"videoPlayerStore.d.ts","sourceRoot":"","sources":["../../../../../src/VideoPlayer/store/videoPlayerStore.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAkB,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3E,eAAO,MAAM,OAAO,kCAGlB,CAAC;AAEH,eAAO,MAAM,WAAW;mBACP,MAAM,SAAS,MAAM;mBACrB,MAAM;sBACH,MAAM;CACzB,CAAC;AAgCF,eAAO,MAAM,mBAAmB;;;;;;;;;;;;EAiD/B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zezosoft/zezo-ott-react-native-video-player",
3
- "version": "1.0.4",
3
+ "version": "1.0.6",
4
4
  "description": "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), TypeScript support, and centralized state management. Perfect for streaming apps, video platforms, and OTT services.",
5
5
  "main": "./lib/module/index.js",
6
6
  "types": "./lib/typescript/src/index.d.ts",
@@ -19,7 +19,6 @@
19
19
  "ios",
20
20
  "lib",
21
21
  "react-native.config.js",
22
- "src",
23
22
  "!android/build",
24
23
  "!android/gradle",
25
24
  "!android/gradlew",
@@ -95,6 +94,8 @@
95
94
  "react-native-fast-image": "*",
96
95
  "react-native-gesture-handler": "*",
97
96
  "react-native-linear-gradient": "*",
97
+ "react-native-mmkv": "*",
98
+ "react-native-nitro-modules": "*",
98
99
  "react-native-reanimated": "*",
99
100
  "react-native-safe-area-context": "*",
100
101
  "react-native-svg": "*",
@@ -106,7 +107,6 @@
106
107
  "axios": "^1.11.0",
107
108
  "lucide-react-native": "^0.539.0",
108
109
  "react-native-awesome-slider": "^2.9.0",
109
- "react-native-mmkv": "^3.3.0",
110
110
  "react-native-orientation-locker": "1.6.0",
111
111
  "react-native-popup-menu": "^0.18.0",
112
112
  "react-native-responsive-fontsize": "^0.5.1",
@@ -140,6 +140,8 @@
140
140
  "react-native-fast-image": "^8.6.3",
141
141
  "react-native-gesture-handler": "^2.28.0",
142
142
  "react-native-linear-gradient": "^2.8.3",
143
+ "react-native-mmkv": "^4.1.2",
144
+ "react-native-nitro-modules": "^0.34.0",
143
145
  "react-native-reanimated": "^4.1.0",
144
146
  "react-native-safe-area-context": "^5.6.1",
145
147
  "react-native-svg": "^15.14.0",
@@ -1,311 +0,0 @@
1
- import {
2
- useEffect,
3
- useRef,
4
- useImperativeHandle,
5
- forwardRef,
6
- useCallback,
7
- useMemo,
8
- } from 'react';
9
- import { View } from 'react-native';
10
- import globalStyles from '../VideoPlayer/styles/globalStyles';
11
- import Video, {
12
- type OnBufferData,
13
- type OnLoadStartData,
14
- type OnProgressData,
15
- type VideoRef,
16
- } from 'react-native-video';
17
- import type { EdgeInsets } from 'react-native-safe-area-context';
18
- import { useAdsPlayerStore } from './store/adsPlayerStore';
19
- import type { VideoAd } from '../VideoPlayer/store/videoPlayer.type';
20
- import { AdMediaControlsProvider } from './MediaControls';
21
- import { Gesture, GestureDetector } from 'react-native-gesture-handler';
22
- import { runOnJS } from 'react-native-reanimated';
23
- import { toggleAdControls, showAdControls } from './utils/controls';
24
- import { resetAdState } from './utils/adStateReset';
25
- import { useAdTracking } from './utils/useAdTracking';
26
-
27
- export interface AdsPlayerProps {
28
- onAdEnd: (ad: VideoAd) => void;
29
- onAdSkip?: (ad: VideoAd) => void;
30
- onAdError?: (error: Error, ad: VideoAd) => void;
31
- onAdTracking?: ({
32
- ad,
33
- trackingUrl,
34
- event,
35
- }: {
36
- ad: VideoAd;
37
- trackingUrl: string;
38
- event: string;
39
- }) => void;
40
- onClose?: () => void;
41
- insets: EdgeInsets;
42
- }
43
-
44
- export interface AdsPlayerRef {
45
- seek: (time: number) => void;
46
- getCurrentTime: () => number;
47
- getDuration: () => number;
48
- }
49
-
50
- const AdsPlayer = forwardRef<AdsPlayerRef, AdsPlayerProps>(
51
- ({ onAdEnd, onAdSkip, onAdError, onAdTracking, onClose, insets }, ref) => {
52
- const {
53
- currentAd,
54
- adDuration,
55
- adCurrentTime,
56
- isAdPaused,
57
- isAdMuted,
58
- isAdPlaying,
59
- setIsAdPaused,
60
- setAdCurrentTime,
61
- setAdDuration,
62
- setShowSkipButton,
63
- setIsAdBuffering,
64
- } = useAdsPlayerStore();
65
- const adVideoRef = useRef<VideoRef>(null);
66
- const trackedQuartilesRef = useRef({
67
- firstQuartile: false,
68
- midpoint: false,
69
- thirdQuartile: false,
70
- });
71
- const trackedImpressionRef = useRef<string | null>(null);
72
- const {
73
- trackAdImpression,
74
- trackAdStart,
75
- trackAdComplete,
76
- trackAdQuartile,
77
- } = useAdTracking({ onAdTracking });
78
-
79
- const trigger = useCallback(() => {
80
- toggleAdControls();
81
- }, []);
82
-
83
- const tapGesture = useMemo(
84
- () =>
85
- Gesture.Tap()
86
- .onEnd(() => {
87
- runOnJS(trigger)();
88
- })
89
- .maxDuration(250),
90
- [trigger]
91
- );
92
-
93
- useImperativeHandle(ref, () => ({
94
- seek: (time: number) => {
95
- adVideoRef.current?.seek(time);
96
- },
97
- getCurrentTime: () => adCurrentTime,
98
- getDuration: () => adDuration,
99
- }));
100
-
101
- // Track impression only once per ad
102
- useEffect(() => {
103
- if (
104
- currentAd &&
105
- isAdPlaying &&
106
- trackedImpressionRef.current !== currentAd.id
107
- ) {
108
- try {
109
- trackedImpressionRef.current = currentAd.id;
110
- trackAdImpression(currentAd);
111
- } catch (error) {
112
- console.error('Error in ad impression tracking:', error);
113
- }
114
- }
115
- }, [currentAd, isAdPlaying, trackAdImpression]);
116
-
117
- // Separate effect for ensuring ad is not paused
118
- useEffect(() => {
119
- if (currentAd && isAdPlaying) {
120
- setIsAdPaused(false);
121
- showAdControls();
122
- }
123
- }, [currentAd, isAdPlaying, setIsAdPaused]);
124
-
125
- useEffect(() => {
126
- if (currentAd?.skippable) {
127
- if (currentAd.skipAfter > 0) {
128
- const timer = setTimeout(() => {
129
- setShowSkipButton(true);
130
- }, currentAd.skipAfter * 1000);
131
- return () => clearTimeout(timer);
132
- }
133
- setShowSkipButton(true);
134
- return undefined;
135
- }
136
- setShowSkipButton(false);
137
- return undefined;
138
- }, [currentAd, setShowSkipButton]);
139
-
140
- const handleAdProgress = (data: OnProgressData) => {
141
- setAdCurrentTime(data.currentTime);
142
- setAdDuration(data.seekableDuration || 0);
143
-
144
- // Reset buffering state when progress updates (playback has resumed)
145
- const { isAdBuffering } = useAdsPlayerStore.getState();
146
- if (isAdBuffering) {
147
- setIsAdBuffering(false);
148
- }
149
-
150
- if (currentAd && adDuration > 0) {
151
- const progress = data.currentTime / adDuration;
152
- if (progress >= 0.25 && !trackedQuartilesRef.current.firstQuartile) {
153
- trackedQuartilesRef.current.firstQuartile = true;
154
- trackAdQuartile(currentAd, 'firstQuartile');
155
- }
156
- if (progress >= 0.5 && !trackedQuartilesRef.current.midpoint) {
157
- trackedQuartilesRef.current.midpoint = true;
158
- trackAdQuartile(currentAd, 'midpoint');
159
- }
160
- if (progress >= 0.75 && !trackedQuartilesRef.current.thirdQuartile) {
161
- trackedQuartilesRef.current.thirdQuartile = true;
162
- trackAdQuartile(currentAd, 'thirdQuartile');
163
- }
164
- }
165
- };
166
-
167
- const handleAdLoadStart = (_: OnLoadStartData) => {
168
- setIsAdBuffering(true);
169
- };
170
-
171
- const handleAdLoad = () => {
172
- try {
173
- setIsAdBuffering(false);
174
- if (currentAd) {
175
- setAdDuration(currentAd.duration);
176
- trackAdStart(currentAd);
177
- }
178
- } catch (error) {
179
- console.error('Error in handleAdLoad:', error);
180
- if (currentAd && onAdError) {
181
- onAdError(
182
- error instanceof Error ? error : new Error('Ad load failed'),
183
- currentAd
184
- );
185
- }
186
- }
187
- };
188
-
189
- const handleAdEnd = () => {
190
- if (!currentAd) return;
191
-
192
- try {
193
- trackAdComplete(currentAd);
194
- resetAdState();
195
- trackedQuartilesRef.current = {
196
- firstQuartile: false,
197
- midpoint: false,
198
- thirdQuartile: false,
199
- };
200
- // Reset impression tracking for next ad
201
- trackedImpressionRef.current = null;
202
- onAdEnd(currentAd);
203
- } catch (error) {
204
- console.error('Error in handleAdEnd:', error);
205
- resetAdState();
206
- trackedImpressionRef.current = null;
207
- onAdEnd(currentAd);
208
- }
209
- };
210
-
211
- const handleAdError = (error: {
212
- error: {
213
- code?: string;
214
- localizedDescription?: string;
215
- errorString?: string;
216
- };
217
- }) => {
218
- if (!currentAd) return;
219
-
220
- try {
221
- const errorMessage =
222
- error.error?.localizedDescription ||
223
- error.error?.errorString ||
224
- 'Ad playback failed';
225
- console.error('Ad playback error:', errorMessage, error);
226
-
227
- resetAdState();
228
- // Reset impression tracking on error
229
- trackedImpressionRef.current = null;
230
-
231
- if (onAdError) {
232
- onAdError(new Error(errorMessage), currentAd);
233
- } else {
234
- // Fallback: treat error as ad end
235
- onAdEnd(currentAd);
236
- }
237
- } catch (err) {
238
- console.error('Error in handleAdError:', err);
239
- resetAdState();
240
- trackedImpressionRef.current = null;
241
- if (currentAd && onAdEnd) {
242
- onAdEnd(currentAd);
243
- }
244
- }
245
- };
246
-
247
- // Memoize video style for performance (no scale to avoid layout overflow)
248
- const videoStyle = useMemo(() => globalStyles.absoluteFill, []);
249
-
250
- // Memoize container style — overflow hidden to prevent layout glitches
251
- const containerStyle = useMemo(
252
- () => [
253
- globalStyles.absoluteFill,
254
- { backgroundColor: '#000', overflow: 'hidden' as const },
255
- ],
256
- []
257
- );
258
-
259
- if (!currentAd || !isAdPlaying) {
260
- return null;
261
- }
262
-
263
- return (
264
- <GestureDetector gesture={tapGesture}>
265
- <View
266
- style={containerStyle}
267
- collapsable={false}
268
- pointerEvents="box-none"
269
- >
270
- <AdMediaControlsProvider
271
- onAdSkip={onAdSkip}
272
- onAdTracking={onAdTracking}
273
- onClose={onClose}
274
- insets={insets}
275
- >
276
- <Video
277
- ref={adVideoRef}
278
- source={{ uri: currentAd.source }}
279
- paused={isAdPaused}
280
- muted={isAdMuted}
281
- onProgress={handleAdProgress}
282
- onLoad={handleAdLoad}
283
- onEnd={handleAdEnd}
284
- onError={handleAdError}
285
- onBuffer={({ isBuffering }: OnBufferData) => {
286
- if (isBuffering) {
287
- setIsAdBuffering(true);
288
- } else {
289
- setTimeout(() => setIsAdBuffering(false), 150);
290
- }
291
- }}
292
- onLoadStart={handleAdLoadStart}
293
- resizeMode="cover"
294
- style={videoStyle}
295
- controls={false}
296
- playInBackground={false}
297
- playWhenInactive={false}
298
- pointerEvents="box-none"
299
- ignoreSilentSwitch="ignore"
300
- progressUpdateInterval={250}
301
- />
302
- </AdMediaControlsProvider>
303
- </View>
304
- </GestureDetector>
305
- );
306
- }
307
- );
308
-
309
- AdsPlayer.displayName = 'AdsPlayer';
310
-
311
- export default AdsPlayer;
@@ -1,191 +0,0 @@
1
- import React, { memo, useCallback, useMemo } from 'react';
2
- import {
3
- Animated,
4
- StyleSheet,
5
- Text,
6
- View,
7
- TouchableOpacity,
8
- } from 'react-native';
9
- import { scale, moderateScale } from 'react-native-size-matters';
10
- import { RFValue } from 'react-native-responsive-fontsize';
11
- import { ExternalLink } from 'lucide-react-native';
12
- import { useAdsPlayerStore } from '../store/adsPlayerStore';
13
- import { useAdControls } from './AdMediaControlsProvider';
14
- import { useAdControlsAutoHide } from '../utils/useAdControlsAutoHide';
15
- import ProgressBar from '../../VideoPlayer/components/ProgressBar';
16
- import { handleAdClickThrough } from '../utils/controls';
17
- import { resetAdState } from '../utils/adStateReset';
18
- import { useAdTracking } from '../utils/useAdTracking';
19
-
20
- const AdBottomControls: React.FC = () => {
21
- const currentAd = useAdsPlayerStore((state) => state.currentAd);
22
- const adCurrentTime = useAdsPlayerStore((state) => state.adCurrentTime);
23
- const adDuration = useAdsPlayerStore((state) => state.adDuration);
24
- const { onAdSkip, onAdTracking } = useAdControls();
25
- const fadeAnim = useAdControlsAutoHide();
26
- const { trackAdSkip, trackAdClick } = useAdTracking({ onAdTracking });
27
-
28
- const shouldShowSkipButton = useMemo(
29
- () =>
30
- currentAd?.skippable &&
31
- currentAd.skipAfter > 0 &&
32
- adCurrentTime >= currentAd.skipAfter,
33
- [currentAd?.skippable, currentAd?.skipAfter, adCurrentTime]
34
- );
35
-
36
- // Memoize animated style
37
- const animatedOpacityStyle = useMemo(
38
- () => ({ opacity: fadeAnim }),
39
- [fadeAnim]
40
- );
41
-
42
- const handleSkip = useCallback(() => {
43
- if (!currentAd) return;
44
-
45
- trackAdSkip(currentAd);
46
- onAdSkip?.(currentAd);
47
- resetAdState();
48
- }, [currentAd, onAdSkip, trackAdSkip]);
49
-
50
- const handleClickThrough = useCallback(() => {
51
- if (currentAd) {
52
- trackAdClick(currentAd);
53
- handleAdClickThrough(currentAd, onAdTracking);
54
- }
55
- }, [currentAd, onAdTracking, trackAdClick]);
56
-
57
- if (!currentAd) {
58
- return null;
59
- }
60
-
61
- return (
62
- <View style={bottomControlsStyles.container}>
63
- {/* Ad Metadata */}
64
- {currentAd.clickThroughUrl && (
65
- <Animated.View style={animatedOpacityStyle} pointerEvents="box-none">
66
- <View pointerEvents="auto">
67
- <TouchableOpacity
68
- style={bottomControlsStyles.metadataContainer}
69
- onPress={handleClickThrough}
70
- activeOpacity={0.7}
71
- >
72
- <View style={bottomControlsStyles.metadataContent}>
73
- <View style={bottomControlsStyles.metadataTextContainer}>
74
- {currentAd.title && (
75
- <Text
76
- style={bottomControlsStyles.metadataTitle}
77
- numberOfLines={1}
78
- ellipsizeMode="tail"
79
- >
80
- {currentAd.title}
81
- </Text>
82
- )}
83
- {currentAd.description && (
84
- <Text
85
- style={bottomControlsStyles.metadataDesc}
86
- numberOfLines={2}
87
- ellipsizeMode="tail"
88
- >
89
- {currentAd.description}
90
- </Text>
91
- )}
92
- </View>
93
- <View style={bottomControlsStyles.clickIndicator}>
94
- <ExternalLink size={scale(14)} color="#fff" />
95
- </View>
96
- </View>
97
- </TouchableOpacity>
98
- </View>
99
- </Animated.View>
100
- )}
101
-
102
- <Animated.View style={animatedOpacityStyle}>
103
- <ProgressBar
104
- duration={adDuration}
105
- currentTime={adCurrentTime}
106
- bufferedTime={adDuration}
107
- disabled={true}
108
- height={moderateScale(3)}
109
- />
110
- </Animated.View>
111
- {shouldShowSkipButton && (
112
- <View pointerEvents="auto">
113
- <TouchableOpacity
114
- onPress={handleSkip}
115
- style={bottomControlsStyles.skipButton}
116
- activeOpacity={0.7}
117
- >
118
- <Text style={bottomControlsStyles.skipButtonText}>Skip Ad</Text>
119
- </TouchableOpacity>
120
- </View>
121
- )}
122
- </View>
123
- );
124
- };
125
-
126
- const bottomControlsStyles = StyleSheet.create({
127
- container: {
128
- position: 'relative',
129
- width: '100%',
130
- bottom: 0,
131
- zIndex: 1,
132
- },
133
- metadataContainer: {
134
- backgroundColor: 'rgba(21, 21, 21, 0.95)',
135
- borderRadius: moderateScale(6),
136
- overflow: 'hidden',
137
- marginBottom: moderateScale(5),
138
- maxWidth: moderateScale(200),
139
- borderWidth: 1,
140
- borderColor: 'rgba(174, 174, 174, 0.12)',
141
- },
142
- metadataContent: {
143
- flexDirection: 'row',
144
- alignItems: 'center',
145
- padding: moderateScale(5),
146
- },
147
- metadataTextContainer: {
148
- flex: 1,
149
- marginRight: moderateScale(4),
150
- minWidth: 0,
151
- },
152
- metadataTitle: {
153
- color: '#FFFFFF',
154
- fontSize: RFValue(10),
155
- fontWeight: '400',
156
- marginBottom: moderateScale(0.5),
157
- letterSpacing: 0.1,
158
- },
159
- metadataDesc: {
160
- color: 'rgba(255, 255, 255, 0.7)',
161
- fontSize: RFValue(9),
162
- lineHeight: RFValue(12),
163
- },
164
- clickIndicator: {
165
- width: moderateScale(20),
166
- height: moderateScale(20),
167
- borderRadius: moderateScale(10),
168
- backgroundColor: 'rgba(255, 255, 255, 0.20)',
169
- justifyContent: 'center',
170
- alignItems: 'center',
171
- },
172
- skipButton: {
173
- position: 'absolute',
174
- right: moderateScale(2),
175
- bottom: moderateScale(32),
176
- backgroundColor: 'rgba(21, 21, 21, 0.95)',
177
- paddingHorizontal: moderateScale(15),
178
- paddingVertical: moderateScale(7),
179
- borderRadius: moderateScale(14),
180
- zIndex: 10,
181
- borderWidth: 1,
182
- borderColor: 'rgba(255, 255, 255, 0.20)',
183
- },
184
- skipButtonText: {
185
- color: '#fff',
186
- fontSize: RFValue(12),
187
- fontWeight: '600',
188
- },
189
- });
190
-
191
- export default memo(AdBottomControls);