@zezosoft/zezo-ott-react-native-ui-kit 1.0.4 → 1.0.5

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 (172) hide show
  1. package/lib/module/assets/animations/Failed.json +2103 -0
  2. package/lib/module/assets/animations/Pending.json +522 -0
  3. package/lib/module/assets/animations/Successful.json +2289 -0
  4. package/lib/module/components/Alert/AlertDialog.js +208 -0
  5. package/lib/module/components/Alert/AlertDialog.js.map +1 -0
  6. package/lib/module/components/Alert/index.js +1 -0
  7. package/lib/module/components/Alert/index.js.map +1 -1
  8. package/lib/module/components/Auth/AuthProvider/AuthProvider.js +270 -0
  9. package/lib/module/components/Auth/AuthProvider/AuthProvider.js.map +1 -0
  10. package/lib/module/components/Auth/SplashScreen/SplashScreen.js +63 -65
  11. package/lib/module/components/Auth/SplashScreen/SplashScreen.js.map +1 -1
  12. package/lib/module/components/Auth/SplashScreen/components/SplashVideo/SplashVideo.js +82 -41
  13. package/lib/module/components/Auth/SplashScreen/components/SplashVideo/SplashVideo.js.map +1 -1
  14. package/lib/module/components/Auth/index.js +2 -0
  15. package/lib/module/components/Auth/index.js.map +1 -1
  16. package/lib/module/components/BackgroundLayout/BackgroundLayout.js +3 -3
  17. package/lib/module/components/BackgroundLayout/BackgroundLayout.js.map +1 -1
  18. package/lib/module/components/Button/SecondaryBtn.js +91 -0
  19. package/lib/module/components/Button/SecondaryBtn.js.map +1 -0
  20. package/lib/module/components/Button/index.js +2 -0
  21. package/lib/module/components/Button/index.js.map +1 -1
  22. package/lib/module/components/Content/Card/NowWatching/NowWatching.js +6 -3
  23. package/lib/module/components/Content/Card/NowWatching/NowWatching.js.map +1 -1
  24. package/lib/module/components/Content/Card/Sliders/Styles/One.js +4 -1
  25. package/lib/module/components/Content/Card/Sliders/Styles/One.js.map +1 -1
  26. package/lib/module/components/Content/Card/Sliders/Styles/Two.js +4 -1
  27. package/lib/module/components/Content/Card/Sliders/Styles/Two.js.map +1 -1
  28. package/lib/module/components/Content/Card/Styles/Five.js +1 -0
  29. package/lib/module/components/Content/Card/Styles/Five.js.map +1 -1
  30. package/lib/module/components/Content/Card/Styles/Four.js +1 -0
  31. package/lib/module/components/Content/Card/Styles/Four.js.map +1 -1
  32. package/lib/module/components/Content/Card/Styles/One.js +7 -3
  33. package/lib/module/components/Content/Card/Styles/One.js.map +1 -1
  34. package/lib/module/components/Content/Card/Styles/RotateInOut.js +1 -0
  35. package/lib/module/components/Content/Card/Styles/RotateInOut.js.map +1 -1
  36. package/lib/module/components/Content/Card/Styles/Six.js +4 -1
  37. package/lib/module/components/Content/Card/Styles/Six.js.map +1 -1
  38. package/lib/module/components/Content/Card/Styles/Three.js +1 -0
  39. package/lib/module/components/Content/Card/Styles/Three.js.map +1 -1
  40. package/lib/module/components/Content/Card/Styles/TopTen.js +1 -0
  41. package/lib/module/components/Content/Card/Styles/TopTen.js.map +1 -1
  42. package/lib/module/components/Content/Card/Styles/Two.js +1 -0
  43. package/lib/module/components/Content/Card/Styles/Two.js.map +1 -1
  44. package/lib/module/components/Content/Card/components/CardPoster.js +12 -28
  45. package/lib/module/components/Content/Card/components/CardPoster.js.map +1 -1
  46. package/lib/module/components/Content/Card/components/RentOrBuyIcon.js +116 -0
  47. package/lib/module/components/Content/Card/components/RentOrBuyIcon.js.map +1 -0
  48. package/lib/module/components/Content/Card/components/ThumbnailCard.js +1 -2
  49. package/lib/module/components/Content/Card/components/ThumbnailCard.js.map +1 -1
  50. package/lib/module/components/ContentView/ContentView.js +1 -0
  51. package/lib/module/components/ContentView/ContentView.js.map +1 -1
  52. package/lib/module/components/ContentView/MoreContentList.js +1 -0
  53. package/lib/module/components/ContentView/MoreContentList.js.map +1 -1
  54. package/lib/module/components/ContentView/components/EpisodeCard.js +6 -10
  55. package/lib/module/components/ContentView/components/EpisodeCard.js.map +1 -1
  56. package/lib/module/components/ContentView/components/HeroBanner.js +17 -5
  57. package/lib/module/components/ContentView/components/HeroBanner.js.map +1 -1
  58. package/lib/module/components/Logo/Logo.js +5 -5
  59. package/lib/module/components/Logo/Logo.js.map +1 -1
  60. package/lib/module/components/Reels/ReelsSeries/Model/Synopsis.js +0 -4
  61. package/lib/module/components/Reels/ReelsSeries/Model/Synopsis.js.map +1 -1
  62. package/lib/module/components/Subscription/SubOne.js +2 -2
  63. package/lib/module/components/Subscription/SubOne.js.map +1 -1
  64. package/lib/module/components/User/ProfileUpdate/ProfileUpdate.js +11 -14
  65. package/lib/module/components/User/ProfileUpdate/ProfileUpdate.js.map +1 -1
  66. package/lib/module/components/User/WatchHistory/WatchHistory.js +1 -0
  67. package/lib/module/components/User/WatchHistory/WatchHistory.js.map +1 -1
  68. package/lib/module/components/User/WatchLater/WatchLater.js +1 -0
  69. package/lib/module/components/User/WatchLater/WatchLater.js.map +1 -1
  70. package/lib/module/components/User/components/UserAvatar.js +35 -8
  71. package/lib/module/components/User/components/UserAvatar.js.map +1 -1
  72. package/lib/module/hooks/useSplashCache.js +117 -0
  73. package/lib/module/hooks/useSplashCache.js.map +1 -0
  74. package/lib/module/store/RecentSearchesStore.js +0 -1
  75. package/lib/module/store/RecentSearchesStore.js.map +1 -1
  76. package/lib/typescript/src/components/Alert/AlertDialog.d.ts +18 -0
  77. package/lib/typescript/src/components/Alert/AlertDialog.d.ts.map +1 -0
  78. package/lib/typescript/src/components/Alert/index.d.ts +1 -0
  79. package/lib/typescript/src/components/Alert/index.d.ts.map +1 -1
  80. package/lib/typescript/src/components/Auth/AuthProvider/AuthProvider.d.ts +35 -0
  81. package/lib/typescript/src/components/Auth/AuthProvider/AuthProvider.d.ts.map +1 -0
  82. package/lib/typescript/src/components/Auth/SplashScreen/SplashScreen.d.ts +4 -3
  83. package/lib/typescript/src/components/Auth/SplashScreen/SplashScreen.d.ts.map +1 -1
  84. package/lib/typescript/src/components/Auth/SplashScreen/components/SplashVideo/SplashVideo.d.ts +1 -1
  85. package/lib/typescript/src/components/Auth/SplashScreen/components/SplashVideo/SplashVideo.d.ts.map +1 -1
  86. package/lib/typescript/src/components/Auth/index.d.ts +2 -0
  87. package/lib/typescript/src/components/Auth/index.d.ts.map +1 -1
  88. package/lib/typescript/src/components/BackgroundLayout/BackgroundLayout.d.ts.map +1 -1
  89. package/lib/typescript/src/components/Button/SecondaryBtn.d.ts +21 -0
  90. package/lib/typescript/src/components/Button/SecondaryBtn.d.ts.map +1 -0
  91. package/lib/typescript/src/components/Button/index.d.ts +11 -0
  92. package/lib/typescript/src/components/Button/index.d.ts.map +1 -1
  93. package/lib/typescript/src/components/Content/Card/NowWatching/NowWatching.d.ts.map +1 -1
  94. package/lib/typescript/src/components/Content/Card/Sliders/Styles/One.d.ts.map +1 -1
  95. package/lib/typescript/src/components/Content/Card/Sliders/Styles/Two.d.ts.map +1 -1
  96. package/lib/typescript/src/components/Content/Card/Styles/Five.d.ts.map +1 -1
  97. package/lib/typescript/src/components/Content/Card/Styles/Four.d.ts.map +1 -1
  98. package/lib/typescript/src/components/Content/Card/Styles/One.d.ts.map +1 -1
  99. package/lib/typescript/src/components/Content/Card/Styles/RotateInOut.d.ts.map +1 -1
  100. package/lib/typescript/src/components/Content/Card/Styles/Six.d.ts.map +1 -1
  101. package/lib/typescript/src/components/Content/Card/Styles/Three.d.ts.map +1 -1
  102. package/lib/typescript/src/components/Content/Card/Styles/TopTen.d.ts.map +1 -1
  103. package/lib/typescript/src/components/Content/Card/Styles/Two.d.ts.map +1 -1
  104. package/lib/typescript/src/components/Content/Card/components/CardPoster.d.ts +4 -2
  105. package/lib/typescript/src/components/Content/Card/components/CardPoster.d.ts.map +1 -1
  106. package/lib/typescript/src/components/Content/Card/components/RentOrBuyIcon.d.ts +14 -0
  107. package/lib/typescript/src/components/Content/Card/components/RentOrBuyIcon.d.ts.map +1 -0
  108. package/lib/typescript/src/components/ContentView/ContentView.d.ts.map +1 -1
  109. package/lib/typescript/src/components/ContentView/MoreContentList.d.ts.map +1 -1
  110. package/lib/typescript/src/components/ContentView/components/EpisodeCard.d.ts.map +1 -1
  111. package/lib/typescript/src/components/ContentView/components/HeroBanner.d.ts +1 -1
  112. package/lib/typescript/src/components/ContentView/components/HeroBanner.d.ts.map +1 -1
  113. package/lib/typescript/src/components/Logo/Logo.d.ts.map +1 -1
  114. package/lib/typescript/src/components/Reels/ReelsSeries/Model/Synopsis.d.ts.map +1 -1
  115. package/lib/typescript/src/components/Subscription/SubOne.d.ts.map +1 -1
  116. package/lib/typescript/src/components/User/ProfileUpdate/ProfileUpdate.d.ts +2 -2
  117. package/lib/typescript/src/components/User/ProfileUpdate/ProfileUpdate.d.ts.map +1 -1
  118. package/lib/typescript/src/components/User/WatchHistory/WatchHistory.d.ts.map +1 -1
  119. package/lib/typescript/src/components/User/WatchLater/WatchLater.d.ts.map +1 -1
  120. package/lib/typescript/src/components/User/components/UserAvatar.d.ts +4 -0
  121. package/lib/typescript/src/components/User/components/UserAvatar.d.ts.map +1 -1
  122. package/lib/typescript/src/hooks/useSplashCache.d.ts +22 -0
  123. package/lib/typescript/src/hooks/useSplashCache.d.ts.map +1 -0
  124. package/lib/typescript/src/store/RecentSearchesStore.d.ts.map +1 -1
  125. package/lib/typescript/src/types/content/content-view.types.d.ts +1 -0
  126. package/lib/typescript/src/types/content/content-view.types.d.ts.map +1 -1
  127. package/package.json +1 -1
  128. package/src/assets/animations/Failed.json +2103 -0
  129. package/src/assets/animations/Pending.json +522 -0
  130. package/src/assets/animations/Successful.json +2289 -0
  131. package/src/components/Alert/AlertDialog.tsx +247 -0
  132. package/src/components/Alert/index.ts +1 -0
  133. package/src/components/Auth/AuthProvider/AuthProvider.tsx +344 -0
  134. package/src/components/Auth/SplashScreen/SplashScreen.tsx +89 -80
  135. package/src/components/Auth/SplashScreen/components/SplashVideo/SplashVideo.tsx +90 -40
  136. package/src/components/Auth/index.ts +2 -0
  137. package/src/components/BackgroundLayout/BackgroundLayout.tsx +3 -3
  138. package/src/components/Button/SecondaryBtn.tsx +116 -0
  139. package/src/components/Button/index.ts +2 -0
  140. package/src/components/Content/Card/NowWatching/NowWatching.tsx +4 -0
  141. package/src/components/Content/Card/Sliders/Styles/One.tsx +2 -0
  142. package/src/components/Content/Card/Sliders/Styles/Two.tsx +2 -0
  143. package/src/components/Content/Card/Styles/Five.tsx +1 -0
  144. package/src/components/Content/Card/Styles/Four.tsx +1 -0
  145. package/src/components/Content/Card/Styles/One.tsx +7 -1
  146. package/src/components/Content/Card/Styles/RotateInOut.tsx +1 -0
  147. package/src/components/Content/Card/Styles/Six.tsx +2 -0
  148. package/src/components/Content/Card/Styles/Three.tsx +1 -0
  149. package/src/components/Content/Card/Styles/TopTen.tsx +1 -0
  150. package/src/components/Content/Card/Styles/Two.tsx +1 -0
  151. package/src/components/Content/Card/components/CardPoster.tsx +23 -51
  152. package/src/components/Content/Card/components/RentOrBuyIcon.tsx +109 -0
  153. package/src/components/Content/Card/components/ThumbnailCard.tsx +1 -2
  154. package/src/components/ContentView/ContentView.tsx +1 -0
  155. package/src/components/ContentView/MoreContentList.tsx +1 -0
  156. package/src/components/ContentView/components/EpisodeCard.tsx +4 -9
  157. package/src/components/ContentView/components/HeroBanner.tsx +16 -0
  158. package/src/components/Logo/Logo.tsx +5 -7
  159. package/src/components/Reels/ReelsSeries/Model/Synopsis.tsx +1 -8
  160. package/src/components/Subscription/SubOne.tsx +4 -2
  161. package/src/components/User/ProfileUpdate/ProfileUpdate.tsx +13 -15
  162. package/src/components/User/WatchHistory/WatchHistory.tsx +1 -0
  163. package/src/components/User/WatchLater/WatchLater.tsx +1 -0
  164. package/src/components/User/components/UserAvatar.tsx +36 -3
  165. package/src/hooks/useSplashCache.ts +166 -0
  166. package/src/store/RecentSearchesStore.ts +0 -1
  167. package/src/types/content/content-view.types.ts +1 -0
  168. package/lib/module/hooks/useInitSplashCacheSync.js +0 -116
  169. package/lib/module/hooks/useInitSplashCacheSync.js.map +0 -1
  170. package/lib/typescript/src/hooks/useInitSplashCacheSync.d.ts +0 -22
  171. package/lib/typescript/src/hooks/useInitSplashCacheSync.d.ts.map +0 -1
  172. package/src/hooks/useInitSplashCacheSync.ts +0 -174
@@ -1,5 +1,10 @@
1
+ /**
2
+ * @author Naresh Dhamu
3
+ * @lastModified Fri 17 Oct 2025 at 10:16 PM
4
+ */
1
5
  import React, { useState } from 'react';
2
6
  import { Image, StyleSheet, View } from 'react-native';
7
+ import SkeletonPlaceholder from 'react-native-skeleton-placeholder';
3
8
  import { scale } from 'react-native-size-matters';
4
9
  import { useTheme } from '../../../theme/hook/useTheme';
5
10
  import type { AppTheme } from '../../../theme/themes';
@@ -18,25 +23,53 @@ const UserAvatar: React.FC<UserAvatarProps> = ({
18
23
  theme,
19
24
  }) => {
20
25
  const [imageError, setImageError] = useState(false);
26
+ const [loading, setLoading] = useState(!!avatarUri);
21
27
  const { theme: appliedTheme } = useTheme(theme);
22
- const borderColor = appliedTheme.colors.primary;
28
+ const borderColor = appliedTheme.colors.primary || '#ccc';
29
+ const skeletonBaseColor = appliedTheme.colors.skeletonBaseColor || '#E0E0E0';
30
+ const skeletonHighlightColor =
31
+ appliedTheme.colors.skeletonHighlightColor || '#F5F5F5';
23
32
 
24
33
  return (
25
34
  <View style={styles(size).wrapper}>
35
+ {loading && (
36
+ <SkeletonPlaceholder
37
+ backgroundColor={skeletonBaseColor}
38
+ highlightColor={skeletonHighlightColor}
39
+ borderRadius={size / 2}
40
+ >
41
+ <SkeletonPlaceholder.Item
42
+ width={size}
43
+ height={size}
44
+ borderRadius={size / 2}
45
+ />
46
+ </SkeletonPlaceholder>
47
+ )}
48
+
26
49
  <Image
27
50
  source={imageError || !avatarUri ? fallbackAvatar : { uri: avatarUri }}
28
- style={[styles(size).avatar, { borderColor }]}
29
- onError={() => setImageError(true)}
51
+ style={[styles(size).avatar, { borderColor, position: 'absolute' }]}
52
+ onError={() => {
53
+ setImageError(true);
54
+ setLoading(false);
55
+ }}
56
+ onLoadStart={() => setLoading(true)}
57
+ onLoadEnd={() => setLoading(false)}
30
58
  />
31
59
  </View>
32
60
  );
33
61
  };
34
62
 
35
63
  export default UserAvatar;
64
+
36
65
  const styles = (size: number) =>
37
66
  StyleSheet.create({
38
67
  wrapper: {
68
+ width: size,
69
+ height: size,
39
70
  position: 'relative',
71
+ justifyContent: 'center',
72
+ alignItems: 'center',
40
73
  },
41
74
  avatar: {
42
75
  width: size,
@@ -0,0 +1,166 @@
1
+ /**
2
+ * @author Naresh
3
+ * @lastModified Fri 17 Oct 2025 at 09:55 PM
4
+ */
5
+
6
+ import { useEffect, useState } from 'react';
7
+ import RNFS from 'react-native-fs';
8
+ import CryptoJS from 'crypto-js';
9
+ import { MMKV } from 'react-native-mmkv';
10
+ import { useSplashStore } from '../store/splashStore';
11
+
12
+ const storage = new MMKV();
13
+ const activeDownloads = new Map<string, Promise<string | null>>();
14
+
15
+ const SUPPORTED_EXTENSIONS = [
16
+ 'json',
17
+ 'mp4',
18
+ 'jpg',
19
+ 'jpeg',
20
+ 'png',
21
+ 'webp',
22
+ ] as const;
23
+
24
+ const getFileExtension = (url: string): string => {
25
+ try {
26
+ const cleanUrl = url.split('?')[0];
27
+ const ext = cleanUrl
28
+ ?.substring(cleanUrl?.lastIndexOf('.') + 1)
29
+ .toLowerCase();
30
+ return SUPPORTED_EXTENSIONS.includes(ext as any) ? (ext as string) : 'png';
31
+ } catch {
32
+ return 'png';
33
+ }
34
+ };
35
+
36
+ const downloadAndCacheAsset = async (
37
+ url: string,
38
+ extension: string,
39
+ cacheKey: string,
40
+ force: boolean
41
+ ): Promise<string | null> => {
42
+ if (!url?.trim()) return null;
43
+
44
+ const ext = extension.replace(/^\./, '') || 'png';
45
+ const hash = CryptoJS.MD5(`${url}|${cacheKey}|${ext}`).toString();
46
+ const localFile = `${RNFS.CachesDirectoryPath}/splash_${hash}.${ext}`;
47
+
48
+ if (activeDownloads.has(hash)) {
49
+ return activeDownloads.get(hash)!;
50
+ }
51
+
52
+ const task = (async () => {
53
+ try {
54
+ const savedHash = storage.getString(cacheKey);
55
+
56
+ if (savedHash && savedHash !== hash) {
57
+ const oldFile = `${RNFS.CachesDirectoryPath}/splash_${savedHash}.${ext}`;
58
+ if (await RNFS.exists(oldFile)) {
59
+ await RNFS.unlink(oldFile).catch(() => {});
60
+ }
61
+ }
62
+
63
+ if (!force) {
64
+ const exists = await RNFS.exists(localFile);
65
+ if (exists && savedHash === hash) {
66
+ return localFile;
67
+ }
68
+ }
69
+
70
+ const { statusCode } = await RNFS.downloadFile({
71
+ fromUrl: url,
72
+ toFile: localFile,
73
+ cacheable: true,
74
+ readTimeout: 15000,
75
+ connectionTimeout: 10000,
76
+ }).promise;
77
+
78
+ if (statusCode === 200) {
79
+ storage.set(cacheKey, hash);
80
+ return localFile;
81
+ }
82
+ } catch {
83
+ return null;
84
+ }
85
+
86
+ return null;
87
+ })();
88
+
89
+ activeDownloads.set(hash, task);
90
+ return task;
91
+ };
92
+
93
+ type SplashCacheOptions = {
94
+ logoUrl?: string;
95
+ backgroundUrl?: string;
96
+ forceDownload?: boolean;
97
+ };
98
+
99
+ export const useSplashCache = ({
100
+ logoUrl,
101
+ backgroundUrl,
102
+ forceDownload = false,
103
+ }: SplashCacheOptions) => {
104
+ const [state, setState] = useState({
105
+ isReady: false,
106
+ error: null as Error | null,
107
+ });
108
+
109
+ const setLogo = useSplashStore((s) => s.setLogoPath);
110
+ const setBackground = useSplashStore((s) => s.setBackdropPath);
111
+
112
+ useEffect(() => {
113
+ let mounted = true;
114
+
115
+ const syncAssets = async () => {
116
+ try {
117
+ const [logoPath, bgPath] = await Promise.all([
118
+ logoUrl
119
+ ? downloadAndCacheAsset(
120
+ logoUrl,
121
+ getFileExtension(logoUrl),
122
+ 'splash_logo',
123
+ forceDownload
124
+ )
125
+ : Promise.resolve(null),
126
+ backgroundUrl
127
+ ? downloadAndCacheAsset(
128
+ backgroundUrl,
129
+ getFileExtension(backgroundUrl),
130
+ 'splash_background',
131
+ forceDownload
132
+ )
133
+ : Promise.resolve(null),
134
+ ]);
135
+
136
+ if (!mounted) return;
137
+
138
+ if (logoPath) setLogo?.(logoPath);
139
+ if (bgPath) setBackground?.(bgPath);
140
+
141
+ setState({ isReady: true, error: null });
142
+ } catch (err) {
143
+ if (mounted) {
144
+ setState({ isReady: true, error: err as Error });
145
+ }
146
+ }
147
+ };
148
+
149
+ syncAssets();
150
+ return () => {
151
+ mounted = false;
152
+ };
153
+ }, [logoUrl, backgroundUrl, forceDownload, setLogo, setBackground]);
154
+
155
+ const logoPath = useSplashStore((s) => s.logo.localPath);
156
+ const bgPath = useSplashStore((s) => s.backdrop.localPath);
157
+
158
+ return {
159
+ state,
160
+ isLoading: !state.isReady && !state.error,
161
+ data: {
162
+ logoPath,
163
+ backgroundPath: bgPath,
164
+ },
165
+ };
166
+ };
@@ -68,7 +68,6 @@ export const useRecentSearchesStore = create<RecentSearchesState>()(
68
68
  if (hasData) {
69
69
  setTimeout(() => {
70
70
  useRecentSearchesStore.setState({ isLoading: false });
71
- console.log('🔄 Zustand store rehydrated');
72
71
  }, 50);
73
72
  } else {
74
73
  useRecentSearchesStore.setState({ isLoading: false });
@@ -129,6 +129,7 @@ export type HeroBannerProps = {
129
129
  renderButtons?: RenderButtons;
130
130
  renderSkeletons?: SkeletonOverrides;
131
131
  menuActions?: MenuAction[];
132
+ content_offering_type?: IContentData['content_offering_type'];
132
133
  };
133
134
 
134
135
  // 🟧 Final Component Props
@@ -1,116 +0,0 @@
1
- "use strict";
2
-
3
- /**
4
- * @author Naresh Dhamu
5
- * @lastModified Tue 29 Jul 2025 at 05:37 PM
6
- */
7
-
8
- import { useEffect, useState } from 'react';
9
- import RNFS from 'react-native-fs';
10
- import CryptoJS from 'crypto-js';
11
- import { MMKV } from 'react-native-mmkv';
12
- import { useSplashStore } from "../store/splashStore.js";
13
- const mmkvStorage = new MMKV();
14
- const inFlightDownloadsMap = new Map();
15
- const SUPPORTED_FILE_TYPES = ['json', 'mp4', 'jpg', 'jpeg', 'png', 'webp'];
16
- const extractFileExtension = url => {
17
- try {
18
- const cleanUrl = url.split('?')[0];
19
- const ext = cleanUrl?.substring(cleanUrl.lastIndexOf('.') + 1).toLowerCase() || '';
20
- return SUPPORTED_FILE_TYPES.includes(ext) ? ext : 'png';
21
- } catch {
22
- return 'png';
23
- }
24
- };
25
- const cacheSplashAsset = async (url, extension, mmkvKey, forceDownload) => {
26
- if (!url?.trim()) return null;
27
- const ext = extension.replace(/^\./, '').trim() || 'mp4';
28
- const hash = CryptoJS.MD5(`${url}|${mmkvKey}|${ext}`).toString();
29
- const localPath = `${RNFS?.CachesDirectoryPath}/splash_${hash}.${ext}`;
30
- if (inFlightDownloadsMap.has(hash)) {
31
- return inFlightDownloadsMap.get(hash);
32
- }
33
- const downloadTask = (async () => {
34
- try {
35
- const previousHash = mmkvStorage.getString(mmkvKey);
36
- if (previousHash && previousHash !== hash) {
37
- const oldPath = `${RNFS?.CachesDirectoryPath}/splash_${previousHash}.${ext}`;
38
- const exists = await RNFS?.exists(oldPath);
39
- if (exists) {
40
- await RNFS?.unlink(oldPath).catch(() => {});
41
- }
42
- }
43
- if (!forceDownload) {
44
- const exists = await RNFS?.exists(localPath);
45
- if (exists && previousHash === hash) {
46
- return localPath;
47
- }
48
- }
49
- const {
50
- statusCode
51
- } = await RNFS?.downloadFile({
52
- fromUrl: url,
53
- toFile: localPath,
54
- cacheable: true,
55
- readTimeout: 15000,
56
- connectionTimeout: 10000
57
- }).promise;
58
- if (statusCode === 200) {
59
- mmkvStorage.set(mmkvKey, hash);
60
- return localPath;
61
- }
62
- } catch {}
63
- return null;
64
- })();
65
- inFlightDownloadsMap.set(hash, downloadTask);
66
- return downloadTask;
67
- };
68
- export const useInitSplashCacheSync = ({
69
- logoUrl,
70
- backgroundUrl,
71
- forceDownload = false
72
- }) => {
73
- const [splashSyncState, setSplashSyncState] = useState({
74
- isReady: false,
75
- error: null
76
- });
77
- const setSplashLogoPath = useSplashStore(s => s.setLogoPath);
78
- const setSplashBackgroundPath = useSplashStore(s => s.setBackdropPath);
79
- useEffect(() => {
80
- let isMounted = true;
81
- const syncSplashAssets = async () => {
82
- try {
83
- const [logoPath, backgroundPath] = await Promise.all([logoUrl ? cacheSplashAsset(logoUrl, extractFileExtension(logoUrl), 'splash_logo', forceDownload) : Promise.resolve(null), backgroundUrl ? cacheSplashAsset(backgroundUrl, extractFileExtension(backgroundUrl), 'splash_background', forceDownload) : Promise.resolve(null)]);
84
- if (!isMounted) return;
85
- if (logoPath) setSplashLogoPath?.(logoPath);
86
- if (backgroundPath) setSplashBackgroundPath?.(backgroundPath);
87
- setSplashSyncState({
88
- isReady: true,
89
- error: null
90
- });
91
- } catch (err) {
92
- if (isMounted) {
93
- setSplashSyncState({
94
- isReady: true,
95
- error: err
96
- });
97
- }
98
- }
99
- };
100
- syncSplashAssets();
101
- return () => {
102
- isMounted = false;
103
- };
104
- }, [logoUrl, backgroundUrl, forceDownload, setSplashLogoPath, setSplashBackgroundPath]);
105
- const splashLogoLocalPath = useSplashStore(s => s.logo.localPath);
106
- const splashBackgroundLocalPath = useSplashStore(s => s.backdrop.localPath);
107
- return {
108
- state: splashSyncState,
109
- isLoading: !splashSyncState.isReady && !splashSyncState.error,
110
- data: {
111
- localPathLogo: splashLogoLocalPath,
112
- localPathBackground: splashBackgroundLocalPath
113
- }
114
- };
115
- };
116
- //# sourceMappingURL=useInitSplashCacheSync.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["useEffect","useState","RNFS","CryptoJS","MMKV","useSplashStore","mmkvStorage","inFlightDownloadsMap","Map","SUPPORTED_FILE_TYPES","extractFileExtension","url","cleanUrl","split","ext","substring","lastIndexOf","toLowerCase","includes","cacheSplashAsset","extension","mmkvKey","forceDownload","trim","replace","hash","MD5","toString","localPath","CachesDirectoryPath","has","get","downloadTask","previousHash","getString","oldPath","exists","unlink","catch","statusCode","downloadFile","fromUrl","toFile","cacheable","readTimeout","connectionTimeout","promise","set","useInitSplashCacheSync","logoUrl","backgroundUrl","splashSyncState","setSplashSyncState","isReady","error","setSplashLogoPath","s","setLogoPath","setSplashBackgroundPath","setBackdropPath","isMounted","syncSplashAssets","logoPath","backgroundPath","Promise","all","resolve","err","splashLogoLocalPath","logo","splashBackgroundLocalPath","backdrop","state","isLoading","data","localPathLogo","localPathBackground"],"sourceRoot":"../../../src","sources":["hooks/useInitSplashCacheSync.ts"],"mappings":"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","ignoreList":[]}
@@ -1,22 +0,0 @@
1
- /**
2
- * @author Naresh Dhamu
3
- * @lastModified Tue 29 Jul 2025 at 05:37 PM
4
- */
5
- type UseSplashCacheSyncOptions = {
6
- logoUrl?: string;
7
- backgroundUrl?: string;
8
- forceDownload?: boolean;
9
- };
10
- export declare const useInitSplashCacheSync: ({ logoUrl, backgroundUrl, forceDownload, }: UseSplashCacheSyncOptions) => {
11
- state: {
12
- isReady: boolean;
13
- error: Error | null;
14
- };
15
- isLoading: boolean;
16
- data: {
17
- localPathLogo: string | null;
18
- localPathBackground: string | null;
19
- };
20
- };
21
- export {};
22
- //# sourceMappingURL=useInitSplashCacheSync.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useInitSplashCacheSync.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useInitSplashCacheSync.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA2FH,KAAK,yBAAyB,GAAG;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAI,4CAIpC,yBAAyB;;;eAGT,KAAK,GAAG,IAAI;;;;;;;CAkE9B,CAAC"}
@@ -1,174 +0,0 @@
1
- /**
2
- * @author Naresh Dhamu
3
- * @lastModified Tue 29 Jul 2025 at 05:37 PM
4
- */
5
-
6
- import { useEffect, useState } from 'react';
7
- import RNFS from 'react-native-fs';
8
- import CryptoJS from 'crypto-js';
9
- import { MMKV } from 'react-native-mmkv';
10
- import { useSplashStore } from '../store/splashStore';
11
-
12
- const mmkvStorage = new MMKV();
13
- const inFlightDownloadsMap = new Map<string, Promise<string | null>>();
14
-
15
- const SUPPORTED_FILE_TYPES = [
16
- 'json',
17
- 'mp4',
18
- 'jpg',
19
- 'jpeg',
20
- 'png',
21
- 'webp',
22
- ] as const;
23
-
24
- const extractFileExtension = (url: string): string => {
25
- try {
26
- const cleanUrl = url.split('?')[0];
27
- const ext =
28
- cleanUrl?.substring(cleanUrl.lastIndexOf('.') + 1).toLowerCase() || '';
29
- return SUPPORTED_FILE_TYPES.includes(
30
- ext as (typeof SUPPORTED_FILE_TYPES)[number]
31
- )
32
- ? ext
33
- : 'png';
34
- } catch {
35
- return 'png';
36
- }
37
- };
38
-
39
- const cacheSplashAsset = async (
40
- url: string,
41
- extension: string,
42
- mmkvKey: string,
43
- forceDownload: boolean
44
- ): Promise<string | null> => {
45
- if (!url?.trim()) return null;
46
-
47
- const ext = extension.replace(/^\./, '').trim() || 'mp4';
48
- const hash = CryptoJS.MD5(`${url}|${mmkvKey}|${ext}`).toString();
49
- const localPath = `${RNFS?.CachesDirectoryPath}/splash_${hash}.${ext}`;
50
-
51
- if (inFlightDownloadsMap.has(hash)) {
52
- return inFlightDownloadsMap.get(hash)!;
53
- }
54
-
55
- const downloadTask = (async () => {
56
- try {
57
- const previousHash = mmkvStorage.getString(mmkvKey);
58
-
59
- if (previousHash && previousHash !== hash) {
60
- const oldPath = `${RNFS?.CachesDirectoryPath}/splash_${previousHash}.${ext}`;
61
- const exists = await RNFS?.exists(oldPath);
62
- if (exists) {
63
- await RNFS?.unlink(oldPath).catch(() => {});
64
- }
65
- }
66
-
67
- if (!forceDownload) {
68
- const exists = await RNFS?.exists(localPath);
69
- if (exists && previousHash === hash) {
70
- return localPath;
71
- }
72
- }
73
-
74
- const { statusCode } = await RNFS?.downloadFile({
75
- fromUrl: url,
76
- toFile: localPath,
77
- cacheable: true,
78
- readTimeout: 15000,
79
- connectionTimeout: 10000,
80
- }).promise;
81
-
82
- if (statusCode === 200) {
83
- mmkvStorage.set(mmkvKey, hash);
84
- return localPath;
85
- }
86
- } catch {}
87
-
88
- return null;
89
- })();
90
-
91
- inFlightDownloadsMap.set(hash, downloadTask);
92
- return downloadTask;
93
- };
94
-
95
- type UseSplashCacheSyncOptions = {
96
- logoUrl?: string;
97
- backgroundUrl?: string;
98
- forceDownload?: boolean;
99
- };
100
-
101
- export const useInitSplashCacheSync = ({
102
- logoUrl,
103
- backgroundUrl,
104
- forceDownload = false,
105
- }: UseSplashCacheSyncOptions) => {
106
- const [splashSyncState, setSplashSyncState] = useState({
107
- isReady: false,
108
- error: null as Error | null,
109
- });
110
-
111
- const setSplashLogoPath = useSplashStore((s) => s.setLogoPath);
112
- const setSplashBackgroundPath = useSplashStore((s) => s.setBackdropPath);
113
-
114
- useEffect(() => {
115
- let isMounted = true;
116
-
117
- const syncSplashAssets = async () => {
118
- try {
119
- const [logoPath, backgroundPath] = await Promise.all([
120
- logoUrl
121
- ? cacheSplashAsset(
122
- logoUrl,
123
- extractFileExtension(logoUrl),
124
- 'splash_logo',
125
- forceDownload
126
- )
127
- : Promise.resolve(null),
128
- backgroundUrl
129
- ? cacheSplashAsset(
130
- backgroundUrl,
131
- extractFileExtension(backgroundUrl),
132
- 'splash_background',
133
- forceDownload
134
- )
135
- : Promise.resolve(null),
136
- ]);
137
-
138
- if (!isMounted) return;
139
-
140
- if (logoPath) setSplashLogoPath?.(logoPath);
141
- if (backgroundPath) setSplashBackgroundPath?.(backgroundPath);
142
-
143
- setSplashSyncState({ isReady: true, error: null });
144
- } catch (err) {
145
- if (isMounted) {
146
- setSplashSyncState({ isReady: true, error: err as Error });
147
- }
148
- }
149
- };
150
-
151
- syncSplashAssets();
152
- return () => {
153
- isMounted = false;
154
- };
155
- }, [
156
- logoUrl,
157
- backgroundUrl,
158
- forceDownload,
159
- setSplashLogoPath,
160
- setSplashBackgroundPath,
161
- ]);
162
-
163
- const splashLogoLocalPath = useSplashStore((s) => s.logo.localPath);
164
- const splashBackgroundLocalPath = useSplashStore((s) => s.backdrop.localPath);
165
-
166
- return {
167
- state: splashSyncState,
168
- isLoading: !splashSyncState.isReady && !splashSyncState.error,
169
- data: {
170
- localPathLogo: splashLogoLocalPath,
171
- localPathBackground: splashBackgroundLocalPath,
172
- },
173
- };
174
- };