@applicaster/zapp-react-native-ui-components 16.0.0-rc.6 → 16.0.0-rc.61

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 (129) hide show
  1. package/Components/AudioPlayer/tv/__tests__/audioPlayer.test.js +19 -0
  2. package/Components/AudioPlayer/tv/__tests__/index.test.tsx +120 -0
  3. package/Components/AudioPlayer/tv/index.tsx +5 -1
  4. package/Components/BackgroundImage/BackgroundImage.android.tv.tsx +28 -0
  5. package/Components/BackgroundImage/BackgroundImage.ios.tv.tsx +24 -0
  6. package/Components/BackgroundImage/BackgroundImage.tsx +42 -0
  7. package/Components/BackgroundImage/index.ts +1 -0
  8. package/Components/CellRendererResolver/index.ts +2 -2
  9. package/Components/ComponentResolver/__tests__/componentResolver.test.js +1 -1
  10. package/Components/FocusableGroup/FocusableTvOS.tsx +11 -7
  11. package/Components/GeneralContentScreen/GeneralContentScreenHookAdapter.tsx +39 -0
  12. package/Components/GeneralContentScreen/__tests__/GeneralContentScreenHookAdapter.test.tsx +64 -0
  13. package/Components/GeneralContentScreen/__tests__/HookContentFocusGroup.web.test.tsx +91 -0
  14. package/Components/GeneralContentScreen/hookAdapter/__tests__/networkService.test.ts +74 -0
  15. package/Components/GeneralContentScreen/hookAdapter/__tests__/runInBackground.test.ts +139 -0
  16. package/Components/GeneralContentScreen/hookAdapter/__tests__/validationHelper.test.ts +124 -0
  17. package/Components/GeneralContentScreen/hookAdapter/logger.ts +6 -0
  18. package/Components/GeneralContentScreen/hookAdapter/networkService.ts +53 -0
  19. package/Components/GeneralContentScreen/hookAdapter/runInBackground.ts +48 -0
  20. package/Components/GeneralContentScreen/hookAdapter/validationHelper.ts +72 -0
  21. package/Components/GeneralContentScreen/hookFocus/index.tsx +13 -0
  22. package/Components/GeneralContentScreen/hookFocus/index.web.tsx +69 -0
  23. package/Components/GeneralContentScreen/index.ts +2 -0
  24. package/Components/Layout/FullWidthRow.tsx +38 -0
  25. package/Components/Layout/TV/ScreenContainer.tsx +5 -0
  26. package/Components/Layout/TV/__tests__/__snapshots__/index.test.tsx.snap +0 -1
  27. package/Components/Layout/TV/index.tsx +3 -4
  28. package/Components/Layout/TV/index.web.tsx +2 -3
  29. package/Components/MasterCell/DefaultComponents/ActionButton.tsx +16 -5
  30. package/Components/MasterCell/DefaultComponents/ActionButtonsCore/__tests__/placement.test.ts +47 -21
  31. package/Components/MasterCell/DefaultComponents/ActionButtonsCore/placement.ts +34 -6
  32. package/Components/MasterCell/DefaultComponents/ButtonContainerView/index.tsx +1 -1
  33. package/Components/MasterCell/DefaultComponents/Image/hoc/utils/__tests__/withDimensions.test.ts +420 -125
  34. package/Components/MasterCell/DefaultComponents/Image/hoc/utils/index.ts +114 -19
  35. package/Components/MasterCell/DefaultComponents/Image/hoc/withDimensions.tsx +19 -8
  36. package/Components/MasterCell/DefaultComponents/ImageContainer/index.tsx +5 -3
  37. package/Components/MasterCell/DefaultComponents/PressableView.tsx +29 -9
  38. package/Components/MasterCell/DefaultComponents/Text/hooks/useText.ts +4 -0
  39. package/Components/MasterCell/DefaultComponents/mobile/MobileActionButtons/ActionButton.tsx +154 -100
  40. package/Components/MasterCell/DefaultComponents/mobile/MobileActionButtons/AssetComponent.tsx +15 -4
  41. package/Components/MasterCell/DefaultComponents/mobile/MobileActionButtons/Button.ts +56 -22
  42. package/Components/MasterCell/DefaultComponents/mobile/MobileActionButtons/Spacer.ts +6 -4
  43. package/Components/MasterCell/DefaultComponents/mobile/MobileActionButtons/TextLabelsContainer.ts +3 -1
  44. package/Components/MasterCell/DefaultComponents/mobile/MobileActionButtons/__tests__/PressableView.test.tsx +32 -21
  45. package/Components/MasterCell/DefaultComponents/mobile/MobileActionButtons/__tests__/index.test.ts +15 -4
  46. package/Components/MasterCell/DefaultComponents/mobile/MobileActionButtons/index.ts +23 -16
  47. package/Components/MasterCell/DefaultComponents/mobile/MobileActionButtons/utils/__tests__/insertButtons.test.ts +8 -3
  48. package/Components/MasterCell/DefaultComponents/mobile/MobileActionButtons/utils/index.ts +2 -2
  49. package/Components/MasterCell/DefaultComponents/tv/TvActionButtons/utils/__tests__/insertButtonsBetweenLabels.test.ts +45 -13
  50. package/Components/MasterCell/DefaultComponents/tv/TvActionButtons/utils/index.ts +2 -2
  51. package/Components/MasterCell/contexts/PressedStateContext.ts +3 -0
  52. package/Components/MasterCell/dataAdapter.ts +15 -5
  53. package/Components/MasterCell/hooks/index.ts +2 -0
  54. package/Components/MasterCell/hooks/usePressedState.ts +4 -0
  55. package/Components/MasterCell/index.tsx +30 -5
  56. package/Components/MasterCell/utils/__tests__/resolveColor.test.js +169 -132
  57. package/Components/MasterCell/utils/__tests__/resolveColorForProp.test.js +92 -0
  58. package/Components/MasterCell/utils/index.ts +85 -46
  59. package/Components/ModalComponent/AudioPlayer/Components/Action.tsx +314 -0
  60. package/Components/ModalComponent/AudioPlayer/Components/Button.tsx +395 -0
  61. package/Components/ModalComponent/AudioPlayer/Components/Header.tsx +763 -0
  62. package/Components/ModalComponent/AudioPlayer/Components/Input.tsx +653 -0
  63. package/Components/ModalComponent/AudioPlayer/Components/Item.tsx +874 -0
  64. package/Components/ModalComponent/AudioPlayer/Components/NowPlayingHeaderSection.tsx +89 -0
  65. package/Components/ModalComponent/AudioPlayer/Components/index.ts +11 -0
  66. package/Components/ModalComponent/AudioPlayer/utils/mergeStyles.ts +199 -0
  67. package/Components/ModalComponent/BottomSheetDragArea.tsx +33 -0
  68. package/Components/ModalComponent/BottomSheetModalContent.tsx +386 -42
  69. package/Components/ModalComponent/Button/index.tsx +5 -3
  70. package/Components/ModalComponent/Header/index.tsx +20 -7
  71. package/Components/ModalComponent/Header/utils.ts +1 -1
  72. package/Components/ModalComponent/ModalBlocksStyleContext.tsx +10 -0
  73. package/Components/ModalComponent/SortableList.tsx +142 -0
  74. package/Components/ModalComponent/TextInputContent.tsx +100 -0
  75. package/Components/ModalComponent/__tests__/BottomSheetDragArea.test.tsx +74 -0
  76. package/Components/ModalComponent/__tests__/BottomSheetModalContent.test.tsx +238 -0
  77. package/Components/ModalComponent/__tests__/TextInputContent.test.tsx +120 -0
  78. package/Components/ModalComponent/__tests__/showTextInput.test.ts +95 -0
  79. package/Components/ModalComponent/index.tsx +11 -0
  80. package/Components/ModalComponent/presets/__tests__/getCell.test.ts +66 -0
  81. package/Components/ModalComponent/presets/dynamicCollectionCell.tsx +78 -0
  82. package/Components/ModalComponent/presets/index.ts +27 -0
  83. package/Components/ModalComponent/presets/selectableCell.tsx +28 -0
  84. package/Components/ModalComponent/presets/standardCell.tsx +41 -0
  85. package/Components/ModalComponent/presets/types.ts +35 -0
  86. package/Components/ModalComponent/showTextInput.ts +43 -0
  87. package/Components/ModalComponent/utils.ts +76 -20
  88. package/Components/OfflineHandler/__tests__/__snapshots__/index.test.tsx.snap +4 -85
  89. package/Components/OfflineHandler/__tests__/index.test.tsx +78 -18
  90. package/Components/OfflineHandler/hooks.ts +123 -0
  91. package/Components/OfflineHandler/index.tsx +51 -73
  92. package/Components/OfflineHandler/utils/index.ts +1 -13
  93. package/Components/PlayerContainer/PlayerContainer.tsx +25 -17
  94. package/Components/PlayerContainer/ProgramInfo/index.tsx +3 -4
  95. package/Components/PlayerContainer/__tests__/PlayerContainer.test.tsx +337 -0
  96. package/Components/PreloaderWrapper/index.tsx +1 -1
  97. package/Components/River/ComponentsMap/ComponentsMap.tsx +2 -2
  98. package/Components/River/__tests__/__snapshots__/componentsMap.test.js.snap +3 -15
  99. package/Components/Screen/TV/hooks/__tests__/useAfterPaint.test.ts +60 -0
  100. package/Components/Screen/TV/hooks/index.ts +2 -0
  101. package/Components/Screen/TV/hooks/useAfterPaint.ts +23 -0
  102. package/Components/Screen/TV/index.web.tsx +16 -7
  103. package/Components/Screen/index.tsx +8 -4
  104. package/Components/ScreenFeedLoader/ScreenFeedLoader.tsx +5 -3
  105. package/Components/ScreenResolverFeedProvider/ScreenResolverFeedProvider.tsx +1 -1
  106. package/Components/ScreenRevealManager/Overlay.tsx +34 -0
  107. package/Components/ScreenRevealManager/__tests__/Overlay.test.tsx +88 -0
  108. package/Components/ScreenRevealManager/withScreenRevealManager.tsx +8 -19
  109. package/Components/TopCutoffOverlay/index.tsx +2 -2
  110. package/Components/Transitioner/Transitioner.tsx +28 -17
  111. package/Components/VideoLive/LiveImageManager.ts +41 -43
  112. package/Components/VideoModal/utils.ts +6 -1
  113. package/Components/ZappFrameworkComponents/BarView/BarView.tsx +12 -5
  114. package/Components/ZappFrameworkComponents/BarView/__tests__/BarView.test.tsx +2 -2
  115. package/Contexts/CachedDimensionsContext/__tests__/index.test.ts +154 -0
  116. package/Contexts/CachedDimensionsContext/index.ts +17 -2
  117. package/Helpers/ComponentCellSelectionHelper/index.js +0 -6
  118. package/Helpers/index.js +7 -40
  119. package/package.json +6 -5
  120. package/Components/Layout/TV/LayoutBackground.tsx +0 -31
  121. package/Components/OfflineHandler/NotificationView/NotificationView.lg.tsx +0 -112
  122. package/Components/OfflineHandler/NotificationView/NotificationView.samsung.tsx +0 -107
  123. package/Components/OfflineHandler/NotificationView/NotificationView.tsx +0 -153
  124. package/Components/OfflineHandler/NotificationView/__tests__/index.test.tsx +0 -66
  125. package/Components/OfflineHandler/NotificationView/utils.ts +0 -34
  126. package/Components/Screen/utils.ts +0 -16
  127. package/Helpers/Analytics/index.js +0 -95
  128. /package/Components/MasterCell/DefaultComponents/ButtonContainerView/{index.tv.android.tsx → index.android.tv.tsx} +0 -0
  129. /package/Decorators/ZappPipesDataConnector/__tests__/{Hero.js → Hero.tsx} +0 -0
@@ -0,0 +1,89 @@
1
+ import React from "react";
2
+ import { StyleSheet, View } from "react-native";
3
+ import {
4
+ AudioPlayerTrackItem,
5
+ VARIANT_NOW_PLAYING,
6
+ mapMenuItemToNowPlayingData,
7
+ } from "./Item";
8
+ import { AudioPlayerHeader, VARIANT_SECTION_HEADER } from "./Header";
9
+ import type { MenuItem } from "@applicaster/zapp-react-native-utils/modalState/types";
10
+ import { usePlayer } from "@applicaster/zapp-react-native-utils/appUtils/playerManager/usePlayer";
11
+ import { usePlayerState } from "@applicaster/zapp-react-native-utils/appUtils/playerManager/usePlayerState";
12
+
13
+ const styles = StyleSheet.create({
14
+ divider: {
15
+ height: StyleSheet.hairlineWidth,
16
+ backgroundColor: "rgba(255, 255, 255, 0.1)",
17
+ marginHorizontal: 20,
18
+ marginVertical: 8,
19
+ },
20
+ });
21
+
22
+ type NowPlayingHeaderSectionProps = {
23
+ onClear?: () => void;
24
+ };
25
+
26
+ export function NowPlayingHeaderSection({
27
+ onClear,
28
+ }: NowPlayingHeaderSectionProps) {
29
+ const player = usePlayer();
30
+ const playerState = usePlayerState("queue-now-playing-section");
31
+
32
+ const renderNowPlayingTrack = () => {
33
+ if (!player?.entry) {
34
+ return null;
35
+ }
36
+
37
+ const mediaGroup = player.entry.media_group;
38
+
39
+ const imageGroup = Array.isArray(mediaGroup)
40
+ ? mediaGroup.find((g: any) => g.type === "image")
41
+ : null;
42
+
43
+ const firstImage = Array.isArray(imageGroup?.media_item)
44
+ ? imageGroup.media_item[0]?.src
45
+ : imageGroup?.media_item?.src;
46
+
47
+ const nowPlayingItem: MenuItem = {
48
+ id: String(player.entry.id ?? "now_playing"),
49
+ title: (player.entry.title as string) || String(player.entry.id),
50
+ summary: (player.entry.summary as string) ?? "",
51
+ icon: firstImage,
52
+ };
53
+
54
+ const data = mapMenuItemToNowPlayingData(
55
+ nowPlayingItem,
56
+ playerState?.isPaused
57
+ );
58
+
59
+ const handlePlayPause = () => {
60
+ if (playerState?.isPaused) {
61
+ player?.play();
62
+ } else {
63
+ player?.pause();
64
+ }
65
+ };
66
+
67
+ return (
68
+ <View>
69
+ <AudioPlayerTrackItem
70
+ configuration={VARIANT_NOW_PLAYING}
71
+ data={data}
72
+ onTrailingButtonPress={handlePlayPause}
73
+ />
74
+ <View style={styles.divider} />
75
+ </View>
76
+ );
77
+ };
78
+
79
+ return (
80
+ <View>
81
+ {renderNowPlayingTrack()}
82
+ <AudioPlayerHeader
83
+ configuration={VARIANT_SECTION_HEADER}
84
+ data={{ title: "Next Up" }}
85
+ onClear={onClear}
86
+ />
87
+ </View>
88
+ );
89
+ }
@@ -0,0 +1,11 @@
1
+ export { AudioPlayerAction } from "./Action";
2
+
3
+ export { AudioPlayerButton, VARIANT_WITH_ICON } from "./Button";
4
+
5
+ export { AudioPlayerHeader } from "./Header";
6
+
7
+ export { AudioPlayerTrackItem } from "./Item";
8
+
9
+ export { NowPlayingHeaderSection } from "./NowPlayingHeaderSection";
10
+
11
+ export { AudioPlayerInput } from "./Input";
@@ -0,0 +1,199 @@
1
+ import {
2
+ BackgroundConfiguration as ItemBackgroundConfiguration,
3
+ ImageConfiguration as ItemImageConfiguration,
4
+ LabelConfiguration as ItemLabelConfiguration,
5
+ NowPlayingAssetConfiguration as ItemNowPlayingAssetConfiguration,
6
+ ItemConfiguration,
7
+ } from "../Components/Item";
8
+ import {
9
+ TitleConfiguration as HeaderTitleConfiguration,
10
+ HeaderConfiguration,
11
+ } from "../Components/Header";
12
+ import {
13
+ BackgroundConfiguration as ButtonBackgroundConfiguration,
14
+ TitleConfiguration as ButtonTitleConfiguration,
15
+ ButtonConfiguration,
16
+ } from "../Components/Button";
17
+
18
+ // ---------------------------------------------------------------------------
19
+ // Item Merging Helpers
20
+ // ---------------------------------------------------------------------------
21
+
22
+ function mergeItemBackground(
23
+ base: ItemBackgroundConfiguration,
24
+ override?: Record<string, any>
25
+ ): ItemBackgroundConfiguration {
26
+ if (!override) return base;
27
+
28
+ return {
29
+ ...base,
30
+ ...(override.backgroundColor
31
+ ? { defaultColor: override.backgroundColor }
32
+ : {}),
33
+ ...(override.focusColor || override.backgroundColor
34
+ ? { focusedColor: override.focusColor || override.backgroundColor }
35
+ : {}),
36
+ ...(override.borderRadius !== undefined
37
+ ? { cornerRadius: override.borderRadius }
38
+ : {}),
39
+ };
40
+ }
41
+
42
+ function mergeItemImage(
43
+ base: ItemImageConfiguration,
44
+ override?: Record<string, any>
45
+ ): ItemImageConfiguration {
46
+ if (!override) return base;
47
+
48
+ return {
49
+ ...base,
50
+ ...(override.width !== undefined ? { width: override.width } : {}),
51
+ ...(override.height !== undefined ? { height: override.height } : {}),
52
+ ...(override.borderRadius !== undefined
53
+ ? { cornerRadius: override.borderRadius }
54
+ : {}),
55
+ ...(override.borderWidth !== undefined
56
+ ? { borderWidth: override.borderWidth }
57
+ : {}),
58
+ ...(override.borderColor ? { borderColor: override.borderColor } : {}),
59
+ };
60
+ }
61
+
62
+ function mergeItemLabel(
63
+ base: ItemLabelConfiguration,
64
+ override?: Record<string, any>
65
+ ): ItemLabelConfiguration {
66
+ if (!override) return base;
67
+
68
+ return {
69
+ ...base,
70
+ ...(override.fontColor ? { fontColor: override.fontColor } : {}),
71
+ ...(override.fontSize !== undefined ? { fontSize: override.fontSize } : {}),
72
+ };
73
+ }
74
+
75
+ function mergeItemNowPlayingAsset(
76
+ base: ItemNowPlayingAssetConfiguration,
77
+ override?: Record<string, any>
78
+ ): ItemNowPlayingAssetConfiguration {
79
+ if (!override) return base;
80
+
81
+ return {
82
+ ...base,
83
+ ...(override.asset ? { asset: override.asset } : {}),
84
+ };
85
+ }
86
+
87
+ export function mergeItemConfiguration(
88
+ base: ItemConfiguration,
89
+ itemBlock?: Record<string, any>
90
+ ): ItemConfiguration {
91
+ if (!itemBlock) return base;
92
+
93
+ const bg = itemBlock.background?.default || itemBlock.background;
94
+ const img = itemBlock.image?.default || itemBlock.image;
95
+ const label1 = itemBlock.textLabel1?.default || itemBlock.textLabel1;
96
+ const label2 = itemBlock.textLabel2?.default || itemBlock.textLabel2;
97
+
98
+ const npLabel =
99
+ itemBlock.nowPlayingLabel?.default || itemBlock.nowPlayingLabel;
100
+
101
+ const npAsset =
102
+ itemBlock.nowPlayingAsset?.default || itemBlock.nowPlayingAsset;
103
+
104
+ return {
105
+ ...base,
106
+ background: mergeItemBackground(base.background, bg),
107
+ image: mergeItemImage(base.image, img),
108
+ textLabel1: mergeItemLabel(base.textLabel1, label1),
109
+ textLabel2: mergeItemLabel(base.textLabel2, label2),
110
+ nowPlayingLabel: mergeItemLabel(base.nowPlayingLabel, npLabel),
111
+ nowPlayingAsset: mergeItemNowPlayingAsset(base.nowPlayingAsset, npAsset),
112
+ };
113
+ }
114
+
115
+ // ---------------------------------------------------------------------------
116
+ // Header Merging Helpers
117
+ // ---------------------------------------------------------------------------
118
+
119
+ function mergeHeaderTitle(
120
+ base: HeaderTitleConfiguration,
121
+ override?: Record<string, any>
122
+ ): HeaderTitleConfiguration {
123
+ if (!override) return base;
124
+
125
+ return {
126
+ ...base,
127
+ ...(override.fontColor ? { fontColor: override.fontColor } : {}),
128
+ ...(override.fontSize !== undefined ? { fontSize: override.fontSize } : {}),
129
+ };
130
+ }
131
+
132
+ export function mergeHeaderConfiguration(
133
+ base: HeaderConfiguration,
134
+ headerBlock?: Record<string, any>
135
+ ): HeaderConfiguration & { backgroundColor?: string } {
136
+ if (!headerBlock) return base;
137
+
138
+ const bgOverride = headerBlock.container?.default?.backgroundColor;
139
+
140
+ return {
141
+ ...base,
142
+ title: mergeHeaderTitle(base.title, headerBlock.title?.default),
143
+ ...(bgOverride ? { backgroundColor: bgOverride } : {}),
144
+ };
145
+ }
146
+
147
+ // ---------------------------------------------------------------------------
148
+ // Button Merging Helpers
149
+ // ---------------------------------------------------------------------------
150
+
151
+ function mergeButtonBackground(
152
+ base: ButtonBackgroundConfiguration,
153
+ override?: Record<string, any>
154
+ ): ButtonBackgroundConfiguration {
155
+ if (!override) return base;
156
+
157
+ return {
158
+ ...base,
159
+ ...(override.backgroundColor
160
+ ? { defaultColor: override.backgroundColor }
161
+ : {}),
162
+ ...(override.borderRadius !== undefined
163
+ ? { cornerRadius: override.borderRadius }
164
+ : {}),
165
+ };
166
+ }
167
+
168
+ function mergeButtonTitle(
169
+ base: ButtonTitleConfiguration,
170
+ override?: Record<string, any>
171
+ ): ButtonTitleConfiguration {
172
+ if (!override) return base;
173
+
174
+ return {
175
+ ...base,
176
+ ...(override.fontColor ? { fontColor: override.fontColor } : {}),
177
+ ...(override.fontSize !== undefined ? { fontSize: override.fontSize } : {}),
178
+ };
179
+ }
180
+
181
+ export function mergeButtonConfiguration(
182
+ base: ButtonConfiguration,
183
+ buttonBlock?: Record<string, any>,
184
+ actionBlock?: Record<string, any>
185
+ ): ButtonConfiguration {
186
+ if (!buttonBlock && !actionBlock) return base;
187
+
188
+ const bgOverride =
189
+ buttonBlock?.background?.default || actionBlock?.background?.default;
190
+
191
+ const titleOverride =
192
+ buttonBlock?.title?.default || actionBlock?.title?.default;
193
+
194
+ return {
195
+ ...base,
196
+ background: mergeButtonBackground(base.background, bgOverride),
197
+ title: mergeButtonTitle(base.title, titleOverride),
198
+ };
199
+ }
@@ -0,0 +1,33 @@
1
+ import React from "react";
2
+ import { PanGestureHandler } from "react-native-gesture-handler";
3
+ import { View } from "react-native";
4
+ import { useBottomSheet } from "@applicaster/zapp-react-native-utils/bottomSheet";
5
+
6
+ /**
7
+ * Turns its children into a drag zone for the enclosing DraggableBottomSheet:
8
+ * dragging here moves/dismisses the sheet (used for the modal header bar).
9
+ * Outside a sheet (no context) it renders children unchanged.
10
+ */
11
+ export const BottomSheetDragArea = ({
12
+ children,
13
+ }: {
14
+ children: React.ReactElement;
15
+ }) => {
16
+ const sheet = useBottomSheet();
17
+
18
+ // Outside a sheet (no context) render children unchanged.
19
+ if (!sheet) return children;
20
+
21
+ return (
22
+ <PanGestureHandler
23
+ simultaneousHandlers={[sheet.masterDrawerRef]}
24
+ shouldCancelWhenOutside={false}
25
+ onGestureEvent={sheet.onDragGestureEvent}
26
+ onHandlerStateChange={sheet.onDragStateChange}
27
+ >
28
+ {/* Old-API PanGestureHandler needs a host-component child; children may
29
+ be a function component (e.g. ModalHeader), so wrap in a View. */}
30
+ <View>{children}</View>
31
+ </PanGestureHandler>
32
+ );
33
+ };