@zezosoft/zezo-ott-react-native-ui-kit 1.1.5 → 1.1.7
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.
- package/lib/module/components/Content/Card/Sliders/Styles/Three.js +5 -4
- package/lib/module/components/Content/Card/Sliders/Styles/Three.js.map +1 -1
- package/lib/module/components/Headers/Four.js +1 -1
- package/lib/module/components/Headers/Three.js +2 -1
- package/lib/module/components/Headers/Three.js.map +1 -1
- package/lib/typescript/src/components/Content/Card/Sliders/Styles/Three.d.ts.map +1 -1
- package/package.json +2 -14
- package/src/Styles/globalStyles.ts +0 -70
- package/src/assets/animations/135037-payment-processing-error.json +0 -1347
- package/src/assets/animations/7227-vui-animation.json +0 -3377
- package/src/assets/animations/Failed.json +0 -2103
- package/src/assets/animations/Pending.json +0 -522
- package/src/assets/animations/Successful.json +0 -2289
- package/src/assets/animations/heart.json +0 -788
- package/src/assets/animations/succesfull-payment.json +0 -2379
- package/src/assets/animations/voice-icon.json +0 -542
- package/src/assets/img/back.png +0 -0
- package/src/assets/img/bottom-panel.png +0 -0
- package/src/assets/img/camera.png +0 -0
- package/src/assets/img/camera2.png +0 -0
- package/src/assets/img/home.png +0 -0
- package/src/assets/img/lock.png +0 -0
- package/src/assets/img/play.png +0 -0
- package/src/assets/img/profile.jpg +0 -0
- package/src/assets/img/qr-code.png +0 -0
- package/src/assets/img/shadow.png +0 -0
- package/src/assets/img/shadow2.png +0 -0
- package/src/assets/img/user.png +0 -0
- package/src/assets/svg/Account.svg +0 -4
- package/src/assets/svg/Favourite.svg +0 -14
- package/src/assets/svg/Upcoming.svg +0 -4
- package/src/assets/svg/content-error.svg +0 -28
- package/src/assets/svg/download.svg +0 -3
- package/src/assets/svg/eye-off.svg +0 -10
- package/src/assets/svg/favorites.svg +0 -3
- package/src/assets/svg/h.svg +0 -4
- package/src/assets/svg/home.svg +0 -5
- package/src/assets/svg/home1.svg +0 -3
- package/src/assets/svg/menu-bar.svg +0 -4
- package/src/assets/svg/my-space.svg +0 -14
- package/src/assets/svg/play-icon-with-bg.svg +0 -5
- package/src/assets/svg/profile.svg +0 -4
- package/src/assets/svg/search.svg +0 -5
- package/src/assets/svg/search1.svg +0 -4
- package/src/assets/svg/server-error.svg +0 -139
- package/src/components/Account/Account.tsx +0 -367
- package/src/components/Account/index.ts +0 -1
- package/src/components/Alert/AlertDialog.tsx +0 -247
- package/src/components/Alert/UAAlert.tsx +0 -170
- package/src/components/Alert/index.ts +0 -2
- package/src/components/Auth/AuthProvider/AuthProvider.tsx +0 -419
- package/src/components/Auth/One/ForgotPassword/ForgotPassword.tsx +0 -324
- package/src/components/Auth/One/Login/LoginWithEmail.tsx +0 -455
- package/src/components/Auth/One/Login/LoginWithPhone.tsx +0 -306
- package/src/components/Auth/One/OTP/OTP.tsx +0 -465
- package/src/components/Auth/One/QrLogin/QrLogin.tsx +0 -602
- package/src/components/Auth/One/QrLogin/components/QrViewArea.tsx +0 -423
- package/src/components/Auth/One/SignUp/SignUp.tsx +0 -479
- package/src/components/Auth/One/SplashScreen/SplashScreen.tsx +0 -249
- package/src/components/Auth/One/SplashScreen/components/SplashImage/SplashImage.tsx +0 -103
- package/src/components/Auth/One/SplashScreen/components/SplashLottie/SplashLottie.tsx +0 -77
- package/src/components/Auth/One/SplashScreen/components/SplashVideo/SplashVideo.tsx +0 -174
- package/src/components/Auth/One/index.ts +0 -24
- package/src/components/Auth/Two/AuthHeader/AuthHeader.tsx +0 -108
- package/src/components/Auth/Two/ForgotPassword/ForgotPassword.tsx +0 -335
- package/src/components/Auth/Two/Login/AuthLoginShell.tsx +0 -173
- package/src/components/Auth/Two/Login/LoginWithEmail.tsx +0 -279
- package/src/components/Auth/Two/Login/LoginWithPhone.tsx +0 -188
- package/src/components/Auth/Two/OTP/OTP.tsx +0 -465
- package/src/components/Auth/Two/QrLogin/QrLogin.tsx +0 -602
- package/src/components/Auth/Two/QrLogin/components/QrViewArea.tsx +0 -423
- package/src/components/Auth/Two/SignUp/SignUp.tsx +0 -472
- package/src/components/Auth/Two/SplashScreen/SplashScreen.tsx +0 -248
- package/src/components/Auth/Two/SplashScreen/components/SplashImage/SplashImage.tsx +0 -92
- package/src/components/Auth/Two/SplashScreen/components/SplashLottie/SplashLottie.tsx +0 -77
- package/src/components/Auth/Two/SplashScreen/components/SplashVideo/SplashVideo.tsx +0 -178
- package/src/components/Auth/Two/index.ts +0 -28
- package/src/components/Auth/index.ts +0 -11
- package/src/components/BackgroundLayout/BackgroundLayout.tsx +0 -174
- package/src/components/BackgroundLayout/BackgroundLayoutOne.tsx +0 -56
- package/src/components/BlogView/BlogView.tsx +0 -276
- package/src/components/BlogView/index.ts +0 -8
- package/src/components/BlurView/BlurView.tsx +0 -199
- package/src/components/BlurView/index.ts +0 -7
- package/src/components/BottomSheet/BottomSheet.tsx +0 -200
- package/src/components/BottomSheet/BottomSheetOne.tsx +0 -220
- package/src/components/BottomSheet/index.ts +0 -4
- package/src/components/Button/BackBtn.tsx +0 -168
- package/src/components/Button/MenuBtn.tsx +0 -229
- package/src/components/Button/PrimaryBtn.tsx +0 -134
- package/src/components/Button/SecondaryBtn.tsx +0 -132
- package/src/components/Button/TextButton.tsx +0 -145
- package/src/components/Button/index.ts +0 -18
- package/src/components/Content/Card/Category/Category.tsx +0 -436
- package/src/components/Content/Card/Category/CategroyTwo.tsx +0 -429
- package/src/components/Content/Card/NowWatching/NowWatching.tsx +0 -624
- package/src/components/Content/Card/Sliders/Styles/One.tsx +0 -490
- package/src/components/Content/Card/Sliders/Styles/Three.tsx +0 -935
- package/src/components/Content/Card/Sliders/Styles/Two.tsx +0 -391
- package/src/components/Content/Card/Sliders/index.ts +0 -17
- package/src/components/Content/Card/Styles/Five.tsx +0 -385
- package/src/components/Content/Card/Styles/Four.tsx +0 -379
- package/src/components/Content/Card/Styles/One.tsx +0 -386
- package/src/components/Content/Card/Styles/RotateInOut.tsx +0 -413
- package/src/components/Content/Card/Styles/Six.tsx +0 -392
- package/src/components/Content/Card/Styles/Three.tsx +0 -314
- package/src/components/Content/Card/Styles/TopTen.tsx +0 -412
- package/src/components/Content/Card/Styles/Two.tsx +0 -416
- package/src/components/Content/Card/components/AdsPoster.tsx +0 -202
- package/src/components/Content/Card/components/CardPoster.tsx +0 -377
- package/src/components/Content/Card/components/NavigateToMore.tsx +0 -97
- package/src/components/Content/Card/components/RentOrBuyIcon.tsx +0 -129
- package/src/components/Content/Card/components/ShowAllButton.tsx +0 -92
- package/src/components/Content/Card/components/ThumbnailCard.tsx +0 -234
- package/src/components/Content/Card/components/index.ts +0 -1
- package/src/components/Content/Card/index.ts +0 -30
- package/src/components/Content/Content.tsx +0 -315
- package/src/components/Content/Sections.tsx +0 -238
- package/src/components/Content/types.ts +0 -176
- package/src/components/ContentView/MoreContentList.tsx +0 -327
- package/src/components/ContentView/One/ContentViewOne.tsx +0 -243
- package/src/components/ContentView/One/components/AboutSection.tsx +0 -216
- package/src/components/ContentView/One/components/CastCard.tsx +0 -265
- package/src/components/ContentView/One/components/EpisodeCard.tsx +0 -535
- package/src/components/ContentView/One/components/GenreTags.tsx +0 -132
- package/src/components/ContentView/One/components/HeroBanner.tsx +0 -357
- package/src/components/ContentView/One/components/MiniInfo.tsx +0 -356
- package/src/components/ContentView/One/components/PlayButton.tsx +0 -56
- package/src/components/ContentView/One/components/Title.tsx +0 -149
- package/src/components/ContentView/One/components/TrailerButton.tsx +0 -76
- package/src/components/ContentView/Two/ContentViewTwo.tsx +0 -343
- package/src/components/ContentView/Two/components/AboutSection.tsx +0 -216
- package/src/components/ContentView/Two/components/Details.tsx +0 -193
- package/src/components/ContentView/Two/components/EpisodeCard.tsx +0 -602
- package/src/components/ContentView/Two/components/GenreTags.tsx +0 -123
- package/src/components/ContentView/Two/components/HeroBanner.tsx +0 -402
- package/src/components/ContentView/Two/components/LikeShareActions.tsx +0 -125
- package/src/components/ContentView/Two/components/MoreLikeThisContentList .tsx +0 -305
- package/src/components/ContentView/Two/components/PlayOrTrailer.tsx +0 -133
- package/src/components/ContentView/Two/components/SectionTabs.tsx +0 -177
- package/src/components/ContentView/Two/components/Title.tsx +0 -226
- package/src/components/ContentView/Two/components/index.ts +0 -15
- package/src/components/ContentView/index.ts +0 -13
- package/src/components/Fallbacks/NoContentFallback.tsx +0 -176
- package/src/components/Fallbacks/NotFoundFallback.tsx +0 -94
- package/src/components/Fallbacks/index.ts +0 -2
- package/src/components/Headers/AppHeader.tsx +0 -150
- package/src/components/Headers/Four.tsx +0 -83
- package/src/components/Headers/One.tsx +0 -115
- package/src/components/Headers/Three.tsx +0 -135
- package/src/components/Headers/Two.tsx +0 -100
- package/src/components/Headers/index.ts +0 -18
- package/src/components/Input/Input.ts +0 -20
- package/src/components/Input/InputOne.tsx +0 -259
- package/src/components/Input/InputThree.tsx +0 -212
- package/src/components/Input/InputTwo.tsx +0 -212
- package/src/components/Input/PhoneNumberInput.tsx +0 -431
- package/src/components/Input/PhoneNumberInputTwo.tsx +0 -418
- package/src/components/Keyboard/HideKeyboard.tsx +0 -88
- package/src/components/Loader/Loader.tsx +0 -44
- package/src/components/Logo/Logo.tsx +0 -145
- package/src/components/NewRelease/NewReleaseSheet.tsx +0 -250
- package/src/components/NewRelease/index.ts +0 -1
- package/src/components/Reels/ReelsSeries/MediaControls/BottomControls.tsx +0 -221
- package/src/components/Reels/ReelsSeries/MediaControls/MediaControlsProvider.tsx +0 -314
- package/src/components/Reels/ReelsSeries/MediaControls/MiddleControls.tsx +0 -196
- package/src/components/Reels/ReelsSeries/MediaControls/RightControls.tsx +0 -95
- package/src/components/Reels/ReelsSeries/MediaControls/TopControls.tsx +0 -163
- package/src/components/Reels/ReelsSeries/Model/DetailsModal.tsx +0 -210
- package/src/components/Reels/ReelsSeries/Model/SettingModal.tsx +0 -146
- package/src/components/Reels/ReelsSeries/Model/UnlockModal.tsx +0 -154
- package/src/components/Reels/ReelsSeries/ReelsSeries.tsx +0 -264
- package/src/components/Reels/ReelsSeries/ReelsSeriesItem.tsx +0 -494
- package/src/components/Reels/ReelsSeries/components/AnimatedThreeLines.tsx +0 -184
- package/src/components/Reels/ReelsSeries/components/Episodes.tsx +0 -154
- package/src/components/Reels/ReelsSeries/components/GradientOverlay.tsx +0 -41
- package/src/components/Reels/ReelsSeries/components/Like.tsx +0 -40
- package/src/components/Reels/ReelsSeries/components/RotatingLoader.tsx +0 -79
- package/src/components/Reels/ReelsSeries/components/Synopsis.tsx +0 -332
- package/src/components/Reels/ReelsSeries/components/VideoControls/QualityControl.tsx +0 -187
- package/src/components/Reels/ReelsSeries/components/VideoControls/SpeedControl.tsx +0 -80
- package/src/components/Reels/ReelsSeries/components/VideoControls/index.ts +0 -2
- package/src/components/Reels/ReelsSeries/types.ts +0 -54
- package/src/components/Reels/ReelsSeries/useReelsWatchProgress.ts +0 -85
- package/src/components/Reels/ReelsSeries/utils/quality.ts +0 -48
- package/src/components/Reels/index.ts +0 -9
- package/src/components/Reels/utils/Controls/gestureUtils.ts +0 -42
- package/src/components/Reels/utils/Controls/index.ts +0 -4
- package/src/components/Reels/utils/Controls/overlayUtils.ts +0 -35
- package/src/components/Reels/utils/Controls/videoControlsConstants.ts +0 -25
- package/src/components/Reels/utils/Controls/videoRef.ts +0 -4
- package/src/components/Reels/utils/index.ts +0 -1
- package/src/components/Reels/utils/timeoutUtils.ts +0 -29
- package/src/components/Search/One.tsx +0 -256
- package/src/components/Search/components/RecentSearchesSection.tsx +0 -181
- package/src/components/Search/components/SearchCard.tsx +0 -275
- package/src/components/Search/index.ts +0 -16
- package/src/components/Settings/AppSettings.tsx +0 -428
- package/src/components/Settings/index.ts +0 -1
- package/src/components/Subscription/SubOne.tsx +0 -874
- package/src/components/Subscription/index.ts +0 -12
- package/src/components/TabBar/One.tsx +0 -148
- package/src/components/TabBar/Three.tsx +0 -169
- package/src/components/TabBar/Two.tsx +0 -189
- package/src/components/TabBar/index.ts +0 -20
- package/src/components/Text/Text.tsx +0 -85
- package/src/components/Text/index.ts +0 -5
- package/src/components/User/DeviceSessions/DeviceSessions.tsx +0 -468
- package/src/components/User/ProfileUpdate/ProfileUpdate.tsx +0 -278
- package/src/components/User/PurchaseHistory/PurchaseHistory.tsx +0 -494
- package/src/components/User/WatchHistory/WatchHistory.tsx +0 -227
- package/src/components/User/WatchLater/WatchLater.tsx +0 -397
- package/src/components/User/components/UserAvatar.tsx +0 -120
- package/src/components/User/components/UserSection.tsx +0 -228
- package/src/components/User/index.ts +0 -18
- package/src/components/View/View.tsx +0 -37
- package/src/components/View/index.ts +0 -5
- package/src/components/common/AppStatusBar.tsx +0 -57
- package/src/components/index.ts +0 -29
- package/src/components/layout/SafeAreaWrapper.tsx +0 -45
- package/src/components/layout/index.ts +0 -1
- package/src/constants/dummySections.ts +0 -98
- package/src/hooks/Images/index.ts +0 -2
- package/src/hooks/Images/useImageLoader.ts +0 -206
- package/src/hooks/Images/useImageValidation.ts +0 -36
- package/src/hooks/index.ts +0 -17
- package/src/hooks/useAdTracking.ts +0 -349
- package/src/hooks/useCards.ts +0 -228
- package/src/hooks/useDebounce.ts +0 -35
- package/src/hooks/useKeyboard.ts +0 -43
- package/src/hooks/useNavigationMode.ts +0 -46
- package/src/hooks/usePaginatedSection.ts +0 -101
- package/src/hooks/usePrevious.ts +0 -28
- package/src/hooks/useSafeCallback.ts +0 -43
- package/src/hooks/useSkeletonItems.ts +0 -30
- package/src/hooks/useSplashCache.ts +0 -186
- package/src/hooks/useThemeColors.ts +0 -51
- package/src/index.tsx +0 -8
- package/src/store/RecentSearchesStore.ts +0 -78
- package/src/store/splashStore.ts +0 -91
- package/src/store/themeStore.ts +0 -43
- package/src/theme/ThemeProvider.tsx +0 -112
- package/src/theme/hook/index.ts +0 -1
- package/src/theme/hook/useInternalTheme.ts +0 -98
- package/src/theme/index.ts +0 -7
- package/src/theme/themes.ts +0 -336
- package/src/theme/utils/validateColor.ts +0 -127
- package/src/types/content/content-view.types.ts +0 -206
- package/src/types/hook/index.ts +0 -5
- package/src/types/hook/usePaginatedSetion.ts +0 -19
- package/src/types/index.ts +0 -7
- package/src/types/sections/index.ts +0 -84
- package/src/utils/Display.ts +0 -14
- package/src/utils/Formater.ts +0 -14
- package/src/utils/PlatformSelector.ts +0 -29
- package/src/utils/SizeMatters.ts +0 -7
- package/src/utils/Spacing.ts +0 -27
- package/src/utils/colorUtils.ts +0 -70
package/src/hooks/useCards.ts
DELETED
|
@@ -1,228 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Global Card Hook (No duplicates + single data key)
|
|
3
|
-
*
|
|
4
|
-
* Provides a unified interface for managing card data with:
|
|
5
|
-
* - Automatic deduplication
|
|
6
|
-
* - Skeleton loading states
|
|
7
|
-
* - Pagination support
|
|
8
|
-
* - Optimized performance
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import { useMemo, useCallback } from 'react';
|
|
12
|
-
import type { IContentData } from '@zezosoft/zezo-ott-api-client';
|
|
13
|
-
import { usePaginatedSection } from './usePaginatedSection';
|
|
14
|
-
import type { IAdItem, MoreFetchData } from '../types';
|
|
15
|
-
import { dummyContentData } from '../constants/dummySections';
|
|
16
|
-
|
|
17
|
-
export type CardSource =
|
|
18
|
-
| { data: (IContentData | IAdItem)[] }
|
|
19
|
-
| (IContentData | IAdItem)[]
|
|
20
|
-
| null;
|
|
21
|
-
|
|
22
|
-
export type UseCardsOptions = {
|
|
23
|
-
sectionId: string;
|
|
24
|
-
data?: CardSource;
|
|
25
|
-
fetchMore?: MoreFetchData<IContentData>;
|
|
26
|
-
loading?: boolean;
|
|
27
|
-
initialSkeleton?: number;
|
|
28
|
-
pagingSkeleton?: number;
|
|
29
|
-
adsRender?: boolean; // If false, ads will be filtered out from listData
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
export type UseCardsReturn = {
|
|
33
|
-
listData: (IContentData | IAdItem)[]; // ✔ Mixed array of content and ads
|
|
34
|
-
pagination: {
|
|
35
|
-
hasNextPage: boolean;
|
|
36
|
-
nextPage: number | null;
|
|
37
|
-
} | null;
|
|
38
|
-
isPaging: boolean;
|
|
39
|
-
hasMore: boolean;
|
|
40
|
-
loadMore: (page: number | null) => Promise<void>;
|
|
41
|
-
isEmpty: boolean;
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
// -----------------------------------------------------------
|
|
45
|
-
// Constants
|
|
46
|
-
// -----------------------------------------------------------
|
|
47
|
-
|
|
48
|
-
const DEFAULT_INITIAL_SKELETON = 5;
|
|
49
|
-
const DEFAULT_PAGING_SKELETON = 3;
|
|
50
|
-
|
|
51
|
-
// -----------------------------------------------------------
|
|
52
|
-
// Helpers
|
|
53
|
-
// -----------------------------------------------------------
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Normalizes different data source formats into a single array
|
|
57
|
-
*/
|
|
58
|
-
const normalize = (src: CardSource): (IContentData | IAdItem)[] => {
|
|
59
|
-
if (!src) return [];
|
|
60
|
-
if (Array.isArray(src)) return src;
|
|
61
|
-
return src.data ?? [];
|
|
62
|
-
};
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* Removes duplicate items by _id using Map for O(n) performance
|
|
66
|
-
* Preserves order of first occurrence
|
|
67
|
-
* Handles both IContentData and IAdItem types
|
|
68
|
-
*/
|
|
69
|
-
const uniqueById = (
|
|
70
|
-
list: (IContentData | IAdItem)[]
|
|
71
|
-
): (IContentData | IAdItem)[] => {
|
|
72
|
-
if (list.length === 0) return [];
|
|
73
|
-
|
|
74
|
-
const seen = new Map<string, IContentData | IAdItem>();
|
|
75
|
-
const result: (IContentData | IAdItem)[] = [];
|
|
76
|
-
|
|
77
|
-
for (const item of list) {
|
|
78
|
-
// Handle ads - check for type property and use appropriate ID field
|
|
79
|
-
if ('type' in item && item.type === 'ads') {
|
|
80
|
-
const adItem = item as IAdItem;
|
|
81
|
-
// Ads might have _id (from IServeAd) or use mediaUrl as identifier
|
|
82
|
-
let id: string;
|
|
83
|
-
if ('_id' in adItem && adItem._id) {
|
|
84
|
-
id = String(adItem._id);
|
|
85
|
-
} else if ('mediaUrl' in adItem && adItem.mediaUrl) {
|
|
86
|
-
id = `ad-${adItem.mediaUrl}`;
|
|
87
|
-
} else {
|
|
88
|
-
id = `ad-${Math.random()}`;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
if (!seen.has(id)) {
|
|
92
|
-
seen.set(id, adItem);
|
|
93
|
-
result.push(adItem);
|
|
94
|
-
}
|
|
95
|
-
continue;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
// Handle content items
|
|
99
|
-
const contentItem = item as IContentData;
|
|
100
|
-
if (!contentItem?._id) continue; // Skip items without valid IDs
|
|
101
|
-
|
|
102
|
-
const id = String(contentItem._id);
|
|
103
|
-
if (!seen.has(id)) {
|
|
104
|
-
seen.set(id, contentItem);
|
|
105
|
-
result.push(contentItem);
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
return result;
|
|
110
|
-
};
|
|
111
|
-
|
|
112
|
-
/**
|
|
113
|
-
* Creates skeleton items for loading states
|
|
114
|
-
* Memoized by count to avoid unnecessary recreations
|
|
115
|
-
* Returns IContentData[] for skeleton loading (ads don't need skeletons)
|
|
116
|
-
*/
|
|
117
|
-
const createSkeletonItems = (count: number, prefix: string): IContentData[] => {
|
|
118
|
-
if (count <= 0) return [];
|
|
119
|
-
return Array.from({ length: count }, (_, i) =>
|
|
120
|
-
dummyContentData(`${prefix}-${i}`)
|
|
121
|
-
);
|
|
122
|
-
};
|
|
123
|
-
|
|
124
|
-
// -----------------------------------------------------------
|
|
125
|
-
// Hook
|
|
126
|
-
// -----------------------------------------------------------
|
|
127
|
-
|
|
128
|
-
export function useCards({
|
|
129
|
-
sectionId,
|
|
130
|
-
data,
|
|
131
|
-
fetchMore,
|
|
132
|
-
loading = false,
|
|
133
|
-
initialSkeleton = DEFAULT_INITIAL_SKELETON,
|
|
134
|
-
pagingSkeleton = DEFAULT_PAGING_SKELETON,
|
|
135
|
-
adsRender = false,
|
|
136
|
-
}: UseCardsOptions): UseCardsReturn {
|
|
137
|
-
// Normalize input data
|
|
138
|
-
const baseItems = useMemo(() => normalize(data ?? { data: [] }), [data]);
|
|
139
|
-
|
|
140
|
-
// Use pagination hook for data management
|
|
141
|
-
const {
|
|
142
|
-
data: list,
|
|
143
|
-
pagination,
|
|
144
|
-
loadMoreData,
|
|
145
|
-
isPaginating,
|
|
146
|
-
hasMore,
|
|
147
|
-
} = usePaginatedSection<IContentData | IAdItem>(
|
|
148
|
-
sectionId,
|
|
149
|
-
fetchMore,
|
|
150
|
-
baseItems,
|
|
151
|
-
loading
|
|
152
|
-
);
|
|
153
|
-
|
|
154
|
-
// Apply deduplication to the list (handles both content and ads)
|
|
155
|
-
const uniqueList = useMemo(
|
|
156
|
-
() => uniqueById(list as (IContentData | IAdItem)[]),
|
|
157
|
-
[list]
|
|
158
|
-
);
|
|
159
|
-
|
|
160
|
-
// Memoize skeleton items - only recreate when count changes
|
|
161
|
-
const initialSkeletonItems = useMemo(
|
|
162
|
-
() => createSkeletonItems(initialSkeleton, 'sk'),
|
|
163
|
-
[initialSkeleton]
|
|
164
|
-
);
|
|
165
|
-
|
|
166
|
-
const pagingSkeletonItems = useMemo(
|
|
167
|
-
() => createSkeletonItems(pagingSkeleton, 'pagination-skeleton'),
|
|
168
|
-
[pagingSkeleton]
|
|
169
|
-
);
|
|
170
|
-
|
|
171
|
-
// Filter ads if adsRender is false
|
|
172
|
-
const filteredList = useMemo(() => {
|
|
173
|
-
if (adsRender) return uniqueList;
|
|
174
|
-
return uniqueList.filter(
|
|
175
|
-
(item): item is IContentData => item.type !== 'ads'
|
|
176
|
-
);
|
|
177
|
-
}, [uniqueList, adsRender]);
|
|
178
|
-
|
|
179
|
-
// Final data array for UI rendering
|
|
180
|
-
// Handles loading states and pagination skeletons
|
|
181
|
-
// Returns mixed array of IContentData | IAdItem (or only IContentData if adsRender is false)
|
|
182
|
-
const items = useMemo(() => {
|
|
183
|
-
// Show initial skeleton during initial load
|
|
184
|
-
if (loading) return initialSkeletonItems as (IContentData | IAdItem)[];
|
|
185
|
-
|
|
186
|
-
// Show data with pagination skeleton when loading more
|
|
187
|
-
if (isPaginating && filteredList.length > 0) {
|
|
188
|
-
return [
|
|
189
|
-
...filteredList,
|
|
190
|
-
...(pagingSkeletonItems as (IContentData | IAdItem)[]),
|
|
191
|
-
];
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
// Return filtered list (with or without ads based on adsRender)
|
|
195
|
-
return filteredList;
|
|
196
|
-
}, [
|
|
197
|
-
loading,
|
|
198
|
-
isPaginating,
|
|
199
|
-
filteredList,
|
|
200
|
-
initialSkeletonItems,
|
|
201
|
-
pagingSkeletonItems,
|
|
202
|
-
]);
|
|
203
|
-
|
|
204
|
-
// Determine if section is empty (only when not loading and no data)
|
|
205
|
-
const isEmpty = useMemo(
|
|
206
|
-
() => !loading && filteredList.length === 0,
|
|
207
|
-
[loading, filteredList.length]
|
|
208
|
-
);
|
|
209
|
-
|
|
210
|
-
// Memoize loadMore callback to prevent unnecessary re-renders
|
|
211
|
-
const handleLoadMore = useCallback(
|
|
212
|
-
async (page: number | null) => {
|
|
213
|
-
if (page && hasMore && !isPaginating) {
|
|
214
|
-
await loadMoreData(page);
|
|
215
|
-
}
|
|
216
|
-
},
|
|
217
|
-
[loadMoreData, hasMore, isPaginating]
|
|
218
|
-
);
|
|
219
|
-
|
|
220
|
-
return {
|
|
221
|
-
listData: items,
|
|
222
|
-
pagination,
|
|
223
|
-
isPaging: isPaginating,
|
|
224
|
-
hasMore,
|
|
225
|
-
loadMore: handleLoadMore,
|
|
226
|
-
isEmpty,
|
|
227
|
-
};
|
|
228
|
-
}
|
package/src/hooks/useDebounce.ts
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { useCallback, useRef, useEffect } from 'react';
|
|
2
|
-
|
|
3
|
-
export const useDebounce = (
|
|
4
|
-
callback: (value: string) => void,
|
|
5
|
-
delay: number
|
|
6
|
-
) => {
|
|
7
|
-
const timeoutRef = useRef<NodeJS.Timeout | null>(null);
|
|
8
|
-
const callbackRef = useRef(callback);
|
|
9
|
-
|
|
10
|
-
// Update callback ref when it changes
|
|
11
|
-
useEffect(() => {
|
|
12
|
-
callbackRef.current = callback;
|
|
13
|
-
}, [callback]);
|
|
14
|
-
|
|
15
|
-
// Cleanup on unmount
|
|
16
|
-
useEffect(() => {
|
|
17
|
-
return () => {
|
|
18
|
-
if (timeoutRef.current) {
|
|
19
|
-
clearTimeout(timeoutRef.current);
|
|
20
|
-
}
|
|
21
|
-
};
|
|
22
|
-
}, []);
|
|
23
|
-
|
|
24
|
-
return useCallback(
|
|
25
|
-
(value: string) => {
|
|
26
|
-
if (timeoutRef.current) {
|
|
27
|
-
clearTimeout(timeoutRef.current);
|
|
28
|
-
}
|
|
29
|
-
timeoutRef.current = setTimeout(() => {
|
|
30
|
-
callbackRef.current(value);
|
|
31
|
-
}, delay);
|
|
32
|
-
},
|
|
33
|
-
[delay]
|
|
34
|
-
);
|
|
35
|
-
};
|
package/src/hooks/useKeyboard.ts
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @author Naresh Dhamu
|
|
3
|
-
* @lastModified Sat 14 Jun 2025 at 03:01 PM
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { useEffect, useState, useCallback, useMemo } from 'react';
|
|
7
|
-
import { Keyboard, Platform } from 'react-native';
|
|
8
|
-
|
|
9
|
-
export const useKeyboard = () => {
|
|
10
|
-
const [isKeyboardOpen, setKeyboardOpen] = useState(false);
|
|
11
|
-
|
|
12
|
-
useEffect(() => {
|
|
13
|
-
const showEvent =
|
|
14
|
-
Platform.OS === 'ios' ? 'keyboardWillShow' : 'keyboardDidShow';
|
|
15
|
-
const hideEvent =
|
|
16
|
-
Platform.OS === 'ios' ? 'keyboardWillHide' : 'keyboardDidHide';
|
|
17
|
-
|
|
18
|
-
const showListener = Keyboard.addListener(showEvent, () => {
|
|
19
|
-
setKeyboardOpen(true);
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
const hideListener = Keyboard.addListener(hideEvent, () => {
|
|
23
|
-
setKeyboardOpen(false);
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
return () => {
|
|
27
|
-
showListener.remove();
|
|
28
|
-
hideListener.remove();
|
|
29
|
-
};
|
|
30
|
-
}, []);
|
|
31
|
-
|
|
32
|
-
const hideKeyboard = useCallback(() => {
|
|
33
|
-
Keyboard.dismiss();
|
|
34
|
-
}, []);
|
|
35
|
-
|
|
36
|
-
return useMemo(
|
|
37
|
-
() => ({
|
|
38
|
-
isKeyboardOpen,
|
|
39
|
-
hideKeyboard,
|
|
40
|
-
}),
|
|
41
|
-
[isKeyboardOpen, hideKeyboard]
|
|
42
|
-
);
|
|
43
|
-
};
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @author Naresh Dhamu
|
|
3
|
-
* @lastModified Thu 06 Nov 2025 at 11:52 AM
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { useEffect, useState, useMemo } from 'react';
|
|
7
|
-
import NavigationMode from 'react-native-navigation-mode';
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Hook to detect Android navigation mode
|
|
11
|
-
* @returns {Object} Navigation mode info
|
|
12
|
-
* @returns {boolean} isThreeButtonNav - true if using three-button navigation
|
|
13
|
-
* @returns {boolean} isGestureNav - true if using gesture navigation
|
|
14
|
-
*/
|
|
15
|
-
export const useNavigationMode = () => {
|
|
16
|
-
const [isThreeButtonNav, setIsThreeButtonNav] = useState(false);
|
|
17
|
-
|
|
18
|
-
useEffect(() => {
|
|
19
|
-
let mounted = true;
|
|
20
|
-
|
|
21
|
-
(async () => {
|
|
22
|
-
try {
|
|
23
|
-
const navMode = (await NavigationMode.getNavigationMode()) as any;
|
|
24
|
-
const isThreeButton =
|
|
25
|
-
navMode?.navigationMode === 'THREE_BUTTON' ||
|
|
26
|
-
navMode?.mode === 'THREE_BUTTON';
|
|
27
|
-
if (mounted) {
|
|
28
|
-
setIsThreeButtonNav(isThreeButton);
|
|
29
|
-
}
|
|
30
|
-
} catch (err) {
|
|
31
|
-
console.log('Navigation mode detect error:', err);
|
|
32
|
-
}
|
|
33
|
-
})();
|
|
34
|
-
|
|
35
|
-
return () => {
|
|
36
|
-
mounted = false;
|
|
37
|
-
};
|
|
38
|
-
}, []);
|
|
39
|
-
|
|
40
|
-
return useMemo(
|
|
41
|
-
() => ({
|
|
42
|
-
isGestureNav: !isThreeButtonNav,
|
|
43
|
-
}),
|
|
44
|
-
[isThreeButtonNav]
|
|
45
|
-
);
|
|
46
|
-
};
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @author Naresh Dhamu
|
|
3
|
-
* @lastModified Wed 25 Jun 2025 at 12:00 PM
|
|
4
|
-
*/
|
|
5
|
-
import React, { useCallback, useState } from 'react';
|
|
6
|
-
import type { ISectionMeta } from '../types';
|
|
7
|
-
|
|
8
|
-
export type MoreFetchData<T> = ({
|
|
9
|
-
sectionId,
|
|
10
|
-
meta,
|
|
11
|
-
}: {
|
|
12
|
-
sectionId: string;
|
|
13
|
-
meta: {
|
|
14
|
-
hasNextPage: boolean;
|
|
15
|
-
nextPage: number;
|
|
16
|
-
};
|
|
17
|
-
}) => Promise<{
|
|
18
|
-
data: T[];
|
|
19
|
-
meta: ISectionMeta;
|
|
20
|
-
} | null>;
|
|
21
|
-
|
|
22
|
-
export function usePaginatedSection<T>(
|
|
23
|
-
sectionId: string,
|
|
24
|
-
fetchFn?: MoreFetchData<T>,
|
|
25
|
-
initialData: T[] = [],
|
|
26
|
-
isLoading?: boolean
|
|
27
|
-
) {
|
|
28
|
-
const [data, setData] = useState<T[]>(initialData);
|
|
29
|
-
const [pagination, setPagination] = useState<{
|
|
30
|
-
hasNextPage: boolean;
|
|
31
|
-
nextPage: number | null;
|
|
32
|
-
}>({
|
|
33
|
-
hasNextPage: true,
|
|
34
|
-
nextPage: 2,
|
|
35
|
-
});
|
|
36
|
-
const [isPaginating, setIsPaginating] = useState(false);
|
|
37
|
-
|
|
38
|
-
// Sync initial data on mount or loading complete
|
|
39
|
-
React.useEffect(() => {
|
|
40
|
-
if (!isLoading && initialData.length) {
|
|
41
|
-
setData(initialData);
|
|
42
|
-
}
|
|
43
|
-
}, [isLoading, initialData.length, initialData]);
|
|
44
|
-
|
|
45
|
-
const loadMoreData = useCallback(
|
|
46
|
-
async (page: number | null) => {
|
|
47
|
-
if (!page || isPaginating || !pagination.hasNextPage || !fetchFn) return;
|
|
48
|
-
|
|
49
|
-
setIsPaginating(true);
|
|
50
|
-
try {
|
|
51
|
-
const res = await fetchFn({
|
|
52
|
-
sectionId,
|
|
53
|
-
meta: {
|
|
54
|
-
hasNextPage: pagination.hasNextPage,
|
|
55
|
-
nextPage: page,
|
|
56
|
-
},
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
if (!res || !res.data || !res.meta?.pagination) {
|
|
60
|
-
console.warn(`⚠️ Invalid response for section: ${sectionId}`, res);
|
|
61
|
-
// Stop further pagination attempts for this section
|
|
62
|
-
setPagination({
|
|
63
|
-
hasNextPage: false,
|
|
64
|
-
nextPage: null,
|
|
65
|
-
});
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
const { hasNextPage, nextPage } = res.meta.pagination;
|
|
70
|
-
|
|
71
|
-
setData((prev) => {
|
|
72
|
-
const existingIds = new Set(
|
|
73
|
-
(prev as any[]).map((item: any) => item._id)
|
|
74
|
-
);
|
|
75
|
-
const newItems = res.data.filter(
|
|
76
|
-
(item: any) => !existingIds.has(item._id)
|
|
77
|
-
);
|
|
78
|
-
return [...prev, ...newItems];
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
setPagination({
|
|
82
|
-
hasNextPage,
|
|
83
|
-
nextPage,
|
|
84
|
-
});
|
|
85
|
-
} catch (err) {
|
|
86
|
-
console.error(`❌ Error loading section [${sectionId}]:`, err);
|
|
87
|
-
} finally {
|
|
88
|
-
setIsPaginating(false);
|
|
89
|
-
}
|
|
90
|
-
},
|
|
91
|
-
[isPaginating, pagination.hasNextPage, fetchFn, sectionId]
|
|
92
|
-
);
|
|
93
|
-
|
|
94
|
-
return {
|
|
95
|
-
data,
|
|
96
|
-
pagination,
|
|
97
|
-
isPaginating,
|
|
98
|
-
hasMore: pagination.hasNextPage,
|
|
99
|
-
loadMoreData,
|
|
100
|
-
};
|
|
101
|
-
}
|
package/src/hooks/usePrevious.ts
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @author Naresh Dhamu
|
|
3
|
-
* @lastModified Optimized for performance
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { useRef } from 'react';
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Hook to get the previous value of a prop or state
|
|
10
|
-
* Optimized to avoid useEffect overhead
|
|
11
|
-
* @param value - The value to track
|
|
12
|
-
* @returns The previous value
|
|
13
|
-
*/
|
|
14
|
-
export function usePrevious<T>(value: T): T | undefined {
|
|
15
|
-
const ref = useRef<{ value: T; previous: T | undefined }>({
|
|
16
|
-
value,
|
|
17
|
-
previous: undefined,
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
// Update ref synchronously during render
|
|
21
|
-
const current = ref.current;
|
|
22
|
-
if (current.value !== value) {
|
|
23
|
-
current.previous = current.value;
|
|
24
|
-
current.value = value;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
return current.previous;
|
|
28
|
-
}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @author Naresh Dhamu
|
|
3
|
-
* @lastModified Optimized for performance
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { useCallback } from 'react';
|
|
7
|
-
import type { GestureResponderEvent } from 'react-native';
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Creates a safe callback that checks if the function exists before calling
|
|
11
|
-
* Prevents unnecessary re-renders by memoizing the callback
|
|
12
|
-
*/
|
|
13
|
-
export function useSafeCallback<T extends (...args: any[]) => any>(
|
|
14
|
-
callback: T | undefined,
|
|
15
|
-
deps: React.DependencyList = []
|
|
16
|
-
): T {
|
|
17
|
-
return useCallback(
|
|
18
|
-
(...args: Parameters<T>) => {
|
|
19
|
-
callback?.(...args);
|
|
20
|
-
},
|
|
21
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
22
|
-
[callback, ...deps]
|
|
23
|
-
) as T;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Creates a safe press handler that checks disabled state
|
|
28
|
-
*/
|
|
29
|
-
export function useSafePressHandler(
|
|
30
|
-
onPress: ((event: GestureResponderEvent) => void) | undefined,
|
|
31
|
-
disabled: boolean = false,
|
|
32
|
-
deps: React.DependencyList = []
|
|
33
|
-
) {
|
|
34
|
-
return useCallback(
|
|
35
|
-
(event: GestureResponderEvent) => {
|
|
36
|
-
if (!disabled && onPress) {
|
|
37
|
-
onPress(event);
|
|
38
|
-
}
|
|
39
|
-
},
|
|
40
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
41
|
-
[disabled, onPress, ...deps]
|
|
42
|
-
);
|
|
43
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @author Naresh Dhamu
|
|
3
|
-
* @lastModified Optimized for performance
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { useMemo, useRef } from 'react';
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Hook to create skeleton items array
|
|
10
|
-
* Memoized to prevent unnecessary recreations
|
|
11
|
-
* Generator function is stored in ref to avoid dependency issues
|
|
12
|
-
*/
|
|
13
|
-
export function useSkeletonItems<T = any>(
|
|
14
|
-
count: number,
|
|
15
|
-
generator?: (index: number) => T
|
|
16
|
-
): T[] {
|
|
17
|
-
const generatorRef = useRef(generator);
|
|
18
|
-
generatorRef.current = generator;
|
|
19
|
-
|
|
20
|
-
return useMemo(() => {
|
|
21
|
-
if (count <= 0) return [];
|
|
22
|
-
if (generatorRef.current) {
|
|
23
|
-
return Array.from({ length: count }, (_, i) => generatorRef.current!(i));
|
|
24
|
-
}
|
|
25
|
-
return Array.from({ length: count }, (_, i) => ({
|
|
26
|
-
_id: `skeleton-${i}`,
|
|
27
|
-
isSkeleton: true,
|
|
28
|
-
})) as T[];
|
|
29
|
-
}, [count]);
|
|
30
|
-
}
|