@applicaster/zapp-react-native-ui-components 12.0.0-alpha.9453522405 → 12.0.0-rc.10

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.
@@ -1,6 +1,7 @@
1
1
  import * as React from "react";
2
2
  import { Animated, EasingFunction, StyleProp, ViewStyle } from "react-native";
3
-
3
+ import { usePrevious } from "@applicaster/zapp-react-native-utils/reactHooks/utils";
4
+ import { toBooleanWithDefaultFalse } from "@applicaster/zapp-react-native-utils/booleanUtils";
4
5
  import { noop } from "@applicaster/zapp-react-native-utils/functionUtils";
5
6
 
6
7
  type AnimatedInterpolatedStyle =
@@ -35,11 +36,16 @@ function getAnimation(config: AnimatedInConfig, phase: "in" | "out") {
35
36
  return config[phase] || config;
36
37
  }
37
38
 
38
- export function AnimatedInOut(props: Props) {
39
- const { visible, animationConfig, children } = props;
40
-
39
+ export function AnimatedInOut({
40
+ visible,
41
+ animationConfig,
42
+ staticStyles = {},
43
+ children,
44
+ }: Props) {
41
45
  const [animatedValue] = React.useState(new Animated.Value(visible ? 1 : 0));
42
- const [animating, setAnimating] = React.useState(null);
46
+ const [animating, setAnimating] = React.useState(undefined);
47
+
48
+ const previousVisible = usePrevious(toBooleanWithDefaultFalse(visible));
43
49
 
44
50
  function startAnimation(toValue, config) {
45
51
  if (animating) {
@@ -55,7 +61,7 @@ export function AnimatedInOut(props: Props) {
55
61
  delay,
56
62
  useNativeDriver: true,
57
63
  }).start(() => {
58
- setAnimating(null);
64
+ setAnimating(undefined);
59
65
  onAnimationEnd();
60
66
  });
61
67
 
@@ -63,12 +69,14 @@ export function AnimatedInOut(props: Props) {
63
69
  }
64
70
 
65
71
  React.useEffect(() => {
66
- if (visible) {
72
+ if (!previousVisible && visible) {
67
73
  startAnimation(1.0, getAnimation(animationConfig, "in"));
68
- } else {
74
+ }
75
+
76
+ if (previousVisible && !visible) {
69
77
  startAnimation(0.0, getAnimation(animationConfig, "out"));
70
78
  }
71
- }, [visible, animating]);
79
+ }, [visible, previousVisible]);
72
80
 
73
81
  const styles = visible
74
82
  ? getAnimation(animationConfig, "in").styles
@@ -77,7 +85,7 @@ export function AnimatedInOut(props: Props) {
77
85
  return (
78
86
  <Animated.View
79
87
  renderToHardwareTextureAndroid={animating}
80
- style={[styles(animatedValue), props?.staticStyles || {}]}
88
+ style={[styles(animatedValue), staticStyles]}
81
89
  >
82
90
  {children}
83
91
  </Animated.View>
@@ -1,3 +1,35 @@
1
- import FastImage from "@applicaster/react-native-fast-image";
1
+ import React from "react";
2
2
 
3
- export const QBImage = FastImage;
3
+ import FastImage, {
4
+ FastImageProps,
5
+ } from "@applicaster/react-native-fast-image";
6
+
7
+ export const QBImage = (props: FastImageProps) => {
8
+ const source = React.useMemo(() => {
9
+ if (typeof props.source === "number") {
10
+ return props.source;
11
+ }
12
+
13
+ return {
14
+ uri: props.source.uri,
15
+ headers: props.source.headers,
16
+ priority: props.source.priority,
17
+ cache: props.source.cache,
18
+ maxWidth: props.source.maxWidth,
19
+ maxHeight: props.source.maxHeight,
20
+ };
21
+ }, [
22
+ ...(typeof props.source === "object"
23
+ ? [
24
+ props.source?.uri,
25
+ props.source?.priority,
26
+ props.source?.cache,
27
+ props.source?.headers,
28
+ props.source?.maxWidth,
29
+ props.source?.maxHeight,
30
+ ]
31
+ : []),
32
+ ]);
33
+
34
+ return <FastImage {...props} source={source} />;
35
+ };
@@ -4,7 +4,6 @@ import { Text, TextStyle, View, ViewStyle } from "react-native";
4
4
 
5
5
  import { getLocalizations } from "@applicaster/zapp-react-native-utils/localizationUtils";
6
6
  import { getAppStylesColor } from "@applicaster/zapp-react-native-utils/stylesUtils";
7
- import { useDimensions } from "@applicaster/zapp-react-native-utils/reactHooks/layout";
8
7
  import { useTheme } from "@applicaster/zapp-react-native-utils/theme";
9
8
  import { styleKeys } from "@applicaster/zapp-react-native-utils/styleKeysUtils";
10
9
 
@@ -26,10 +25,10 @@ const textStyles = (appStyles = defaultAppStyles): TextStyle => ({
26
25
  textAlign: "center",
27
26
  });
28
27
 
29
- const errorStyles = ({ width, height, backgroundColor }): ViewStyle => ({
28
+ const errorStyles = ({ backgroundColor }): ViewStyle => ({
30
29
  flex: 1,
31
- width,
32
- height,
30
+ width: "100%",
31
+ height: "100%",
33
32
  justifyContent: "center",
34
33
  alignItems: "center",
35
34
  position: "absolute",
@@ -41,8 +40,6 @@ export function ErrorDisplayComponent({
41
40
  styles,
42
41
  remoteConfigurations: { localizations },
43
42
  }: Props) {
44
- const { width, height } = useDimensions("window");
45
-
46
43
  const theme = useTheme();
47
44
  const backgroundColor = theme?.app_background_color;
48
45
 
@@ -53,7 +50,7 @@ export function ErrorDisplayComponent({
53
50
  const appStyles = R.prop(styleKeys.style_namespace, styles);
54
51
 
55
52
  return (
56
- <View style={errorStyles({ width, height, backgroundColor })}>
53
+ <View style={errorStyles({ backgroundColor })}>
57
54
  <Text style={textStyles(appStyles)}>{stream_error_message}</Text>
58
55
  </View>
59
56
  );
@@ -1,7 +1,7 @@
1
1
  import * as R from "ramda";
2
2
 
3
3
  import { usePickFromState } from "@applicaster/zapp-react-native-redux/hooks";
4
- import { useDimensions } from "@applicaster/zapp-react-native-utils/reactHooks";
4
+ import { useIsTablet } from "@applicaster/zapp-react-native-utils/reactHooks";
5
5
  import { toCamelCase } from "@applicaster/zapp-react-native-utils/stringUtils";
6
6
  import { useMemo } from "react";
7
7
  import { isNilOrEmpty } from "@applicaster/zapp-react-native-utils/reactUtils/helpers";
@@ -47,7 +47,7 @@ const stylingKeys = [
47
47
 
48
48
  export function useScreenConfiguration(screenId: string): ScreenConfiguration {
49
49
  const { rivers } = usePickFromState(["rivers"]);
50
- const { deviceInfo } = useDimensions("screen", { deviceInfo: true });
50
+ const isTablet = useIsTablet();
51
51
 
52
52
  return useMemo(() => {
53
53
  const config = {} as ScreenConfiguration;
@@ -56,8 +56,7 @@ export function useScreenConfiguration(screenId: string): ScreenConfiguration {
56
56
  if (screenData) {
57
57
  const { styles } = screenData;
58
58
 
59
- const keyPrefix =
60
- deviceInfo?.isTablet && styles?.tablet_theme ? "tablet_" : "";
59
+ const keyPrefix = isTablet && styles?.tablet_theme ? "tablet_" : "";
61
60
 
62
61
  stylingKeys.forEach(([key, castFn]) => {
63
62
  const styleKey = `${keyPrefix}${key}`;
@@ -2,8 +2,6 @@ import * as React from "react";
2
2
  import { View } from "react-native";
3
3
  import { create, act } from "react-test-renderer";
4
4
 
5
- import { ORIENTATIONS } from "@applicaster/zapp-react-native-utils/appUtils/orientationHelper";
6
-
7
5
  const Mocked_RouteManager = jest.fn((props) => (
8
6
  <View testID="routeManager" {...props} />
9
7
  ));
@@ -144,44 +142,44 @@ describe("<Screen Component />", () => {
144
142
  });
145
143
  });
146
144
 
147
- it("invokes the orientation hook when the route changes", () => {
148
- act(() => {
149
- wrapper = create(<Screen {...screenProps} />);
150
- });
151
-
152
- // @ts-ignore
153
- useCurrentScreenData.mockReturnValue({
154
- id: "player-testId",
155
- general: { screen_orientation: ORIENTATIONS.landscapeSensor },
156
- plugin_type: "player",
157
- });
158
-
159
- act(() => {
160
- wrapper.update(
161
- <Screen
162
- {...screenProps}
163
- pathname="/playable"
164
- screenData={{
165
- id: "player-testId",
166
- general: { screen_orientation: ORIENTATIONS.landscapeSensor },
167
- plugin_type: "player",
168
- }}
169
- />
170
- );
171
- });
172
-
173
- useCurrentScreenData.mockReturnValue({
174
- id: "player-testId",
175
- general: { screen_orientation: ORIENTATIONS.landscapeSensor },
176
- });
177
-
178
- act(() => {
179
- wrapper.update(<Screen {...screenProps} />);
180
- });
181
-
182
- expect(allowedOrientationsForScreen).toHaveBeenNthCalledWith(
183
- 1,
184
- ORIENTATIONS.landscapeSensor
185
- );
186
- });
145
+ // it("invokes the orientation hook when the route changes", () => {
146
+ // act(() => {
147
+ // wrapper = create(<Screen {...screenProps} />);
148
+ // });
149
+
150
+ // // @ts-ignore
151
+ // useCurrentScreenData.mockReturnValue({
152
+ // id: "player-testId",
153
+ // general: { screen_orientation: ORIENTATIONS.landscapeSensor },
154
+ // plugin_type: "player",
155
+ // });
156
+
157
+ // act(() => {
158
+ // wrapper.update(
159
+ // <Screen
160
+ // {...screenProps}
161
+ // pathname="/playable"
162
+ // screenData={{
163
+ // id: "player-testId",
164
+ // general: { screen_orientation: ORIENTATIONS.landscapeSensor },
165
+ // plugin_type: "player",
166
+ // }}
167
+ // />
168
+ // );
169
+ // });
170
+
171
+ // useCurrentScreenData.mockReturnValue({
172
+ // id: "player-testId",
173
+ // general: { screen_orientation: ORIENTATIONS.landscapeSensor },
174
+ // });
175
+
176
+ // act(() => {
177
+ // wrapper.update(<Screen {...screenProps} />);
178
+ // });
179
+
180
+ // expect(allowedOrientationsForScreen).toHaveBeenNthCalledWith(
181
+ // 1,
182
+ // ORIENTATIONS.landscapeSensor
183
+ // );
184
+ // });
187
185
  });
@@ -8,7 +8,7 @@ import {
8
8
 
9
9
  import { usePickFromState } from "@applicaster/zapp-react-native-redux/hooks";
10
10
  import { findPluginByType } from "@applicaster/zapp-react-native-utils/pluginUtils";
11
- import { useIsTablet } from "@applicaster/zapp-react-native-utils/reactHooks/device/useIsTablet";
11
+ import { useIsTablet } from "@applicaster/zapp-react-native-utils/reactHooks";
12
12
  import { ZappHookModalContext } from "../../Contexts";
13
13
  import { HookModalContextT } from "../../Contexts/ZappHookModalContext";
14
14
 
@@ -1,18 +1,24 @@
1
1
  import * as React from "react";
2
- import { Platform, StyleSheet, View, ViewStyle } from "react-native";
2
+ import {
3
+ Dimensions,
4
+ Platform,
5
+ StyleSheet,
6
+ View,
7
+ ViewStyle,
8
+ } from "react-native";
3
9
  import { Edge, SafeAreaView } from "react-native-safe-area-context";
4
10
 
5
11
  import { isTV } from "@applicaster/zapp-react-native-utils/reactUtils";
6
- import { useIsTablet } from "@applicaster/zapp-react-native-utils/reactHooks/device";
12
+ import { useIsTablet } from "@applicaster/zapp-react-native-utils/reactHooks";
7
13
  import { PlayerDetails } from "./PlayerDetails";
8
14
  import { playerDimesionsHack } from "./utils";
9
15
  import { PathnameContext } from "../../Contexts/PathnameContext";
10
- import { useDimensions } from "@applicaster/zapp-react-native-utils/reactHooks";
11
16
  import { ScreenContextProvider } from "../../Contexts/ScreenContext";
12
17
 
13
- type Dimensions = {
14
- width: number;
15
- height: number;
18
+ type DimensionsT = {
19
+ width: number | string;
20
+ height: number | string;
21
+ aspectRatio?: number;
16
22
  };
17
23
 
18
24
  type Configuration = {
@@ -23,14 +29,14 @@ type Configuration = {
23
29
 
24
30
  type Props = {
25
31
  entry: ZappEntry;
26
- style: ViewStyle & Dimensions;
32
+ style: ViewStyle & DimensionsT;
27
33
  containerStyle?: ViewStyle;
28
34
  inline?: boolean;
29
35
  docked?: boolean;
30
36
  isModal?: boolean;
31
37
  fullscreen?: boolean;
32
38
  isTabletPortrait?: boolean;
33
- children: (playerDimensions: Dimensions) => React.ReactNode;
39
+ children: (playerDimensions: DimensionsT) => React.ReactNode;
34
40
  configuration: Configuration;
35
41
  };
36
42
 
@@ -52,6 +58,15 @@ const directionStyles = (isTabletLandscape: boolean): ViewStyle => {
52
58
  return orientationStyles.portrait;
53
59
  };
54
60
 
61
+ const getScreenAspectRatio = () => {
62
+ const { width, height } = Dimensions.get("screen");
63
+
64
+ const longEdge = Math.max(width, height);
65
+ const shortEdge = Math.min(width, height);
66
+
67
+ return longEdge / shortEdge;
68
+ };
69
+
55
70
  const safeAreaStyles = (
56
71
  configuration: Configuration,
57
72
  isTablet: boolean
@@ -66,34 +81,6 @@ const safeAreaStyles = (
66
81
  };
67
82
  };
68
83
 
69
- const getTabletWidth = (
70
- configuration: Configuration,
71
- dimensions: Dimensions
72
- ) => {
73
- const tablet_landscape_sidebar_width =
74
- configuration?.tablet_landscape_sidebar_width;
75
-
76
- const { width } = dimensions;
77
-
78
- const sidebarWidth = Number(tablet_landscape_sidebar_width?.replace("%", ""));
79
-
80
- if (tablet_landscape_sidebar_width?.includes("%")) {
81
- return width * (1 - sidebarWidth / 100);
82
- }
83
-
84
- if (Number.isNaN(sidebarWidth)) {
85
- return width * 0.65;
86
- }
87
-
88
- return width - sidebarWidth;
89
- };
90
-
91
- export const defaultAspectRatioHeight = (width: number): number =>
92
- (width / 16) * 9;
93
-
94
- export const defaultAspectRatioWidth = (height: number): number =>
95
- (height / 9) * 16;
96
-
97
84
  const getEdges = (
98
85
  isTablet: boolean,
99
86
  docked: boolean,
@@ -115,6 +102,28 @@ const getEdges = (
115
102
  return ["top"];
116
103
  };
117
104
 
105
+ const getTabletWidth = (
106
+ configuration: Configuration,
107
+ dimensions: DimensionsT
108
+ ) => {
109
+ const tablet_landscape_sidebar_width =
110
+ configuration?.tablet_landscape_sidebar_width;
111
+
112
+ const { width } = dimensions;
113
+
114
+ const sidebarWidth = Number(tablet_landscape_sidebar_width?.replace("%", ""));
115
+
116
+ if (tablet_landscape_sidebar_width?.includes("%")) {
117
+ return Number(width) * (1 - sidebarWidth / 100);
118
+ }
119
+
120
+ if (Number.isNaN(sidebarWidth)) {
121
+ return Number(width) * 0.65;
122
+ }
123
+
124
+ return Number(width) - sidebarWidth;
125
+ };
126
+
118
127
  export const PlayerWrapper = (props: Props) => {
119
128
  const {
120
129
  entry,
@@ -136,40 +145,38 @@ export const PlayerWrapper = (props: Props) => {
136
145
 
137
146
  const tabletWidth = getTabletWidth(configuration, style);
138
147
 
139
- const { width: screenWidth } = useDimensions("screen");
140
-
141
- const containerDimensions: Dimensions = React.useMemo(
148
+ const baseDimensions: DimensionsT = React.useMemo(
142
149
  () => ({
143
150
  width:
144
- isInlineModal && !docked && isTabletLandscape
145
- ? tabletWidth
146
- : style.width,
147
- height:
148
- isInlineModal && !docked
149
- ? defaultAspectRatioHeight(
150
- isTabletLandscape ? tabletWidth : screenWidth
151
- )
152
- : style.height,
151
+ isInlineModal && !docked && isTabletLandscape ? tabletWidth : "100%",
152
+ height: isInlineModal && docked ? style.height : undefined,
153
153
  }),
154
- [isInlineModal, docked, isTabletLandscape, tabletWidth, style, screenWidth]
154
+ [isInlineModal, tabletWidth, style.height, docked]
155
155
  );
156
156
 
157
- const playerDimensions: Dimensions = React.useMemo(
157
+ const playerDimensions: DimensionsT = React.useMemo(
158
158
  () => ({
159
- width:
160
- isInlineModal && docked
161
- ? defaultAspectRatioWidth(containerDimensions.height)
162
- : containerDimensions.width,
163
- height: containerDimensions.height,
159
+ ...baseDimensions,
160
+ width: isInlineModal && docked ? undefined : baseDimensions.width,
161
+ aspectRatio: !isInlineModal ? getScreenAspectRatio() : 16 / 9,
162
+ }),
163
+ [baseDimensions, isInlineModal]
164
+ );
165
+
166
+ const containerDimensions: DimensionsT = React.useMemo(
167
+ () => ({
168
+ ...baseDimensions,
169
+ aspectRatio:
170
+ isInlineModal && docked ? undefined : playerDimensions.aspectRatio,
164
171
  }),
165
- [isInlineModal, docked, containerDimensions]
172
+ [baseDimensions, isInlineModal, docked, playerDimensions.aspectRatio]
166
173
  );
167
174
 
168
175
  const WrapperView = React.useMemo(() => (isTV() ? View : SafeAreaView), []);
169
176
 
170
177
  const childrenStyles = React.useMemo(
171
178
  () => ({ ...playerDimensions, ...playerDimesionsHack }),
172
- [playerDimensions, playerDimesionsHack]
179
+ [containerDimensions, playerDimesionsHack]
173
180
  );
174
181
 
175
182
  return (
@@ -190,12 +197,6 @@ export const PlayerWrapper = (props: Props) => {
190
197
  defaultStyles.playerContainer,
191
198
  containerDimensions,
192
199
  containerStyle,
193
- {
194
- height:
195
- isInlineModal && !docked
196
- ? containerDimensions.height + 10
197
- : containerDimensions.height,
198
- },
199
200
  playerDimesionsHack,
200
201
  ]}
201
202
  >
@@ -50,7 +50,7 @@ jest.mock("@applicaster/zapp-react-native-utils/reactHooks/navigation", () => ({
50
50
 
51
51
  jest.mock("../utils", () => ({ playerDimesionsHack: {} }));
52
52
 
53
- const { PlayerWrapper, defaultAspectRatioWidth } = require("../PlayerWrapper");
53
+ const { PlayerWrapper } = require("../PlayerWrapper");
54
54
 
55
55
  jest.useFakeTimers();
56
56
  const children = jest.fn(() => {});
@@ -110,7 +110,8 @@ describe("PlayerWrapper", () => {
110
110
 
111
111
  const expectDimensions = {
112
112
  ...dimensions,
113
- width: defaultAspectRatioWidth(dimensions.height),
113
+ width: undefined,
114
+ aspectRatio: 16 / 9,
114
115
  };
115
116
 
116
117
  expect(element).toMatchSnapshot();
@@ -35,13 +35,11 @@ exports[`PlayerWrapper renders inline 1`] = `
35
35
  "zIndex": 200,
36
36
  },
37
37
  Object {
38
- "height": 421.875,
39
- "width": 300,
38
+ "aspectRatio": 1.7777777777777777,
39
+ "height": undefined,
40
+ "width": "100%",
40
41
  },
41
42
  Object {},
42
- Object {
43
- "height": 431.875,
44
- },
45
43
  Object {},
46
44
  ]
47
45
  }
@@ -105,13 +103,11 @@ exports[`PlayerWrapper renders inline and docked 1`] = `
105
103
  "zIndex": 200,
106
104
  },
107
105
  Object {
106
+ "aspectRatio": undefined,
108
107
  "height": 50,
109
- "width": 300,
108
+ "width": "100%",
110
109
  },
111
110
  Object {},
112
- Object {
113
- "height": 50,
114
- },
115
111
  Object {},
116
112
  ]
117
113
  }
@@ -163,13 +159,11 @@ exports[`PlayerWrapper renders inline on tablet in landscape orientation 1`] = `
163
159
  "zIndex": 200,
164
160
  },
165
161
  Object {
166
- "height": 109.6875,
162
+ "aspectRatio": 1.7777777777777777,
163
+ "height": undefined,
167
164
  "width": 195,
168
165
  },
169
166
  Object {},
170
- Object {
171
- "height": 119.6875,
172
- },
173
167
  Object {},
174
168
  ]
175
169
  }
@@ -233,13 +227,11 @@ exports[`PlayerWrapper renders properly 1`] = `
233
227
  "zIndex": 200,
234
228
  },
235
229
  Object {
236
- "height": 800,
237
- "width": 300,
230
+ "aspectRatio": 1.7786666666666666,
231
+ "height": undefined,
232
+ "width": "100%",
238
233
  },
239
234
  Object {},
240
- Object {
241
- "height": 800,
242
- },
243
235
  Object {},
244
236
  ]
245
237
  }
@@ -1,4 +1,4 @@
1
- import React from "react";
1
+ import * as React from "react";
2
2
  import { Dimensions } from "react-native";
3
3
  import { useIsTabletLandscape } from "@applicaster/zapp-react-native-utils/reactHooks/device/useMemoizedIsTablet";
4
4
  import {
@@ -39,13 +39,22 @@ export const useModalSize = (): Size => {
39
39
  MODAL_SIZE_FOR_PORTRAIT
40
40
  );
41
41
 
42
- const setNewModalSize = (size, log) => {
43
- setModalSize(size);
42
+ const setNewModalSize = React.useCallback((newSize, log) => {
43
+ setModalSize((oldSize) => {
44
+ if (
45
+ oldSize.height === newSize.height &&
46
+ oldSize.width === newSize.width
47
+ ) {
48
+ return oldSize;
49
+ }
50
+
51
+ return newSize;
52
+ });
44
53
 
45
54
  logger.debug({
46
55
  message: log,
47
56
  });
48
- };
57
+ }, []);
49
58
 
50
59
  const isTabletLandscape = useIsTabletLandscape();
51
60
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@applicaster/zapp-react-native-ui-components",
3
- "version": "12.0.0-alpha.9453522405",
3
+ "version": "12.0.0-rc.10",
4
4
  "description": "Applicaster Zapp React Native ui components for the Quick Brick App",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
@@ -35,10 +35,10 @@
35
35
  "redux-mock-store": "^1.5.3"
36
36
  },
37
37
  "dependencies": {
38
- "@applicaster/applicaster-types": "12.0.0-alpha.9453522405",
39
- "@applicaster/zapp-react-native-bridge": "12.0.0-alpha.9453522405",
40
- "@applicaster/zapp-react-native-redux": "12.0.0-alpha.9453522405",
41
- "@applicaster/zapp-react-native-utils": "12.0.0-alpha.9453522405",
38
+ "@applicaster/applicaster-types": "12.0.0-rc.10",
39
+ "@applicaster/zapp-react-native-bridge": "12.0.0-rc.10",
40
+ "@applicaster/zapp-react-native-redux": "12.0.0-rc.10",
41
+ "@applicaster/zapp-react-native-utils": "12.0.0-rc.10",
42
42
  "promise": "^8.3.0",
43
43
  "react-router-native": "^5.1.2",
44
44
  "url": "^0.11.0",