@applicaster/zapp-react-native-utils 14.0.0-alpha.3259144304 → 14.0.0-alpha.3497255033

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.
Files changed (109) hide show
  1. package/actionsExecutor/ActionExecutorContext.tsx +60 -84
  2. package/actionsExecutor/ScreenActions.ts +164 -0
  3. package/actionsExecutor/StorageActions.ts +110 -0
  4. package/actionsExecutor/feedDecorator.ts +171 -0
  5. package/actionsExecutor/screenResolver.ts +11 -0
  6. package/analyticsUtils/AnalyticPlayerListener.ts +5 -2
  7. package/analyticsUtils/AnalyticsEvents/helper.ts +81 -0
  8. package/analyticsUtils/AnalyticsEvents/sendOnClickEvent.ts +14 -4
  9. package/analyticsUtils/__tests__/analyticsUtils.test.js +3 -0
  10. package/analyticsUtils/events.ts +8 -0
  11. package/analyticsUtils/playerAnalyticsTracker.ts +2 -1
  12. package/appUtils/HooksManager/Hook.ts +4 -4
  13. package/appUtils/HooksManager/index.ts +11 -1
  14. package/appUtils/accessibilityManager/const.ts +13 -0
  15. package/appUtils/accessibilityManager/hooks.ts +35 -1
  16. package/appUtils/accessibilityManager/index.ts +152 -31
  17. package/appUtils/accessibilityManager/utils.ts +24 -0
  18. package/appUtils/contextKeysManager/contextResolver.ts +42 -1
  19. package/appUtils/focusManager/__tests__/__snapshots__/focusManager.test.js.snap +8 -0
  20. package/appUtils/focusManager/__tests__/focusManager.test.js +1 -1
  21. package/appUtils/focusManager/events.ts +2 -0
  22. package/appUtils/focusManager/index.ios.ts +27 -0
  23. package/appUtils/focusManager/index.ts +86 -11
  24. package/appUtils/focusManager/treeDataStructure/Tree/index.js +1 -1
  25. package/appUtils/focusManagerAux/utils/index.ts +112 -3
  26. package/appUtils/focusManagerAux/utils/utils.ios.ts +35 -0
  27. package/appUtils/platform/platformUtils.ts +33 -3
  28. package/appUtils/playerManager/OverlayObserver/OverlaysObserver.ts +0 -15
  29. package/appUtils/playerManager/conts.ts +21 -0
  30. package/appUtils/playerManager/useChapterMarker.tsx +0 -1
  31. package/appUtils/playerManager/usePlayerControllerSetup.tsx +16 -0
  32. package/arrayUtils/__tests__/allTruthy.test.ts +24 -0
  33. package/arrayUtils/__tests__/anyThruthy.test.ts +24 -0
  34. package/arrayUtils/index.ts +6 -1
  35. package/componentsUtils/__tests__/isTabsScreen.test.ts +38 -0
  36. package/componentsUtils/index.ts +4 -1
  37. package/configurationUtils/__tests__/manifestKeyParser.test.ts +546 -0
  38. package/configurationUtils/index.ts +1 -1
  39. package/configurationUtils/manifestKeyParser.ts +57 -32
  40. package/focusManager/FocusManager.ts +104 -20
  41. package/focusManager/Tree.ts +25 -21
  42. package/focusManager/__tests__/FocusManager.test.ts +50 -8
  43. package/focusManager/aux/index.ts +98 -0
  44. package/focusManager/utils.ts +12 -6
  45. package/index.d.ts +1 -10
  46. package/manifestUtils/defaultManifestConfigurations/player.js +196 -2
  47. package/manifestUtils/index.js +4 -0
  48. package/manifestUtils/keys.js +12 -0
  49. package/manifestUtils/sharedConfiguration/screenPicker/stylesFields.js +6 -0
  50. package/navigationUtils/__tests__/mapContentTypesToRivers.test.ts +130 -0
  51. package/navigationUtils/index.ts +26 -21
  52. package/package.json +2 -3
  53. package/playerUtils/PlayerTTS/PlayerTTS.ts +359 -0
  54. package/playerUtils/PlayerTTS/index.ts +1 -0
  55. package/playerUtils/getPlayerActionButtons.ts +2 -2
  56. package/playerUtils/index.ts +51 -0
  57. package/playerUtils/usePlayerTTS.ts +21 -0
  58. package/reactHooks/autoscrolling/__tests__/useTrackedView.test.tsx +3 -1
  59. package/reactHooks/cell-click/__tests__/index.test.js +3 -0
  60. package/reactHooks/cell-click/index.ts +8 -1
  61. package/reactHooks/debugging/__tests__/index.test.js +0 -1
  62. package/reactHooks/feed/__tests__/useBatchLoading.test.tsx +8 -2
  63. package/reactHooks/feed/__tests__/useFeedLoader.test.tsx +71 -31
  64. package/reactHooks/feed/index.ts +2 -0
  65. package/reactHooks/feed/useBatchLoading.ts +16 -9
  66. package/reactHooks/feed/useFeedLoader.tsx +36 -43
  67. package/reactHooks/feed/useInflatedUrl.ts +23 -29
  68. package/reactHooks/feed/useLoadPipesDataDispatch.ts +63 -0
  69. package/reactHooks/feed/usePipesCacheReset.ts +3 -3
  70. package/reactHooks/flatList/useSequentialRenderItem.tsx +3 -3
  71. package/reactHooks/layout/__tests__/index.test.tsx +3 -1
  72. package/reactHooks/layout/index.ts +1 -1
  73. package/reactHooks/layout/isTablet/index.ts +12 -5
  74. package/reactHooks/layout/useDimensions/__tests__/useDimensions.test.ts +34 -36
  75. package/reactHooks/layout/useDimensions/useDimensions.ts +2 -3
  76. package/reactHooks/layout/useLayoutVersion.ts +5 -5
  77. package/reactHooks/navigation/index.ts +7 -5
  78. package/reactHooks/navigation/useIsScreenActive.ts +9 -5
  79. package/reactHooks/navigation/useRoute.ts +7 -2
  80. package/reactHooks/navigation/useScreenStateStore.ts +8 -0
  81. package/reactHooks/resolvers/__tests__/useCellResolver.test.tsx +4 -0
  82. package/reactHooks/screen/useScreenContext.ts +1 -1
  83. package/reactHooks/state/__tests__/ZStoreProvider.test.tsx +2 -1
  84. package/reactHooks/state/index.ts +1 -1
  85. package/reactHooks/state/useHomeRiver.ts +4 -2
  86. package/reactHooks/state/useRivers.ts +7 -8
  87. package/riverComponetsMeasurementProvider/index.tsx +1 -1
  88. package/screenPickerUtils/index.ts +13 -0
  89. package/services/js2native.ts +1 -0
  90. package/storage/ScreenSingleValueProvider.ts +204 -0
  91. package/storage/ScreenStateMultiSelectProvider.ts +293 -0
  92. package/storage/StorageMultiSelectProvider.ts +192 -0
  93. package/storage/StorageSingleSelectProvider.ts +108 -0
  94. package/time/BackgroundTimer.ts +6 -4
  95. package/utils/__tests__/endsWith.test.ts +30 -0
  96. package/utils/__tests__/find.test.ts +36 -0
  97. package/utils/__tests__/omit.test.ts +19 -0
  98. package/utils/__tests__/path.test.ts +33 -0
  99. package/utils/__tests__/pathOr.test.ts +37 -0
  100. package/utils/__tests__/startsWith.test.ts +30 -0
  101. package/utils/__tests__/take.test.ts +40 -0
  102. package/utils/endsWith.ts +9 -0
  103. package/utils/find.ts +3 -0
  104. package/utils/index.ts +23 -0
  105. package/utils/omit.ts +5 -0
  106. package/utils/path.ts +5 -0
  107. package/utils/pathOr.ts +5 -0
  108. package/utils/startsWith.ts +9 -0
  109. package/utils/take.ts +5 -0
@@ -208,7 +208,7 @@ function getPlayerConfiguration({ platform, version }) {
208
208
  {
209
209
  key: "accessibility_forward_label",
210
210
  label: "Accessibility forward label",
211
- initial_value: "Forward button",
211
+ initial_value: "Fast forward button",
212
212
  label_tooltip: "Label for forward button accessibility",
213
213
  type: "text_input",
214
214
  },
@@ -292,7 +292,7 @@ function getPlayerConfiguration({ platform, version }) {
292
292
  {
293
293
  key: "accessibility_back_label",
294
294
  label: "Accessibility back label",
295
- initial_value: "Back button",
295
+ initial_value: "Exit player button",
296
296
  label_tooltip: "Label for back button accessibility",
297
297
  type: "text_input",
298
298
  },
@@ -317,6 +317,20 @@ function getPlayerConfiguration({ platform, version }) {
317
317
  label_tooltip: "Hint for fullscreen button accessibility",
318
318
  type: "text_input",
319
319
  },
320
+ {
321
+ key: "accessibility_skip_intro_label",
322
+ label: "Accessibility skip intro label",
323
+ initial_value: "Skip intro - button",
324
+ label_tooltip: "Label for skip intro button accessibility",
325
+ type: "text_input",
326
+ },
327
+ {
328
+ key: "accessibility_skip_intro_hint",
329
+ label: "Accessibility skip intro hint",
330
+ initial_value: "Press to skip intro",
331
+ label_tooltip: "Hint for skip intro button accessibility",
332
+ type: "text_input",
333
+ },
320
334
  ],
321
335
  };
322
336
 
@@ -351,6 +365,86 @@ function getPlayerConfiguration({ platform, version }) {
351
365
  ],
352
366
  },
353
367
  ]),
368
+ fieldsGroup(
369
+ "Partial Player (Roku only)",
370
+ "This section allows you to configure width and height of video player in Partial Player",
371
+ [
372
+ {
373
+ key: "video_theater_width",
374
+ label: "Width of player",
375
+ type: "number_input",
376
+ initial_value: 1420,
377
+ placeholder: "1420",
378
+ },
379
+ {
380
+ key: "video_theater_height",
381
+ label: "Height of player",
382
+ type: "number_input",
383
+ initial_value: 900,
384
+ placeholder: "900",
385
+ },
386
+ {
387
+ key: "full_screen_button_offset_x",
388
+ label: "Fullscreen button X",
389
+ type: "number_input",
390
+ initial_value: 160,
391
+ placeholder: "160",
392
+ },
393
+ {
394
+ key: "full_screen_button_offset_y",
395
+ label: "Fullscreen button Y",
396
+ type: "number_input",
397
+ initial_value: 160,
398
+ placeholder: "160",
399
+ },
400
+ {
401
+ key: "full_screen_button_w",
402
+ label: "Fullscreen button width",
403
+ type: "number_input",
404
+ initial_value: 120,
405
+ placeholder: "120",
406
+ },
407
+ {
408
+ key: "full_screen_button_h",
409
+ label: "Fullscreen button height",
410
+ type: "number_input",
411
+ initial_value: 120,
412
+ placeholder: "120",
413
+ },
414
+ {
415
+ key: "full_screen_button_background_color",
416
+ type: "color_picker",
417
+ label: "Fullscreen Button background color",
418
+ initial_value: "#00000000",
419
+ placeholder: "color",
420
+ label_tooltip: "Pick Color",
421
+ },
422
+ {
423
+ key: "full_screen_button_background_url",
424
+ type: "text_input",
425
+ label: "Fullscreen Button background URL",
426
+ initial_value: "pkg:/images/tv_fullscreen.png",
427
+ placeholder: "",
428
+ label_tooltip: "",
429
+ },
430
+ {
431
+ key: "full_screen_button_highlighted_background_color",
432
+ type: "color_picker",
433
+ label: "Fullscreen Button highlighted background color",
434
+ initial_value: "#00000000",
435
+ placeholder: "color",
436
+ label_tooltip: "Pick Color",
437
+ },
438
+ {
439
+ key: "full_screen_button_highlighted_background_url",
440
+ type: "text_input",
441
+ label: "Fullscreen Button highlighted URL",
442
+ initial_value: "pkg:/images/tv_fullscreen.png",
443
+ placeholder: "",
444
+ label_tooltip: "",
445
+ },
446
+ ]
447
+ ),
354
448
  fieldsGroup(
355
449
  "Skip Button",
356
450
  "This section allows you to configure the skip button styles for tv",
@@ -482,6 +576,20 @@ function getPlayerConfiguration({ platform, version }) {
482
576
  key: "skip_button_style_text_android_font_size",
483
577
  initial_value: 24,
484
578
  },
579
+ {
580
+ type: "roku_font_selector",
581
+ label_tooltip: "",
582
+ label: "Roku Font Family",
583
+ key: "skip_button_style_text_roku_font_family",
584
+ initial_value: "Ubuntu-Bold",
585
+ },
586
+ {
587
+ type: "number_input",
588
+ label_tooltip: "",
589
+ label: "Roku Font Size",
590
+ key: "skip_button_style_text_roku_font_size",
591
+ initial_value: 24,
592
+ },
485
593
  {
486
594
  type: "select",
487
595
  options: [
@@ -2890,6 +2998,18 @@ function getPlayerConfiguration({ platform, version }) {
2890
2998
  key: "android_tv_audio_player_title_font_size",
2891
2999
  initial_value: 40,
2892
3000
  },
3001
+ {
3002
+ type: "roku_font_selector",
3003
+ label: "Roku Font Family",
3004
+ key: "roku_audio_player_title_font_family",
3005
+ initial_value: "Ubuntu-Bold",
3006
+ },
3007
+ {
3008
+ type: "number_input",
3009
+ label: "Roku Font Size",
3010
+ key: "roku_audio_player_title_font_size",
3011
+ initial_value: 40,
3012
+ },
2893
3013
  ]
2894
3014
  ),
2895
3015
  // Audio Player Summary Font Family
@@ -2963,6 +3083,18 @@ function getPlayerConfiguration({ platform, version }) {
2963
3083
  key: "android_tv_audio_player_summary_font_size",
2964
3084
  initial_value: 22,
2965
3085
  },
3086
+ {
3087
+ type: "roku_font_selector",
3088
+ label: "Roku Font Family",
3089
+ key: "roku_audio_player_summary_font_family",
3090
+ initial_value: "Ubuntu-Medium",
3091
+ },
3092
+ {
3093
+ type: "number_input",
3094
+ label: "Roku Font Size",
3095
+ key: "roku_audio_player_summary_font_size",
3096
+ initial_value: 22,
3097
+ },
2966
3098
  ]
2967
3099
  ),
2968
3100
  fieldsGroup(
@@ -2985,6 +3117,14 @@ function getPlayerConfiguration({ platform, version }) {
2985
3117
  type: "uploader",
2986
3118
  default: "",
2987
3119
  },
3120
+ {
3121
+ key: "audio_player_background_image_overlay",
3122
+ label: "Background Image Overlay",
3123
+ label_tooltip:
3124
+ "Add a semi-transparent color overlay to improve text readability over the background image.",
3125
+ type: "color_picker_rgba",
3126
+ initial_value: "rgba(17, 17, 17, 0.5)",
3127
+ },
2988
3128
  {
2989
3129
  type: "text_input",
2990
3130
  label: "Item Image Key",
@@ -3322,6 +3462,60 @@ function getPlayerConfiguration({ platform, version }) {
3322
3462
  },
3323
3463
  ]
3324
3464
  ),
3465
+ fieldsGroup(
3466
+ "Roku only",
3467
+ "This section allows you to configure RAF - Roku Ad Framework settings",
3468
+ [
3469
+ {
3470
+ key: "raf_enabled",
3471
+ type: "switch",
3472
+ initial_value: false,
3473
+ },
3474
+ {
3475
+ key: "raf_url",
3476
+ type: "text_input",
3477
+ label: "Ad URL",
3478
+ label_tooltip:
3479
+ "Publisher's ad URL. The default is the Roku Ad Server with a single pre-roll placeholder, with revenue split ad sharing by default. TO GET PAID A URL MUST BE PASSED IN HERE. Note: If you are putting ads in child targetted content then your ad url will have to use the ROKU_ADS_KIDS_CONTENT macro value, as per the docs here: developer.roku.com/docs/developer-program/advertising/integrating-roku-advertising-framework.md#url-parameter-macros",
3480
+ },
3481
+ {
3482
+ key: "genre",
3483
+ type: "text_input",
3484
+ label: "Roku Genre",
3485
+ initial_value: "Entertainment",
3486
+ label_tooltip:
3487
+ "Choose value from Roku genre tags, from developer.roku.com/en-gb/docs/developer-program/advertising/integrating-roku-advertising-framework.md",
3488
+ },
3489
+ {
3490
+ key: "nielsen_enabled",
3491
+ type: "checkbox",
3492
+ initial_value: false,
3493
+ label_tooltip:
3494
+ "Required only for apps launched in the US market, See developer.roku.com/en-gb/docs/developer-program/advertising/integrating-roku-advertising-framework.md for details on configuration",
3495
+ },
3496
+ {
3497
+ key: "nielsen_app_id",
3498
+ type: "text_input",
3499
+ initial_value: "",
3500
+ label_tooltip:
3501
+ "id of your app for nielsen leave blank if you don't have a specific id (that is almost always the case)",
3502
+ },
3503
+ {
3504
+ key: "nielsen_genre",
3505
+ type: "text_input",
3506
+ initial_value: "General",
3507
+ label_tooltip:
3508
+ "genre from developer.roku.com/en-gb/docs/developer-program/advertising/integrating-roku-advertising-framework.md#nielsen-dar-genre-tags",
3509
+ },
3510
+ {
3511
+ key: "is_kids_content",
3512
+ type: "checkbox",
3513
+ initial_value: false,
3514
+ label_tooltip:
3515
+ "If your content is directed at kids, this must be checked. See developer.roku.com/docs/developer-program/advertising/raf-api.md#setcontentgenregenres-as-string-kidscontent-as-boolean for more info. Also note your ad urls will have to use the ROKU_ADS_KIDS_CONTENT macro value, as per the docs here: developer.roku.com/docs/developer-program/advertising/integrating-roku-advertising-framework.md#url-parameter-macros",
3516
+ },
3517
+ ]
3518
+ ),
3325
3519
  fieldsGroup(
3326
3520
  "Audio Tracks",
3327
3521
  "This section allows you to configure default audio track behavior for videos with multiple audio tracks",
@@ -29,6 +29,9 @@ const {
29
29
  getUpdatedSecondaryImageKeys,
30
30
  } = require("./secondaryImage");
31
31
 
32
+ const DEFAULT_GRADIENT_IMAGE =
33
+ "data:image/png;base64,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";
34
+
32
35
  module.exports = {
33
36
  fontKey,
34
37
  fontKeyTV,
@@ -47,5 +50,6 @@ module.exports = {
47
50
  tvProgressBar,
48
51
  secondaryImage,
49
52
  getUpdatedSecondaryImageKeys,
53
+ DEFAULT_GRADIENT_IMAGE,
50
54
  compact,
51
55
  };
@@ -485,6 +485,18 @@ const TV_MENU_LABEL_FIELDS = [
485
485
  type: ZAPPIFEST_FIELDS.number_input,
486
486
  suffix: "LG letter spacing",
487
487
  },
488
+ {
489
+ type: ZAPPIFEST_FIELDS.font_selector.roku,
490
+ suffix: "Roku font family",
491
+ },
492
+ {
493
+ type: ZAPPIFEST_FIELDS.number_input,
494
+ suffix: "Roku font size",
495
+ },
496
+ {
497
+ type: ZAPPIFEST_FIELDS.number_input,
498
+ suffix: "Roku line height",
499
+ },
488
500
  {
489
501
  type: ZAPPIFEST_FIELDS.select,
490
502
  suffix: "text transform",
@@ -424,6 +424,12 @@ const titleFields = [
424
424
  key: "vizio_font_family",
425
425
  initial_value: fontFamily,
426
426
  },
427
+ {
428
+ type: "roku_font_selector",
429
+ label: "Roku TV Font Family",
430
+ key: "roku_font_family",
431
+ initial_value: fontFamily,
432
+ },
427
433
  ...generateFontConfiguration(),
428
434
  // text transform
429
435
  {
@@ -0,0 +1,130 @@
1
+ import { mapContentTypesToRivers } from "../index";
2
+
3
+ describe("mapContentTypesToRivers", () => {
4
+ it("should return the correct content types mapped to rivers", () => {
5
+ const state = {
6
+ rivers: {
7
+ "river-1": {
8
+ plugin_type: "river",
9
+ },
10
+ },
11
+ contentTypes: {
12
+ "content-type-1": {
13
+ screen_id: "river-1",
14
+ },
15
+ },
16
+ };
17
+
18
+ const result = mapContentTypesToRivers(state);
19
+
20
+ expect(result).toEqual({
21
+ "content-type-1": {
22
+ screenType: "river",
23
+ screen_id: "river-1",
24
+ },
25
+ });
26
+ });
27
+
28
+ it("should return null if contentTypes is undefined", () => {
29
+ const state = {
30
+ rivers: {
31
+ "river-1": {
32
+ plugin_type: "river",
33
+ },
34
+ },
35
+ // contentTypes is missing
36
+ };
37
+
38
+ const result = mapContentTypesToRivers(state);
39
+
40
+ expect(result).toBeNull();
41
+ });
42
+
43
+ it("should skip content types whose screen does not exist in rivers", () => {
44
+ const state = {
45
+ rivers: {
46
+ "river-1": {
47
+ plugin_type: "river",
48
+ },
49
+ },
50
+ contentTypes: {
51
+ "content-type-1": {
52
+ screen_id: "river-1",
53
+ },
54
+ "content-type-2": {
55
+ screen_id: "river-2", // river-2 does not exist
56
+ },
57
+ },
58
+ };
59
+
60
+ const result = mapContentTypesToRivers(state);
61
+
62
+ expect(result).toEqual({
63
+ "content-type-1": {
64
+ screenType: "river",
65
+ screen_id: "river-1",
66
+ },
67
+ });
68
+
69
+ // result is not null, but may be undefined for missing keys
70
+ expect(result && result["content-type-2"]).toBeUndefined();
71
+ });
72
+
73
+ it("should use 'type' if 'plugin_type' is not present in river", () => {
74
+ const state = {
75
+ rivers: {
76
+ "river-1": {
77
+ type: "custom-type",
78
+ },
79
+ },
80
+ contentTypes: {
81
+ "content-type-1": {
82
+ screen_id: "river-1",
83
+ },
84
+ },
85
+ };
86
+
87
+ const result = mapContentTypesToRivers(state);
88
+
89
+ expect(result).toEqual({
90
+ "content-type-1": {
91
+ screenType: "custom-type",
92
+ screen_id: "river-1",
93
+ },
94
+ });
95
+ });
96
+
97
+ it("should skip content types if neither plugin_type nor type is present in river", () => {
98
+ const state = {
99
+ rivers: {
100
+ "river-1": {
101
+ // no plugin_type or type
102
+ },
103
+ },
104
+ contentTypes: {
105
+ "content-type-1": {
106
+ screen_id: "river-1",
107
+ },
108
+ },
109
+ };
110
+
111
+ const result = mapContentTypesToRivers(state);
112
+
113
+ expect(result).toEqual({});
114
+ });
115
+
116
+ it("should handle empty contentTypes object", () => {
117
+ const state = {
118
+ rivers: {
119
+ "river-1": {
120
+ plugin_type: "river",
121
+ },
122
+ },
123
+ contentTypes: {},
124
+ };
125
+
126
+ const result = mapContentTypesToRivers(state);
127
+
128
+ expect(result).toEqual({});
129
+ });
130
+ });
@@ -13,6 +13,7 @@ import {
13
13
  isPlayable,
14
14
  isV2River,
15
15
  } from "./itemTypeMatchers";
16
+ import { RootState } from "@applicaster/zapp-react-native-redux/store";
16
17
 
17
18
  type PathAttribute = {
18
19
  screenType: string;
@@ -41,7 +42,7 @@ export function getNavigationType(
41
42
  R.unless(R.isNil, R.prop("navigation_type")),
42
43
  R.defaultTo(undefined),
43
44
  R.find(R.propEq("category", category))
44
- )(navigations);
45
+ )(navigations || []);
45
46
  }
46
47
 
47
48
  /**
@@ -377,10 +378,11 @@ export const usesVideoModal = (
377
378
  return targetScreenConfiguration?.styles?.use_video_modal;
378
379
  };
379
380
 
380
- export const mapContentTypesToRivers = ({
381
- rivers,
382
- contentTypes,
383
- }): ZappContentTypesMapped | null => {
381
+ export const mapContentTypesToRivers = (
382
+ state: Partial<RootState>
383
+ ): ZappContentTypesMapped | null => {
384
+ const { rivers, contentTypes } = state;
385
+
384
386
  if (!contentTypes) {
385
387
  return null;
386
388
  }
@@ -573,24 +575,27 @@ export function routeIsPlayerScreen(currentRoute) {
573
575
  return currentRoute?.includes("/playable");
574
576
  }
575
577
 
576
- export const getNavBarProps =
577
- (currentRiver: ZappRiver, pathname: string, title: string) => () => {
578
- const props = getNavigationPropsV2({
579
- currentRiver,
580
- title,
581
- category: "nav_bar",
582
- });
578
+ export const getNavBarProps = (
579
+ currentRiver: ZappRiver,
580
+ pathname: string,
581
+ title: string
582
+ ) => {
583
+ const props = getNavigationPropsV2({
584
+ currentRiver,
585
+ title,
586
+ category: "nav_bar",
587
+ });
583
588
 
584
- if (props) {
585
- return {
586
- ...props,
587
- id: pathname,
588
- pathname: pathname,
589
- };
590
- }
589
+ if (props) {
590
+ return {
591
+ ...props,
592
+ id: pathname,
593
+ pathname: pathname,
594
+ };
595
+ }
591
596
 
592
- return null;
593
- };
597
+ return null;
598
+ };
594
599
 
595
600
  export const findMenuPlugin = (
596
601
  navigations: ZappNavigation[],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@applicaster/zapp-react-native-utils",
3
- "version": "14.0.0-alpha.3259144304",
3
+ "version": "14.0.0-alpha.3497255033",
4
4
  "description": "Applicaster Zapp React Native utilities package",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
@@ -27,7 +27,7 @@
27
27
  },
28
28
  "homepage": "https://github.com/applicaster/quickbrick#readme",
29
29
  "dependencies": {
30
- "@applicaster/applicaster-types": "14.0.0-alpha.3259144304",
30
+ "@applicaster/applicaster-types": "14.0.0-alpha.3497255033",
31
31
  "buffer": "^5.2.1",
32
32
  "camelize": "^1.0.0",
33
33
  "dayjs": "^1.11.10",
@@ -38,7 +38,6 @@
38
38
  "peerDependencies": {
39
39
  "@applicaster/zapp-pipes-v2-client": "*",
40
40
  "@react-native-community/netinfo": "*",
41
- "immer": "*",
42
41
  "react": "*",
43
42
  "react-native": "*",
44
43
  "uglify-js": "*",