Skip to content

Commit 4019c84

Browse files
committed
Merge branch 'main' into feature/remove-canBeMissing
2 parents 14685b8 + 93a0dd2 commit 4019c84

8 files changed

Lines changed: 542 additions & 367 deletions

File tree

lib/Onyx.ts

Lines changed: 281 additions & 275 deletions
Large diffs are not rendered by default.

lib/OnyxUtils.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,21 @@ function getDeferredInitTask(): DeferredTask {
137137
return deferredInitTask;
138138
}
139139

140+
/**
141+
* Executes an action after Onyx has been initialized.
142+
* If Onyx is already initialized, the action is executed immediately.
143+
* Otherwise, it waits for initialization to complete before executing.
144+
*
145+
* @param action The action to execute after initialization
146+
* @returns The result of the action
147+
*/
148+
function afterInit<T>(action: () => Promise<T>): Promise<T> {
149+
if (deferredInitTask.isResolved) {
150+
return action();
151+
}
152+
return deferredInitTask.promise.then(action);
153+
}
154+
140155
/**
141156
* Getter - returns the skippable collection member IDs.
142157
*/
@@ -1749,6 +1764,7 @@ const OnyxUtils = {
17491764
getMergeQueuePromise,
17501765
getDefaultKeyStates,
17511766
getDeferredInitTask,
1767+
afterInit,
17521768
initStoreValues,
17531769
sendActionToDevTools,
17541770
get,

lib/createDeferredTask.ts

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
type DeferredTask = {
22
promise: Promise<void>;
3-
resolve?: () => void;
3+
resolve: () => void;
4+
isResolved: boolean;
45
};
56

67
/**
@@ -9,11 +10,16 @@ type DeferredTask = {
910
* Useful when we want to wait for a tasks that is resolved from an external action
1011
*/
1112
export default function createDeferredTask(): DeferredTask {
12-
const deferred = {} as DeferredTask;
13+
const {promise, resolve: originalResolve} = Promise.withResolvers<void>();
1314

14-
deferred.promise = new Promise((res) => {
15-
deferred.resolve = res;
16-
});
15+
const deferred: DeferredTask = {
16+
promise,
17+
resolve: () => {
18+
deferred.isResolved = true;
19+
originalResolve();
20+
},
21+
isResolved: false,
22+
};
1723

1824
return deferred;
1925
}

lib/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,7 @@ type ExpandOnyxKeys<TKey extends OnyxKey> = TKey extends CollectionKeyBase ? NoI
334334
* If a new method is added to OnyxUtils.METHOD constant, it must be added to OnyxMethodValueMap type.
335335
* Otherwise it will show static type errors.
336336
*/
337-
type OnyxUpdate<TKey extends OnyxKey = OnyxKey> = {
337+
type OnyxUpdate<TKey extends OnyxKey> = {
338338
// ⚠️ DO NOT CHANGE THIS TYPE, UNLESS YOU KNOW WHAT YOU ARE DOING. ⚠️
339339
[K in TKey]:
340340
| {onyxMethod: typeof OnyxUtils.METHOD.SET; key: ExpandOnyxKeys<K>; value: OnyxSetInput<K>}

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "react-native-onyx",
3-
"version": "3.0.34",
3+
"version": "3.0.36",
44
"author": "Expensify, Inc.",
55
"homepage": "https://expensify.com",
66
"description": "State management for React Native",

0 commit comments

Comments
 (0)