@applicaster/zapp-react-native-ui-components 12.0.4-rc.0 → 12.0.4-rc.2

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.
@@ -8,6 +8,8 @@ import { loggerLiveImageManager } from "./loggerHelper";
8
8
  import { isTV } from "@applicaster/zapp-react-native-utils/reactUtils";
9
9
  import { Component } from "react";
10
10
 
11
+ const TIMEOUT_FOR_DELAY_CHECK_PLAYER_POSITION = 500; // ms
12
+
11
13
  const { log_debug, log_info, log_error } = loggerLiveImageManager;
12
14
 
13
15
  export type LiveImageManagerEvent =
@@ -62,6 +64,9 @@ export class LiveImageManager implements PlayerLifecycleListener {
62
64
  protected currentlyPlaying: LiveImage | null = null;
63
65
  protected primaryPlayer: Player | null = null;
64
66
 
67
+ private checkPlayerPositionTimeout: ReturnType<typeof setTimeout> | null =
68
+ null;
69
+
65
70
  protected listeners: Record<
66
71
  string,
67
72
  Record<LiveImageManagerEvent, (event?: Record<string, any>) => void>
@@ -118,6 +123,11 @@ export class LiveImageManager implements PlayerLifecycleListener {
118
123
  });
119
124
  };
120
125
 
126
+ private cancelCheckPlayerPositionTimeout = () => {
127
+ clearTimeout(this.checkPlayerPositionTimeout);
128
+ this.checkPlayerPositionTimeout = null;
129
+ };
130
+
121
131
  public onViewportEnter = (item: LiveImage) => {
122
132
  log_debug(
123
133
  `onViewportEnter: live-image ${playerInfo(
@@ -125,7 +135,21 @@ export class LiveImageManager implements PlayerLifecycleListener {
125
135
  )}, primary ${playerInfo(this.primaryPlayer)}`
126
136
  );
127
137
 
128
- this.checkPlayerPosition(item);
138
+ if (!isTV()) {
139
+ // mobile only
140
+ // we have to delay running checkPlayerPosition, because sometimes on fast scrolling we get wrong order onEnter, then onLeave.
141
+ // which could cause select wrong item to play
142
+
143
+ this.cancelCheckPlayerPositionTimeout();
144
+
145
+ this.checkPlayerPositionTimeout = setTimeout(() => {
146
+ this.cancelCheckPlayerPositionTimeout();
147
+
148
+ this.checkPlayerPosition(item);
149
+ }, TIMEOUT_FOR_DELAY_CHECK_PLAYER_POSITION);
150
+ } else {
151
+ this.checkPlayerPosition(item);
152
+ }
129
153
  };
130
154
 
131
155
  public onViewportLeave = (item: LiveImage) => {
@@ -246,6 +270,8 @@ export class LiveImageManager implements PlayerLifecycleListener {
246
270
  };
247
271
 
248
272
  public checkPlayerPosition = (item: LiveImage) => {
273
+ this.cancelCheckPlayerPositionTimeout();
274
+
249
275
  log_debug(
250
276
  `checkPlayerPosition: live-image playerId: ${playerInfo(
251
277
  item.player
@@ -244,25 +244,27 @@ const PlayerLiveImageComponent = (props: Props) => {
244
244
  }, [item.id]);
245
245
 
246
246
  React.useEffect(() => {
247
- if (playerManager) {
248
- const isPlayerRegistered = playerManager.isPlayerRegistered(playerId);
247
+ if (isMeasurement(item) || !playerManager) {
248
+ return;
249
+ }
249
250
 
250
- if (isPlayerRegistered) {
251
- log_error(
252
- `PlayerLiveImageComponent: player ${playerId} already registered`
253
- );
254
- } else {
255
- playerManager.registerPlayer({
256
- id: playerId,
257
- playerController: controller,
258
- });
251
+ const isPlayerRegistered = playerManager.isPlayerRegistered(playerId);
259
252
 
260
- return () => {
261
- playerManager.unregisterPlayer(playerId);
262
- };
263
- }
253
+ if (isPlayerRegistered) {
254
+ log_error(
255
+ `PlayerLiveImageComponent: player ${playerId} already registered`
256
+ );
257
+ } else {
258
+ playerManager.registerPlayer({
259
+ id: playerId,
260
+ playerController: controller,
261
+ });
262
+
263
+ return () => {
264
+ playerManager.unregisterPlayer(playerId);
265
+ };
264
266
  }
265
- }, [liveImageItem, playerId, controller]);
267
+ }, [liveImageItem, playerId, controller, item.id]);
266
268
 
267
269
  const onPositionUpdated = React.useCallback(
268
270
  (data) => {
@@ -1,10 +1,11 @@
1
1
  /* eslint-disable react/display-name */
2
2
  import * as React from "react";
3
- import { render } from "@testing-library/react-native";
3
+ import { render, act } from "@testing-library/react-native";
4
4
  import * as PlayerFactory from "@applicaster/zapp-react-native-utils/appUtils/playerManager/playerFactory";
5
5
  import { Player } from "@applicaster/zapp-react-native-utils/appUtils/playerManager/player";
6
6
  import { ThemeContext } from "@applicaster/zapp-react-native-utils/theme";
7
7
  import * as navigationHooks from "@applicaster/zapp-react-native-utils/reactHooks/navigation";
8
+ import { playerManager } from "@applicaster/zapp-react-native-utils/appUtils/playerManager";
8
9
 
9
10
  import { PlayerLiveImage } from "../PlayerLiveImageComponent";
10
11
  import * as useNavigationHooks from "@applicaster/zapp-react-native-utils/reactHooks/navigation/useNavigation";
@@ -33,7 +34,7 @@ const mockStore = configureStore();
33
34
 
34
35
  const store = mockStore({ appData: {} });
35
36
 
36
- const Wrapper = ({ children }: { children: React.ReactChildren }) => (
37
+ const Wrapper = ({ children }: { children: React.ReactNode }) => (
37
38
  /* @ts-ignore */
38
39
  <Provider store={store}>
39
40
  <ThemeContext.Provider
@@ -113,4 +114,53 @@ describe("PlayerLiveImageComponent", () => {
113
114
 
114
115
  // TODO: implement this test
115
116
  });
117
+
118
+ it("should register the player for normal item", () => {
119
+ render(
120
+ <Wrapper>
121
+ <PlayerLiveImage {...defaultProps} />
122
+ </Wrapper>
123
+ );
124
+
125
+ const isPlayerRegistered = playerManager.isPlayerRegistered(
126
+ defaultProps.playerId
127
+ );
128
+
129
+ expect(isPlayerRegistered).toBe(true);
130
+ });
131
+
132
+ it("should unregister the player for normal item", () => {
133
+ const component = render(
134
+ <Wrapper>
135
+ <PlayerLiveImage {...defaultProps} />
136
+ </Wrapper>
137
+ );
138
+
139
+ act(() => component.unmount());
140
+
141
+ const isPlayerRegistered = playerManager.isPlayerRegistered(
142
+ defaultProps.playerId
143
+ );
144
+
145
+ expect(isPlayerRegistered).toBe(false);
146
+ });
147
+
148
+ it("should not register the player for 'pre-measurement' item", () => {
149
+ const props = {
150
+ ...defaultProps,
151
+ item: {
152
+ ...defaultProps.item,
153
+ id: "pre-measurement-1",
154
+ },
155
+ };
156
+
157
+ render(
158
+ <Wrapper>
159
+ <PlayerLiveImage {...props} />
160
+ </Wrapper>
161
+ );
162
+
163
+ const isPlayerRegistered = playerManager.isPlayerRegistered(props.playerId);
164
+ expect(isPlayerRegistered).toBe(false);
165
+ });
116
166
  });
@@ -0,0 +1,33 @@
1
+ import * as React from "react";
2
+ import { StyleSheet, View } from "react-native";
3
+
4
+ import { useTheme } from "@applicaster/zapp-react-native-utils/theme";
5
+
6
+ import { Spinner } from "../Spinner";
7
+
8
+ const styles = StyleSheet.create({
9
+ container: {
10
+ ...StyleSheet.absoluteFillObject,
11
+ alignItems: "center",
12
+ justifyContent: "center",
13
+ },
14
+ });
15
+
16
+ export const OpaqueLayer = () => {
17
+ const theme = useTheme();
18
+
19
+ return (
20
+ <View
21
+ style={[
22
+ styles.container,
23
+ {
24
+ // we assume that it's non-transparent and we could show spinner always until it will be covered by player
25
+ // this spinner hides all content under modal
26
+ backgroundColor: theme?.app_background_color,
27
+ },
28
+ ]}
29
+ >
30
+ <Spinner />
31
+ </View>
32
+ );
33
+ };
@@ -10,7 +10,8 @@ import { Edge, SafeAreaView } from "react-native-safe-area-context";
10
10
  import { isTV } from "@applicaster/zapp-react-native-utils/reactUtils";
11
11
  import { useIsTablet } from "@applicaster/zapp-react-native-utils/reactHooks";
12
12
  import { PlayerDetails } from "./PlayerDetails";
13
- import { playerDimesionsHack } from "./utils";
13
+ import { playerDimensionsHack } from "./utils";
14
+ import { useDelayedPlayerDetails } from "./hooks";
14
15
 
15
16
  import {
16
17
  AnimatedScrollModal,
@@ -121,34 +122,6 @@ const getTabletWidth = (
121
122
  return Number(width) - sidebarWidth;
122
123
  };
123
124
 
124
- const showDetails = (
125
- isMobile: boolean,
126
- docked: boolean,
127
- isInlineModal,
128
- pip
129
- ): boolean => {
130
- if (pip) {
131
- return false;
132
- }
133
-
134
- if (!isInlineModal) {
135
- return false;
136
- }
137
-
138
- // for mobile we always show details. Mounting of it very heavy operation.
139
- if (isMobile) {
140
- return true;
141
- }
142
-
143
- // workaround for tablets we need to mount/unmount in order to avoid PlayerDetails content dissappearing
144
- // FIXME - find out the reason of dissapearing of content
145
- if (docked) {
146
- return false;
147
- }
148
-
149
- return true;
150
- };
151
-
152
125
  const PlayerWrapperComponent = (props: Props) => {
153
126
  const {
154
127
  entry,
@@ -167,7 +140,15 @@ const PlayerWrapperComponent = (props: Props) => {
167
140
 
168
141
  const isInlineModal = inline && isModal;
169
142
 
170
- // const style = getStyles(baseStyle, !isTablet, isInlineModal, pip);
143
+ // Mounting the PlayerDetails component is a resource-intensive process.
144
+ // Therefore, for performance reasons, we mount it with a delay to make the rotation process as smooth as possible.
145
+ // The flow is as follows: the rotation occurs first, and then, after a short delay, we mount the PlayerDetails component.
146
+ // This helps to avoid blocking the rotation and any animations related to the rotation.
147
+ const isShowPlayerDetails = useDelayedPlayerDetails({
148
+ isInline: isInlineModal,
149
+ isDocked: docked,
150
+ isPip: pip,
151
+ });
171
152
 
172
153
  const isTabletLandscape = !isTV() && isTablet && !isTabletPortrait;
173
154
 
@@ -203,8 +184,8 @@ const PlayerWrapperComponent = (props: Props) => {
203
184
  const WrapperView = React.useMemo(() => (isTV() ? View : SafeAreaView), []);
204
185
 
205
186
  const childrenStyles = React.useMemo(
206
- () => ({ ...playerDimensions, ...playerDimesionsHack }),
207
- [containerDimensions, playerDimesionsHack]
187
+ () => ({ ...playerDimensions, ...playerDimensionsHack }),
188
+ [containerDimensions, playerDimensionsHack]
208
189
  );
209
190
 
210
191
  return (
@@ -213,7 +194,7 @@ const PlayerWrapperComponent = (props: Props) => {
213
194
  style={[
214
195
  safeAreaStyles(configuration, isTablet),
215
196
  style,
216
- playerDimesionsHack,
197
+ playerDimensionsHack,
217
198
  ]}
218
199
  >
219
200
  <AnimationComponent
@@ -227,7 +208,7 @@ const PlayerWrapperComponent = (props: Props) => {
227
208
  defaultStyles.playerContainer,
228
209
  containerDimensions,
229
210
  containerStyle,
230
- playerDimesionsHack,
211
+ playerDimensionsHack,
231
212
  ]}
232
213
  >
233
214
  <AnimationComponent
@@ -246,7 +227,7 @@ const PlayerWrapperComponent = (props: Props) => {
246
227
  </View>
247
228
 
248
229
  <AnimatedScrollModal>
249
- {showDetails(!isTablet, docked, isInlineModal, pip) && (
230
+ {isShowPlayerDetails && (
250
231
  <AnimationComponent
251
232
  animationType={ComponentAnimationType.componentFade}
252
233
  style={defaultStyles.flex}
@@ -1,6 +1,6 @@
1
1
  import React from "react";
2
- import * as R from "ramda";
3
- import { StyleSheet, View, StatusBar } from "react-native";
2
+ import { equals } from "ramda";
3
+ import { StyleSheet, StatusBar } from "react-native";
4
4
 
5
5
  import { HandlePlayable } from "@applicaster/zapp-react-native-ui-components/Components/HandlePlayable";
6
6
  import {
@@ -17,17 +17,20 @@ import {
17
17
  import { useIsTablet } from "@applicaster/zapp-react-native-utils/reactHooks/device/useIsTablet";
18
18
 
19
19
  import { withModalNavigationContextProvider } from "../../Contexts/ModalNavigationContext";
20
- import { useModalSize } from "./hooks/useModalSize";
21
- import { useBackgroundColor } from "./hooks/useBackgroundColor";
22
- import { useInitialPlayerState } from "./hooks/useInitialPlayerState";
20
+ import {
21
+ useModalSize,
22
+ useBackgroundColor,
23
+ useInitialPlayerState,
24
+ } from "./hooks";
25
+
23
26
  import { APP_EVENTS } from "@applicaster/zapp-react-native-utils/appUtils/events";
24
- import { Spinner } from "../Spinner";
25
27
  import { PathnameContext } from "@applicaster/zapp-react-native-ui-components/Contexts/PathnameContext";
26
28
  import { ROUTE_TYPES } from "@applicaster/zapp-react-native-utils/navigationUtils/routeTypes";
27
29
  import { useSubscriberFor } from "@applicaster/zapp-react-native-utils/reactHooks/useSubscriberFor";
28
30
  import { requiresAuthentication } from "@applicaster/zapp-react-native-utils/configurationUtils";
29
31
  import { playerManager } from "@applicaster/zapp-react-native-utils/appUtils";
30
32
  import { ScreenContextProvider } from "../../Contexts/ScreenContext";
33
+ import { OpaqueLayer } from "./OpaqueLayer";
31
34
 
32
35
  import { AnimatedPlayerModalWrapper } from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/ModalAnimation";
33
36
 
@@ -39,17 +42,6 @@ const styles = StyleSheet.create({
39
42
  bottom: 0,
40
43
  position: "absolute",
41
44
  },
42
- // eslint-disable-next-line react-native/no-color-literals
43
- loaderContainer: {
44
- top: 0,
45
- left: 0,
46
- right: 0,
47
- bottom: 0,
48
- position: "absolute",
49
- alignItems: "center",
50
- justifyContent: "center",
51
- backgroundColor: "rgba(64,64,64,.5)",
52
- },
53
45
  });
54
46
 
55
47
  const VideoModalComponent = () => {
@@ -100,7 +92,7 @@ const VideoModalComponent = () => {
100
92
 
101
93
  const onHooksSuccess = ({ payload }) => {
102
94
  // set new modified entry
103
- if (!R.equals(payload, item)) {
95
+ if (!equals(payload, item)) {
104
96
  onVideoModalHookSuccessAnalyticsEvent();
105
97
  setVideoModalItem(payload);
106
98
  }
@@ -136,7 +128,10 @@ const VideoModalComponent = () => {
136
128
 
137
129
  <PathnameContext.Provider value={pathname}>
138
130
  <ScreenContextProvider pathname={pathname}>
139
- {itemIdHooksFinished === item?.id ? (
131
+ {/* Hide content underneath when we switch to next video in fullscreen mode */}
132
+ {mode === "FULLSCREEN" && <OpaqueLayer />}
133
+
134
+ {itemIdHooksFinished === item?.id && (
140
135
  <AnimatedPlayerModalWrapper
141
136
  style={[
142
137
  styles.container,
@@ -153,10 +148,6 @@ const VideoModalComponent = () => {
153
148
  mode={mode}
154
149
  />
155
150
  </AnimatedPlayerModalWrapper>
156
- ) : (
157
- <View style={styles.loaderContainer}>
158
- <Spinner />
159
- </View>
160
151
  )}
161
152
  </ScreenContextProvider>
162
153
  </PathnameContext.Provider>
@@ -59,7 +59,7 @@ jest.mock("@applicaster/zapp-react-native-utils/reactHooks/navigation", () => ({
59
59
  })),
60
60
  }));
61
61
 
62
- jest.mock("../utils", () => ({ playerDimesionsHack: {} }));
62
+ jest.mock("../utils", () => ({ playerDimensionsHack: {} }));
63
63
 
64
64
  const { PlayerWrapper } = require("../PlayerWrapper");
65
65
 
@@ -71,36 +71,6 @@ exports[`PlayerWrapper renders inline 1`] = `
71
71
  }
72
72
  testID="test-player-container"
73
73
  />
74
- <View
75
- animationType="componentFade"
76
- style={
77
- Object {
78
- "flex": 1,
79
- }
80
- }
81
- >
82
- <View
83
- configuration={
84
- Object {
85
- "tablet_landscape_player_container_background_color": "red",
86
- "tablet_landscape_sidebar_width": "35%",
87
- }
88
- }
89
- entry={
90
- Object {
91
- "id": "test",
92
- }
93
- }
94
- isTablet={false}
95
- isTabletLandscape={false}
96
- style={
97
- Object {
98
- "flex": 1,
99
- "paddingTop": 20,
100
- }
101
- }
102
- />
103
- </View>
104
74
  </View>
105
75
  </RNCSafeAreaView>
106
76
  </RNCSafeAreaProvider>
@@ -177,36 +147,6 @@ exports[`PlayerWrapper renders inline and docked 1`] = `
177
147
  }
178
148
  testID="test-player-container"
179
149
  />
180
- <View
181
- animationType="componentFade"
182
- style={
183
- Object {
184
- "flex": 1,
185
- }
186
- }
187
- >
188
- <View
189
- configuration={
190
- Object {
191
- "tablet_landscape_player_container_background_color": "red",
192
- "tablet_landscape_sidebar_width": "35%",
193
- }
194
- }
195
- entry={
196
- Object {
197
- "id": "test",
198
- }
199
- }
200
- isTablet={false}
201
- isTabletLandscape={false}
202
- style={
203
- Object {
204
- "flex": 1,
205
- "paddingTop": 20,
206
- }
207
- }
208
- />
209
- </View>
210
150
  </View>
211
151
  </RNCSafeAreaView>
212
152
  </RNCSafeAreaProvider>
@@ -299,36 +239,6 @@ exports[`PlayerWrapper renders inline on tablet in landscape orientation 1`] = `
299
239
  }
300
240
  />
301
241
  </View>
302
- <View
303
- animationType="componentFade"
304
- style={
305
- Object {
306
- "flex": 1,
307
- }
308
- }
309
- >
310
- <View
311
- configuration={
312
- Object {
313
- "tablet_landscape_player_container_background_color": "red",
314
- "tablet_landscape_sidebar_width": "35%",
315
- }
316
- }
317
- entry={
318
- Object {
319
- "id": "test",
320
- }
321
- }
322
- isTablet={true}
323
- isTabletLandscape={true}
324
- style={
325
- Object {
326
- "flex": 1,
327
- "paddingTop": 20,
328
- }
329
- }
330
- />
331
- </View>
332
242
  </View>
333
243
  </RNCSafeAreaView>
334
244
  </RNCSafeAreaProvider>
@@ -0,0 +1,7 @@
1
+ export { useBackgroundColor } from "./useBackgroundColor";
2
+
3
+ export { useDelayedPlayerDetails } from "./useDelayedPlayerDetails";
4
+
5
+ export { useInitialPlayerState } from "./useInitialPlayerState";
6
+
7
+ export { useModalSize } from "./useModalSize";
@@ -0,0 +1,49 @@
1
+ import * as React from "react";
2
+ import { useIsTablet } from "@applicaster/zapp-react-native-utils/reactHooks";
3
+ import { withTimeout$ } from "@applicaster/zapp-react-native-utils/idleUtils";
4
+
5
+ import { showDetails } from "./utils";
6
+
7
+ const TIMEOUT = 100; // ms
8
+
9
+ type Props = { isInline: boolean; isDocked: boolean; isPip: boolean };
10
+
11
+ /**
12
+ * Custom hook to determine whether to show player details with a delay.
13
+ *
14
+ * @param {Object} params - The parameters object.
15
+ * @param {boolean} params.isInline - Indicates if the player is inline.
16
+ * @param {boolean} params.isDocked - Indicates if the player is docked.
17
+ * @param {boolean} params.isPip - Indicates if the player is in PIP mode.
18
+ * @returns {boolean} - Returns true if player details should be shown, otherwise false.
19
+ */
20
+ export const useDelayedPlayerDetails = ({
21
+ isInline,
22
+ isDocked,
23
+ isPip,
24
+ }: Props): boolean => {
25
+ const [shouldShowDetails, setShouldShowDetails] = React.useState(false);
26
+
27
+ const isTablet = useIsTablet();
28
+
29
+ React.useEffect(() => {
30
+ const subscription = withTimeout$(TIMEOUT).subscribe({
31
+ next: () => {
32
+ setShouldShowDetails(() => {
33
+ return showDetails({
34
+ isMobile: !isTablet,
35
+ isInline,
36
+ isDocked,
37
+ isPip,
38
+ });
39
+ });
40
+ },
41
+ });
42
+
43
+ return () => {
44
+ subscription.unsubscribe();
45
+ };
46
+ }, [isDocked, isTablet, isInline, isPip]);
47
+
48
+ return shouldShowDetails;
49
+ };
@@ -0,0 +1,91 @@
1
+ import { showDetails } from "..";
2
+
3
+ describe("showDetails", () => {
4
+ it("should return false if isPip is true", () => {
5
+ const result = showDetails({
6
+ isMobile: true,
7
+ isInline: true,
8
+ isDocked: false,
9
+ isPip: true,
10
+ });
11
+
12
+ expect(result).toBe(false);
13
+ });
14
+
15
+ it("should return false if isDocked is true", () => {
16
+ const result = showDetails({
17
+ isMobile: true,
18
+ isInline: true,
19
+ isDocked: true,
20
+ isPip: false,
21
+ });
22
+
23
+ expect(result).toBe(false);
24
+ });
25
+
26
+ it("should return true if isMobile is true and isInline is true", () => {
27
+ const result = showDetails({
28
+ isMobile: true,
29
+ isInline: true,
30
+ isDocked: false,
31
+ isPip: false,
32
+ });
33
+
34
+ expect(result).toBe(true);
35
+ });
36
+
37
+ it("should return false if isMobile is true and isInline is false", () => {
38
+ const result = showDetails({
39
+ isMobile: true,
40
+ isInline: false,
41
+ isDocked: false,
42
+ isPip: false,
43
+ });
44
+
45
+ expect(result).toBe(false);
46
+ });
47
+
48
+ it("should return true if isMobile is false", () => {
49
+ const result = showDetails({
50
+ isMobile: false,
51
+ isInline: true,
52
+ isDocked: false,
53
+ isPip: false,
54
+ });
55
+
56
+ expect(result).toBe(true);
57
+ });
58
+
59
+ it("should return true if isMobile is false and isInline is false", () => {
60
+ const result = showDetails({
61
+ isMobile: false,
62
+ isInline: false,
63
+ isDocked: false,
64
+ isPip: false,
65
+ });
66
+
67
+ expect(result).toBe(true);
68
+ });
69
+
70
+ it("should return false if all properties are false except isMobile", () => {
71
+ const result = showDetails({
72
+ isMobile: true,
73
+ isInline: false,
74
+ isDocked: false,
75
+ isPip: false,
76
+ });
77
+
78
+ expect(result).toBe(false);
79
+ });
80
+
81
+ it("should return true if all properties are false except isInline", () => {
82
+ const result = showDetails({
83
+ isMobile: false,
84
+ isInline: true,
85
+ isDocked: false,
86
+ isPip: false,
87
+ });
88
+
89
+ expect(result).toBe(true);
90
+ });
91
+ });
@@ -35,3 +35,36 @@ export const orientationWasChangedFromPortraitToLandscape = ({
35
35
  isOrientationLandscape(toOrientation)
36
36
  );
37
37
  };
38
+
39
+ export const showDetails = ({
40
+ isMobile,
41
+ isInline,
42
+ isDocked,
43
+ isPip,
44
+ }: {
45
+ isMobile: boolean;
46
+ isInline: boolean;
47
+ isDocked: boolean;
48
+ isPip: boolean;
49
+ }): boolean => {
50
+ if (isPip) {
51
+ return false;
52
+ }
53
+
54
+ if (isDocked) {
55
+ return false;
56
+ }
57
+
58
+ // for mobile with inline mode(rotation is portrait) we always show details.
59
+ if (isMobile && isInline) {
60
+ return true;
61
+ }
62
+
63
+ // for mobile with landscape rotation(player is fullscreen) we always hide details. Mounting of it is very heavy operation.
64
+ if (isMobile && !isInline) {
65
+ return false;
66
+ }
67
+
68
+ // for tablets we always show details
69
+ return true;
70
+ };
@@ -54,7 +54,7 @@ const fullSize = {
54
54
  height: "100%",
55
55
  };
56
56
 
57
- export const playerDimesionsHack = platformSelect({
57
+ export const playerDimensionsHack = platformSelect({
58
58
  android_tv: fullSize,
59
59
  amazon: fullSize,
60
60
  lg_tv: fullSize,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@applicaster/zapp-react-native-ui-components",
3
- "version": "12.0.4-rc.0",
3
+ "version": "12.0.4-rc.2",
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",
@@ -34,10 +34,10 @@
34
34
  "redux-mock-store": "^1.5.3"
35
35
  },
36
36
  "dependencies": {
37
- "@applicaster/applicaster-types": "12.0.4-rc.0",
38
- "@applicaster/zapp-react-native-bridge": "12.0.4-rc.0",
39
- "@applicaster/zapp-react-native-redux": "12.0.4-rc.0",
40
- "@applicaster/zapp-react-native-utils": "12.0.4-rc.0",
37
+ "@applicaster/applicaster-types": "12.0.4-rc.2",
38
+ "@applicaster/zapp-react-native-bridge": "12.0.4-rc.2",
39
+ "@applicaster/zapp-react-native-redux": "12.0.4-rc.2",
40
+ "@applicaster/zapp-react-native-utils": "12.0.4-rc.2",
41
41
  "promise": "^8.3.0",
42
42
  "react-router-native": "^5.1.2",
43
43
  "url": "^0.11.0",