@applicaster/zapp-react-native-ui-components 13.0.0-alpha.2245033574 → 13.0.0-alpha.2308533304

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 (153) hide show
  1. package/Components/AppContainer/__tests__/AppContainer.test.js +4 -6
  2. package/Components/AudioPlayer/AudioPlayer.tsx +7 -0
  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 -0
  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/useEventAlerts.ts +30 -0
  37. package/Components/HandlePlayable/HandlePlayable.tsx +21 -27
  38. package/Components/Layout/TV/LayoutBackground.tsx +28 -0
  39. package/Components/Layout/TV/NavBarContainer.tsx +19 -23
  40. package/Components/Layout/TV/ScreenContainer.tsx +8 -2
  41. package/Components/Layout/TV/ScreenLayoutContextProvider.tsx +5 -0
  42. package/Components/Layout/TV/__tests__/ScreenContainer.test.tsx +2 -1
  43. package/Components/Layout/TV/__tests__/__snapshots__/NavBarContainer.test.tsx.snap +3 -2
  44. package/Components/Layout/TV/__tests__/__snapshots__/ScreenContainer.test.tsx.snap +3 -2
  45. package/Components/Layout/TV/__tests__/__snapshots__/index.test.tsx.snap +15 -10
  46. package/Components/Layout/TV/__tests__/index.test.tsx +8 -2
  47. package/Components/Layout/TV/index.tsx +6 -20
  48. package/Components/Layout/TV/index.web.tsx +4 -1
  49. package/Components/MasterCell/DefaultComponents/ActionButton.tsx +2 -3
  50. package/Components/MasterCell/DefaultComponents/Image/Image.ios.tsx +4 -3
  51. package/Components/MasterCell/DefaultComponents/Image/hooks/useImage.ts +11 -7
  52. package/Components/MasterCell/DefaultComponents/LiveImage/index.tsx +2 -2
  53. package/Components/MasterCell/DefaultComponents/tv/TvActionButtons/const.ts +3 -0
  54. package/Components/MasterCell/DefaultComponents/tv/TvActionButtons/index.ts +6 -6
  55. package/Components/MasterCell/SharedUI/ProgressBar/hooks/useFillInPercent.ts +2 -8
  56. package/Components/MasterCell/__tests__/__snapshots__/elementMapper.test.js.snap +4 -12
  57. package/Components/MasterCell/__tests__/__snapshots__/masterCell.test.js.snap +0 -229
  58. package/Components/MasterCell/__tests__/elementMapper.test.js +18 -5
  59. package/Components/MasterCell/__tests__/masterCell.test.js +26 -26
  60. package/Components/MasterCell/hooks/useAsyncRendering/MasterCellAsyncRenderManager.ts +2 -2
  61. package/Components/MasterCell/utils/behaviorProvider.ts +136 -0
  62. package/Components/MasterCell/utils/index.ts +8 -134
  63. package/Components/ModalComponent/BottomSheetModalContent.tsx +81 -66
  64. package/Components/ModalComponent/Button/Item.tsx +6 -5
  65. package/Components/ModalComponent/Button/assets.ts +1 -1
  66. package/Components/ModalComponent/Button/index.tsx +45 -62
  67. package/Components/ModalComponent/Header/index.tsx +9 -8
  68. package/Components/ModalComponent/utils.ts +55 -7
  69. package/Components/OfflineHandler/NotificationView/NotificationView.lg.tsx +2 -2
  70. package/Components/OfflineHandler/NotificationView/NotificationView.samsung.tsx +2 -2
  71. package/Components/OfflineHandler/NotificationView/__tests__/index.test.tsx +0 -5
  72. package/Components/OfflineHandler/utils/index.ts +1 -1
  73. package/Components/PlayerContainer/PlayerContainer.tsx +40 -14
  74. package/Components/PlayerContainer/ProgramInfo/index.tsx +2 -2
  75. package/Components/PlayerImageBackground/index.tsx +1 -1
  76. package/Components/River/ComponentsMap/ComponentsMap.tsx +42 -65
  77. package/Components/River/ComponentsMap/hooks/useLoadingState.ts +78 -51
  78. package/Components/River/RiverFooter.tsx +39 -9
  79. package/Components/River/RiverItem.tsx +39 -3
  80. package/Components/River/TV/index.tsx +6 -1
  81. package/Components/River/__tests__/__snapshots__/componentsMap.test.js.snap +100 -31
  82. package/Components/River/__tests__/__snapshots__/river.test.js.snap +20 -82
  83. package/Components/River/__tests__/componentsMap.test.js +3 -4
  84. package/Components/River/__tests__/river.test.js +75 -40
  85. package/Components/RouteManager/__tests__/__snapshots__/routeManager.test.js.snap +11 -4
  86. package/Components/RouteManager/__tests__/routeManager.test.js +29 -14
  87. package/Components/RouteManager/__tests__/testId.test.js +8 -6
  88. package/Components/Screen/TV/index.web.tsx +5 -6
  89. package/Components/Screen/hooks.ts +53 -0
  90. package/Components/Screen/index.tsx +16 -43
  91. package/Components/ScreenResolver/__tests__/screenResolver.test.js +91 -70
  92. package/Components/Tabs/Tab.tsx +5 -3
  93. package/Components/TextInputTv/index.tsx +2 -1
  94. package/Components/TopMarginApplicator/TopMarginApplicator.tsx +2 -3
  95. package/Components/TrackedView/index.tsx +1 -0
  96. package/Components/Transitioner/AnimationManager.js +15 -15
  97. package/Components/Transitioner/Scene.tsx +1 -1
  98. package/Components/Transitioner/Transitioner.tsx +3 -3
  99. package/Components/Transitioner/__tests__/Scene.test.js +25 -14
  100. package/Components/Transitioner/__tests__/__snapshots__/Scene.test.js.snap +12 -68
  101. package/Components/Transitioner/__tests__/__snapshots__/transitioner.test.js.snap +2 -2
  102. package/Components/Transitioner/__tests__/transitioner.test.js +13 -4
  103. package/Components/VideoLive/PlayerLiveImageComponent.tsx +7 -3
  104. package/Components/VideoLive/__tests__/__snapshots__/PlayerLiveImageComponent.test.tsx.snap +1 -0
  105. package/Components/VideoModal/ModalAnimation/AnimatedPlayerModalWrapper.tsx +1 -1
  106. package/Components/VideoModal/ModalAnimation/AnimatedScrollModal.tsx +46 -30
  107. package/Components/VideoModal/ModalAnimation/AnimatedVideoPlayerComponent.tsx +3 -3
  108. package/Components/VideoModal/ModalAnimation/AnimationComponent.tsx +45 -20
  109. package/Components/VideoModal/ModalAnimation/ModalAnimationContext.tsx +12 -6
  110. package/Components/VideoModal/ModalAnimation/__tests__/getMoveUpValue.test.ts +108 -0
  111. package/Components/VideoModal/ModalAnimation/const.ts +5 -0
  112. package/Components/VideoModal/ModalAnimation/index.ts +2 -0
  113. package/Components/VideoModal/ModalAnimation/utils.ts +36 -0
  114. package/Components/VideoModal/PlayerDetails.tsx +18 -10
  115. package/Components/VideoModal/PlayerWrapper.tsx +28 -5
  116. package/Components/VideoModal/VideoModal.tsx +19 -4
  117. package/Components/VideoModal/__tests__/__snapshots__/PlayerDetails.test.tsx.snap +2 -40
  118. package/Components/VideoModal/utils.ts +3 -4
  119. package/Components/Viewport/ViewportAware/__tests__/__snapshots__/viewportAware.test.js.snap +24 -36
  120. package/Components/Viewport/ViewportAware/__tests__/viewportAware.test.js +12 -18
  121. package/Components/Viewport/__tests__/utils.test.js +5 -4
  122. package/Components/ZappUIComponent/Placeholder.tsx +3 -1
  123. package/Components/ZappUIComponent/__tests__/{ZappUIComponent.test.js → ZappUIComponent.test.tsx} +26 -10
  124. package/Components/ZappUIComponent/index.tsx +4 -17
  125. package/Components/default-cell-renderer/__tests__/defaultCellRenderer.test.tsx +20 -17
  126. package/Components/default-cell-renderer/viewTrees/tv/DefaultCell/__tests__/DefaultCell.test.tsx +15 -11
  127. package/Contexts/ComponentsMapOffsetContext/index.tsx +49 -0
  128. package/Contexts/FocusableGroupContext/withFocusableContext.tsx +4 -10
  129. package/Contexts/HeaderOffsetContext/index.tsx +4 -6
  130. package/Contexts/ScreenContext/index.tsx +3 -10
  131. package/Contexts/ScreenLayoutContext/index.tsx +5 -3
  132. package/Decorators/Navigator/__tests__/navigator.test.js +16 -16
  133. package/Decorators/Navigator/index.tsx +1 -1
  134. package/Decorators/RiverResolver/__tests__/riverResolver.test.tsx +18 -24
  135. package/Decorators/RiverResolver/index.tsx +6 -8
  136. package/Decorators/ZappPipesDataConnector/__tests__/zappPipesDataConnector.test.js +29 -22
  137. package/Decorators/ZappPipesDataConnector/index.tsx +4 -30
  138. package/package.json +7 -11
  139. package/tsconfig.json +2 -3
  140. package/.babelrc +0 -8
  141. package/Components/Cell/CellStyles/FallbackCellStyle/index.js +0 -157
  142. package/Components/Cell/CellStyles/Hero/index.js +0 -111
  143. package/Components/Cell/CellStyles/ScreenSelector/index.js +0 -68
  144. package/Components/Cell/CellStyles/cellStylesResolver.ts +0 -19
  145. package/Components/Cell/CellStyles/colors.js +0 -40
  146. package/Components/Cell/CellStyles/index.js +0 -15
  147. package/Components/CellRendererResolver/__tests__/__snapshots__/cellRendererResolver.test.js.snap +0 -53
  148. package/Components/RouteManager/__tests__/__snapshots__/testId.test.js.snap +0 -17
  149. package/Components/ScreenResolver/__tests__/__snapshots__/screenResolver.test.js.snap +0 -17
  150. package/Components/ZappUIComponent/__tests__/__snapshots__/ZappUIComponent.test.js.snap +0 -91
  151. package/Components/default-cell-renderer/__tests__/__snapshots__/defaultCellRenderer.test.tsx.snap +0 -338
  152. package/Decorators/Navigator/__tests__/__snapshots__/navigator.test.js.snap +0 -18
  153. 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 } 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 { SafeAreaView } 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
+ height: "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,58 +73,64 @@ 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]);
77
86
 
78
- const handlePress = (item: any) => {
79
- onPress(item);
80
- dismiss();
81
- };
87
+ const handlePress = useCallback(
88
+ (item: any) => {
89
+ onPress(item);
90
+ dismiss();
91
+ },
92
+ [onPress, dismiss]
93
+ );
82
94
 
83
95
  return (
84
96
  <View
85
- style={{
86
- paddingTop: Number(theme.modal_bottom_sheet_padding_top),
87
- }}
97
+ style={[
98
+ styles.container,
99
+ {
100
+ paddingTop,
101
+ },
102
+ ]}
88
103
  >
89
- <ModalHeader
90
- width={props.width}
91
- dismiss={dismiss}
92
- configuration={theme}
93
- onLayout={onHeaderLayout}
94
- summary={summary}
95
- title={title}
96
- />
97
- <ScrollView
98
- bounces={false}
99
- style={{ maxHeight: maxContentHeight }}
100
- contentContainerStyle={{
101
- paddingBottom: Number(theme.modal_bottom_sheet_padding_bottom),
102
- paddingTop: Number(theme.modal_bottom_sheet_padding_top),
103
- }}
104
- >
105
- {items.map((item, index) => (
106
- <ButtonComponent
107
- key={index}
108
- width={props.width}
109
- configuration={theme}
110
- selectedItem={current_selection}
111
- item={item}
112
- onPress={handlePress}
113
- iconBaseProps={iconBaseProps}
114
- itemBaseProps={itemBaseProps}
115
- labelBaseProps={labelBaseProps}
116
- />
117
- ))}
118
- </ScrollView>
104
+ <SafeAreaView edges={["left", "right", "bottom"]}>
105
+ <ModalHeader
106
+ dismiss={dismiss}
107
+ configuration={theme}
108
+ summary={summary}
109
+ title={title}
110
+ />
111
+ <ScrollView
112
+ contentContainerStyle={{
113
+ paddingBottom,
114
+ }}
115
+ >
116
+ {items.map((item, index) => (
117
+ <ButtonComponent
118
+ key={index}
119
+ configuration={theme}
120
+ selectedItem={current_selection}
121
+ item={item}
122
+ onPress={handlePress}
123
+ label={theme[item?.label] ?? item?.label}
124
+ iconBaseProps={iconBaseProps}
125
+ itemBaseProps={itemBaseProps}
126
+ labelBaseProps={labelBaseProps}
127
+ selectedItemIcon={getSelectedItemIcon(theme)}
128
+ defaultItemIcon={getDefaultItemIcon(theme)}
129
+ iconPlacement={iconPlacement}
130
+ />
131
+ ))}
132
+ </ScrollView>
133
+ </SafeAreaView>
119
134
  </View>
120
135
  );
121
136
  }
@@ -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
  }
@@ -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
+ <View style={styles.flex}>
63
64
  {title ? <Title {...titleProps} /> : null}
64
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 };