@applicaster/zapp-react-native-utils 13.0.0-rc.140 → 13.0.0-rc.142

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,3 +1,8 @@
1
+ import * as React from "react";
2
+ import { get, has } from "@applicaster/zapp-react-native-utils/utils";
3
+ import { useZStore } from "@applicaster/zapp-react-native-utils/reactHooks";
4
+ import { useRoute } from "@applicaster/zapp-react-native-utils/reactHooks/navigation";
5
+
1
6
  import { isNotEmptyString } from "@applicaster/zapp-react-native-utils/stringUtils";
2
7
  import { getMediaItems } from "@applicaster/zapp-react-native-utils/configurationUtils";
3
8
 
@@ -136,3 +141,102 @@ export const getArtworkImage = ({
136
141
  // default image
137
142
  return DEFAULT_IMAGE;
138
143
  };
144
+
145
+ const useAdjustedKeyFromScreenData = ({ config, keys }) => {
146
+ const { screenData } = useRoute();
147
+
148
+ const adjustedConfig = { ...config };
149
+
150
+ keys.forEach((key) => {
151
+ const path = ["targetScreen", "styles", key];
152
+
153
+ if (has(screenData, path)) {
154
+ const value = get(screenData, path);
155
+
156
+ adjustedConfig[key] = value;
157
+ }
158
+ });
159
+
160
+ return adjustedConfig;
161
+ };
162
+
163
+ const AUDIO_PLAYER_ARTWORK_IMAGE_KEY = "audio_player_artwork_image_key";
164
+
165
+ const audioPlayerArtworkImageKeySelector = (config) =>
166
+ config?.[AUDIO_PLAYER_ARTWORK_IMAGE_KEY];
167
+
168
+ export const useArtworkImage = (entry: ZappEntry): string => {
169
+ const configuration = useZStore("playerConfiguration");
170
+
171
+ const audio_player_artwork_image_key_value = configuration(
172
+ audioPlayerArtworkImageKeySelector
173
+ );
174
+
175
+ const pluginConfiguration = React.useMemo(
176
+ () => ({
177
+ audio_player_artwork_image_key: audio_player_artwork_image_key_value,
178
+ }),
179
+ [audio_player_artwork_image_key_value]
180
+ );
181
+
182
+ // HACK: for override [key] from screenData, because we treat empty string value as missing key and replace it to initial_value from manifest(which is wrong)
183
+ const adjustedPluginConfiguration = useAdjustedKeyFromScreenData({
184
+ keys: [AUDIO_PLAYER_ARTWORK_IMAGE_KEY],
185
+ config: pluginConfiguration,
186
+ });
187
+
188
+ return React.useMemo(
189
+ () =>
190
+ getArtworkImage({
191
+ key: AUDIO_PLAYER_ARTWORK_IMAGE_KEY,
192
+ entry,
193
+ plugin_configuration: adjustedPluginConfiguration,
194
+ }),
195
+ []
196
+ );
197
+ };
198
+
199
+ const AUDIO_PLAYER_IMAGE_KEY = "audio_player_image_key";
200
+ const AUDIO_PLAYER_BACKGROUND_IMAGE = "audio_player_background_image";
201
+
202
+ const audioPlayerImageKeySelector = (config) =>
203
+ config?.[AUDIO_PLAYER_IMAGE_KEY];
204
+
205
+ const audioPlayerBackgroundImageSelector = (config) =>
206
+ config?.[AUDIO_PLAYER_BACKGROUND_IMAGE];
207
+
208
+ export const useBackgroundImage = (entry: ZappEntry): { uri: string } => {
209
+ const configuration = useZStore("playerConfiguration");
210
+
211
+ const audio_player_image_key_value = configuration(
212
+ audioPlayerImageKeySelector
213
+ );
214
+
215
+ const audio_player_background_image_value = configuration(
216
+ audioPlayerBackgroundImageSelector
217
+ );
218
+
219
+ const pluginConfiguration = React.useMemo(
220
+ () => ({
221
+ audio_player_image_key: audio_player_image_key_value,
222
+ audio_player_background_image: audio_player_background_image_value,
223
+ }),
224
+ [audio_player_image_key_value, audio_player_background_image_value]
225
+ );
226
+
227
+ // HACK: for override [key] from screenData, because we treat empty string value as missing key and replace it to initial_value from manifest(which is wrong)
228
+ const adjustedPluginConfiguration = useAdjustedKeyFromScreenData({
229
+ keys: [AUDIO_PLAYER_IMAGE_KEY, AUDIO_PLAYER_BACKGROUND_IMAGE],
230
+ config: pluginConfiguration,
231
+ });
232
+
233
+ return React.useMemo(
234
+ () => ({
235
+ uri: getBackgroundImage({
236
+ entry,
237
+ plugin_configuration: adjustedPluginConfiguration,
238
+ }),
239
+ }),
240
+ [entry, adjustedPluginConfiguration]
241
+ );
242
+ };
@@ -2331,7 +2331,53 @@ function getPlayerConfiguration({ platform }) {
2331
2331
  type: "number_input",
2332
2332
  label: "Android TV Font Size",
2333
2333
  key: "android_tv_audio_player_summary_font_size",
2334
- initial_value: 25,
2334
+ initial_value: 22,
2335
+ },
2336
+ ]
2337
+ ),
2338
+ fieldsGroup(
2339
+ "Audio Player Background",
2340
+ "This section allows you to configure the audio player layout",
2341
+ [
2342
+ {
2343
+ key: "audio_player_background_color",
2344
+ label: "Background Color",
2345
+ label_tooltip:
2346
+ "Set a background color using hex format and opacity. If left empty, the default color from the app’s theme will be used.",
2347
+ type: "color_picker_rgba",
2348
+ initial_value: "rgba(17, 17, 17, 1)",
2349
+ },
2350
+ {
2351
+ key: "audio_player_background_image",
2352
+ label: "Background Image",
2353
+ label_tooltip:
2354
+ "Upload a background image for the audio player. If no image is provided, the background color will be used as a fallback.",
2355
+ type: "uploader",
2356
+ default: "",
2357
+ },
2358
+ {
2359
+ key: "audio_player_background_image_overlay",
2360
+ label: "Background Image Overlay",
2361
+ label_tooltip:
2362
+ "Add a semi-transparent color overlay to improve text readability over the background image.",
2363
+ type: "color_picker_rgba",
2364
+ initial_value: "rgba(17, 17, 17, 0.5)",
2365
+ },
2366
+ {
2367
+ type: "text_input",
2368
+ label: "Item Image Key",
2369
+ key: "audio_player_artwork_image_key",
2370
+ label_tooltip:
2371
+ "Define the key used to fetch the item’s image. If left empty, a default image will be shown.",
2372
+ initial_value: "image_base",
2373
+ },
2374
+ {
2375
+ key: "audio_player_artwork_border_radius",
2376
+ label: "Item Image Corner Radius",
2377
+ label_tooltip:
2378
+ "Set the corner radius (in pixels) for item images. Leave empty for sharp corners (0px).",
2379
+ type: "number_input",
2380
+ initial_value: 16,
2335
2381
  },
2336
2382
  ]
2337
2383
  ),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@applicaster/zapp-react-native-utils",
3
- "version": "13.0.0-rc.140",
3
+ "version": "13.0.0-rc.142",
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": "13.0.0-rc.140",
30
+ "@applicaster/applicaster-types": "13.0.0-rc.142",
31
31
  "buffer": "^5.2.1",
32
32
  "camelize": "^1.0.0",
33
33
  "dayjs": "^1.11.10",
@@ -13,13 +13,15 @@ class BackgroundTimer {
13
13
 
14
14
  const EventEmitter = platformSelect({
15
15
  android: DeviceEventEmitter,
16
- ios: undefined,
16
+ android_tv: DeviceEventEmitter,
17
+ amazon: DeviceEventEmitter, // probably does not exist and uses android_tv
17
18
  default: undefined,
18
19
  });
19
20
 
20
21
  EventEmitter?.addListener("BackgroundTimer.timer.fired", (id: number) => {
21
- if (this.callbacks[id]) {
22
- const callback = this.callbacks[id];
22
+ const callback = this.callbacks[id];
23
+
24
+ if (callback) {
23
25
  delete this.callbacks[id];
24
26
  callback();
25
27
  }
package/utils/index.ts CHANGED
@@ -9,4 +9,8 @@ export {
9
9
  size,
10
10
  isNil,
11
11
  isEmpty,
12
+ get,
13
+ has,
14
+ flatMap,
15
+ difference,
12
16
  } from "lodash";