@applicaster/zapp-react-native-ui-components 13.0.0-alpha.1124981321 → 13.0.0-alpha.1173186260

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 (157) hide show
  1. package/Components/AppContainer/__tests__/AppContainer.test.js +4 -6
  2. package/Components/AudioPlayer/AudioPlayer.tsx +7 -4
  3. package/Components/AudioPlayer/__tests__/Runtime.test.js +5 -8
  4. package/Components/AudioPlayer/__tests__/__snapshots__/audioPlayer.test.js.snap +54 -111
  5. package/Components/AudioPlayer/__tests__/__snapshots__/audioPlayerLayout.test.js.snap +36 -20
  6. package/Components/AudioPlayer/__tests__/artWork.test.js +3 -5
  7. package/Components/AudioPlayer/__tests__/audioPlayer.test.js +3 -5
  8. package/Components/AudioPlayer/__tests__/audioPlayerLayout.test.js +7 -8
  9. package/Components/AudioPlayer/__tests__/channel.test.js +3 -5
  10. package/Components/AudioPlayer/__tests__/summary.test.js +3 -5
  11. package/Components/AudioPlayer/__tests__/title.test.js +3 -5
  12. package/Components/AudioPlayer/helpers.tsx +1 -1
  13. package/Components/BaseFocusable/index.tsx +1 -2
  14. package/Components/Cell/Cell.tsx +4 -13
  15. package/Components/Cell/CellWithFocusable.tsx +50 -59
  16. package/Components/Cell/CellWrapper.tsx +18 -0
  17. package/Components/Cell/TvOSCellComponent.tsx +20 -22
  18. package/Components/Cell/__tests__/CellWIthFocusable.test.js +13 -6
  19. package/Components/Cell/index.js +3 -1
  20. package/Components/Cell/styles.ts +17 -0
  21. package/Components/CellRendererResolver/__tests__/cellRendererResolver.test.js +46 -48
  22. package/Components/CellRendererResolver/index.ts +2 -1
  23. package/Components/ComponentResolver/__tests__/__snapshots__/componentResolver.test.js.snap +1 -42
  24. package/Components/ComponentResolver/__tests__/componentResolver.test.js +16 -22
  25. package/Components/ContentScreen/__tests__/contentScreen.test.js +3 -3
  26. package/Components/ErrorScreen/index.tsx +14 -6
  27. package/Components/Focusable/Focusable.tsx +1 -0
  28. package/Components/Focusable/FocusableTvOS.tsx +5 -1
  29. package/Components/Focusable/index.android.tsx +10 -3
  30. package/Components/FocusableCell/index.tsx +1 -1
  31. package/Components/FocusableGroup/FocusableTvOS.tsx +34 -86
  32. package/Components/FocusableGroup/index.tsx +0 -3
  33. package/Components/FocusableList/index.tsx +26 -9
  34. package/Components/FocusableScrollView/index.tsx +43 -13
  35. package/Components/GeneralContentScreen/GeneralContentScreen.tsx +3 -0
  36. package/Components/GeneralContentScreen/utils/useCurationAPI.ts +4 -2
  37. package/Components/GeneralContentScreen/utils/useEventAlerts.ts +30 -0
  38. package/Components/HandlePlayable/HandlePlayable.tsx +21 -27
  39. package/Components/Layout/TV/LayoutBackground.tsx +28 -0
  40. package/Components/Layout/TV/NavBarContainer.tsx +19 -23
  41. package/Components/Layout/TV/ScreenContainer.tsx +8 -2
  42. package/Components/Layout/TV/ScreenLayoutContextProvider.tsx +5 -0
  43. package/Components/Layout/TV/__tests__/ScreenContainer.test.tsx +2 -1
  44. package/Components/Layout/TV/__tests__/__snapshots__/NavBarContainer.test.tsx.snap +3 -2
  45. package/Components/Layout/TV/__tests__/__snapshots__/ScreenContainer.test.tsx.snap +3 -2
  46. package/Components/Layout/TV/__tests__/__snapshots__/index.test.tsx.snap +15 -10
  47. package/Components/Layout/TV/__tests__/index.test.tsx +8 -2
  48. package/Components/Layout/TV/index.tsx +6 -20
  49. package/Components/Layout/TV/index.web.tsx +4 -1
  50. package/Components/MasterCell/DefaultComponents/ActionButton.tsx +2 -3
  51. package/Components/MasterCell/DefaultComponents/Image/Image.ios.tsx +4 -3
  52. package/Components/MasterCell/DefaultComponents/Image/hooks/useImage.ts +11 -7
  53. package/Components/MasterCell/DefaultComponents/LiveImage/index.tsx +2 -2
  54. package/Components/MasterCell/DefaultComponents/tv/TvActionButtons/const.ts +3 -0
  55. package/Components/MasterCell/DefaultComponents/tv/TvActionButtons/index.ts +6 -6
  56. package/Components/MasterCell/SharedUI/ProgressBar/hooks/useFillInPercent.ts +2 -8
  57. package/Components/MasterCell/__tests__/__snapshots__/elementMapper.test.js.snap +4 -12
  58. package/Components/MasterCell/__tests__/__snapshots__/masterCell.test.js.snap +0 -229
  59. package/Components/MasterCell/__tests__/elementMapper.test.js +18 -5
  60. package/Components/MasterCell/__tests__/masterCell.test.js +26 -26
  61. package/Components/MasterCell/hooks/useAsyncRendering/MasterCellAsyncRenderManager.ts +2 -2
  62. package/Components/MasterCell/utils/behaviorProvider.ts +136 -0
  63. package/Components/MasterCell/utils/index.ts +8 -134
  64. package/Components/ModalComponent/BottomSheetModalContent.tsx +59 -43
  65. package/Components/ModalComponent/Button/Item.tsx +6 -5
  66. package/Components/ModalComponent/Button/assets.ts +1 -1
  67. package/Components/ModalComponent/Button/index.tsx +45 -62
  68. package/Components/ModalComponent/Header/index.tsx +12 -11
  69. package/Components/ModalComponent/utils.ts +55 -7
  70. package/Components/OfflineHandler/NotificationView/NotificationView.lg.tsx +2 -2
  71. package/Components/OfflineHandler/NotificationView/NotificationView.samsung.tsx +2 -2
  72. package/Components/OfflineHandler/NotificationView/__tests__/index.test.tsx +0 -5
  73. package/Components/OfflineHandler/utils/index.ts +1 -1
  74. package/Components/PlayerContainer/PlayerContainer.tsx +42 -15
  75. package/Components/PlayerContainer/ProgramInfo/index.tsx +2 -2
  76. package/Components/PlayerImageBackground/index.tsx +1 -1
  77. package/Components/River/ComponentsMap/ComponentsMap.tsx +42 -65
  78. package/Components/River/ComponentsMap/hooks/useLoadingState.ts +78 -51
  79. package/Components/River/RiverFooter.tsx +39 -9
  80. package/Components/River/RiverItem.tsx +39 -3
  81. package/Components/River/TV/index.tsx +6 -1
  82. package/Components/River/__tests__/__snapshots__/componentsMap.test.js.snap +100 -31
  83. package/Components/River/__tests__/__snapshots__/river.test.js.snap +20 -82
  84. package/Components/River/__tests__/componentsMap.test.js +3 -4
  85. package/Components/River/__tests__/river.test.js +75 -40
  86. package/Components/RouteManager/__tests__/__snapshots__/routeManager.test.js.snap +11 -4
  87. package/Components/RouteManager/__tests__/routeManager.test.js +29 -14
  88. package/Components/RouteManager/__tests__/testId.test.js +8 -6
  89. package/Components/Screen/TV/__tests__/index.web.test.tsx +26 -0
  90. package/Components/Screen/TV/index.web.tsx +5 -6
  91. package/Components/Screen/__tests__/Screen.test.tsx +22 -14
  92. package/Components/Screen/__tests__/__snapshots__/Screen.test.tsx.snap +2 -2
  93. package/Components/Screen/hooks.ts +3 -6
  94. package/Components/Screen/index.tsx +4 -4
  95. package/Components/ScreenResolver/__tests__/screenResolver.test.js +91 -70
  96. package/Components/Tabs/Tab.tsx +5 -3
  97. package/Components/TextInputTv/index.tsx +2 -1
  98. package/Components/TopMarginApplicator/TopMarginApplicator.tsx +2 -3
  99. package/Components/TrackedView/index.tsx +1 -0
  100. package/Components/Transitioner/AnimationManager.js +15 -15
  101. package/Components/Transitioner/Scene.tsx +1 -1
  102. package/Components/Transitioner/Transitioner.tsx +3 -3
  103. package/Components/Transitioner/__tests__/Scene.test.js +25 -14
  104. package/Components/Transitioner/__tests__/__snapshots__/Scene.test.js.snap +12 -68
  105. package/Components/Transitioner/__tests__/__snapshots__/transitioner.test.js.snap +2 -2
  106. package/Components/Transitioner/__tests__/transitioner.test.js +13 -4
  107. package/Components/VideoLive/PlayerLiveImageComponent.tsx +7 -3
  108. package/Components/VideoLive/__tests__/__snapshots__/PlayerLiveImageComponent.test.tsx.snap +1 -0
  109. package/Components/VideoModal/ModalAnimation/AnimatedPlayerModalWrapper.tsx +1 -1
  110. package/Components/VideoModal/ModalAnimation/AnimatedScrollModal.tsx +46 -30
  111. package/Components/VideoModal/ModalAnimation/AnimatedVideoPlayerComponent.tsx +3 -3
  112. package/Components/VideoModal/ModalAnimation/AnimationComponent.tsx +45 -21
  113. package/Components/VideoModal/ModalAnimation/ModalAnimationContext.tsx +12 -6
  114. package/Components/VideoModal/ModalAnimation/__tests__/getMoveUpValue.test.ts +108 -0
  115. package/Components/VideoModal/ModalAnimation/const.ts +5 -0
  116. package/Components/VideoModal/ModalAnimation/index.ts +2 -0
  117. package/Components/VideoModal/ModalAnimation/utils.ts +30 -0
  118. package/Components/VideoModal/PlayerDetails.tsx +18 -10
  119. package/Components/VideoModal/PlayerWrapper.tsx +37 -24
  120. package/Components/VideoModal/VideoModal.tsx +19 -4
  121. package/Components/VideoModal/__tests__/__snapshots__/PlayerDetails.test.tsx.snap +2 -40
  122. package/Components/VideoModal/utils.ts +3 -4
  123. package/Components/Viewport/ViewportAware/__tests__/__snapshots__/viewportAware.test.js.snap +24 -36
  124. package/Components/Viewport/ViewportAware/__tests__/viewportAware.test.js +12 -18
  125. package/Components/Viewport/__tests__/utils.test.js +5 -4
  126. package/Components/ZappUIComponent/Placeholder.tsx +3 -1
  127. package/Components/ZappUIComponent/__tests__/{ZappUIComponent.test.js → ZappUIComponent.test.tsx} +26 -10
  128. package/Components/ZappUIComponent/index.tsx +4 -17
  129. package/Components/default-cell-renderer/__tests__/defaultCellRenderer.test.tsx +20 -17
  130. package/Components/default-cell-renderer/viewTrees/tv/DefaultCell/__tests__/DefaultCell.test.tsx +15 -11
  131. package/Contexts/ComponentsMapOffsetContext/index.tsx +49 -0
  132. package/Contexts/FocusableGroupContext/withFocusableContext.tsx +4 -10
  133. package/Contexts/HeaderOffsetContext/index.tsx +4 -6
  134. package/Contexts/ScreenContext/index.tsx +3 -10
  135. package/Contexts/ScreenLayoutContext/index.tsx +5 -3
  136. package/Decorators/Navigator/__tests__/navigator.test.js +16 -16
  137. package/Decorators/Navigator/index.tsx +1 -1
  138. package/Decorators/RiverResolver/__tests__/riverResolver.test.tsx +18 -24
  139. package/Decorators/RiverResolver/index.tsx +6 -8
  140. package/Decorators/ZappPipesDataConnector/__tests__/zappPipesDataConnector.test.js +29 -22
  141. package/Decorators/ZappPipesDataConnector/index.tsx +4 -30
  142. package/package.json +7 -11
  143. package/tsconfig.json +2 -3
  144. package/.babelrc +0 -8
  145. package/Components/Cell/CellStyles/FallbackCellStyle/index.js +0 -157
  146. package/Components/Cell/CellStyles/Hero/index.js +0 -111
  147. package/Components/Cell/CellStyles/ScreenSelector/index.js +0 -68
  148. package/Components/Cell/CellStyles/cellStylesResolver.ts +0 -19
  149. package/Components/Cell/CellStyles/colors.js +0 -40
  150. package/Components/Cell/CellStyles/index.js +0 -15
  151. package/Components/CellRendererResolver/__tests__/__snapshots__/cellRendererResolver.test.js.snap +0 -53
  152. package/Components/RouteManager/__tests__/__snapshots__/testId.test.js.snap +0 -17
  153. package/Components/ScreenResolver/__tests__/__snapshots__/screenResolver.test.js.snap +0 -17
  154. package/Components/ZappUIComponent/__tests__/__snapshots__/ZappUIComponent.test.js.snap +0 -91
  155. package/Components/default-cell-renderer/__tests__/__snapshots__/defaultCellRenderer.test.tsx.snap +0 -338
  156. package/Decorators/Navigator/__tests__/__snapshots__/navigator.test.js.snap +0 -18
  157. package/Decorators/RiverResolver/__tests__/__snapshots__/riverResolver.test.tsx.snap +0 -28
@@ -1,23 +1,16 @@
1
- import React, {
2
- useCallback,
3
- useEffect,
4
- useMemo,
5
- useRef,
6
- useState,
7
- } from "react";
8
- import { View, LayoutChangeEvent, ScrollView } from "react-native";
1
+ import React, { useCallback, useEffect, useMemo, useRef } from "react";
2
+ import { View, ScrollView, StyleSheet, Platform } from "react-native";
9
3
  import { Button } from "./Button";
10
4
  import { ItemIconProps } from "./Button/ItemIcon";
11
5
  import { ItemProps } from "./Button/Item";
12
6
  import { ItemLabelProps } from "./Button/ItemLabel";
13
- import {
14
- defaultItemIconProps,
15
- defaultItemLabelProps,
16
- defaultItemProps,
17
- } from "./utils";
7
+ import { getItemIconProps, getItemLabelProps, getItemProps } from "./utils";
18
8
  import { useTheme } from "@applicaster/zapp-react-native-utils/theme";
19
9
 
10
+ import type { PluginConfiguration } from "./";
11
+
20
12
  import { ModalHeader } from "./Header";
13
+ import { useSafeAreaInsets } from "react-native-safe-area-context";
21
14
 
22
15
  type ModalComponentProps = {
23
16
  items: any[];
@@ -30,32 +23,48 @@ type ModalComponentProps = {
30
23
  maxHeight?: number;
31
24
  dismiss: () => void;
32
25
  buttonComponent?: React.ComponentType;
26
+ iconProps?: ItemIconProps | ((theme: PluginConfiguration) => ItemIconProps);
27
+ itemProps?:
28
+ | ItemProps
29
+ | ((theme: PluginConfiguration, width: number) => ItemProps);
30
+ labelProps?:
31
+ | ItemLabelProps
32
+ | ((theme: PluginConfiguration, width: number) => ItemLabelProps);
33
+ getSelectedItemIcon: (
34
+ theme: PluginConfiguration
35
+ ) => ItemIconProps["asset"] | null;
36
+ getDefaultItemIcon: (
37
+ theme: PluginConfiguration
38
+ ) => ItemIconProps["asset"] | null;
39
+ iconPlacement?: "left" | "right";
33
40
  };
34
41
 
42
+ const styles = StyleSheet.create({
43
+ container: {
44
+ maxHeight: "100%",
45
+ },
46
+ });
47
+
35
48
  export function BottomSheetModalContent(props: ModalComponentProps) {
36
49
  const {
37
50
  items,
38
51
  currentRoute,
39
- maxHeight,
40
52
  current_selection = null,
41
53
  onPress,
42
54
  dismiss,
43
55
  summary,
44
56
  title,
45
57
  buttonComponent: ButtonComponent = Button,
58
+ getSelectedItemIcon = (theme) =>
59
+ theme.modal_bottom_sheet_item_selected_icon,
60
+ getDefaultItemIcon = () => null,
61
+ iconPlacement,
46
62
  } = props;
47
63
 
48
- const [headerHeight, setHeaderHeight] = useState(0);
49
64
  const route = useRef(currentRoute);
50
65
  const theme = useTheme<BaseThemePropertiesMobile>();
51
-
52
- const maxContentHeight = maxHeight
53
- ? maxHeight - headerHeight - Number(theme.modal_bottom_sheet_padding_top)
54
- : undefined;
55
-
56
- const onHeaderLayout = useCallback((event: LayoutChangeEvent) => {
57
- setHeaderHeight(event.nativeEvent.layout.height);
58
- }, []);
66
+ const paddingTop = Number(theme.modal_bottom_sheet_padding_top);
67
+ const paddingBottom = Number(theme.modal_bottom_sheet_padding_bottom);
59
68
 
60
69
  useEffect(() => {
61
70
  if (currentRoute !== route.current) {
@@ -64,55 +73,62 @@ export function BottomSheetModalContent(props: ModalComponentProps) {
64
73
  }, [currentRoute]);
65
74
 
66
75
  const iconBaseProps = useMemo<ItemIconProps>(() => {
67
- return defaultItemIconProps(theme);
68
- }, [theme]);
76
+ return getItemIconProps(theme, props.iconProps);
77
+ }, [theme, props.iconProps]);
69
78
 
70
79
  const itemBaseProps = useMemo<ItemProps>(() => {
71
- return defaultItemProps(theme, props.width);
72
- }, [theme, props.width]);
80
+ return getItemProps(theme, props.width, props.itemProps);
81
+ }, [theme, props.width, props.itemProps]);
73
82
 
74
83
  const labelBaseProps = useMemo<ItemLabelProps>(() => {
75
- return defaultItemLabelProps(theme, props.width);
76
- }, [theme, props.width]);
84
+ return getItemLabelProps(theme, props.width, props.labelProps);
85
+ }, [theme, props.width, props.labelProps]);
86
+
87
+ const handlePress = useCallback(
88
+ (item: any) => {
89
+ onPress(item);
90
+ dismiss();
91
+ },
92
+ [onPress, dismiss]
93
+ );
77
94
 
78
- const handlePress = (item: any) => {
79
- onPress(item);
80
- dismiss();
81
- };
95
+ const bottomInset = useSafeAreaInsets().bottom;
82
96
 
83
97
  return (
84
98
  <View
85
- style={{
86
- paddingTop: Number(theme.modal_bottom_sheet_padding_top),
87
- }}
99
+ style={[
100
+ styles.container,
101
+ {
102
+ paddingTop: paddingTop,
103
+ },
104
+ ]}
88
105
  >
89
106
  <ModalHeader
90
- width={props.width}
91
107
  dismiss={dismiss}
92
108
  configuration={theme}
93
- onLayout={onHeaderLayout}
94
109
  summary={summary}
95
110
  title={title}
96
111
  />
97
112
  <ScrollView
98
- bounces={false}
99
- style={{ maxHeight: maxContentHeight }}
100
113
  contentContainerStyle={{
101
- paddingBottom: Number(theme.modal_bottom_sheet_padding_bottom),
102
- paddingTop: Number(theme.modal_bottom_sheet_padding_top),
114
+ paddingBottom:
115
+ Platform.OS === "ios" ? paddingBottom + bottomInset : paddingBottom,
103
116
  }}
104
117
  >
105
118
  {items.map((item, index) => (
106
119
  <ButtonComponent
107
120
  key={index}
108
- width={props.width}
109
121
  configuration={theme}
110
122
  selectedItem={current_selection}
111
123
  item={item}
112
124
  onPress={handlePress}
125
+ label={theme[item?.label] ?? item?.label}
113
126
  iconBaseProps={iconBaseProps}
114
127
  itemBaseProps={itemBaseProps}
115
128
  labelBaseProps={labelBaseProps}
129
+ selectedItemIcon={getSelectedItemIcon(theme)}
130
+ defaultItemIcon={getDefaultItemIcon(theme)}
131
+ iconPlacement={iconPlacement}
116
132
  />
117
133
  ))}
118
134
  </ScrollView>
@@ -5,7 +5,7 @@ export type ItemProps = {
5
5
  backgroundColor: string;
6
6
  focusedBackgroundColor: string;
7
7
  selectedBackgroundColor?: string;
8
- focusectedBackgroundColor?: string;
8
+ focusedSelectedBackgroundColor?: string;
9
9
  borderRadius: number;
10
10
  marginBottom: number;
11
11
  marginLeft: number;
@@ -15,6 +15,7 @@ export type ItemProps = {
15
15
  paddingBottom: number;
16
16
  paddingRight: number;
17
17
  paddingLeft: number;
18
+ maxWidth: number;
18
19
  focused?: boolean;
19
20
  selected?: boolean;
20
21
  children?: ReactChild[];
@@ -33,11 +34,11 @@ function getBackgroundColor({
33
34
  backgroundColor,
34
35
  focusedBackgroundColor,
35
36
  selectedBackgroundColor,
36
- focusectedBackgroundColor,
37
+ focusedSelectedBackgroundColor,
37
38
  }) {
38
39
  switch (true) {
39
40
  case selected && focused:
40
- return focusectedBackgroundColor;
41
+ return focusedSelectedBackgroundColor;
41
42
  case selected && !focused:
42
43
  return selectedBackgroundColor;
43
44
  case !selected && focused:
@@ -51,7 +52,7 @@ export function Item(props: ItemProps) {
51
52
  const {
52
53
  backgroundColor,
53
54
  focusedBackgroundColor,
54
- focusectedBackgroundColor,
55
+ focusedSelectedBackgroundColor,
55
56
  selectedBackgroundColor,
56
57
  children,
57
58
  focused,
@@ -68,7 +69,7 @@ export function Item(props: ItemProps) {
68
69
  backgroundColor: getBackgroundColor({
69
70
  selected,
70
71
  focused,
71
- focusectedBackgroundColor,
72
+ focusedSelectedBackgroundColor,
72
73
  focusedBackgroundColor,
73
74
  selectedBackgroundColor,
74
75
  backgroundColor,
@@ -1,4 +1,4 @@
1
1
  /* eslint-disable max-len */
2
2
 
3
3
  export const defaultSelectedAsset: string =
4
- "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAYAAABV7bNHAAAACXBIWXMAACE4AAAhOAFFljFgAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAGsSURBVHgB7drdaYRAFIbhk2yuBTuwlXSQDrKdrOnErSSlpATBe0nOBxEMEXV+nDnjfg8MwiK4vKjMDIoQERERERERERHRY+j7vtHxJvTfb5wvHd/DMLyLpyc5IcTRw6eOZvrtcrlcq6q6i6PTBVqKM/GJdKpAa3EmrpGe5ST2xIFxHF/FwSnuoL1x1L2u66s4KD7QkXGg6EBHx4FiA6WIA0UGShUHiguUMg4UFSh1HCgmUI44UESgXHEgaCatf/wWslLeeY1GMsWBF/GEOHpodeouGkl8Vso7rtFIxjjg9YhNcea/+W4nrFyjkcxxwDnQUpxJrEhW4oBToLU4k9BIluKA60t6M6i+kzrfF7e1OODziLV6uG2d53onWYwDvi/pViJGshoHvCeKsSJZjgNBM+nQSNbjQPBSwzdSCXEgylrMNVIpcSDaYnVvJPWhA9OAZuO87HEg6mreIdIWE3Eg+nZHhEhm4sAh+0EBkUzFgcM2zDwimYsDh+4oOkQyGQcO33LdEclsHEiyJ70SyXScpBAJX3vNRif01yxSJ7SMH1USEREREREREREV7Ad//SBSU+GIIAAAAABJRU5ErkJggg==";
4
+ "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAYAAABV7bNHAAAACXBIWXMAACE4AAAhOAFFljFgAAAA+0lEQVR4nO3a3QnCQBBF4ZRiSXZgKVqKnVnCQBpQwb0QJA752ZjszPlg3/JwOU8b2K4DAAAAAAAAkIOZnczsvPeOQypxHmb27Pv+sveeQxnG0SFSMRaHSIUXJ32kKXHKue+99e+I4yCOgzgO4jiI4yCOgzgO4jiajfMedd366t50nK3/b0LE2SpSqDi1I4WMUytSs3G6z/jbhOGLIzUdR7aKFCKO1I4UKo7UihQyjqyNFDqOLI2UIo7MjZQqjkyNVL7LFUdmRMoXRypEihtHVkSKH0cWRMoTR2ZEyhdHJkTKG0ecSMSRkUjE+TaIRJxfeFQJAAAAAAAANOwFT0Mt2UgcaMoAAAAASUVORK5CYII=";
@@ -4,11 +4,9 @@ import { Item, ItemProps } from "./Item";
4
4
  import { ItemIcon, ItemIconProps } from "./ItemIcon";
5
5
  import { ItemLabel, ItemLabelProps } from "./ItemLabel";
6
6
  import { defaultSelectedAsset } from "./assets";
7
- import * as assets from "./assets";
8
7
 
9
8
  type ButtonProps = {
10
9
  configuration: any;
11
- width: number;
12
10
  selectedItem?: any;
13
11
  item: any; // Adjust type as needed
14
12
  onPress: (item: any) => void; // Adjust type as needed
@@ -17,6 +15,9 @@ type ButtonProps = {
17
15
  labelBaseProps?: ItemLabelProps;
18
16
  disabled?: boolean;
19
17
  label?: string | Record<string, string>;
18
+ iconPlacement?: "left" | "right";
19
+ selectedItemIcon?: ItemIconProps["asset"];
20
+ defaultItemIcon?: ItemIconProps["asset"];
20
21
  };
21
22
 
22
23
  const styles = StyleSheet.create({
@@ -31,81 +32,63 @@ export function Button({
31
32
  item,
32
33
  onPress,
33
34
  configuration,
34
- width,
35
35
  iconBaseProps,
36
- itemBaseProps,
36
+ itemBaseProps: itemProps,
37
37
  labelBaseProps,
38
38
  label,
39
+ iconPlacement = "left",
40
+ defaultItemIcon,
41
+ selectedItemIcon,
39
42
  disabled = false,
40
43
  }: ButtonProps) {
41
44
  const [focused, setFocused] = useState(false);
42
45
 
43
- const selected = useMemo(
44
- () => selectedItem && item.value === selectedItem?.value,
45
- [selectedItem, selectedItem]
46
- );
47
-
48
- const itemProps = useMemo<ItemProps>(
49
- () => ({
50
- ...itemBaseProps,
51
- width,
52
- }),
53
- [configuration, width]
54
- );
46
+ const selected = selectedItem && item.value === selectedItem?.value;
55
47
 
56
- const itemIconProps = useMemo<ItemIconProps>(
57
- () => ({
58
- ...iconBaseProps,
59
- asset: configuration[item.asset] ?? assets[item.asset] ?? item.asset,
60
- }),
61
- [configuration, item.asset]
48
+ const itemIconPropsAssets = useMemo<ItemIconProps["asset"]>(
49
+ () => configuration[item.asset] ?? item.asset ?? defaultItemIcon,
50
+ [item.asset, defaultItemIcon]
62
51
  );
63
52
 
64
- const selectedItemIconProps = useMemo<ItemIconProps>(
65
- () => ({
66
- ...iconBaseProps,
67
- asset:
68
- configuration["modal_bottom_sheet_item_selected_icon"] ||
69
- defaultSelectedAsset,
70
- marginRight: 10,
71
- }),
72
- [configuration]
53
+ const selectedItemIconPropsAssets = useMemo<ItemIconProps["asset"]>(
54
+ () => selectedItemIcon || defaultSelectedAsset,
55
+ [selectedItemIcon]
73
56
  );
74
57
 
75
- const itemLabelProps = useMemo<ItemLabelProps>(
76
- () => ({
77
- ...labelBaseProps,
78
- label: label ?? configuration[item?.label] ?? item?.label ?? null,
79
- }),
80
- [configuration, item?.label]
81
- );
58
+ const renderItemIcon =
59
+ itemIconPropsAssets && itemIconPropsAssets.length > 0 ? (
60
+ <ItemIcon {...iconBaseProps} asset={itemIconPropsAssets} />
61
+ ) : null;
82
62
 
83
63
  if (disabled) return null;
84
64
 
85
65
  return (
86
- <View style={{ maxWidth: width }}>
87
- <TouchableOpacity
88
- activeOpacity={1}
89
- onPress={() => onPress(item)}
90
- onPressIn={() => setFocused(true)}
91
- onPressOut={() => setFocused(false)}
92
- >
93
- <Item {...itemProps} focused={focused} selected={selected}>
94
- <View style={styles.label_icon_container}>
95
- {itemIconProps.asset && itemIconProps.asset.length > 0 && (
96
- <ItemIcon {...itemIconProps} />
97
- )}
98
- {itemLabelProps.label && (
99
- <ItemLabel
100
- {...itemLabelProps}
101
- focused={focused}
102
- selected={selected}
103
- />
104
- )}
105
- </View>
106
- {selected && <ItemIcon {...selectedItemIconProps} />}
107
- </Item>
108
- </TouchableOpacity>
109
- </View>
66
+ <TouchableOpacity
67
+ activeOpacity={1}
68
+ onPress={() => onPress(item)}
69
+ onPressIn={() => setFocused(true)}
70
+ onPressOut={() => setFocused(false)}
71
+ >
72
+ <Item {...itemProps} focused={focused} selected={selected}>
73
+ <View style={styles.label_icon_container}>
74
+ {iconPlacement === "left" && renderItemIcon}
75
+
76
+ {label ? (
77
+ <ItemLabel
78
+ {...labelBaseProps}
79
+ label={label ?? null}
80
+ focused={focused}
81
+ selected={selected}
82
+ />
83
+ ) : null}
84
+ </View>
85
+
86
+ {selected ? (
87
+ <ItemIcon {...iconBaseProps} asset={selectedItemIconPropsAssets} />
88
+ ) : (
89
+ iconPlacement === "right" && renderItemIcon
90
+ )}
91
+ </Item>
92
+ </TouchableOpacity>
110
93
  );
111
94
  }
@@ -1,5 +1,5 @@
1
1
  import React, { useMemo } from "react";
2
- import { View, StyleSheet, LayoutChangeEvent } from "react-native";
2
+ import { LayoutChangeEvent, StyleSheet, View } from "react-native";
3
3
  import { Title, TitleProps } from "./Title";
4
4
  import { CloseButton, CloseButtonProps } from "./CloseButton";
5
5
  import { getCloseButtonProps, getTitleProps } from "./utils";
@@ -8,13 +8,18 @@ import { PluginConfiguration } from "../index";
8
8
  type Props = {
9
9
  dismiss: () => void;
10
10
  configuration: PluginConfiguration;
11
- width: number;
12
11
  onLayout?: (event: LayoutChangeEvent) => void;
13
12
  summary?: string;
14
13
  title?: string;
15
14
  };
16
15
 
17
16
  const styles = StyleSheet.create({
17
+ noFlex: {
18
+ flex: 0,
19
+ },
20
+ flex: {
21
+ flex: 1,
22
+ },
18
23
  container: {
19
24
  flexDirection: "row",
20
25
  alignItems: "center",
@@ -22,7 +27,7 @@ const styles = StyleSheet.create({
22
27
  });
23
28
 
24
29
  export function ModalHeader(props: Props) {
25
- const { configuration, dismiss, width, onLayout, summary, title } = props;
30
+ const { configuration, dismiss, onLayout, summary, title } = props;
26
31
 
27
32
  const closeButtonProps = useMemo<CloseButtonProps>(
28
33
  () => ({
@@ -55,15 +60,11 @@ export function ModalHeader(props: Props) {
55
60
 
56
61
  return (
57
62
  <View onLayout={onLayout} style={styles.container}>
58
- <View
59
- style={{
60
- width: width - buttonsContainerWidth,
61
- }}
62
- >
63
- {title && <Title {...titleProps} />}
64
- {summary && <Title {...summaryProps} />}
63
+ <View style={styles.flex}>
64
+ {title ? <Title {...titleProps} /> : null}
65
+ {summary ? <Title {...summaryProps} /> : null}
65
66
  </View>
66
- <View style={{ width: buttonsContainerWidth }}>
67
+ <View style={[styles.noFlex, { width: buttonsContainerWidth }]}>
67
68
  <CloseButton {...closeButtonProps} />
68
69
  </View>
69
70
  </View>
@@ -1,15 +1,18 @@
1
1
  import { platformSelect } from "@applicaster/zapp-react-native-utils/reactUtils";
2
- import { PluginConfiguration } from "./index";
2
+ import { PluginConfiguration } from "./";
3
+ import { ItemIconProps } from "./Button/ItemIcon";
4
+ import { ItemLabelProps } from "./Button/ItemLabel";
5
+ import { ItemProps } from "./Button/Item";
3
6
 
4
7
  export function defaultItemProps(
5
8
  config: PluginConfiguration,
6
9
  maxWidth: number
7
- ) {
10
+ ): ItemProps {
8
11
  const {
9
12
  modal_bottom_sheet_item_background_color,
10
13
  modal_bottom_sheet_item_focus_background_color,
11
14
  modal_bottom_sheet_item_selected_background_color,
12
- modal_bottom_sheet_item_focusected_background_color,
15
+ modal_bottom_sheet_item_focused_selected_background_color,
13
16
  modal_bottom_sheet_item_corner_radius,
14
17
  modal_bottom_sheet_item_margin_bottom,
15
18
  modal_bottom_sheet_item_margin_left,
@@ -25,8 +28,8 @@ export function defaultItemProps(
25
28
  backgroundColor: modal_bottom_sheet_item_background_color,
26
29
  focusedBackgroundColor: modal_bottom_sheet_item_focus_background_color,
27
30
  selectedBackgroundColor: modal_bottom_sheet_item_selected_background_color,
28
- focusectedBackgroundColor:
29
- modal_bottom_sheet_item_focusected_background_color,
31
+ focusedSelectedBackgroundColor:
32
+ modal_bottom_sheet_item_focused_selected_background_color,
30
33
  borderRadius: modal_bottom_sheet_item_corner_radius,
31
34
  marginBottom: modal_bottom_sheet_item_margin_bottom,
32
35
  marginTop: modal_bottom_sheet_item_margin_top,
@@ -43,7 +46,7 @@ export function defaultItemProps(
43
46
  export function defaultItemLabelProps(
44
47
  config: PluginConfiguration,
45
48
  sheetWidth: number
46
- ) {
49
+ ): ItemLabelProps {
47
50
  const {
48
51
  modal_bottom_sheet_item_label_android_letter_spacing,
49
52
  modal_bottom_sheet_item_label_ios_letter_spacing,
@@ -103,7 +106,9 @@ export function defaultItemLabelProps(
103
106
  };
104
107
  }
105
108
 
106
- export function defaultItemIconProps(config: PluginConfiguration) {
109
+ export function defaultItemIconProps(
110
+ config: PluginConfiguration
111
+ ): ItemIconProps {
107
112
  const {
108
113
  modal_bottom_sheet_item_icon_height,
109
114
  modal_bottom_sheet_item_icon_width,
@@ -124,3 +129,46 @@ export function defaultItemIconProps(config: PluginConfiguration) {
124
129
  marginRight: modal_bottom_sheet_item_icon_margin_right,
125
130
  };
126
131
  }
132
+
133
+ export function getItemIconProps(
134
+ theme: PluginConfiguration,
135
+ iconProps?: ((theme: PluginConfiguration) => ItemIconProps) | ItemIconProps
136
+ ) {
137
+ if (iconProps) {
138
+ return typeof iconProps === "function" ? iconProps(theme) : iconProps;
139
+ }
140
+
141
+ return defaultItemIconProps(theme);
142
+ }
143
+
144
+ export function getItemLabelProps(
145
+ theme: PluginConfiguration,
146
+ width: number,
147
+ labelProps?:
148
+ | ((theme: PluginConfiguration, width: number) => ItemLabelProps)
149
+ | ItemLabelProps
150
+ ) {
151
+ if (labelProps) {
152
+ return typeof labelProps === "function"
153
+ ? labelProps(theme, width)
154
+ : labelProps;
155
+ }
156
+
157
+ return defaultItemLabelProps(theme, width);
158
+ }
159
+
160
+ export function getItemProps(
161
+ theme: PluginConfiguration,
162
+ width: number,
163
+ itemProps?:
164
+ | ((theme: PluginConfiguration, width: number) => ItemProps)
165
+ | ItemProps
166
+ ) {
167
+ if (itemProps) {
168
+ return typeof itemProps === "function"
169
+ ? itemProps(theme, width)
170
+ : itemProps;
171
+ }
172
+
173
+ return defaultItemProps(theme, width);
174
+ }
@@ -90,7 +90,7 @@ export const NotificationView = (props: Props) => {
90
90
  return (
91
91
  <div onClick={onClose}>
92
92
  {children}
93
- {open && (
93
+ {open ? (
94
94
  <div style={styles.body}>
95
95
  <div style={styles.title}>
96
96
  <h2>{MSG}</h2>
@@ -98,7 +98,7 @@ export const NotificationView = (props: Props) => {
98
98
 
99
99
  <h4 style={styles.subtitle}>{EXTRA_MSG}</h4>
100
100
  </div>
101
- )}
101
+ ) : null}
102
102
  </div>
103
103
  );
104
104
  };
@@ -85,7 +85,7 @@ export const NotificationView = (props: Props) => {
85
85
  return (
86
86
  <div onClick={onClose}>
87
87
  {children}
88
- {shown && (
88
+ {shown ? (
89
89
  <div style={styles.body}>
90
90
  <div style={styles.title}>
91
91
  <h2>{title}</h2>
@@ -93,7 +93,7 @@ export const NotificationView = (props: Props) => {
93
93
 
94
94
  <h4 style={styles.subtitle}>{subtitle}</h4>
95
95
  </div>
96
- )}
96
+ ) : null}
97
97
  </div>
98
98
  );
99
99
  };
@@ -1,7 +1,6 @@
1
1
  import React from "react";
2
2
  import { Text, Animated } from "react-native";
3
3
 
4
- import { shallow } from "enzyme";
5
4
  import renderer from "react-test-renderer";
6
5
 
7
6
  jest.useFakeTimers();
@@ -40,10 +39,6 @@ const {
40
39
  } = require("../NotificationView");
41
40
 
42
41
  describe("NotificationView", () => {
43
- it("renders", () => {
44
- shallow(<NotificationView dismiss={dismiss} />);
45
- });
46
-
47
42
  it("Show online message when Online", () => {
48
43
  const component = renderer.create(
49
44
  <NotificationView online dismiss={dismiss} />
@@ -57,7 +57,7 @@ export const useNotificationHeight = () => {
57
57
 
58
58
  const navBarHeight = platformSelect({ ios: 44, android: 56 });
59
59
 
60
- const statusHeight = Platform.OS === "android" ? 0 : insets.top;
60
+ const statusHeight = insets.top;
61
61
  const notificationHeight = statusHeight + navBarHeight;
62
62
 
63
63
  return { statusHeight, notificationHeight };