@applicaster/quick-brick-core 13.0.0-alpha.1486614302 → 13.0.0-alpha.1503493274

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.
@@ -56,6 +56,7 @@ export class DraggableBottomSheet extends Component<Props, ComponentState> {
56
56
  _translateYOffset: Animated.Value;
57
57
  _translateY: Animated.AnimatedAddition;
58
58
  _snapPoints: SnapPoints;
59
+ _prevContentHeight = 0;
59
60
 
60
61
  _callWhenMounted: () => void | null;
61
62
 
@@ -89,6 +90,14 @@ export class DraggableBottomSheet extends Component<Props, ComponentState> {
89
90
  this._lastScrollY
90
91
  );
91
92
 
93
+ const initialSnapPoints = new SnapPoints(props.height, props.sheetHeight);
94
+
95
+ this._translateYOffset = new Animated.Value(
96
+ props.visible ? initialSnapPoints.top : initialSnapPoints.bottom
97
+ );
98
+
99
+ this._prevContentHeight = initialSnapPoints.contentHeight;
100
+
92
101
  this.state = {
93
102
  lastSnap: props.height,
94
103
  dragging: false,
@@ -150,12 +159,25 @@ export class DraggableBottomSheet extends Component<Props, ComponentState> {
150
159
 
151
160
  if (!this._snapPoints) {
152
161
  this._snapPoints = new SnapPoints(windowHeight, totalSheetHeight);
162
+ this._prevContentHeight = totalSheetHeight;
153
163
  } else {
154
164
  this._snapPoints.windowHeight = windowHeight;
155
165
  this._snapPoints.contentHeight = totalSheetHeight;
156
- }
157
166
 
158
- this._translateYOffset = new Animated.Value(this._snapPoints.bottom);
167
+ if (this.props.visible && this._isMounted) {
168
+ Animated.timing(this._translateYOffset, {
169
+ toValue: this._snapPoints.top,
170
+ duration: ANIMATION_DURATION,
171
+ easing: ANIMATION_EASING,
172
+ delay: ANIMATION_DELAY,
173
+ useNativeDriver: USE_NATIVE_DRIVER,
174
+ }).start();
175
+ } else {
176
+ this._translateYOffset.setValue(this._snapPoints.top);
177
+ }
178
+
179
+ this._prevContentHeight = totalSheetHeight;
180
+ }
159
181
 
160
182
  this._translateY = Animated.add(
161
183
  this._translateYOffset,
@@ -254,6 +276,7 @@ export class DraggableBottomSheet extends Component<Props, ComponentState> {
254
276
  getDraggableAreaStyles() {
255
277
  return {
256
278
  width: this.props.maxWidth,
279
+ top: 0,
257
280
  left: (this.props.width - this.props.maxWidth) / 2 || 0,
258
281
  };
259
282
  }
@@ -300,7 +323,6 @@ export class DraggableBottomSheet extends Component<Props, ComponentState> {
300
323
  simultaneousHandlers={this.drawer}
301
324
  >
302
325
  <Animated.ScrollView
303
- style={{ marginBottom: this._snapPoints.top }}
304
326
  bounces={false}
305
327
  onScrollBeginDrag={this._onRegisterLastScroll}
306
328
  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(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;
@@ -6,10 +6,10 @@ import { ModalChildrenWrapper } from "./ModalChildrenWrapper";
6
6
  import { PathnameContext } from "@applicaster/zapp-react-native-ui-components/Contexts/PathnameContext";
7
7
  import { ScreenContextProvider } from "@applicaster/zapp-react-native-ui-components/Contexts/ScreenContext";
8
8
  import { ROUTE_TYPES } from "@applicaster/zapp-react-native-utils/navigationUtils/routeTypes";
9
- import { useModalStore } from "@applicaster/zapp-react-native-utils/modalState";
9
+ import { useModalStoreState } from "@applicaster/zapp-react-native-utils/modalState";
10
10
 
11
11
  export function ModalProvider() {
12
- const { modalState } = useModalStore();
12
+ const modalState = useModalStoreState();
13
13
 
14
14
  const [modalVisible, setModalVisible] = React.useState(false);
15
15
  const [modalShown, setModalShown] = React.useState(false);
@@ -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>
@@ -69,8 +69,8 @@ import { PlayNextState } from "@applicaster/zapp-react-native-utils/appUtils/pla
69
69
  import { inflateUrl } from "@applicaster/zapp-react-native-ui-components/Components/LinkHandler/LinkHandler";
70
70
  import {
71
71
  dismissModal,
72
+ modalStore,
72
73
  openModal,
73
- useModalStore,
74
74
  } from "@applicaster/zapp-react-native-utils/modalState";
75
75
  import { useSubscriberFor } from "@applicaster/zapp-react-native-utils/reactHooks/useSubscriberFor";
76
76
  import { QBUIComponentEvents } from "@applicaster/zapp-react-native-ui-components/events";
@@ -152,7 +152,7 @@ export function NavigationProvider({ children }: Props) {
152
152
  );
153
153
 
154
154
  const getModalState: () => ModalState = () => {
155
- const { modalState } = useModalStore.getState();
155
+ const { modalState } = modalStore.getState();
156
156
 
157
157
  return modalState;
158
158
  };
package/App/index.tsx CHANGED
@@ -1,13 +1,5 @@
1
- // Disable logs popups(RN68)
2
- import { LogBox } from "react-native";
3
- LogBox.ignoreAllLogs();
4
-
5
1
  import * as React from "react";
6
- import {
7
- compose,
8
- prop,
9
- identity,
10
- } from "@applicaster/zapp-react-native-utils/utils";
2
+ import * as R from "ramda";
11
3
 
12
4
  import {
13
5
  initialWindowMetrics,
@@ -97,8 +89,8 @@ export function createQuickBrickApp(options): ZappApp {
97
89
  InteractionManager = () => null,
98
90
  Layout,
99
91
  QuickBrickManager,
100
- OfflineHandler = prop("children"),
101
- ContextProviders = [identity],
92
+ OfflineHandler = R.prop("children"),
93
+ ContextProviders = [R.identity],
102
94
  appLoader = () => Promise.resolve(),
103
95
  SplashLoader = Loader,
104
96
  } = options;
@@ -108,7 +100,7 @@ export function createQuickBrickApp(options): ZappApp {
108
100
  // Beware of the order of decorators !
109
101
  // It's awesome but it can break everything
110
102
 
111
- return compose(
103
+ return R.compose(
112
104
  storeConnector, // storeConnector should be first, as it disregards other props
113
105
  ...ContextProviders, // contexts consumers are only working below this point
114
106
  appRemoteDataLoader,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@applicaster/quick-brick-core",
3
- "version": "13.0.0-alpha.1486614302",
3
+ "version": "13.0.0-alpha.1503493274",
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.1486614302",
32
- "@applicaster/quick-brick-core-plugins": "13.0.0-alpha.1486614302",
33
- "@applicaster/zapp-pipes-v2-client": "13.0.0-alpha.1486614302",
34
- "@applicaster/zapp-react-native-bridge": "13.0.0-alpha.1486614302",
35
- "@applicaster/zapp-react-native-redux": "13.0.0-alpha.1486614302",
36
- "@applicaster/zapp-react-native-ui-components": "13.0.0-alpha.1486614302",
37
- "@applicaster/zapp-react-native-utils": "13.0.0-alpha.1486614302",
31
+ "@applicaster/applicaster-types": "13.0.0-alpha.1503493274",
32
+ "@applicaster/quick-brick-core-plugins": "13.0.0-alpha.1503493274",
33
+ "@applicaster/zapp-pipes-v2-client": "13.0.0-alpha.1503493274",
34
+ "@applicaster/zapp-react-native-bridge": "13.0.0-alpha.1503493274",
35
+ "@applicaster/zapp-react-native-redux": "13.0.0-alpha.1503493274",
36
+ "@applicaster/zapp-react-native-ui-components": "13.0.0-alpha.1503493274",
37
+ "@applicaster/zapp-react-native-utils": "13.0.0-alpha.1503493274",
38
38
  "atob": "^2.1.2",
39
39
  "axios": "^0.28.0",
40
40
  "btoa": "^1.2.1",
@@ -1 +0,0 @@
1
- export { Fragment as ModalChildrenWrapper } from "react";
@@ -1 +0,0 @@
1
- export { Fragment as ModalChildrenWrapper } from "react";