@applicaster/zapp-react-native-utils 13.0.0-alpha.1918049654 → 13.0.0-alpha.2000015251
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.
- package/appUtils/HooksManager/Hook.ts +2 -2
- package/appUtils/HooksManager/types.ts +2 -2
- package/appUtils/contextKeysManager/contextResolver.ts +6 -2
- package/appUtils/focusManager/index.ts +2 -3
- package/appUtils/platform/platformUtils.ts +24 -3
- package/appUtils/playerManager/player.ts +2 -2
- package/manifestUtils/__tests__/createConfig.test.js +0 -2
- package/navigationUtils/__tests__/__snapshots__/navigationUtils.test.js.snap +0 -1
- package/navigationUtils/index.ts +4 -6
- package/numberUtils/index.ts +7 -5
- package/package.json +2 -2
- package/reactHooks/feed/useFeedLoader.tsx +6 -13
- package/reactHooks/layout/useDimensions/helpers/__tests__/getInitialDimensions.test.js +1 -1
- package/reactHooks/layout/useDimensions/useDimensions.ts +8 -0
- package/reactHooks/navigation/useGetTabBarHeight.ts +1 -3
- package/reactHooks/state/useRefWithInitialValue.ts +14 -0
- package/reactHooks/state/useStateFromSubscribe.ts +23 -0
- package/reactHooks/usePluginConfiguration.ts +1 -1
- package/reactHooks/useSubscriberFor.ts +4 -3
- package/screenState/index.ts +24 -10
- package/theme/index.ts +1 -1
- package/time/Timer.ts +4 -1
- package/zappFrameworkUtils/presentPluginOneTime.ts +2 -3
|
@@ -16,7 +16,7 @@ const BASE_HOOK_PROPERTIES = ["screen_id", "identifier", "weight"];
|
|
|
16
16
|
* @returns {number} index
|
|
17
17
|
*/
|
|
18
18
|
const hookState: (
|
|
19
|
-
arg0: typeof HOOKS_EVENTS[keyof typeof HOOKS_EVENTS]
|
|
19
|
+
arg0: (typeof HOOKS_EVENTS)[keyof typeof HOOKS_EVENTS]
|
|
20
20
|
) => number = R.indexOf(R.__, R.values(HOOKS_EVENTS));
|
|
21
21
|
|
|
22
22
|
/**
|
|
@@ -62,7 +62,7 @@ export class Hook implements HookInterface {
|
|
|
62
62
|
* @param {Array<Any>} args variadic arguments to invoke the handler with
|
|
63
63
|
*/
|
|
64
64
|
setStateAndNotify(
|
|
65
|
-
event: typeof HOOKS_EVENTS[keyof typeof HOOKS_EVENTS],
|
|
65
|
+
event: (typeof HOOKS_EVENTS)[keyof typeof HOOKS_EVENTS],
|
|
66
66
|
...args
|
|
67
67
|
) {
|
|
68
68
|
this.state = hookState(event);
|
|
@@ -103,7 +103,7 @@ export interface Hook<T extends HookModule = HookModule> {
|
|
|
103
103
|
identifier: string;
|
|
104
104
|
configuration: T["configuration"];
|
|
105
105
|
setStateAndNotify(
|
|
106
|
-
event: typeof HOOKS_EVENTS[keyof typeof HOOKS_EVENTS],
|
|
106
|
+
event: (typeof HOOKS_EVENTS)[keyof typeof HOOKS_EVENTS],
|
|
107
107
|
opts: {
|
|
108
108
|
error?: typeof Error;
|
|
109
109
|
route?: string;
|
|
@@ -112,7 +112,7 @@ export interface Hook<T extends HookModule = HookModule> {
|
|
|
112
112
|
}
|
|
113
113
|
);
|
|
114
114
|
general?: {
|
|
115
|
-
transition_type: typeof HOOKS_EVENTS[keyof typeof HOOKS_EVENTS];
|
|
115
|
+
transition_type: (typeof HOOKS_EVENTS)[keyof typeof HOOKS_EVENTS];
|
|
116
116
|
allow_screen_plugin_presentation: boolean;
|
|
117
117
|
is_flow_blocker: boolean;
|
|
118
118
|
};
|
|
@@ -42,12 +42,16 @@ export const resolveObjectValues = async (
|
|
|
42
42
|
|
|
43
43
|
const resolvedEntries = await Promise.all(
|
|
44
44
|
entries.map(async ([key, value]) => {
|
|
45
|
-
const regex = /@{([^/]+)\/([^}]*)}/;
|
|
46
|
-
|
|
47
45
|
if (typeof value !== "string") {
|
|
48
46
|
return [key, value];
|
|
49
47
|
}
|
|
50
48
|
|
|
49
|
+
if (!value.startsWith("@")) {
|
|
50
|
+
return [key, value];
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const regex = /@{([^/]+)\/([^}]*)}/;
|
|
54
|
+
|
|
51
55
|
const match = (value as string).match(regex);
|
|
52
56
|
|
|
53
57
|
if (match) {
|
|
@@ -13,6 +13,7 @@ import {
|
|
|
13
13
|
import { subscriber } from "../../functionUtils";
|
|
14
14
|
import { coreLogger } from "../../logger";
|
|
15
15
|
import { ACTION } from "./utils/enums";
|
|
16
|
+
|
|
16
17
|
const logger = coreLogger.addSubsystem("focusManager");
|
|
17
18
|
|
|
18
19
|
const isFocusEnabled = (focusableItem): boolean => {
|
|
@@ -325,8 +326,6 @@ export const focusManager = (function () {
|
|
|
325
326
|
},
|
|
326
327
|
});
|
|
327
328
|
|
|
328
|
-
currentFocusNode = focusCandidate;
|
|
329
|
-
|
|
330
329
|
focusableItem && setFocus(focusCandidate.id, null);
|
|
331
330
|
|
|
332
331
|
return { success: true };
|
|
@@ -477,7 +476,7 @@ export const focusManager = (function () {
|
|
|
477
476
|
function isCurrentFocusOnTheTopScreen() {
|
|
478
477
|
const routes = R.pathOr([], ["root", "children"], focusableTree);
|
|
479
478
|
|
|
480
|
-
if (routes.length <= 1) {
|
|
479
|
+
if (currentFocusNode && routes.length <= 1) {
|
|
481
480
|
// there is only one or zero routes
|
|
482
481
|
return true;
|
|
483
482
|
}
|
|
@@ -81,9 +81,12 @@ export class ClosedCaptioningManager {
|
|
|
81
81
|
|
|
82
82
|
static getInstance(): ClosedCaptioningManager {
|
|
83
83
|
if (!ClosedCaptioningManager.ccManagerInstance) {
|
|
84
|
+
log_debug("ClosedCaptioningManager: Creating new instance");
|
|
84
85
|
ClosedCaptioningManager.ccManagerInstance = new ClosedCaptioningManager();
|
|
85
86
|
}
|
|
86
87
|
|
|
88
|
+
log_debug("ClosedCaptioningManager: Returning existing instance");
|
|
89
|
+
|
|
87
90
|
return ClosedCaptioningManager.ccManagerInstance;
|
|
88
91
|
}
|
|
89
92
|
|
|
@@ -92,23 +95,41 @@ export class ClosedCaptioningManager {
|
|
|
92
95
|
PLATFORM_KEYS.deviceClosedCaptioningEnabled
|
|
93
96
|
);
|
|
94
97
|
|
|
95
|
-
log_debug("Initializing closed captioning manager", { existingState });
|
|
96
|
-
|
|
97
98
|
if (existingState !== null) {
|
|
99
|
+
log_debug(
|
|
100
|
+
`ClosedCaptioningManager: Setting initial state to ${existingState}`
|
|
101
|
+
);
|
|
102
|
+
|
|
98
103
|
this.ccState$.next(existingState === "true" || existingState === true);
|
|
104
|
+
} else {
|
|
105
|
+
log_debug("ClosedCaptioningManager: No existing state found");
|
|
99
106
|
}
|
|
100
107
|
|
|
101
108
|
if (hasVizioAPIs()) {
|
|
109
|
+
log_debug("ClosedCaptioningManager: Setting closed captioning handler");
|
|
110
|
+
|
|
102
111
|
window.VIZIO!.setClosedCaptionHandler((isCCEnabled) => {
|
|
103
|
-
log_debug(
|
|
112
|
+
log_debug(
|
|
113
|
+
"ClosedCaptioningManager: There was a change in the CC state",
|
|
114
|
+
{ isCCEnabled }
|
|
115
|
+
);
|
|
104
116
|
|
|
105
117
|
sessionStorage.setItem(
|
|
106
118
|
PLATFORM_KEYS.deviceClosedCaptioningEnabled,
|
|
107
119
|
isCCEnabled
|
|
108
120
|
);
|
|
109
121
|
|
|
122
|
+
log_debug(
|
|
123
|
+
"ClosedCaptioningManager: Saved CC state to session storage",
|
|
124
|
+
{ isCCEnabled }
|
|
125
|
+
);
|
|
126
|
+
|
|
110
127
|
this.ccState$.next(isCCEnabled);
|
|
111
128
|
});
|
|
129
|
+
} else {
|
|
130
|
+
log_debug(
|
|
131
|
+
"ClosedCaptioningManager: Vizio APIs are not available, skipping setup"
|
|
132
|
+
);
|
|
112
133
|
}
|
|
113
134
|
}
|
|
114
135
|
|
|
@@ -154,8 +154,8 @@ export class Player {
|
|
|
154
154
|
this.isSeeking()
|
|
155
155
|
? this.playerState.seekPosition
|
|
156
156
|
: this.playerState.adState
|
|
157
|
-
|
|
158
|
-
|
|
157
|
+
? this.playerState.adState.adPosition
|
|
158
|
+
: this.playerState.contentPosition;
|
|
159
159
|
|
|
160
160
|
getEntry = (): ZappEntry | null => this.entry;
|
|
161
161
|
|
package/navigationUtils/index.ts
CHANGED
|
@@ -111,7 +111,6 @@ export function getNavigationProps({
|
|
|
111
111
|
assets: ZappNavBarAssets;
|
|
112
112
|
rules: ZappNavBarRules;
|
|
113
113
|
nav_items: NavBarItem[];
|
|
114
|
-
data: MenuItemDataProperties;
|
|
115
114
|
} | null {
|
|
116
115
|
const { activeRiver } = navigator;
|
|
117
116
|
const { navigations, id: selected, home } = activeRiver; // use useRiver hook instead
|
|
@@ -125,7 +124,7 @@ export function getNavigationProps({
|
|
|
125
124
|
return null;
|
|
126
125
|
}
|
|
127
126
|
|
|
128
|
-
const { styles, assets, nav_items, rules
|
|
127
|
+
const { styles, assets, nav_items, rules } = navigation;
|
|
129
128
|
|
|
130
129
|
return {
|
|
131
130
|
selected,
|
|
@@ -135,7 +134,6 @@ export function getNavigationProps({
|
|
|
135
134
|
assets: assets as ZappNavBarAssets,
|
|
136
135
|
nav_items: nav_items as any as NavBarItem[],
|
|
137
136
|
rules: rules as any as ZappNavBarRules,
|
|
138
|
-
data: data as MenuItemDataProperties,
|
|
139
137
|
};
|
|
140
138
|
}
|
|
141
139
|
|
|
@@ -646,8 +644,8 @@ export const getScreenId = (
|
|
|
646
644
|
fallbackRiver: ZappRiver
|
|
647
645
|
) => {
|
|
648
646
|
return screenData?.targetScreen
|
|
649
|
-
? screenData?.targetScreen?.id ?? fallbackRiver.id
|
|
647
|
+
? (screenData?.targetScreen?.id ?? fallbackRiver.id)
|
|
650
648
|
: "screen_id" in screenData
|
|
651
|
-
|
|
652
|
-
|
|
649
|
+
? screenData.screen_id
|
|
650
|
+
: fallbackRiver.id;
|
|
653
651
|
};
|
package/numberUtils/index.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { logger } from "@applicaster/zapp-react-native-utils/logger";
|
|
|
3
3
|
|
|
4
4
|
const numberUtilsLogger = logger?.addSubsystem("NumberUtils");
|
|
5
5
|
|
|
6
|
-
export const toNumber = (value:
|
|
6
|
+
export const toNumber = (value: unknown): number | undefined => {
|
|
7
7
|
if (R.isNil(value) || R.isEmpty(value)) {
|
|
8
8
|
return undefined;
|
|
9
9
|
}
|
|
@@ -17,10 +17,12 @@ export const toNumber = (value: any): number | undefined => {
|
|
|
17
17
|
return undefined;
|
|
18
18
|
};
|
|
19
19
|
|
|
20
|
-
export const toNumberWithDefault = (
|
|
21
|
-
|
|
20
|
+
export const toNumberWithDefault = (
|
|
21
|
+
defaultValue: number,
|
|
22
|
+
value: unknown
|
|
23
|
+
): number => toNumber(value) ?? defaultValue;
|
|
22
24
|
|
|
23
|
-
export const toNumberWithDefaultZero = (value:
|
|
25
|
+
export const toNumberWithDefaultZero = (value: unknown): number =>
|
|
24
26
|
toNumberWithDefault(0, value);
|
|
25
27
|
|
|
26
28
|
export const requireNumber = (obj, key: string) => {
|
|
@@ -39,7 +41,7 @@ export const requireNumber = (obj, key: string) => {
|
|
|
39
41
|
|
|
40
42
|
export const toFiniteNumberWithDefault = (
|
|
41
43
|
defaultValue: number,
|
|
42
|
-
value:
|
|
44
|
+
value: unknown
|
|
43
45
|
): number => {
|
|
44
46
|
const possibleNumber = toNumberWithDefault(defaultValue, value);
|
|
45
47
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@applicaster/zapp-react-native-utils",
|
|
3
|
-
"version": "13.0.0-alpha.
|
|
3
|
+
"version": "13.0.0-alpha.2000015251",
|
|
4
4
|
"description": "Applicaster Zapp React Native utilities package",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"types": "index.d.ts",
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
},
|
|
29
29
|
"homepage": "https://github.com/applicaster/quickbrick#readme",
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@applicaster/applicaster-types": "13.0.0-alpha.
|
|
31
|
+
"@applicaster/applicaster-types": "13.0.0-alpha.2000015251",
|
|
32
32
|
"buffer": "^5.2.1",
|
|
33
33
|
"camelize": "^1.0.0",
|
|
34
34
|
"create-react-context": "^0.2.3",
|
|
@@ -20,7 +20,6 @@ type Props = {
|
|
|
20
20
|
silentRefresh?: boolean;
|
|
21
21
|
method?: "get" | "post";
|
|
22
22
|
bodyParams?: Record<string, unknown>;
|
|
23
|
-
skipLoading?: boolean;
|
|
24
23
|
};
|
|
25
24
|
};
|
|
26
25
|
|
|
@@ -94,7 +93,7 @@ export const useFeedLoader = ({
|
|
|
94
93
|
if (
|
|
95
94
|
shouldDispatchData(callableFeedUrl, currentFeed, pipesOptions.clearCache)
|
|
96
95
|
) {
|
|
97
|
-
if (callableFeedUrl
|
|
96
|
+
if (callableFeedUrl) {
|
|
98
97
|
dispatch(
|
|
99
98
|
loadPipesData(callableFeedUrl, {
|
|
100
99
|
...pipesOptions,
|
|
@@ -102,33 +101,26 @@ export const useFeedLoader = ({
|
|
|
102
101
|
riverId,
|
|
103
102
|
})
|
|
104
103
|
);
|
|
105
|
-
} else if (!callableFeedUrl) {
|
|
106
|
-
logger.info({
|
|
107
|
-
message:
|
|
108
|
-
"Feed is not defined or not inflated, skipping loading. \nMake sure you have correct feedUrl and mapping.",
|
|
109
|
-
jsOnly: true,
|
|
110
|
-
});
|
|
111
104
|
} else {
|
|
112
105
|
logger.info({
|
|
113
106
|
message:
|
|
114
|
-
"
|
|
115
|
-
data: { url: callableFeedUrl },
|
|
107
|
+
"Feed is not defined or not inflated, skipping loading. \nMake sure you have correct feedUrl and mapping.",
|
|
116
108
|
jsOnly: true,
|
|
117
109
|
});
|
|
118
110
|
}
|
|
119
111
|
} else {
|
|
120
112
|
logger.info({
|
|
121
113
|
message:
|
|
122
|
-
"Feed already
|
|
114
|
+
"Feed already exist, skipping loading. \nCall reloadData() if you want to refresh data.",
|
|
123
115
|
data: { url: callableFeedUrl },
|
|
124
116
|
jsOnly: true,
|
|
125
117
|
});
|
|
126
118
|
}
|
|
127
119
|
}, []);
|
|
128
120
|
|
|
129
|
-
// Reload feed when feedUrl changes
|
|
121
|
+
// Reload feed when feedUrl changes
|
|
130
122
|
useEffect(() => {
|
|
131
|
-
if (!isInitialRender && callableFeedUrl
|
|
123
|
+
if (!isInitialRender && callableFeedUrl) {
|
|
132
124
|
dispatch(loadPipesData(callableFeedUrl, { ...pipesOptions, riverId }));
|
|
133
125
|
}
|
|
134
126
|
}, [callableFeedUrl]);
|
|
@@ -164,6 +156,7 @@ export const useFeedLoader = ({
|
|
|
164
156
|
currentFeed?.data,
|
|
165
157
|
currentFeed?.error,
|
|
166
158
|
currentFeed?.loading,
|
|
159
|
+
|
|
167
160
|
reloadData,
|
|
168
161
|
loadNext,
|
|
169
162
|
]);
|
|
@@ -52,6 +52,14 @@ export const useDimensions: UseDimensions = (
|
|
|
52
52
|
? { fullDimensions }
|
|
53
53
|
: { ...fullDimensions };
|
|
54
54
|
|
|
55
|
+
if (options.updateForInactiveScreens === undefined) {
|
|
56
|
+
options.updateForInactiveScreens = true;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (options.fullDimensions === undefined) {
|
|
60
|
+
options.fullDimensions = false;
|
|
61
|
+
}
|
|
62
|
+
|
|
55
63
|
const [dimensions, setDimensions] = useState(getInitialDimensions(context));
|
|
56
64
|
const deviceInfo = useRef(getDeviceInfo(dimensions, appData));
|
|
57
65
|
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { useSafeAreaInsets } from "react-native-safe-area-context";
|
|
2
|
-
|
|
3
1
|
import { platformSelect } from "../../reactUtils";
|
|
4
2
|
|
|
5
3
|
const TAB_BAR_HEIGHT_IOS = 49;
|
|
@@ -7,6 +5,6 @@ const TAB_BAR_HEIGHT_ANDROID = 56;
|
|
|
7
5
|
|
|
8
6
|
export const useGetTabBarHeight = () =>
|
|
9
7
|
platformSelect({
|
|
10
|
-
ios: TAB_BAR_HEIGHT_IOS
|
|
8
|
+
ios: TAB_BAR_HEIGHT_IOS,
|
|
11
9
|
android: TAB_BAR_HEIGHT_ANDROID,
|
|
12
10
|
}) as number;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* returns a ref with an initial value that is lazily evaluated once
|
|
5
|
+
* */
|
|
6
|
+
export const useRefWithInitialValue = <T>(initialValueGetter: () => T) => {
|
|
7
|
+
const ref = React.useRef<T>(null);
|
|
8
|
+
|
|
9
|
+
if (ref.current === null) {
|
|
10
|
+
ref.current = initialValueGetter();
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
return ref;
|
|
14
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { useEffect, useState } from "react";
|
|
2
|
+
import type { Subject } from "rxjs";
|
|
3
|
+
|
|
4
|
+
export const useStateFromSubscribe = <T, U>(
|
|
5
|
+
subject: Subject<T>,
|
|
6
|
+
onUpdate: (
|
|
7
|
+
observerValue: T,
|
|
8
|
+
next: React.Dispatch<React.SetStateAction<U>>
|
|
9
|
+
) => void,
|
|
10
|
+
initialValue: U
|
|
11
|
+
) => {
|
|
12
|
+
const [state, setState] = useState<U>(initialValue);
|
|
13
|
+
|
|
14
|
+
useEffect(() => {
|
|
15
|
+
const subscription = subject.subscribe((observer) =>
|
|
16
|
+
onUpdate(observer, setState)
|
|
17
|
+
);
|
|
18
|
+
|
|
19
|
+
return () => subscription.unsubscribe();
|
|
20
|
+
}, [subject]);
|
|
21
|
+
|
|
22
|
+
return state;
|
|
23
|
+
};
|
|
@@ -4,9 +4,10 @@ import { subscriber } from "@applicaster/zapp-react-native-utils/functionUtils";
|
|
|
4
4
|
const subscriberObjects = Object.create({});
|
|
5
5
|
|
|
6
6
|
interface UseSubscriberFor {
|
|
7
|
-
(
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
(
|
|
8
|
+
eventName: string,
|
|
9
|
+
handler?: (...args: unknown[]) => void
|
|
10
|
+
): (...args: unknown[]) => ReturnType<typeof subscriber>;
|
|
10
11
|
}
|
|
11
12
|
|
|
12
13
|
/**
|
package/screenState/index.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { create } from "zustand";
|
|
2
2
|
import { produce } from "immer";
|
|
3
3
|
import { path } from "ramda";
|
|
4
|
+
import React from "react";
|
|
5
|
+
import { useShallow } from "zustand/react/shallow";
|
|
4
6
|
|
|
5
7
|
type ScreenState = {
|
|
6
8
|
selectedEntry: {
|
|
@@ -18,6 +20,8 @@ type ScreenStore = {
|
|
|
18
20
|
setSelectedEntry: (screenId: string, entryId: string) => void;
|
|
19
21
|
};
|
|
20
22
|
|
|
23
|
+
type SetSelectedEntry = (screenId: string, entryId: string) => void;
|
|
24
|
+
|
|
21
25
|
const useScreenStore = create<ScreenStore>((set) => ({
|
|
22
26
|
screens: screensInitialState,
|
|
23
27
|
setSelectedEntry: (screenId, entryId) =>
|
|
@@ -35,17 +39,27 @@ const useScreenStore = create<ScreenStore>((set) => ({
|
|
|
35
39
|
export function useScreenState(
|
|
36
40
|
screenId: ScreenId
|
|
37
41
|
): null | { screen: ScreenState; setSelectedEntry: (entryId: string) => void } {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
) as ScreenState;
|
|
42
|
+
const screenState = useScreenStore<ScreenState>(
|
|
43
|
+
useShallow(path(["screens", screenId]))
|
|
44
|
+
);
|
|
42
45
|
|
|
43
|
-
const setSelectedEntry = useScreenStore(
|
|
46
|
+
const setSelectedEntry = useScreenStore<SetSelectedEntry>(
|
|
47
|
+
useShallow(path(["setSelectedEntry"]))
|
|
48
|
+
);
|
|
44
49
|
|
|
45
|
-
|
|
50
|
+
const memoizedSetSelectedEntry = React.useCallback(
|
|
51
|
+
(entryId) => setSelectedEntry(screenId, entryId),
|
|
52
|
+
[screenId, setSelectedEntry]
|
|
53
|
+
);
|
|
46
54
|
|
|
47
|
-
return
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
55
|
+
return React.useMemo(
|
|
56
|
+
() =>
|
|
57
|
+
!screenId
|
|
58
|
+
? null
|
|
59
|
+
: {
|
|
60
|
+
screen: screenState,
|
|
61
|
+
setSelectedEntry: memoizedSetSelectedEntry,
|
|
62
|
+
},
|
|
63
|
+
[screenId, screenState]
|
|
64
|
+
);
|
|
51
65
|
}
|
package/theme/index.ts
CHANGED
|
@@ -14,7 +14,7 @@ export const ThemeContext = React.createContext({
|
|
|
14
14
|
export function useTheme<
|
|
15
15
|
T extends Record<string, any> =
|
|
16
16
|
| BaseThemePropertiesTV
|
|
17
|
-
| BaseThemePropertiesMobile
|
|
17
|
+
| BaseThemePropertiesMobile,
|
|
18
18
|
>(): T {
|
|
19
19
|
const { themes, selectedThemeId } = React.useContext(ThemeContext);
|
|
20
20
|
|
package/time/Timer.ts
CHANGED
|
@@ -3,7 +3,10 @@ export class Timer {
|
|
|
3
3
|
private remaining: number;
|
|
4
4
|
private timeoutId: NodeJS.Timeout | null;
|
|
5
5
|
|
|
6
|
-
constructor(
|
|
6
|
+
constructor(
|
|
7
|
+
private callback: () => void,
|
|
8
|
+
private duration: number
|
|
9
|
+
) {
|
|
7
10
|
this.remaining = this.duration;
|
|
8
11
|
this.timeoutId = null;
|
|
9
12
|
}
|
|
@@ -92,9 +92,8 @@ export const PresentHookPluginOneTime = (
|
|
|
92
92
|
const presentOneTimeVersionName =
|
|
93
93
|
await getLatestWatchedVersionNumberFromStorage(storageKey, namespace);
|
|
94
94
|
|
|
95
|
-
const applicationVersionName =
|
|
96
|
-
versionNameKey
|
|
97
|
-
);
|
|
95
|
+
const applicationVersionName =
|
|
96
|
+
await sessionStorage.getItem(versionNameKey);
|
|
98
97
|
|
|
99
98
|
if (!presentOneTimeVersionName || !applicationVersionName) {
|
|
100
99
|
log_info(
|