@applicaster/zapp-react-native-ui-components 14.0.0-rc.9 → 15.0.0-rc.1

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 (163) hide show
  1. package/Components/AnimatedInOut/index.tsx +5 -3
  2. package/Components/AudioPlayer/index.tsx +15 -0
  3. package/Components/AudioPlayer/mobile/Layout.tsx +66 -0
  4. package/Components/AudioPlayer/{__tests__/__snapshots__/audioPlayer.test.js.snap → mobile/__tests__/__snapshots__/audioPlayerMobileLayout.test.js.snap} +2 -2
  5. package/Components/AudioPlayer/mobile/__tests__/audioPlayerMobileLayout.test.js +18 -0
  6. package/Components/AudioPlayer/mobile/index.tsx +18 -0
  7. package/Components/AudioPlayer/{Artwork.tsx → tv/Artwork.tsx} +3 -2
  8. package/Components/AudioPlayer/{Channel.tsx → tv/Channel.tsx} +7 -7
  9. package/Components/AudioPlayer/tv/Layout.tsx +168 -0
  10. package/Components/AudioPlayer/{Runtime.tsx → tv/Runtime.tsx} +7 -1
  11. package/Components/AudioPlayer/{Summary.tsx → tv/Summary.tsx} +6 -2
  12. package/Components/AudioPlayer/{Title.tsx → tv/Title.tsx} +6 -2
  13. package/Components/AudioPlayer/{__tests__ → tv/__tests__}/__snapshots__/Runtime.test.js.snap +2 -2
  14. package/Components/AudioPlayer/tv/__tests__/__snapshots__/audioPlayer.test.js.snap +164 -0
  15. package/Components/AudioPlayer/tv/__tests__/__snapshots__/channel.test.js.snap +19 -0
  16. package/Components/AudioPlayer/{__tests__ → tv/__tests__}/__snapshots__/summary.test.js.snap +1 -2
  17. package/Components/AudioPlayer/{__tests__ → tv/__tests__}/__snapshots__/title.test.js.snap +1 -2
  18. package/Components/AudioPlayer/{__tests__ → tv/__tests__}/audioPlayer.test.js +7 -3
  19. package/Components/AudioPlayer/{helpers.tsx → tv/helpers.tsx} +11 -5
  20. package/Components/AudioPlayer/{AudioPlayer.tsx → tv/index.tsx} +17 -58
  21. package/Components/AudioPlayer/types.ts +40 -0
  22. package/Components/BaseFocusable/index.tsx +23 -12
  23. package/Components/Cell/Cell.tsx +91 -64
  24. package/Components/Cell/CellWithFocusable.tsx +3 -0
  25. package/Components/Cell/__tests__/CellWIthFocusable.test.js +3 -2
  26. package/Components/Cell/index.js +7 -3
  27. package/Components/ComponentResolver/index.ts +1 -1
  28. package/Components/FeedLoader/FeedLoader.tsx +7 -16
  29. package/Components/FeedLoader/FeedLoaderHOC.tsx +21 -0
  30. package/Components/FeedLoader/index.js +2 -8
  31. package/Components/Focusable/Focusable.tsx +12 -3
  32. package/Components/Focusable/FocusableTvOS.tsx +5 -5
  33. package/Components/Focusable/FocusableiOS.tsx +2 -2
  34. package/Components/Focusable/Touchable.tsx +5 -3
  35. package/Components/Focusable/__tests__/index.android.test.tsx +3 -0
  36. package/Components/Focusable/index.android.tsx +19 -11
  37. package/Components/Focusable/index.tsx +1 -1
  38. package/Components/FocusableGroup/FocusableTvOS.tsx +1 -1
  39. package/Components/FocusableList/FocusableItem.tsx +4 -3
  40. package/Components/FocusableList/FocusableListItemWrapper.tsx +2 -1
  41. package/Components/FocusableList/hooks/useCellState.android.ts +13 -3
  42. package/Components/FocusableList/index.tsx +20 -9
  43. package/Components/FreezeWithCallback/__tests__/index.test.tsx +67 -43
  44. package/Components/GeneralContentScreen/utils/__tests__/useCurationAPI.test.js +42 -59
  45. package/Components/GeneralContentScreen/utils/useCurationAPI.ts +13 -10
  46. package/Components/HandlePlayable/HandlePlayable.tsx +25 -9
  47. package/Components/HookRenderer/HookRenderer.tsx +5 -1
  48. package/Components/Layout/TV/LayoutBackground.tsx +1 -1
  49. package/Components/Layout/TV/__tests__/index.test.tsx +0 -1
  50. package/Components/MasterCell/DefaultComponents/ActionButton.tsx +6 -2
  51. package/Components/MasterCell/DefaultComponents/Button.tsx +1 -1
  52. package/Components/MasterCell/DefaultComponents/FocusableView/index.tsx +4 -39
  53. package/Components/MasterCell/DefaultComponents/Image/hoc/withDimensions.tsx +1 -1
  54. package/Components/MasterCell/DefaultComponents/ImageContainer/index.tsx +1 -1
  55. package/Components/MasterCell/DefaultComponents/SecondaryImage/Image.tsx +65 -17
  56. package/Components/MasterCell/DefaultComponents/SecondaryImage/__tests__/Image.test.tsx +21 -3
  57. package/Components/MasterCell/DefaultComponents/SecondaryImage/__tests__/__snapshots__/Image.test.tsx.snap +6 -3
  58. package/Components/MasterCell/DefaultComponents/Text/index.tsx +26 -6
  59. package/Components/MasterCell/DefaultComponents/__tests__/image.test.js +10 -10
  60. package/Components/MasterCell/DefaultComponents/__tests__/text.test.tsx +18 -18
  61. package/Components/MasterCell/SharedUI/CollapsibleTextContainer/__tests__/index.test.tsx +10 -10
  62. package/Components/MasterCell/elementMapper.tsx +1 -2
  63. package/Components/MasterCell/index.tsx +1 -1
  64. package/Components/MasterCell/utils/behaviorProvider.ts +82 -14
  65. package/Components/MasterCell/utils/index.ts +11 -5
  66. package/Components/OfflineHandler/NotificationView/__tests__/index.test.tsx +13 -18
  67. package/Components/OfflineHandler/__tests__/__snapshots__/index.test.tsx.snap +9 -0
  68. package/Components/OfflineHandler/__tests__/index.test.tsx +26 -35
  69. package/Components/PlayerContainer/ErrorDisplay/index.ts +1 -1
  70. package/Components/PlayerContainer/PlayerContainer.tsx +46 -33
  71. package/Components/PlayerContainer/ProgramInfo/index.tsx +1 -1
  72. package/Components/PlayerContainer/index.ts +1 -1
  73. package/Components/PlayerImageBackground/index.tsx +1 -1
  74. package/Components/River/ComponentsMap/ComponentsMap.tsx +0 -1
  75. package/Components/River/ComponentsMap/hooks/__tests__/useLoadingState.test.ts +378 -0
  76. package/Components/River/ComponentsMap/hooks/useLoadingState.ts +2 -2
  77. package/Components/River/RefreshControl.tsx +11 -17
  78. package/Components/River/RiverItem.tsx +3 -0
  79. package/Components/River/TV/River.tsx +2 -17
  80. package/Components/River/TV/index.tsx +3 -1
  81. package/Components/River/TV/withPipesV1DataLoader.tsx +43 -0
  82. package/Components/River/TV/withRiverDataLoader.tsx +17 -0
  83. package/Components/River/TV/withTVEventHandler.tsx +1 -1
  84. package/Components/River/__tests__/__snapshots__/componentsMap.test.js.snap +2 -0
  85. package/Components/River/__tests__/river.test.js +12 -26
  86. package/Components/River/index.tsx +1 -1
  87. package/Components/Screen/__tests__/Screen.test.tsx +28 -29
  88. package/Components/Screen/__tests__/navigationHandler.test.ts +133 -22
  89. package/Components/Screen/navigationHandler.ts +20 -2
  90. package/Components/ScreenResolver/index.tsx +15 -0
  91. package/Components/ScreenRevealManager/ScreenRevealManager.ts +76 -0
  92. package/Components/ScreenRevealManager/__tests__/ScreenRevealManager.test.ts +107 -0
  93. package/Components/ScreenRevealManager/__tests__/withScreenRevealManager.test.tsx +96 -0
  94. package/Components/ScreenRevealManager/index.ts +1 -0
  95. package/Components/ScreenRevealManager/withScreenRevealManager.tsx +79 -0
  96. package/Components/Tabs/TV/Tabs.android.tsx +1 -3
  97. package/Components/Tabs/Tabs.tsx +2 -3
  98. package/Components/TextInputTv/__tests__/__snapshots__/TextInputTv.test.js.snap +13 -0
  99. package/Components/TextInputTv/index.tsx +11 -0
  100. package/Components/Touchable/__tests__/__snapshots__/touchable.test.tsx.snap +34 -0
  101. package/Components/Touchable/__tests__/touchable.test.tsx +12 -17
  102. package/Components/Transitioner/__tests__/__snapshots__/Scene.test.js.snap +15 -9
  103. package/Components/VideoLive/animationUtils.ts +3 -3
  104. package/Components/VideoModal/ModalAnimation/AnimatedScrollModal.tsx +3 -9
  105. package/Components/VideoModal/ModalAnimation/AnimatedScrollModal.web.tsx +294 -0
  106. package/Components/VideoModal/ModalAnimation/AnimatedVideoPlayerComponent.web.tsx +93 -0
  107. package/Components/VideoModal/ModalAnimation/ModalAnimationContext.tsx +73 -29
  108. package/Components/VideoModal/PlayerDetails.tsx +24 -2
  109. package/Components/VideoModal/PlayerWrapper.tsx +26 -142
  110. package/Components/VideoModal/VideoModal.tsx +3 -17
  111. package/Components/VideoModal/__tests__/PlayerDetails.test.tsx +5 -5
  112. package/Components/VideoModal/__tests__/PlayerWrapper.test.tsx +1 -7
  113. package/Components/VideoModal/__tests__/__snapshots__/PlayerWrapper.test.tsx.snap +44 -240
  114. package/Components/VideoModal/hooks/__tests__/useDelayedPlayerDetails.test.ts +9 -1
  115. package/Components/VideoModal/hooks/index.ts +0 -2
  116. package/Components/VideoModal/hooks/useDelayedPlayerDetails.ts +40 -15
  117. package/Components/VideoModal/hooks/useModalSize.ts +18 -2
  118. package/Components/VideoModal/hooks/utils/__tests__/showDetails.test.ts +2 -2
  119. package/Components/VideoModal/hooks/utils/index.ts +4 -0
  120. package/Components/VideoModal/utils.ts +6 -0
  121. package/Components/Viewport/ViewportAware/__tests__/viewportAware.test.js +12 -16
  122. package/Components/Viewport/ViewportTracker/__tests__/viewportTracker.test.js +84 -24
  123. package/Components/Viewport/VisibilitySensor/VisibilitySensor.tsx +3 -3
  124. package/Components/default-cell-renderer/viewTrees/tv/DefaultCell/index.ts +3 -3
  125. package/Contexts/CellFocusedStateContext/index.tsx +27 -0
  126. package/Contexts/ConfigutaionContext/__tests__/ConfigurationProvider.test.tsx +3 -3
  127. package/Contexts/ScreenContext/index.tsx +46 -6
  128. package/Decorators/ConfigurationWrapper/__tests__/withConfigurationProvider.test.tsx +3 -3
  129. package/Decorators/ConfigurationWrapper/withConfigurationProvider.tsx +2 -2
  130. package/Decorators/RiverFeedLoader/__tests__/__snapshots__/riverFeedLoader.test.tsx.snap +221 -209
  131. package/Decorators/RiverFeedLoader/__tests__/riverFeedLoader.test.tsx +14 -16
  132. package/Decorators/RiverFeedLoader/__tests__/utils.test.ts +0 -20
  133. package/Decorators/RiverFeedLoader/index.tsx +22 -4
  134. package/Decorators/RiverFeedLoader/utils/index.ts +0 -18
  135. package/Decorators/RiverResolver/__tests__/riverResolver.test.tsx +3 -6
  136. package/Decorators/ZappPipesDataConnector/ResolverSelector.tsx +25 -0
  137. package/Decorators/ZappPipesDataConnector/__tests__/NullFeedResolver.test.tsx +78 -0
  138. package/Decorators/ZappPipesDataConnector/__tests__/ResolverSelector.test.tsx +205 -0
  139. package/Decorators/ZappPipesDataConnector/__tests__/StaticFeedResolver.test.tsx +251 -0
  140. package/Decorators/ZappPipesDataConnector/__tests__/UrlFeedResolver.test.tsx +368 -0
  141. package/Decorators/ZappPipesDataConnector/__tests__/utils.test.ts +39 -0
  142. package/Decorators/ZappPipesDataConnector/index.tsx +26 -293
  143. package/Decorators/ZappPipesDataConnector/resolvers/NullFeedResolver.tsx +25 -0
  144. package/Decorators/ZappPipesDataConnector/resolvers/StaticFeedResolver.tsx +87 -0
  145. package/Decorators/ZappPipesDataConnector/resolvers/UrlFeedResolver.tsx +266 -0
  146. package/Decorators/ZappPipesDataConnector/types.ts +29 -0
  147. package/Decorators/ZappPipesDataConnector/utils/mongoFilter.ts +738 -0
  148. package/Decorators/ZappPipesDataConnector/utils/useFilter.tsx +157 -0
  149. package/events/index.ts +3 -0
  150. package/package.json +5 -10
  151. package/Components/AudioPlayer/AudioPlayerLayout.tsx +0 -202
  152. package/Components/AudioPlayer/__tests__/__snapshots__/audioPlayerLayout.test.js.snap +0 -66
  153. package/Components/AudioPlayer/__tests__/__snapshots__/channel.test.js.snap +0 -28
  154. package/Components/AudioPlayer/__tests__/audioPlayerLayout.test.js +0 -26
  155. package/Components/AudioPlayer/index.ts +0 -1
  156. package/Components/River/__tests__/__snapshots__/river.test.js.snap +0 -27
  157. package/Components/VideoModal/hooks/useBackgroundColor.ts +0 -10
  158. /package/Components/AudioPlayer/{__tests__ → tv/__tests__}/Runtime.test.js +0 -0
  159. /package/Components/AudioPlayer/{__tests__ → tv/__tests__}/__snapshots__/artWork.test.js.snap +0 -0
  160. /package/Components/AudioPlayer/{__tests__ → tv/__tests__}/artWork.test.js +0 -0
  161. /package/Components/AudioPlayer/{__tests__ → tv/__tests__}/channel.test.js +0 -0
  162. /package/Components/AudioPlayer/{__tests__ → tv/__tests__}/summary.test.js +0 -0
  163. /package/Components/AudioPlayer/{__tests__ → tv/__tests__}/title.test.js +0 -0
@@ -0,0 +1,266 @@
1
+ /// <reference types="@applicaster/applicaster-types" />
2
+ /// <reference types="@applicaster/zapp-react-native-ui-components" />
3
+ import React, { useEffect, useMemo } from "react";
4
+ import * as R from "ramda";
5
+ import { Platform } from "react-native";
6
+ import Url from "url";
7
+ import { favoritesListener } from "@applicaster/zapp-react-native-bridge/Favorites";
8
+ import {
9
+ getInflatedDataSourceUrl,
10
+ getSearchContext,
11
+ useFeedLoader,
12
+ useFeedRefresh,
13
+ useRoute,
14
+ } from "@applicaster/zapp-react-native-utils/reactHooks";
15
+
16
+ import { ComponentDataSourceContext, ZappPipesDataProps } from "../types";
17
+ import { useScreenStateStore } from "@applicaster/zapp-react-native-utils/reactHooks/navigation/useScreenStateStore";
18
+ import { isVerticalListOrGrid } from "../utils";
19
+ import { useFilter } from "../utils/useFilter";
20
+ import { subscribeForKeyChanges } from "@applicaster/zapp-pipes-v2-client";
21
+
22
+ const FAVORITES_TYPE = "FAVOURITES";
23
+
24
+ function getDataSourceUrl({
25
+ component,
26
+ feedUrl,
27
+ screenData,
28
+ entryContext,
29
+ searchContext,
30
+ screenContext,
31
+ }): { dataSourceUrl: string | null; type: string | null } {
32
+ if (feedUrl) {
33
+ return { dataSourceUrl: feedUrl, type: null };
34
+ }
35
+
36
+ if (component.data) {
37
+ const {
38
+ data: { source, type, mapping },
39
+ } = component;
40
+
41
+ if (type === FAVORITES_TYPE) {
42
+ return { dataSourceUrl: source || FAVORITES_TYPE, type };
43
+ }
44
+
45
+ if (source) {
46
+ if (type === "APPLICASTER_COLLECTION" && !R.includes("://", source)) {
47
+ return {
48
+ dataSourceUrl: `applicaster://fetchData?type=${type}&collectionId=${source}`,
49
+ type,
50
+ };
51
+ }
52
+
53
+ if (type === "APPLICASTER_CATEGORY" && !R.includes("://", source)) {
54
+ return {
55
+ dataSourceUrl: `applicaster://fetchData?type=${type}&categoryId=${source}&platform=${Platform.OS}`,
56
+ type,
57
+ };
58
+ }
59
+
60
+ if (mapping) {
61
+ const contexts = {
62
+ entry: entryContext,
63
+ screen: screenContext || screenData,
64
+ search: getSearchContext(searchContext, mapping),
65
+ };
66
+
67
+ const dataSourceUrl = getInflatedDataSourceUrl({
68
+ source,
69
+ mapping,
70
+ contexts,
71
+ });
72
+
73
+ if (!dataSourceUrl) {
74
+ return { dataSourceUrl: null, type: null };
75
+ }
76
+
77
+ return { dataSourceUrl, type };
78
+ }
79
+
80
+ return { dataSourceUrl: source, type };
81
+ }
82
+ }
83
+
84
+ return { dataSourceUrl: null, type: null };
85
+ }
86
+
87
+ function getMethodAndParams(component) {
88
+ const method: "get" | "post" = R.pathOr("get", ["data", "method"], component);
89
+
90
+ const bodyParams: Record<string, unknown> = R.pathOr(
91
+ {},
92
+ ["data", "bodyParams"],
93
+ component
94
+ );
95
+
96
+ return {
97
+ method,
98
+ bodyParams,
99
+ };
100
+ }
101
+
102
+ function getListenerFromPlugin(
103
+ dataSourceUrl: string,
104
+ plugins: QuickBrickPlugin[]
105
+ ): AddDataSourceListener | void {
106
+ const url = Url.parse(dataSourceUrl, false);
107
+
108
+ const addListener = R.compose(
109
+ R.path(["module", "addDataSourceListener"]),
110
+ R.find(R.propEq("identifier", url.host))
111
+ )(plugins);
112
+
113
+ return addListener;
114
+ }
115
+
116
+ function applyItemLimit(zappPipesData, component) {
117
+ if (!zappPipesData || !zappPipesData.data) {
118
+ return zappPipesData;
119
+ }
120
+
121
+ const { data } = zappPipesData;
122
+
123
+ const {
124
+ rules: { item_limit },
125
+ } = component;
126
+
127
+ if (item_limit && data.entry && data.entry.length) {
128
+ return {
129
+ ...zappPipesData,
130
+ data: {
131
+ ...data,
132
+ entry: R.slice(
133
+ 0,
134
+ Math.min(Number(item_limit), R.length(data.entry)),
135
+ data.entry
136
+ ),
137
+ },
138
+ };
139
+ }
140
+
141
+ return zappPipesData;
142
+ }
143
+
144
+ type UrlFeedResolverProps = ComponentDataSourceContext & {
145
+ children: (dataProps: ZappPipesDataProps) => React.ReactNode;
146
+ };
147
+
148
+ export function UrlFeedResolver({
149
+ children,
150
+ component,
151
+ feedUrl,
152
+ isLast,
153
+ entryContext,
154
+ screenContext,
155
+ searchContext,
156
+ screenData,
157
+ plugins,
158
+ }: UrlFeedResolverProps) {
159
+ const { dataSourceUrl, type } = useMemo(
160
+ () =>
161
+ getDataSourceUrl({
162
+ component,
163
+ feedUrl,
164
+ screenData,
165
+ entryContext,
166
+ searchContext,
167
+ screenContext,
168
+ }),
169
+ [
170
+ component?.id,
171
+ feedUrl,
172
+ entryContext,
173
+ searchContext,
174
+ screenContext,
175
+ screenData?.id,
176
+ ]
177
+ );
178
+
179
+ const shouldClearCache = useMemo(
180
+ () => Boolean(component?.rules?.clear_cache_on_reload),
181
+ [component?.id]
182
+ );
183
+
184
+ const pipesOptions = useMemo(
185
+ () => ({
186
+ clearCache: type === FAVORITES_TYPE,
187
+ loadLocalFavorites: type === FAVORITES_TYPE,
188
+ silentRefresh: !shouldClearCache,
189
+ ...getMethodAndParams(component),
190
+ }),
191
+ [type, shouldClearCache, component]
192
+ );
193
+
194
+ const { reloadData, loadNext, error, loading, url, data } = useFeedLoader({
195
+ feedUrl: dataSourceUrl ?? "",
196
+ pipesOptions,
197
+ });
198
+
199
+ const { pathname } = useRoute();
200
+ const screenStateStore = useScreenStateStore();
201
+
202
+ // Setup listeners for data source URL
203
+ useEffect(() => {
204
+ if (!reloadData) {
205
+ return;
206
+ }
207
+
208
+ if (dataSourceUrl?.includes("pipesv2://")) {
209
+ (
210
+ getListenerFromPlugin(dataSourceUrl, plugins) as AddDataSourceListener
211
+ )?.(reloadData);
212
+ } else {
213
+ return subscribeForKeyChanges({
214
+ url: dataSourceUrl,
215
+ pathname,
216
+ screenStateStore,
217
+ callback: reloadData,
218
+ });
219
+ }
220
+ }, [dataSourceUrl, reloadData, pathname, screenStateStore]);
221
+
222
+ // Setup favorites listener
223
+ useEffect(() => {
224
+ if (type === FAVORITES_TYPE && reloadData) {
225
+ favoritesListener.on("FAVORITES_CHANGED", reloadData);
226
+
227
+ return () => {
228
+ favoritesListener.removeHandler("FAVORITES_CHANGED", reloadData);
229
+ };
230
+ }
231
+ }, [type, reloadData]);
232
+
233
+ // Apply feed refresh hook
234
+ useFeedRefresh({
235
+ reloadData,
236
+ component,
237
+ });
238
+
239
+ const loadNextData = useMemo(
240
+ () => (!isLast && isVerticalListOrGrid(component) ? undefined : loadNext),
241
+ [isLast, component, loadNext]
242
+ );
243
+
244
+ const applyItemFilter = useFilter({ url, loading, data, error }, component);
245
+
246
+ const zappPipesDataProps = useMemo(() => {
247
+ const pipeData = { url, loading, data, error };
248
+
249
+ return {
250
+ zappPipesData: applyItemLimit(applyItemFilter(pipeData), component),
251
+ reloadData,
252
+ loadNextData,
253
+ };
254
+ }, [
255
+ url,
256
+ loading,
257
+ data,
258
+ error,
259
+ component,
260
+ reloadData,
261
+ loadNextData,
262
+ applyItemFilter,
263
+ ]);
264
+
265
+ return <>{children(zappPipesDataProps)}</>;
266
+ }
@@ -0,0 +1,29 @@
1
+ import { ReloadDataFunction } from "@applicaster/zapp-react-native-utils/reactHooks/feed/useFeedLoader";
2
+
3
+ export type ZappPipesData = {
4
+ url: string;
5
+ loading: boolean;
6
+ data: ZappFeed;
7
+ error?: Error;
8
+ };
9
+
10
+ export type ComponentDataSourceContext = {
11
+ component: ZappUIComponent;
12
+ feedUrl?: string;
13
+ riverId: string;
14
+ getStaticComponentFeed?: GeneralContentScreenProps["getStaticComponentFeed"];
15
+ componentIndex?: number;
16
+ isScreenWrappedInContainer?: boolean;
17
+ isLast?: boolean;
18
+ entryContext?: Record<string, any>;
19
+ screenContext?: Record<string, any>;
20
+ searchContext?: string;
21
+ screenData?: any;
22
+ plugins?: QuickBrickPlugin[];
23
+ };
24
+
25
+ export type ZappPipesDataProps = {
26
+ zappPipesData: ZappPipesData;
27
+ reloadData?: ReloadDataFunction;
28
+ loadNextData?: () => void;
29
+ };