@applicaster/quick-brick-core 13.0.0-alpha.6400875052 → 13.0.0-alpha.6444233049

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.
@@ -300,7 +300,6 @@ export class DraggableBottomSheet extends Component<Props, ComponentState> {
300
300
  simultaneousHandlers={this.drawer}
301
301
  >
302
302
  <Animated.ScrollView
303
- style={{ marginBottom: this._snapPoints.top }}
304
303
  bounces={false}
305
304
  onScrollBeginDrag={this._onRegisterLastScroll}
306
305
  scrollEventThrottle={1}
@@ -1,21 +1,33 @@
1
1
  import React from "react";
2
- import { StyleSheet, View } from "react-native";
2
+ import { LayoutChangeEvent, Platform, StyleSheet, View } from "react-native";
3
3
 
4
4
  import { Handle, HandleProps } from "./Handle";
5
5
  import { DraggableBottomSheet } from "./DraggableBottomSheet";
6
+ import {
7
+ SafeAreaView,
8
+ useSafeAreaFrame,
9
+ useSafeAreaInsets,
10
+ } from "react-native-safe-area-context";
11
+ import {
12
+ isAndroidPlatform,
13
+ isAndroidVersionAtLeast,
14
+ platformSelect,
15
+ } from "@applicaster/zapp-react-native-utils/reactUtils";
6
16
 
7
17
  type Props = {
8
18
  children: React.ReactChild;
9
19
  backgroundColor: string;
10
20
  cornerRadius: number;
11
- contentHeight: number;
12
21
  maxHeight: number;
13
22
  maxWidth: number;
14
23
  visible: boolean;
15
24
  handleProps: HandleProps;
16
25
  closeToast: () => void;
17
- dimensions: { width: number; height: number };
18
- paddingBottom: number;
26
+ dimensions: {
27
+ statusBarHeight: any;
28
+ width: number;
29
+ height: number;
30
+ };
19
31
  };
20
32
 
21
33
  const styles = StyleSheet.create({
@@ -25,6 +37,32 @@ const styles = StyleSheet.create({
25
37
  },
26
38
  });
27
39
 
40
+ const defaultBottomOffset = platformSelect({
41
+ ios: 34,
42
+ android: 0,
43
+ });
44
+
45
+ const getSheetHeight = ({ height, bottomOffset, maxHeight }) => {
46
+ return platformSelect({
47
+ ios: height - bottomOffset,
48
+ default:
49
+ (height || maxHeight) -
50
+ (!isAndroidVersionAtLeast(35) && isAndroidPlatform() ? bottomOffset : 0),
51
+ });
52
+ };
53
+
54
+ const useGetSheetHeight = (height, maxHeight) => {
55
+ const { bottom = defaultBottomOffset } = useSafeAreaInsets();
56
+
57
+ const bottomOffset = bottom;
58
+
59
+ return getSheetHeight({
60
+ height,
61
+ bottomOffset,
62
+ maxHeight,
63
+ });
64
+ };
65
+
28
66
  export function ModalBottomSheetFrame(props: Props) {
29
67
  const {
30
68
  children,
@@ -34,31 +72,50 @@ export function ModalBottomSheetFrame(props: Props) {
34
72
  maxWidth,
35
73
  visible,
36
74
  handleProps,
37
- contentHeight,
38
75
  dimensions,
39
- paddingBottom,
40
76
  } = props;
41
77
 
78
+ const safeAreaDims = useSafeAreaFrame();
79
+
42
80
  const extraStyles = {
43
81
  backgroundColor,
44
82
  borderTopLeftRadius: cornerRadius,
45
83
  borderTopRightRadius: cornerRadius,
46
84
  maxHeight,
47
- paddingBottom,
48
- maxWidth: Math.min(Number(maxWidth), dimensions.width),
85
+ maxWidth: Math.min(Number(maxWidth), safeAreaDims.width),
86
+ };
87
+
88
+ const [height, setHeight] = React.useState(0);
89
+
90
+ const onLayout = (event: LayoutChangeEvent) => {
91
+ const { height } = event.nativeEvent.layout;
92
+
93
+ if (height !== 0) {
94
+ setHeight((oldHeight) => oldHeight || height);
95
+ }
49
96
  };
50
97
 
98
+ const { bottom = defaultBottomOffset } = useSafeAreaInsets();
99
+
100
+ const sheetHeight = useGetSheetHeight(height, maxHeight);
101
+
51
102
  return (
52
103
  <DraggableBottomSheet
53
- sheetHeight={contentHeight}
54
- visible={visible}
104
+ sheetHeight={sheetHeight}
105
+ visible={height > 0 && visible}
55
106
  dismiss={props.closeToast}
56
107
  hasHeader={handleProps.enabled}
57
108
  header={(dragging) => <Handle {...handleProps} focused={dragging} />}
58
109
  maxWidth={maxWidth}
59
110
  {...dimensions}
111
+ height={safeAreaDims.height - (Platform.OS === "ios" ? bottom : 0)}
60
112
  >
61
- <View style={[styles.toastFrameContainer, extraStyles]}>{children}</View>
113
+ <SafeAreaView
114
+ edges={["left", "right", "bottom"]}
115
+ style={[styles.toastFrameContainer, extraStyles]}
116
+ >
117
+ <View onLayout={onLayout}>{children}</View>
118
+ </SafeAreaView>
62
119
  </DraggableBottomSheet>
63
120
  );
64
121
  }
@@ -1,9 +1,7 @@
1
1
  /// <reference types="@applicaster/applicaster-types" />
2
2
  import { useTheme } from "@applicaster/zapp-react-native-utils/theme";
3
- import { platformSelect } from "@applicaster/zapp-react-native-utils/reactUtils";
4
- import { useSafeAreaInsets } from "react-native-safe-area-context";
5
3
 
6
- import React, { useCallback, useEffect, useMemo, useState } from "react";
4
+ import React, { useCallback, useEffect, useState } from "react";
7
5
  import { Keyboard, StyleSheet, View } from "react-native";
8
6
 
9
7
  import { Overlay } from "./Overlay";
@@ -29,61 +27,38 @@ type Props = {
29
27
  modalBottomSheetContentProps: Record<string, any>;
30
28
  };
31
29
 
32
- const defaultBottomOffset = platformSelect({
33
- ios: 34,
34
- android: 0,
35
- });
36
-
37
30
  export function ModalBottomSheet(props: Props) {
38
31
  const theme = useTheme<BaseThemePropertiesMobile>();
39
32
  const navigator = useNavigation();
40
33
  const dimensions = useDimensions();
41
- const [sheetHeight, setSheetHeight] = useState(0);
42
34
  const [visible, setVisible] = useState(true);
43
- const dismiss = () => setVisible(false);
44
- const { bottom = defaultBottomOffset } = useSafeAreaInsets();
45
-
46
- const bottomOffset = bottom + dimensions.statusBarHeight;
47
35
 
48
36
  const {
49
37
  modal_bottom_sheet_background_color: sheetBackgroundColor,
50
38
  modal_bottom_sheet_overlay_color: sheetOverlayColor,
51
39
  modal_bottom_sheet_top_corner_radius: sheetCornerRadius,
52
- modal_bottom_sheet_max_height: sheetMaxHeight,
53
40
  modal_bottom_sheet_handle: sheetHandleEnabled,
54
41
  modal_bottom_sheet_handle_color: sheetHandleColor,
55
42
  modal_bottom_sheet_handle_focus_color: sheetHandleFocusedColor,
56
43
  modal_bottom_sheet_tablet_max_width: sheetTabletMaxWidth,
57
44
  } = theme;
58
45
 
46
+ const sheetMaxHeight = dimensions.height * 0.75; // Set a default max height
47
+
59
48
  const {
60
49
  ModalBottomSheetContent = ModalComponent,
61
50
  modalBottomSheetContentProps,
62
51
  } = props;
63
52
 
64
- const onLayout = useCallback(({ nativeEvent }) => {
65
- const calculatedHeight = nativeEvent?.layout?.height;
66
-
67
- if (calculatedHeight > 0 && sheetHeight === 0) {
68
- setSheetHeight(Math.min(calculatedHeight, sheetMaxHeight));
69
- }
70
- }, []);
71
-
72
53
  useEffect(() => {
73
54
  Keyboard.dismiss();
74
55
  }, []);
75
56
 
76
- const isTablet = useIsTablet();
57
+ const dismiss = useCallback(() => setVisible(false), []);
77
58
 
78
- const maxWidth = useMemo(
79
- () =>
80
- isTablet
81
- ? Math.max(sheetTabletMaxWidth, dimensions.width)
82
- : dimensions.width,
83
- [isTablet]
84
- );
59
+ const isTablet = useIsTablet();
85
60
 
86
- const modalVisible = visible && sheetHeight > 0;
61
+ const maxWidth = isTablet ? sheetTabletMaxWidth : dimensions.width;
87
62
 
88
63
  return (
89
64
  <View style={styles.container}>
@@ -95,12 +70,10 @@ export function ModalBottomSheet(props: Props) {
95
70
  <ModalBottomSheetFrame
96
71
  backgroundColor={sheetBackgroundColor}
97
72
  cornerRadius={sheetCornerRadius}
98
- contentHeight={sheetHeight + bottomOffset}
99
- maxHeight={sheetMaxHeight + bottomOffset}
100
- paddingBottom={bottomOffset}
73
+ maxHeight={sheetMaxHeight}
101
74
  maxWidth={maxWidth}
102
75
  dimensions={dimensions}
103
- visible={modalVisible}
76
+ visible={visible}
104
77
  closeToast={dismiss}
105
78
  handleProps={{
106
79
  enabled: sheetHandleEnabled,
@@ -108,18 +81,15 @@ export function ModalBottomSheet(props: Props) {
108
81
  focusedColor: sheetHandleFocusedColor,
109
82
  }}
110
83
  >
111
- <View onLayout={onLayout}>
112
- <ModalBottomSheetContent
113
- width={
114
- Math.min(sheetTabletMaxWidth, dimensions.width) ||
115
- dimensions.width
116
- }
117
- maxHeight={sheetMaxHeight}
118
- {...modalBottomSheetContentProps}
119
- dismiss={dismiss}
120
- currentRoute={navigator.currentRoute}
121
- />
122
- </View>
84
+ <ModalBottomSheetContent
85
+ width={
86
+ Math.min(sheetTabletMaxWidth, dimensions.width) || dimensions.width
87
+ }
88
+ maxHeight={sheetMaxHeight}
89
+ {...modalBottomSheetContentProps}
90
+ dismiss={dismiss}
91
+ currentRoute={navigator.currentRoute}
92
+ />
123
93
  </ModalBottomSheetFrame>
124
94
  </View>
125
95
  );
@@ -1,7 +1,7 @@
1
1
  import * as React from "react";
2
2
  import { Modal, ModalProps } from "react-native";
3
3
 
4
- type Props = {
4
+ type Props = ModalProps & {
5
5
  children: React.ReactChild;
6
6
  ModalContainer?: React.FC<ModalProps> | React.ComponentClass<ModalProps>;
7
7
  visible: boolean;
@@ -40,7 +40,11 @@ export function ModalProvider() {
40
40
  return (
41
41
  <PathnameContext.Provider value={pathname}>
42
42
  <ScreenContextProvider pathname={pathname}>
43
- <ModalPresenter visible={shouldShowModal} {...modalState?.options}>
43
+ <ModalPresenter
44
+ visible={shouldShowModal}
45
+ {...modalState?.options}
46
+ statusBarTranslucent
47
+ >
44
48
  <ModalChildrenWrapper>
45
49
  <ModalContent modalScreenProps={modalScreenProps} />
46
50
  </ModalChildrenWrapper>
@@ -58,7 +58,10 @@ import {
58
58
  legacyScreenData,
59
59
  openExternalUrl,
60
60
  } from "./utils";
61
- import { debounce } from "@applicaster/zapp-react-native-utils/functionUtils";
61
+ import {
62
+ debounce,
63
+ getJsonReplacer,
64
+ } from "@applicaster/zapp-react-native-utils/functionUtils";
62
65
 
63
66
  import { findParent } from "@applicaster/zapp-react-native-ui-components/Contexts/ZappPipesContext/ZappPipesEntryContext";
64
67
  import { ZappPipesEntryContext } from "@applicaster/zapp-react-native-ui-components/Contexts";
@@ -722,8 +725,8 @@ export function NavigationProvider({ children }: Props) {
722
725
  getNestedEntry,
723
726
  key: state?.location?.key,
724
727
  modalData: state.stack.modal?.state ?? null,
725
- openModal: openModal,
726
- dismissModal: dismissModal,
728
+ openModal,
729
+ dismissModal,
727
730
  getModalState,
728
731
  videoModalState: state.options.videoModal,
729
732
  openVideoModal,
@@ -741,7 +744,15 @@ export function NavigationProvider({ children }: Props) {
741
744
  getStackForPathname,
742
745
  mainStack: state.stack.mainStack,
743
746
  }),
744
- [rivers, plugins, JSON.stringify(state), appLaunched, startUpHooks]
747
+ [
748
+ rivers,
749
+ plugins,
750
+ // TODO: Compare entire screen data from state must be removed
751
+ // State size could be large ~150kb and take 80ms on android tv on 8 rails
752
+ JSON.stringify(state, getJsonReplacer()),
753
+ appLaunched,
754
+ startUpHooks,
755
+ ]
745
756
  );
746
757
 
747
758
  // when running the tests, we pass the dispatch function
@@ -461,48 +461,4 @@ describe("<NavigationProvider />", () => {
461
461
  });
462
462
  });
463
463
  });
464
-
465
- describe("modal feature", () => {
466
- it("sets the modalState when opening a modal", () => {
467
- act(() => {
468
- wrapper = renderContextConsumer();
469
- });
470
-
471
- const view = getByTestId(wrapper, "WrapperView");
472
- act(() => view.props.navigator.openModal({ item: rivers.A1234 }));
473
- expect(view.props.navigator.get).toMatchSnapshot();
474
- });
475
-
476
- it("removes the visible flag when dismissing a modal", () => {
477
- act(() => {
478
- wrapper = renderContextConsumer();
479
- });
480
-
481
- const view = getByTestId(wrapper, "WrapperView");
482
- act(() => view.props.navigator.openModal({ item: rivers.A1234 }));
483
- expect(view.props.navigator.getModalState()).toMatchSnapshot();
484
- act(() => view.props.navigator.dismissModal());
485
- expect(view.props.navigator.getModalState().visible).toBeFalsy();
486
- expect(view.props.navigator.getModalState()).toMatchSnapshot();
487
- });
488
-
489
- it("should reset state to initial when dismissing a modal ( closeModalBottomSheet ) opened by openModalBottomSheet", () => {
490
- act(() => {
491
- wrapper = renderContextConsumer();
492
- });
493
-
494
- const view = getByTestId(wrapper, "WrapperView");
495
-
496
- act(() =>
497
- view.props.navigator.openModalBottomSheet({
498
- ModalBottomSheetContent: rivers.A1234,
499
- modalBottomSheetContentProps: { some: "props" },
500
- })
501
- );
502
-
503
- expect(view.props.navigator.getModalState()).toMatchSnapshot();
504
- act(() => view.props.navigator.closeModalBottomSheet());
505
- expect(view.props.navigator.getModalState()).toMatchSnapshot();
506
- });
507
- });
508
464
  });
package/App/index.tsx CHANGED
@@ -1,5 +1,6 @@
1
1
  import * as React from "react";
2
2
  import * as R from "ramda";
3
+
3
4
  import {
4
5
  initialWindowMetrics,
5
6
  SafeAreaProvider,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@applicaster/quick-brick-core",
3
- "version": "13.0.0-alpha.6400875052",
3
+ "version": "13.0.0-alpha.6444233049",
4
4
  "description": "Core package for Applicaster's Quick Brick App",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
@@ -28,13 +28,13 @@
28
28
  },
29
29
  "homepage": "https://github.com/applicaster/quickbrick#readme",
30
30
  "dependencies": {
31
- "@applicaster/applicaster-types": "13.0.0-alpha.6400875052",
32
- "@applicaster/quick-brick-core-plugins": "13.0.0-alpha.6400875052",
33
- "@applicaster/zapp-pipes-v2-client": "13.0.0-alpha.6400875052",
34
- "@applicaster/zapp-react-native-bridge": "13.0.0-alpha.6400875052",
35
- "@applicaster/zapp-react-native-redux": "13.0.0-alpha.6400875052",
36
- "@applicaster/zapp-react-native-ui-components": "13.0.0-alpha.6400875052",
37
- "@applicaster/zapp-react-native-utils": "13.0.0-alpha.6400875052",
31
+ "@applicaster/applicaster-types": "13.0.0-alpha.6444233049",
32
+ "@applicaster/quick-brick-core-plugins": "13.0.0-alpha.6444233049",
33
+ "@applicaster/zapp-pipes-v2-client": "13.0.0-alpha.6444233049",
34
+ "@applicaster/zapp-react-native-bridge": "13.0.0-alpha.6444233049",
35
+ "@applicaster/zapp-react-native-redux": "13.0.0-alpha.6444233049",
36
+ "@applicaster/zapp-react-native-ui-components": "13.0.0-alpha.6444233049",
37
+ "@applicaster/zapp-react-native-utils": "13.0.0-alpha.6444233049",
38
38
  "atob": "^2.1.2",
39
39
  "axios": "^0.28.0",
40
40
  "btoa": "^1.2.1",
@@ -1,68 +0,0 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
2
-
3
- exports[`<NavigationProvider /> modal feature removes the visible flag when dismissing a modal 1`] = `
4
- {
5
- "options": {
6
- "animated": true,
7
- "animationType": "slide",
8
- "onDismiss": [Function],
9
- "onRequestClose": [Function],
10
- "onShow": [Function],
11
- "presentationStyle": "overFullScreen",
12
- "transparent": true,
13
- },
14
- "props": undefined,
15
- "screen": {
16
- "id": "A1234",
17
- "navigations": [],
18
- "ui_components": [],
19
- },
20
- "visible": true,
21
- }
22
- `;
23
-
24
- exports[`<NavigationProvider /> modal feature removes the visible flag when dismissing a modal 2`] = `
25
- {
26
- "options": {},
27
- "props": {},
28
- "screen": null,
29
- "visible": false,
30
- }
31
- `;
32
-
33
- exports[`<NavigationProvider /> modal feature sets the modalState when opening a modal 1`] = `undefined`;
34
-
35
- exports[`<NavigationProvider /> modal feature should reset state to initial when dismissing a modal ( closeModalBottomSheet ) opened by openModalBottomSheet 1`] = `
36
- {
37
- "options": {
38
- "animated": false,
39
- "animationType": "none",
40
- "onDismiss": [Function],
41
- "onRequestClose": [Function],
42
- "onShow": [Function],
43
- "presentationStyle": "overFullScreen",
44
- "transparent": true,
45
- },
46
- "props": {},
47
- "screen": {
48
- "ModalBottomSheetContent": {
49
- "id": "A1234",
50
- "navigations": [],
51
- "ui_components": [],
52
- },
53
- "modalBottomSheetContentProps": {
54
- "some": "props",
55
- },
56
- },
57
- "visible": true,
58
- }
59
- `;
60
-
61
- exports[`<NavigationProvider /> modal feature should reset state to initial when dismissing a modal ( closeModalBottomSheet ) opened by openModalBottomSheet 2`] = `
62
- {
63
- "options": {},
64
- "props": {},
65
- "screen": null,
66
- "visible": false,
67
- }
68
- `;