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

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
  });
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.1",
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.1",
38
+ "@applicaster/zapp-react-native-bridge": "12.0.4-rc.1",
39
+ "@applicaster/zapp-react-native-redux": "12.0.4-rc.1",
40
+ "@applicaster/zapp-react-native-utils": "12.0.4-rc.1",
41
41
  "promise": "^8.3.0",
42
42
  "react-router-native": "^5.1.2",
43
43
  "url": "^0.11.0",