@applicaster/zapp-react-native-ui-components 16.0.0-rc.9 → 16.0.0-rc.90

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 (144) 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/Cell/Cell.tsx +3 -6
  5. package/Components/Cell/TvOSCellComponent.tsx +0 -1
  6. package/Components/CellRendererResolver/index.ts +2 -2
  7. package/Components/ComponentResolver/__tests__/componentResolver.test.js +1 -1
  8. package/Components/FocusableGroup/FocusableTvOS.tsx +11 -7
  9. package/Components/GeneralContentScreen/GeneralContentScreenHookAdapter.tsx +54 -0
  10. package/Components/GeneralContentScreen/__tests__/GeneralContentScreenHookAdapter.test.tsx +64 -0
  11. package/Components/GeneralContentScreen/__tests__/HookContentFocusGroup.web.test.tsx +91 -0
  12. package/Components/GeneralContentScreen/hookAdapter/__tests__/networkService.test.ts +74 -0
  13. package/Components/GeneralContentScreen/hookAdapter/__tests__/runInBackground.test.ts +139 -0
  14. package/Components/GeneralContentScreen/hookAdapter/__tests__/skipExpression.test.ts +294 -0
  15. package/Components/GeneralContentScreen/hookAdapter/__tests__/validationHelper.test.ts +188 -0
  16. package/Components/GeneralContentScreen/hookAdapter/logger.ts +6 -0
  17. package/Components/GeneralContentScreen/hookAdapter/networkService.ts +53 -0
  18. package/Components/GeneralContentScreen/hookAdapter/runInBackground.ts +48 -0
  19. package/Components/GeneralContentScreen/hookAdapter/skipExpression.ts +252 -0
  20. package/Components/GeneralContentScreen/hookAdapter/validationHelper.ts +90 -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/MasterCell/DefaultComponents/ActionButton.tsx +21 -6
  26. package/Components/MasterCell/DefaultComponents/ActionButtonsCore/__tests__/placement.test.ts +47 -21
  27. package/Components/MasterCell/DefaultComponents/ActionButtonsCore/components/ActionButtonController.tsx +19 -4
  28. package/Components/MasterCell/DefaultComponents/ActionButtonsCore/components/__tests__/ActionButtonController.test.tsx +43 -1
  29. package/Components/MasterCell/DefaultComponents/ActionButtonsCore/placement.ts +34 -6
  30. package/Components/MasterCell/DefaultComponents/Button.tsx +1 -0
  31. package/Components/MasterCell/DefaultComponents/Image/hoc/utils/__tests__/withDimensions.test.ts +420 -125
  32. package/Components/MasterCell/DefaultComponents/Image/hoc/utils/index.ts +114 -19
  33. package/Components/MasterCell/DefaultComponents/Image/hoc/withDimensions.tsx +19 -8
  34. package/Components/MasterCell/DefaultComponents/ImageContainer/index.tsx +5 -3
  35. package/Components/MasterCell/DefaultComponents/PressableView.tsx +29 -9
  36. package/Components/MasterCell/DefaultComponents/Text/hooks/useText.ts +4 -0
  37. package/Components/MasterCell/DefaultComponents/Toggle.tsx +36 -14
  38. package/Components/MasterCell/DefaultComponents/__tests__/Toggle.test.tsx +167 -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/ActionsBottomSheet/ActionButton.tsx +56 -0
  60. package/Components/ModalComponent/ActionsBottomSheet/__tests__/openActionsBottomSheet.test.ts +38 -0
  61. package/Components/ModalComponent/ActionsBottomSheet/boundActionButton.tsx +24 -0
  62. package/Components/ModalComponent/ActionsBottomSheet/index.ts +9 -0
  63. package/Components/ModalComponent/ActionsBottomSheet/openActionsBottomSheet.ts +61 -0
  64. package/Components/ModalComponent/AudioPlayer/Components/Button.tsx +385 -0
  65. package/Components/ModalComponent/AudioPlayer/Components/Header.tsx +728 -0
  66. package/Components/ModalComponent/AudioPlayer/Components/Input.tsx +628 -0
  67. package/Components/ModalComponent/AudioPlayer/Components/Item.tsx +982 -0
  68. package/Components/ModalComponent/AudioPlayer/Components/NowPlayingHeaderSection.tsx +94 -0
  69. package/Components/ModalComponent/AudioPlayer/Components/__tests__/Item.test.tsx +113 -0
  70. package/Components/ModalComponent/AudioPlayer/Components/index.ts +9 -0
  71. package/Components/ModalComponent/AudioPlayer/utils/__tests__/mergeStyles.test.ts +248 -0
  72. package/Components/ModalComponent/AudioPlayer/utils/mergeStyles.ts +386 -0
  73. package/Components/ModalComponent/BottomSheetDragArea.tsx +33 -0
  74. package/Components/ModalComponent/BottomSheetModalContent.tsx +431 -49
  75. package/Components/ModalComponent/Button/index.tsx +5 -3
  76. package/Components/ModalComponent/Header/CloseButton.tsx +12 -0
  77. package/Components/ModalComponent/Header/__tests__/CloseButton.test.tsx +72 -0
  78. package/Components/ModalComponent/Header/index.tsx +20 -7
  79. package/Components/ModalComponent/Header/utils.ts +1 -1
  80. package/Components/ModalComponent/ModalBlocksStyleContext.tsx +10 -0
  81. package/Components/ModalComponent/SortableList.tsx +157 -0
  82. package/Components/ModalComponent/SortableList.web.tsx +34 -0
  83. package/Components/ModalComponent/TextInputContent.tsx +112 -0
  84. package/Components/ModalComponent/__tests__/BottomSheetDragArea.test.tsx +74 -0
  85. package/Components/ModalComponent/__tests__/BottomSheetModalContent.test.tsx +255 -0
  86. package/Components/ModalComponent/__tests__/SortableList.web.test.tsx +16 -0
  87. package/Components/ModalComponent/__tests__/TextInputContent.test.tsx +156 -0
  88. package/Components/ModalComponent/__tests__/showTextInput.test.ts +95 -0
  89. package/Components/ModalComponent/index.tsx +18 -9
  90. package/Components/ModalComponent/presets/__tests__/getCell.test.ts +90 -0
  91. package/Components/ModalComponent/presets/dynamicCollectionCell.tsx +78 -0
  92. package/Components/ModalComponent/presets/index.ts +27 -0
  93. package/Components/ModalComponent/presets/selectableCell.tsx +28 -0
  94. package/Components/ModalComponent/presets/standardCell.tsx +41 -0
  95. package/Components/ModalComponent/presets/types.ts +35 -0
  96. package/Components/ModalComponent/showTextInput.ts +43 -0
  97. package/Components/ModalComponent/utils.ts +82 -21
  98. package/Components/OfflineHandler/__tests__/__snapshots__/index.test.tsx.snap +4 -85
  99. package/Components/OfflineHandler/__tests__/index.test.tsx +78 -18
  100. package/Components/OfflineHandler/hooks.ts +111 -0
  101. package/Components/OfflineHandler/index.tsx +51 -73
  102. package/Components/OfflineHandler/utils/index.ts +1 -13
  103. package/Components/PlayerContainer/PlayerContainer.tsx +25 -17
  104. package/Components/PlayerContainer/ProgramInfo/index.tsx +3 -4
  105. package/Components/PlayerContainer/__tests__/PlayerContainer.test.tsx +337 -0
  106. package/Components/PreloaderWrapper/index.tsx +1 -1
  107. package/Components/River/ComponentsMap/ComponentsMap.tsx +87 -61
  108. package/Components/River/River.tsx +4 -0
  109. package/Components/River/__tests__/__snapshots__/componentsMap.test.js.snap +140 -89
  110. package/Components/River/__tests__/componentsMap.test.js +8 -3
  111. package/Components/River/__tests__/resultCallback.test.tsx +47 -0
  112. package/Components/Screen/index.tsx +8 -4
  113. package/Components/Screen/navigationHandler.ts +8 -8
  114. package/Components/ScreenFeedLoader/ScreenFeedLoader.tsx +5 -3
  115. package/Components/ScreenResolverFeedProvider/ScreenResolverFeedProvider.tsx +1 -1
  116. package/Components/ScreenRevealManager/ScreenRevealManager.ts +18 -2
  117. package/Components/ScreenRevealManager/__tests__/ScreenRevealManager.test.ts +36 -0
  118. package/Components/ScreenRevealManager/__tests__/withScreenRevealManager.test.tsx +56 -0
  119. package/Components/ScreenRevealManager/withScreenRevealManager.tsx +21 -4
  120. package/Components/TopCutoffOverlay/index.tsx +2 -2
  121. package/Components/Transitioner/Transitioner.tsx +28 -17
  122. package/Components/VideoLive/LiveImageManager.ts +1 -1
  123. package/Components/VideoModal/utils.ts +6 -1
  124. package/Components/ZappFrameworkComponents/BarView/BarView.tsx +12 -5
  125. package/Components/ZappFrameworkComponents/BarView/__tests__/BarView.test.tsx +2 -2
  126. package/Contexts/CachedDimensionsContext/__tests__/index.test.ts +154 -0
  127. package/Contexts/CachedDimensionsContext/index.ts +17 -2
  128. package/Contexts/ModalNavigationContext/__tests__/index.test.tsx +15 -0
  129. package/Contexts/ModalNavigationContext/index.tsx +2 -2
  130. package/Helpers/ComponentCellSelectionHelper/index.js +0 -6
  131. package/Helpers/index.js +0 -39
  132. package/Hooks/useEntryActionsExpander.ts +63 -0
  133. package/package.json +6 -5
  134. package/Components/OfflineHandler/NotificationView/NotificationView.lg.tsx +0 -112
  135. package/Components/OfflineHandler/NotificationView/NotificationView.samsung.tsx +0 -107
  136. package/Components/OfflineHandler/NotificationView/NotificationView.tsx +0 -153
  137. package/Components/OfflineHandler/NotificationView/__tests__/index.test.tsx +0 -66
  138. package/Components/OfflineHandler/NotificationView/utils.ts +0 -34
  139. package/Components/Screen/utils.ts +0 -16
  140. package/Helpers/Analytics/index.js +0 -95
  141. /package/Components/BackgroundImage/{BackgroundImage.tv.android.tsx → BackgroundImage.android.tv.tsx} +0 -0
  142. /package/Components/BackgroundImage/{BackgroundImage.tv.ios.tsx → BackgroundImage.ios.tv.tsx} +0 -0
  143. /package/Components/MasterCell/DefaultComponents/ButtonContainerView/{index.tv.android.tsx → index.android.tv.tsx} +0 -0
  144. /package/Decorators/ZappPipesDataConnector/__tests__/{Hero.js → Hero.tsx} +0 -0
@@ -0,0 +1,386 @@
1
+ import {
2
+ BackgroundConfiguration as ItemBackgroundConfiguration,
3
+ ImageConfiguration as ItemImageConfiguration,
4
+ LabelConfiguration as ItemLabelConfiguration,
5
+ NowPlayingAssetConfiguration as ItemNowPlayingAssetConfiguration,
6
+ CheckboxAssetsConfiguration as ItemCheckboxAssetsConfiguration,
7
+ ActionButtonAssetsConfiguration as ItemActionButtonAssetsConfiguration,
8
+ ItemConfiguration,
9
+ } from "../Components/Item";
10
+ import {
11
+ TitleConfiguration as HeaderTitleConfiguration,
12
+ HeaderConfiguration,
13
+ } from "../Components/Header";
14
+ import {
15
+ BackgroundConfiguration as ButtonBackgroundConfiguration,
16
+ TitleConfiguration as ButtonTitleConfiguration,
17
+ ButtonConfiguration,
18
+ } from "../Components/Button";
19
+
20
+ // ---------------------------------------------------------------------------
21
+ // Item Merging Helpers
22
+ // ---------------------------------------------------------------------------
23
+
24
+ function mergeItemBackground(
25
+ base: ItemBackgroundConfiguration,
26
+ defaultOverride?: Record<string, any>,
27
+ focusedOverride?: Record<string, any>
28
+ ): ItemBackgroundConfiguration {
29
+ if (!defaultOverride && !focusedOverride) return base;
30
+
31
+ // Only take focused color from the focused/pressed bucket (or legacy
32
+ // mis-parsed focus* aliases). Never fall back to default background —
33
+ // that would overwrite base.focusedColor whenever Studio only sets default.
34
+ const focusedColor =
35
+ focusedOverride?.backgroundColor ??
36
+ defaultOverride?.focusColor ??
37
+ defaultOverride?.focusBackgroundColor;
38
+
39
+ return {
40
+ ...base,
41
+ ...(defaultOverride?.backgroundColor
42
+ ? { defaultColor: defaultOverride.backgroundColor }
43
+ : {}),
44
+ ...(focusedColor != null && focusedColor !== "" ? { focusedColor } : {}),
45
+ ...(defaultOverride?.borderRadius !== undefined
46
+ ? { cornerRadius: defaultOverride.borderRadius }
47
+ : {}),
48
+ ...(defaultOverride?.paddingTop !== undefined
49
+ ? { paddingTop: defaultOverride.paddingTop }
50
+ : {}),
51
+ ...(defaultOverride?.paddingRight !== undefined
52
+ ? { paddingRight: defaultOverride.paddingRight }
53
+ : {}),
54
+ ...(defaultOverride?.paddingBottom !== undefined
55
+ ? { paddingBottom: defaultOverride.paddingBottom }
56
+ : {}),
57
+ ...(defaultOverride?.paddingLeft !== undefined
58
+ ? { paddingLeft: defaultOverride.paddingLeft }
59
+ : {}),
60
+ };
61
+ }
62
+
63
+ function mergeItemImage(
64
+ base: ItemImageConfiguration,
65
+ override?: Record<string, any>
66
+ ): ItemImageConfiguration {
67
+ if (!override) return base;
68
+
69
+ return {
70
+ ...base,
71
+ ...(override.width !== undefined ? { width: override.width } : {}),
72
+ ...(override.height !== undefined ? { height: override.height } : {}),
73
+ ...(override.borderRadius !== undefined
74
+ ? { cornerRadius: override.borderRadius }
75
+ : {}),
76
+ ...(override.borderWidth !== undefined
77
+ ? { borderWidth: override.borderWidth }
78
+ : {}),
79
+ ...(override.borderColor ? { borderColor: override.borderColor } : {}),
80
+ };
81
+ }
82
+
83
+ function mergeItemLabel(
84
+ base: ItemLabelConfiguration,
85
+ override?: Record<string, any>
86
+ ): ItemLabelConfiguration {
87
+ if (!override) return base;
88
+
89
+ return {
90
+ ...base,
91
+ ...(override.fontColor ? { fontColor: override.fontColor } : {}),
92
+ ...(override.fontSize !== undefined ? { fontSize: override.fontSize } : {}),
93
+ ...(override.lineHeight !== undefined
94
+ ? { lineHeight: override.lineHeight }
95
+ : {}),
96
+ ...(override.fontFamily
97
+ ? {
98
+ iosFontFamily: override.fontFamily,
99
+ androidFontFamily: override.fontFamily,
100
+ }
101
+ : {}),
102
+ ...(override.iosFontFamily
103
+ ? { iosFontFamily: override.iosFontFamily }
104
+ : {}),
105
+ ...(override.androidFontFamily
106
+ ? { androidFontFamily: override.androidFontFamily }
107
+ : {}),
108
+ ...(override.letterSpacing !== undefined
109
+ ? {
110
+ iosLetterSpacing: override.letterSpacing,
111
+ androidLetterSpacing: override.letterSpacing,
112
+ }
113
+ : {}),
114
+ ...(override.iosLetterSpacing !== undefined
115
+ ? { iosLetterSpacing: override.iosLetterSpacing }
116
+ : {}),
117
+ ...(override.androidLetterSpacing !== undefined
118
+ ? { androidLetterSpacing: override.androidLetterSpacing }
119
+ : {}),
120
+ ...(override.textTransform
121
+ ? { textTransform: override.textTransform }
122
+ : {}),
123
+ };
124
+ }
125
+
126
+ function mergeItemNowPlayingAsset(
127
+ base: ItemNowPlayingAssetConfiguration,
128
+ override?: Record<string, any>
129
+ ): ItemNowPlayingAssetConfiguration {
130
+ if (!override) return base;
131
+
132
+ return {
133
+ ...base,
134
+ ...(override.asset ? { asset: override.asset } : {}),
135
+ };
136
+ }
137
+
138
+ function mergeItemCheckboxAssets(
139
+ base: ItemCheckboxAssetsConfiguration,
140
+ override?: Record<string, any>
141
+ ): ItemCheckboxAssetsConfiguration {
142
+ if (!override) return base;
143
+
144
+ return {
145
+ ...base,
146
+ ...(override.asset ? { asset: override.asset } : {}),
147
+ ...(override.checkedAsset ? { checkedAsset: override.checkedAsset } : {}),
148
+ };
149
+ }
150
+
151
+ function mergeItemActionButtonAssets(
152
+ base: ItemActionButtonAssetsConfiguration,
153
+ override?: Record<string, any>
154
+ ): ItemActionButtonAssetsConfiguration {
155
+ if (!override) return base;
156
+
157
+ return {
158
+ ...base,
159
+ ...(override.removeAsset ? { removeAsset: override.removeAsset } : {}),
160
+ ...(override.dragAsset ? { dragAsset: override.dragAsset } : {}),
161
+ };
162
+ }
163
+
164
+ export function mergeItemConfiguration(
165
+ base: ItemConfiguration,
166
+ itemBlock?: Record<string, any>
167
+ ): ItemConfiguration {
168
+ if (!itemBlock) return base;
169
+
170
+ const bgDefault = itemBlock.background?.default || itemBlock.background;
171
+
172
+ const bgFocused =
173
+ itemBlock.background?.focused ||
174
+ itemBlock.background?.focus ||
175
+ itemBlock.background?.pressed;
176
+
177
+ const img = itemBlock.image?.default || itemBlock.image;
178
+ const label1 = itemBlock.textLabel1?.default || itemBlock.textLabel1;
179
+ const label2 = itemBlock.textLabel2?.default || itemBlock.textLabel2;
180
+
181
+ const npLabel =
182
+ itemBlock.nowPlayingLabel?.default || itemBlock.nowPlayingLabel;
183
+
184
+ const npAsset =
185
+ itemBlock.nowPlayingAsset?.default || itemBlock.nowPlayingAsset;
186
+
187
+ const checkbox = itemBlock.checkbox?.default || itemBlock.checkbox;
188
+
189
+ const actionButtons =
190
+ itemBlock.actionButtons?.default || itemBlock.actionButtons;
191
+
192
+ return {
193
+ ...base,
194
+ background: mergeItemBackground(base.background, bgDefault, bgFocused),
195
+ image: mergeItemImage(base.image, img),
196
+ textLabel1: mergeItemLabel(base.textLabel1, label1),
197
+ textLabel2: mergeItemLabel(base.textLabel2, label2),
198
+ nowPlayingLabel: mergeItemLabel(base.nowPlayingLabel, npLabel),
199
+ nowPlayingAsset: mergeItemNowPlayingAsset(base.nowPlayingAsset, npAsset),
200
+ checkboxAssets: mergeItemCheckboxAssets(
201
+ base.checkboxAssets || {},
202
+ checkbox
203
+ ),
204
+ actionButtonAssets: mergeItemActionButtonAssets(
205
+ base.actionButtonAssets || {},
206
+ actionButtons
207
+ ),
208
+ };
209
+ }
210
+
211
+ // ---------------------------------------------------------------------------
212
+ // Header Merging Helpers
213
+ // ---------------------------------------------------------------------------
214
+
215
+ function mergeHeaderTitle(
216
+ base: HeaderTitleConfiguration,
217
+ override?: Record<string, any>
218
+ ): HeaderTitleConfiguration {
219
+ if (!override) return base;
220
+
221
+ return {
222
+ ...base,
223
+ ...(override.fontColor ? { fontColor: override.fontColor } : {}),
224
+ ...(override.fontSize !== undefined ? { fontSize: override.fontSize } : {}),
225
+ };
226
+ }
227
+
228
+ export function mergeHeaderConfiguration(
229
+ base: HeaderConfiguration,
230
+ headerBlock?: Record<string, any>
231
+ ): HeaderConfiguration & { backgroundColor?: string } {
232
+ if (!headerBlock) return base;
233
+
234
+ const bgOverride = headerBlock.container?.default?.backgroundColor;
235
+
236
+ return {
237
+ ...base,
238
+ title: mergeHeaderTitle(base.title, headerBlock.title?.default),
239
+ ...(bgOverride ? { backgroundColor: bgOverride } : {}),
240
+ };
241
+ }
242
+
243
+ // ---------------------------------------------------------------------------
244
+ // Button Merging Helpers
245
+ // ---------------------------------------------------------------------------
246
+
247
+ function mergeButtonBackground(
248
+ base: ButtonBackgroundConfiguration,
249
+ defaultOverride?: Record<string, any>,
250
+ focusedOverride?: Record<string, any>
251
+ ): ButtonBackgroundConfiguration {
252
+ if (!defaultOverride && !focusedOverride) return base;
253
+
254
+ // Same as mergeItemBackground: do not use default background as focusedColor.
255
+ const focusedColor =
256
+ focusedOverride?.backgroundColor ??
257
+ defaultOverride?.focusColor ??
258
+ defaultOverride?.focusBackgroundColor;
259
+
260
+ return {
261
+ ...base,
262
+ ...(defaultOverride?.backgroundColor
263
+ ? { defaultColor: defaultOverride.backgroundColor }
264
+ : {}),
265
+ ...(focusedColor != null && focusedColor !== "" ? { focusedColor } : {}),
266
+ ...(defaultOverride?.borderRadius !== undefined
267
+ ? { cornerRadius: defaultOverride.borderRadius }
268
+ : {}),
269
+ ...(defaultOverride?.paddingTop !== undefined
270
+ ? { paddingTop: defaultOverride.paddingTop }
271
+ : {}),
272
+ ...(defaultOverride?.paddingRight !== undefined
273
+ ? { paddingRight: defaultOverride.paddingRight }
274
+ : {}),
275
+ ...(defaultOverride?.paddingBottom !== undefined
276
+ ? { paddingBottom: defaultOverride.paddingBottom }
277
+ : {}),
278
+ ...(defaultOverride?.paddingLeft !== undefined
279
+ ? { paddingLeft: defaultOverride.paddingLeft }
280
+ : {}),
281
+ };
282
+ }
283
+
284
+ function mergeButtonTitle(
285
+ base: ButtonTitleConfiguration,
286
+ override?: Record<string, any>
287
+ ): ButtonTitleConfiguration {
288
+ if (!override) return base;
289
+
290
+ return {
291
+ ...base,
292
+ ...(override.fontColor ? { fontColor: override.fontColor } : {}),
293
+ ...(override.fontSize !== undefined ? { fontSize: override.fontSize } : {}),
294
+ ...(override.lineHeight !== undefined
295
+ ? { lineHeight: override.lineHeight }
296
+ : {}),
297
+ ...(override.fontFamily
298
+ ? {
299
+ iosFontFamily: override.fontFamily,
300
+ androidFontFamily: override.fontFamily,
301
+ }
302
+ : {}),
303
+ ...(override.iosFontFamily
304
+ ? { iosFontFamily: override.iosFontFamily }
305
+ : {}),
306
+ ...(override.androidFontFamily
307
+ ? { androidFontFamily: override.androidFontFamily }
308
+ : {}),
309
+ ...(override.letterSpacing !== undefined
310
+ ? {
311
+ iosLetterSpacing: override.letterSpacing,
312
+ androidLetterSpacing: override.letterSpacing,
313
+ }
314
+ : {}),
315
+ ...(override.iosLetterSpacing !== undefined
316
+ ? { iosLetterSpacing: override.iosLetterSpacing }
317
+ : {}),
318
+ ...(override.androidLetterSpacing !== undefined
319
+ ? { androidLetterSpacing: override.androidLetterSpacing }
320
+ : {}),
321
+ ...(override.textTransform
322
+ ? { textTransform: override.textTransform }
323
+ : {}),
324
+ };
325
+ }
326
+
327
+ function mergeButtonIcons(
328
+ base: ButtonConfiguration["icons"],
329
+ iconsOverride?: Record<string, any>,
330
+ leadingOverride?: Record<string, any>
331
+ ): ButtonConfiguration["icons"] {
332
+ if (!iconsOverride && !leadingOverride) return base;
333
+
334
+ const iconsDefault = iconsOverride?.default || iconsOverride;
335
+ const leadingDefault = leadingOverride?.default || leadingOverride;
336
+
337
+ return {
338
+ ...base,
339
+ ...(iconsDefault?.width !== undefined ? { width: iconsDefault.width } : {}),
340
+ ...(iconsDefault?.height !== undefined
341
+ ? { height: iconsDefault.height }
342
+ : {}),
343
+ leadingIcon: {
344
+ ...base.leadingIcon,
345
+ ...(leadingDefault?.enabled !== undefined
346
+ ? { enabled: leadingDefault.enabled }
347
+ : {}),
348
+ ...(leadingDefault?.actionType
349
+ ? { actionType: leadingDefault.actionType }
350
+ : {}),
351
+ ...(leadingDefault?.asset ? { asset: leadingDefault.asset } : {}),
352
+ },
353
+ };
354
+ }
355
+
356
+ export function mergeButtonConfiguration(
357
+ base: ButtonConfiguration,
358
+ buttonBlock?: Record<string, any>,
359
+ actionBlock?: Record<string, any>
360
+ ): ButtonConfiguration {
361
+ if (!buttonBlock && !actionBlock) return base;
362
+
363
+ const bgDefault =
364
+ buttonBlock?.background?.default || actionBlock?.background?.default;
365
+
366
+ const bgFocused =
367
+ buttonBlock?.background?.focused ||
368
+ buttonBlock?.background?.focus ||
369
+ actionBlock?.background?.focused ||
370
+ actionBlock?.background?.focus ||
371
+ buttonBlock?.background?.pressed ||
372
+ actionBlock?.background?.pressed;
373
+
374
+ const titleOverride =
375
+ buttonBlock?.title?.default || actionBlock?.title?.default;
376
+
377
+ const iconsOverride = buttonBlock?.icons || actionBlock?.icons;
378
+ const leadingOverride = buttonBlock?.leadingIcon || actionBlock?.leadingIcon;
379
+
380
+ return {
381
+ ...base,
382
+ background: mergeButtonBackground(base.background, bgDefault, bgFocused),
383
+ title: mergeButtonTitle(base.title, titleOverride),
384
+ icons: mergeButtonIcons(base.icons, iconsOverride, leadingOverride),
385
+ };
386
+ }
@@ -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
+ };