@applicaster/zapp-react-native-utils 16.0.0-alpha.5222020837 → 16.0.0-alpha.5803191443

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.
@@ -0,0 +1,65 @@
1
+ import {
2
+ resolveAssets,
3
+ resolveConfiguredAsset,
4
+ } from "@applicaster/zapp-react-native-utils/actionUtils";
5
+
6
+ describe("actionUtils", () => {
7
+ describe("resolveConfiguredAsset", () => {
8
+ it("returns configured asset when value is a non-empty string", () => {
9
+ expect(resolveConfiguredAsset("configured", "fallback")).toBe(
10
+ "configured"
11
+ );
12
+
13
+ expect(
14
+ resolveConfiguredAsset("https://example.com/icon.png", "fallback")
15
+ ).toBe("https://example.com/icon.png");
16
+ });
17
+
18
+ it("returns fallback when configured asset is empty or undefined", () => {
19
+ expect(resolveConfiguredAsset("", "fallback")).toBe("fallback");
20
+ expect(resolveConfiguredAsset(" ", "fallback")).toBe("fallback");
21
+ expect(resolveConfiguredAsset(" ", "fallback")).toBe("fallback");
22
+ expect(resolveConfiguredAsset(undefined, "fallback")).toBe("fallback");
23
+ });
24
+
25
+ it("returns fallback for non-string configured asset values", () => {
26
+ expect(resolveConfiguredAsset(null as any, "fallback")).toBe("fallback");
27
+ expect(resolveConfiguredAsset(123 as any, "fallback")).toBe("fallback");
28
+ expect(resolveConfiguredAsset({} as any, "fallback")).toBe("fallback");
29
+ });
30
+ });
31
+
32
+ describe("resolveAssets", () => {
33
+ it("returns configured assets when both flavour values are configured", () => {
34
+ expect(
35
+ resolveAssets("asset-1", "asset-2", ["default-1", "default-2"])
36
+ ).toEqual(["asset-1", "asset-2"]);
37
+ });
38
+
39
+ it("falls back to code defaults when configured flavour values are empty", () => {
40
+ expect(resolveAssets("", undefined, ["default-1", "default-2"])).toEqual([
41
+ "default-1",
42
+ "default-2",
43
+ ]);
44
+ });
45
+
46
+ it("falls back per flavour independently", () => {
47
+ expect(resolveAssets("", "asset-2", ["default-1", "default-2"])).toEqual([
48
+ "default-1",
49
+ "asset-2",
50
+ ]);
51
+ });
52
+
53
+ it("uses the cell fallback before code defaults", () => {
54
+ expect(
55
+ resolveAssets("", undefined, ["default-1", "default-2"], "cell")
56
+ ).toEqual(["cell", "cell"]);
57
+ });
58
+
59
+ it("preserves configured assets before using the cell fallback", () => {
60
+ expect(
61
+ resolveAssets("asset-1", "", ["default-1", "default-2"], "cell")
62
+ ).toEqual(["asset-1", "cell"]);
63
+ });
64
+ });
65
+ });
@@ -1,7 +1,30 @@
1
1
  import { Image } from "react-native";
2
2
  import { isTV } from "../reactUtils";
3
3
 
4
+ export type Asset = [string, string] | [string];
5
+
4
6
  export const resolveDefaultAssetUri = (source: string | number): string =>
5
7
  isTV()
6
8
  ? (source as string)
7
9
  : Image.resolveAssetSource(source as number)?.uri || "";
10
+
11
+ const isConfiguredAsset = (asset?: string | null): asset is string =>
12
+ typeof asset === "string" && asset.trim().length > 0;
13
+
14
+ export const resolveConfiguredAsset = (
15
+ configuredAsset: string | undefined,
16
+ fallbackAsset: string
17
+ ): string =>
18
+ isConfiguredAsset(configuredAsset) ? configuredAsset : fallbackAsset;
19
+
20
+ /** Resolves assets in the following order: configured asset(can be empty), fallback asset(cell asset, can be empty), default asset */
21
+ export const resolveAssets = <T extends Asset>(
22
+ flavour1Asset: string | undefined,
23
+ flavour2Asset: string | undefined,
24
+ defaultAssets: T,
25
+ fallbackAssetSrc?: string
26
+ ): T =>
27
+ [
28
+ resolveConfiguredAsset(flavour1Asset, fallbackAssetSrc || defaultAssets[0]),
29
+ resolveConfiguredAsset(flavour2Asset, fallbackAssetSrc || defaultAssets[1]),
30
+ ] as T;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@applicaster/zapp-react-native-utils",
3
- "version": "16.0.0-alpha.5222020837",
3
+ "version": "16.0.0-alpha.5803191443",
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": "16.0.0-alpha.5222020837",
30
+ "@applicaster/applicaster-types": "16.0.0-alpha.5803191443",
31
31
  "buffer": "^5.2.1",
32
32
  "camelize": "^1.0.0",
33
33
  "dayjs": "^1.11.10",
@@ -0,0 +1,114 @@
1
+ import { renderHook } from "@testing-library/react-native";
2
+ import { useIsStandaloneFullscreen } from "../useIsStandaloneFullscreen";
3
+
4
+ import { useNavigation } from "@applicaster/zapp-react-native-utils/reactHooks";
5
+ import { toBooleanWithDefaultFalse } from "@applicaster/zapp-react-native-utils/booleanUtils";
6
+
7
+ jest.mock("@applicaster/zapp-react-native-utils/reactHooks");
8
+ jest.mock("@applicaster/zapp-react-native-utils/booleanUtils");
9
+
10
+ const mockUseNavigation = useNavigation as jest.Mock;
11
+ const mockToBoolean = toBooleanWithDefaultFalse as jest.Mock;
12
+
13
+ describe("useIsStandaloneFullscreen", () => {
14
+ beforeEach(() => {
15
+ jest.clearAllMocks();
16
+
17
+ mockUseNavigation.mockReturnValue({
18
+ canGoBack: jest.fn().mockReturnValue(false),
19
+ screenData: {
20
+ general: { allow_screen_plugin_presentation: true },
21
+ },
22
+ });
23
+
24
+ mockToBoolean.mockReturnValue(false);
25
+ });
26
+
27
+ it("returns true when cannot go back and screen plugin presentation is allowed", () => {
28
+ mockToBoolean.mockReturnValue(true);
29
+
30
+ const { result } = renderHook(() => useIsStandaloneFullscreen());
31
+
32
+ expect(mockToBoolean).toHaveBeenCalledWith(true);
33
+ expect(result.current).toBe(true);
34
+ });
35
+
36
+ it("returns false when can go back even if screen plugin presentation is allowed", () => {
37
+ mockUseNavigation.mockReturnValue({
38
+ canGoBack: jest.fn().mockReturnValue(true),
39
+ screenData: {
40
+ general: { allow_screen_plugin_presentation: true },
41
+ },
42
+ });
43
+
44
+ mockToBoolean.mockReturnValue(false);
45
+
46
+ const { result } = renderHook(() => useIsStandaloneFullscreen());
47
+
48
+ expect(mockToBoolean).toHaveBeenCalledWith(false);
49
+ expect(result.current).toBe(false);
50
+ });
51
+
52
+ it("returns false when cannot go back but screen plugin presentation is not allowed", () => {
53
+ mockUseNavigation.mockReturnValue({
54
+ canGoBack: jest.fn().mockReturnValue(false),
55
+ screenData: {
56
+ general: { allow_screen_plugin_presentation: false },
57
+ },
58
+ });
59
+
60
+ mockToBoolean.mockReturnValue(false);
61
+
62
+ const { result } = renderHook(() => useIsStandaloneFullscreen());
63
+
64
+ expect(mockToBoolean).toHaveBeenCalledWith(false);
65
+ expect(result.current).toBe(false);
66
+ });
67
+
68
+ it("returns false when screen plugin presentation flag is undefined", () => {
69
+ mockUseNavigation.mockReturnValue({
70
+ canGoBack: jest.fn().mockReturnValue(false),
71
+ screenData: { general: {} },
72
+ });
73
+
74
+ mockToBoolean.mockReturnValue(false);
75
+
76
+ const { result } = renderHook(() => useIsStandaloneFullscreen());
77
+
78
+ expect(mockToBoolean).toHaveBeenCalledWith(undefined);
79
+ expect(result.current).toBe(false);
80
+ });
81
+
82
+ it("returns false when navigator is undefined", () => {
83
+ mockUseNavigation.mockReturnValue(undefined);
84
+ mockToBoolean.mockReturnValue(false);
85
+
86
+ const { result } = renderHook(() => useIsStandaloneFullscreen());
87
+
88
+ expect(mockToBoolean).toHaveBeenCalledWith(undefined);
89
+ expect(result.current).toBe(false);
90
+ });
91
+
92
+ it("returns false when screenData is undefined", () => {
93
+ mockUseNavigation.mockReturnValue({
94
+ canGoBack: jest.fn().mockReturnValue(false),
95
+ screenData: undefined,
96
+ });
97
+
98
+ mockToBoolean.mockReturnValue(false);
99
+
100
+ const { result } = renderHook(() => useIsStandaloneFullscreen());
101
+
102
+ expect(mockToBoolean).toHaveBeenCalledWith(undefined);
103
+ expect(result.current).toBe(false);
104
+ });
105
+
106
+ it("passes the combined condition through toBooleanWithDefaultFalse", () => {
107
+ mockToBoolean.mockImplementation((val) => Boolean(val));
108
+
109
+ const { result } = renderHook(() => useIsStandaloneFullscreen());
110
+
111
+ expect(mockToBoolean).toHaveBeenCalledWith(true);
112
+ expect(result.current).toBe(true);
113
+ });
114
+ });
@@ -16,3 +16,5 @@ export { useScreenBackgroundColor } from "./useScreenBackgroundColor";
16
16
  export { useCurrentScreenIsHook } from "./useCurrentScreenIsHook";
17
17
 
18
18
  export { useCurrentScreenIsStartupHook } from "./useCurrentScreenIsStartupHook";
19
+
20
+ export { useIsStandaloneFullscreen } from "./useIsStandaloneFullscreen";
@@ -0,0 +1,12 @@
1
+ import { useNavigation } from "@applicaster/zapp-react-native-utils/reactHooks";
2
+ import { toBooleanWithDefaultFalse } from "@applicaster/zapp-react-native-utils/booleanUtils";
3
+
4
+ export const useIsStandaloneFullscreen = (): boolean => {
5
+ const navigator = useNavigation();
6
+
7
+ return toBooleanWithDefaultFalse(
8
+ !navigator?.canGoBack() &&
9
+ // @ts-ignore
10
+ navigator?.screenData?.general?.allow_screen_plugin_presentation
11
+ );
12
+ };
@@ -197,7 +197,7 @@ export const useCallbackNavigationAction = (
197
197
  }
198
198
  }
199
199
 
200
- hookCallback?.({ ...args, success: false, cancelled: true });
200
+ hookCallback?.({ ...args, success: false, abort: true });
201
201
  const currentNavigation = navigationRef.current;
202
202
 
203
203
  switch (data.action) {