@applicaster/zapp-react-native-utils 16.0.0-alpha.2851031376 → 16.0.0-alpha.2963644197

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 (186) hide show
  1. package/actionsExecutor/ActionExecutor.ts +57 -12
  2. package/actionsExecutor/ActionExecutorContext.tsx +111 -313
  3. package/actionsExecutor/__tests__/ActionExecutor.test.ts +71 -0
  4. package/actionsExecutor/__tests__/feedDecorator.test.ts +61 -0
  5. package/actionsExecutor/actions/__tests__/dismissBottomSheet.test.ts +25 -0
  6. package/actionsExecutor/actions/__tests__/goBack.test.ts +62 -0
  7. package/actionsExecutor/actions/__tests__/goHome.test.ts +19 -0
  8. package/actionsExecutor/actions/__tests__/loadItemsFromSource.test.ts +88 -0
  9. package/actionsExecutor/actions/__tests__/navigateToScreen.test.ts +133 -0
  10. package/actionsExecutor/actions/__tests__/openBottomSheet.customContent.test.ts +76 -0
  11. package/actionsExecutor/actions/__tests__/openBottomSheet.inlineItems.test.ts +300 -0
  12. package/actionsExecutor/actions/__tests__/presentScreen.test.ts +127 -0
  13. package/actionsExecutor/actions/__tests__/showAlert.test.ts +49 -0
  14. package/actionsExecutor/actions/__tests__/showToast.test.ts +88 -0
  15. package/actionsExecutor/actions/appRestart.ts +24 -0
  16. package/actionsExecutor/actions/confirmDialog.ts +53 -0
  17. package/actionsExecutor/actions/dismissBottomSheet.ts +23 -0
  18. package/actionsExecutor/actions/goBack.ts +60 -0
  19. package/actionsExecutor/actions/goHome.ts +31 -0
  20. package/actionsExecutor/actions/index.ts +42 -0
  21. package/actionsExecutor/actions/localStorageRemove.ts +27 -0
  22. package/actionsExecutor/actions/localStorageSet.ts +28 -0
  23. package/actionsExecutor/actions/localStorageToggleFlag.ts +28 -0
  24. package/actionsExecutor/actions/navigateToScreen.ts +137 -0
  25. package/actionsExecutor/actions/openBottomSheet.ts +338 -0
  26. package/actionsExecutor/actions/presentScreen.ts +78 -0
  27. package/actionsExecutor/actions/refreshComponent.ts +85 -0
  28. package/actionsExecutor/actions/screenSetVariable.ts +35 -0
  29. package/actionsExecutor/actions/screenToggleFlag.ts +38 -0
  30. package/actionsExecutor/actions/sendCloudEvent.ts +93 -0
  31. package/actionsExecutor/actions/sessionStorageRemove.ts +19 -0
  32. package/actionsExecutor/actions/sessionStorageSet.ts +20 -0
  33. package/actionsExecutor/actions/sessionStorageToggleFlag.ts +15 -0
  34. package/actionsExecutor/actions/showAlert.ts +51 -0
  35. package/actionsExecutor/actions/showToast.ts +87 -0
  36. package/actionsExecutor/actions/switchLayout.ts +40 -0
  37. package/actionsExecutor/consts.ts +27 -0
  38. package/actionsExecutor/feedDecorator.ts +6 -6
  39. package/actionsExecutor/types.ts +59 -0
  40. package/analyticsUtils/AnalyticsEvents/sendMenuClickEvent.ts +2 -2
  41. package/analyticsUtils/PlayerAnalyticsManager.ts +1 -1
  42. package/appUtils/HooksManager/index.ts +9 -0
  43. package/appUtils/contextKeysManager/__tests__/getKey/failure.test.ts +1 -1
  44. package/appUtils/contextKeysManager/__tests__/removeKey/failure.test.ts +1 -1
  45. package/appUtils/contextKeysManager/__tests__/setKey/failure/invalidKey.test.ts +4 -4
  46. package/appUtils/contextKeysManager/index.ts +1 -1
  47. package/appUtils/playerManager/OverlayObserver/OverlaysObserver.ts +142 -59
  48. package/appUtils/playerManager/OverlayObserver/__tests__/getUpcomingQueue.test.ts +67 -0
  49. package/appUtils/playerManager/OverlayObserver/__tests__/liveContent.test.ts +205 -0
  50. package/appUtils/playerManager/OverlayObserver/__tests__/utils.test.ts +56 -0
  51. package/appUtils/playerManager/OverlayObserver/getUpcomingQueue.android.tv.ts +4 -0
  52. package/appUtils/playerManager/OverlayObserver/getUpcomingQueue.ios.tv.ts +4 -0
  53. package/appUtils/playerManager/OverlayObserver/getUpcomingQueue.ts +24 -0
  54. package/appUtils/playerManager/OverlayObserver/getUpcomingQueue.web.ts +4 -0
  55. package/appUtils/playerManager/OverlayObserver/utils.ts +51 -20
  56. package/appUtils/playerManager/__tests__/playerContent.test.ts +403 -0
  57. package/appUtils/playerManager/__tests__/playerFactory.test.ts +1 -1
  58. package/appUtils/playerManager/__tests__/playerNative.test.ts +114 -0
  59. package/appUtils/playerManager/__tests__/playerNativeCommand.test.ts +62 -0
  60. package/appUtils/playerManager/__tests__/usePlayerContent.test.tsx +64 -0
  61. package/appUtils/playerManager/{conts.ts → const.ts} +33 -0
  62. package/appUtils/playerManager/index.ts +1 -1
  63. package/appUtils/playerManager/player.ts +125 -3
  64. package/appUtils/playerManager/playerFactory.ts +1 -1
  65. package/appUtils/playerManager/playerNative.ts +28 -4
  66. package/appUtils/playerManager/playerNativeCommand.ts +3 -6
  67. package/appUtils/playerManager/usePlayerContent.tsx +43 -0
  68. package/appUtils/playerManager/usePlayerControllerSetup.tsx +1 -1
  69. package/appUtils/playerManager/userLanguagePreference.ts +1 -1
  70. package/arrayUtils/__tests__/{anyThruthy.test.ts → anyTruthy.test.ts} +8 -0
  71. package/arrayUtils/__tests__/arrayUtils.test.ts +165 -108
  72. package/arrayUtils/__tests__/isEmptyArray.test.ts +11 -0
  73. package/arrayUtils/__tests__/isFilledArray.test.ts +12 -0
  74. package/arrayUtils/__tests__/isFirst.test.ts +17 -0
  75. package/arrayUtils/__tests__/isIndexInRange.test.ts +14 -0
  76. package/arrayUtils/__tests__/isLast.test.ts +31 -0
  77. package/arrayUtils/__tests__/makeListOf.test.ts +31 -0
  78. package/arrayUtils/__tests__/makeListOfIndexes.test.ts +20 -0
  79. package/arrayUtils/__tests__/reorderByIds.test.ts +50 -0
  80. package/arrayUtils/__tests__/sample.test.ts +61 -0
  81. package/arrayUtils/index.ts +136 -20
  82. package/bottomSheet/__tests__/scrollContext.test.tsx +35 -0
  83. package/bottomSheet/index.ts +17 -0
  84. package/cellUtils/index.ts +33 -8
  85. package/colorUtils/__tests__/isTransparentColor.test.ts +76 -0
  86. package/colorUtils/__tests__/isValidColor.test.ts +70 -0
  87. package/colorUtils/index.ts +50 -0
  88. package/configurationUtils/__tests__/manifestKeyParser.test.ts +21 -0
  89. package/configurationUtils/__tests__/modalBlocksParser.test.ts +269 -0
  90. package/configurationUtils/manifestKeyParser.ts +50 -10
  91. package/configurationUtils/modalBlocksParser.ts +214 -0
  92. package/entryActions/__tests__/buildEntryActions.test.ts +235 -0
  93. package/entryActions/aliasPresentation.ts +108 -0
  94. package/entryActions/buildEntryActions.ts +167 -0
  95. package/entryActions/index.ts +15 -0
  96. package/entryActions/types.ts +39 -0
  97. package/manifestUtils/__tests__/player.audioControls.test.js +158 -0
  98. package/manifestUtils/_internals/index.js +14 -3
  99. package/manifestUtils/defaultManifestConfigurations/generalContent.js +6 -0
  100. package/manifestUtils/defaultManifestConfigurations/player.js +349 -20
  101. package/manifestUtils/fieldUtils/__tests__/fieldUtils.test.js +84 -0
  102. package/manifestUtils/fieldUtils/index.js +125 -0
  103. package/manifestUtils/index.js +3 -0
  104. package/manifestUtils/keys.js +8 -0
  105. package/manifestUtils/mobileAction/button/index.js +16 -0
  106. package/manifestUtils/mobileAction/container/index.js +3 -1
  107. package/manifestUtils/mobileAction/groups/defaults.js +3 -1
  108. package/manifestUtils/modalBlocks.js +304 -0
  109. package/modalState/ContentViewModel.ts +113 -0
  110. package/modalState/EditableCollection.ts +17 -0
  111. package/modalState/EditableCollectionRegistry.ts +51 -0
  112. package/modalState/ModalOrchestrator.ts +212 -0
  113. package/modalState/RemoteEditableCollection.ts +235 -0
  114. package/modalState/__tests__/ContentViewModel.editable.test.ts +69 -0
  115. package/modalState/__tests__/ContentViewModel.test.ts +165 -0
  116. package/modalState/__tests__/EditableCollectionRegistry.test.ts +112 -0
  117. package/modalState/__tests__/ModalOrchestrator.phase3.test.ts +63 -0
  118. package/modalState/__tests__/RemoteEditableCollection.test.ts +415 -0
  119. package/modalState/__tests__/index.test.ts +30 -1
  120. package/modalState/__tests__/useBottomSheetContent.test.ts +349 -0
  121. package/modalState/__tests__/useModalStoreState.test.ts +142 -0
  122. package/modalState/index.ts +35 -83
  123. package/modalState/store.ts +109 -0
  124. package/modalState/types.ts +162 -0
  125. package/modalState/useBottomSheetContent.ts +109 -0
  126. package/numberUtils/__tests__/isMinusZero.test.ts +20 -0
  127. package/numberUtils/__tests__/isZero.test.ts +27 -0
  128. package/numberUtils/__tests__/requireNumber.test.ts +50 -0
  129. package/numberUtils/__tests__/toNumber.test.ts +27 -0
  130. package/numberUtils/__tests__/toNumberWithDefault.test.ts +64 -0
  131. package/numberUtils/__tests__/toNumberWithDefaultZero.test.ts +48 -0
  132. package/numberUtils/index.ts +27 -8
  133. package/package.json +2 -2
  134. package/pipesUtils/__tests__/buildUrlWithQuery.test.ts +33 -0
  135. package/pipesUtils/__tests__/withPipesEndpoint.test.tsx +56 -0
  136. package/pipesUtils/index.ts +1 -0
  137. package/pipesUtils/withPipesEndpoint.tsx +54 -0
  138. package/playerUtils/__tests__/contentDataKeys.test.ts +297 -0
  139. package/playerUtils/__tests__/resolvePlayerActions.test.ts +138 -0
  140. package/playerUtils/__tests__/resolvePlayerTitleSubtitle.test.ts +180 -0
  141. package/playerUtils/contentDataKeys.ts +134 -0
  142. package/playerUtils/index.ts +37 -16
  143. package/playerUtils/isAudioItem.ts +26 -0
  144. package/playerUtils/resolvePlayerActions.ts +71 -0
  145. package/playerUtils/resolvePlayerTitleSubtitle.ts +76 -0
  146. package/pluginUtils/__tests__/pluginUtils.test.js +32 -0
  147. package/pluginUtils/index.ts +29 -0
  148. package/reactHooks/actions/index.ts +117 -2
  149. package/reactHooks/cell-click/__tests__/index.test.js +64 -0
  150. package/reactHooks/cell-click/index.ts +24 -17
  151. package/reactHooks/feed/__mocks__/useMarkPipesDataStale.ts +4 -0
  152. package/reactHooks/feed/__tests__/useInflatedUrl.test.tsx +25 -0
  153. package/reactHooks/feed/index.ts +5 -1
  154. package/reactHooks/feed/useBatchLoading.ts +9 -1
  155. package/reactHooks/feed/{usePipesCacheReset.ts → useMarkPipesDataStale.ts} +12 -4
  156. package/reactHooks/index.ts +2 -0
  157. package/reactHooks/layout/index.ts +1 -1
  158. package/reactHooks/navigation/__mocks__/index.ts +4 -0
  159. package/reactHooks/navigation/__tests__/index.test.tsx +176 -1
  160. package/reactHooks/navigation/__tests__/useIsScreenActive.test.ts +42 -0
  161. package/reactHooks/navigation/__tests__/usePresentScreen.test.ts +154 -0
  162. package/reactHooks/navigation/index.ts +3 -1
  163. package/reactHooks/navigation/useIsScreenActive.ts +29 -8
  164. package/reactHooks/navigation/usePresentScreen.ts +157 -0
  165. package/reactHooks/navigation/useRoute.ts +22 -5
  166. package/reactHooks/state/useComponentScreenState.ts +1 -1
  167. package/reactHooks/usePluginConfiguration.ts +4 -1
  168. package/reactHooks/utils/__tests__/index.test.js +22 -2
  169. package/reactHooks/utils/index.ts +13 -2
  170. package/riverComponetsMeasurementProvider/index.tsx +12 -8
  171. package/stringUtils/__tests__/stringUtils.test.js +42 -0
  172. package/stringUtils/index.ts +2 -2
  173. package/uiActionsRegistrator/__tests__/resolveActionIdentifiers.test.ts +93 -0
  174. package/uiActionsRegistrator/__tests__/subscribe.test.ts +107 -0
  175. package/uiActionsRegistrator/__tests__/usableActionItems.test.ts +52 -0
  176. package/uiActionsRegistrator/index.ts +25 -0
  177. package/uiActionsRegistrator/registry.ts +335 -0
  178. package/uiActionsRegistrator/resolveActionIdentifiers.ts +100 -0
  179. package/uiActionsRegistrator/usableActionItems.ts +66 -0
  180. package/zappFrameworkUtils/__tests__/localStorageHelper.test.ts +146 -0
  181. package/zappFrameworkUtils/localStorageHelper.ts +19 -15
  182. package/appUtils/playerManager/usePlayerTitleSummaryOverlay.tsx +0 -56
  183. package/playerUtils/__tests__/getPlayerActionButtons.test.ts +0 -54
  184. package/playerUtils/getPlayerActionButtons.ts +0 -17
  185. package/reactHooks/feed/__mocks__/usePipesCacheReset.ts +0 -1
  186. /package/reactHooks/actions/__tests__/{index.test.js → index.test.tsx} +0 -0
@@ -0,0 +1,158 @@
1
+ const { player } = require("../defaultManifestConfigurations/player");
2
+
3
+ const manifestFor = (platform) => player({ platform, version: "0.0.0" });
4
+
5
+ const findGroup = (manifest, label) =>
6
+ manifest.styles.fields.find((group) => group.group && group.label === label);
7
+
8
+ const findFieldInGroup = (manifest, label, key) =>
9
+ findGroup(manifest, label)?.fields?.find((field) => field.key === key);
10
+
11
+ const findLocalization = (manifest, key) =>
12
+ manifest.localizations.fields.find((field) => field.key === key);
13
+
14
+ describe("player manifest — audio playlist controls", () => {
15
+ const manifest = manifestFor("ios_for_quickbrick");
16
+
17
+ describe("Player Controls Layout", () => {
18
+ const field = () =>
19
+ findFieldInGroup(manifest, "Audio Player", "player_controls_layout");
20
+
21
+ it("is declared in the Audio Player group", () => {
22
+ expect(field()).toBeDefined();
23
+ });
24
+
25
+ it("is a select defaulting to the existing controls", () => {
26
+ expect(field().type).toBe("select");
27
+ expect(field().initial_value).toBe("playback_speed_and_sleep_timer");
28
+ });
29
+
30
+ it("only shows when the audio player layout is in use", () => {
31
+ expect(field()).toMatchObject({
32
+ rules: "conditional",
33
+ conditional_fields: [
34
+ { key: "styles/full_screen_audio_player", condition_value: true },
35
+ ],
36
+ });
37
+ });
38
+
39
+ it("offers exactly the two documented options", () => {
40
+ expect(field().options).toEqual([
41
+ {
42
+ text: "Playback Speed & Sleep Timer (Default)",
43
+ value: "playback_speed_and_sleep_timer",
44
+ },
45
+ {
46
+ text: "Playlist Controls (Previous & Next)",
47
+ value: "playlist_controls",
48
+ },
49
+ ]);
50
+ });
51
+ });
52
+
53
+ describe("control icons", () => {
54
+ it.each(["previous_track", "next_track"])(
55
+ "declares %s as an uploader",
56
+ (key) => {
57
+ expect(findFieldInGroup(manifest, "Assets", key)).toMatchObject({
58
+ key,
59
+ type: "uploader",
60
+ });
61
+ }
62
+ );
63
+
64
+ it.each(["previous_track", "next_track"])(
65
+ "only shows %s when the playlist controls layout is selected",
66
+ (key) => {
67
+ expect(findFieldInGroup(manifest, "Assets", key)).toMatchObject({
68
+ rules: "conditional",
69
+ conditional_fields: [
70
+ {
71
+ key: "styles/player_controls_layout",
72
+ condition_value: "playlist_controls",
73
+ },
74
+ ],
75
+ });
76
+ }
77
+ );
78
+
79
+ it.each([
80
+ "speed_0_8",
81
+ "speed_1",
82
+ "speed_1_2",
83
+ "speed_1_5",
84
+ "speed_2",
85
+ "sleep_timer",
86
+ "sleep_timer_active",
87
+ ])(
88
+ "only shows %s when the playback speed and sleep timer layout is selected",
89
+ (key) => {
90
+ expect(findFieldInGroup(manifest, "Assets", key)).toMatchObject({
91
+ rules: "conditional",
92
+ conditional_fields: [
93
+ {
94
+ key: "styles/player_controls_layout",
95
+ condition_value: "playback_speed_and_sleep_timer",
96
+ },
97
+ ],
98
+ });
99
+ }
100
+ );
101
+ });
102
+
103
+ describe("accessibility strings", () => {
104
+ it.each([
105
+ "accessibility_previous_track_label",
106
+ "accessibility_previous_track_hint",
107
+ "accessibility_next_track_label",
108
+ "accessibility_next_track_hint",
109
+ ])("declares %s with a default", (key) => {
110
+ expect(findLocalization(manifest, key)).toMatchObject({
111
+ type: "text_input",
112
+ });
113
+
114
+ expect(findLocalization(manifest, key).initial_value).toBeTruthy();
115
+ });
116
+ });
117
+
118
+ describe("tv platforms", () => {
119
+ // The audio player layout is mobile only, so nothing this feature adds —
120
+ // including its screen reader strings — belongs in a tv manifest.
121
+ it.each(["tvos_for_quickbrick", "android_tv_for_quickbrick", "lg_tv"])(
122
+ "adds no audio controls layout field on %s",
123
+ (platform) => {
124
+ expect(
125
+ findFieldInGroup(
126
+ manifestFor(platform),
127
+ "Audio Player",
128
+ "player_controls_layout"
129
+ )
130
+ ).toBeUndefined();
131
+ }
132
+ );
133
+
134
+ it.each([
135
+ "accessibility_previous_track_label",
136
+ "accessibility_previous_track_hint",
137
+ "accessibility_next_track_label",
138
+ "accessibility_next_track_hint",
139
+ ])("does not declare %s on tv", (key) => {
140
+ expect(
141
+ findLocalization(manifestFor("tvos_for_quickbrick"), key)
142
+ ).toBeUndefined();
143
+ });
144
+
145
+ it("still declares the tv-only localizations", () => {
146
+ expect(
147
+ findLocalization(
148
+ manifestFor("tvos_for_quickbrick"),
149
+ "back_to_live_label"
150
+ )
151
+ ).toBeDefined();
152
+
153
+ expect(
154
+ findLocalization(manifestFor("tvos_for_quickbrick"), "start_over_label")
155
+ ).toBeDefined();
156
+ });
157
+ });
158
+ });
@@ -135,7 +135,8 @@ function generateFieldsFromDefaults(label, defaults, fields) {
135
135
  function generateFieldsFromDefaultsWithoutPrefixedLabel(
136
136
  label,
137
137
  defaults,
138
- fields
138
+ fields,
139
+ { withStyle = false } = {}
139
140
  ) {
140
141
  const keyPrefix = toSnakeCase(label);
141
142
 
@@ -151,19 +152,29 @@ function generateFieldsFromDefaultsWithoutPrefixedLabel(
151
152
  const generatedField = {
152
153
  ...fieldProps,
153
154
  label: capitalizeFirstLetter(field.suffix),
154
- key: `${keyPrefix}_${toSnakeCase(field.suffix)}`,
155
+ key: withStyle
156
+ ? `${keyPrefix}_style_${toSnakeCase(field.suffix)}`
157
+ : `${keyPrefix}_${toSnakeCase(field.suffix)}`,
155
158
  initial_value: R.when(R.is(Array), R.head)(initialValue),
156
159
  };
157
160
 
158
161
  if (conditions) {
159
162
  generatedField.conditional_fields = conditions.map((condition) => {
163
+ if (condition.section === null) {
164
+ return { key: condition.key, condition_value: condition.value };
165
+ }
166
+
160
167
  const section = condition.section ? `${condition.section}/` : "";
161
168
 
162
169
  return {
163
- key: `${section}${keyPrefix}_${toSnakeCase(condition.key)}`,
170
+ key: withStyle
171
+ ? `${section}${keyPrefix}_style_${toSnakeCase(condition.key)}`
172
+ : `${section}${keyPrefix}_${toSnakeCase(condition.key)}`,
164
173
  condition_value: condition.value,
165
174
  };
166
175
  });
176
+
177
+ generatedField.rules = "all_conditions";
167
178
  }
168
179
 
169
180
  return generatedField;
@@ -12,6 +12,12 @@ const generalContent = () => ({
12
12
  label: "Navigation Bar",
13
13
  placeholder: "Choose Nav Bar",
14
14
  },
15
+ {
16
+ key: "hide_menu",
17
+ type: "switch",
18
+ label: "Hide Menu",
19
+ initial_value: false,
20
+ },
15
21
  ],
16
22
  },
17
23
  styles: {