Skip to content

Commit 43cd76c

Browse files
ENvironmentSetanakin_karrot
andauthored
fix(react): Attach promise state tracking instruments into original promises in useThenable (#665)
Co-authored-by: anakin_karrot <[email protected]>
1 parent ba7fa13 commit 43cd76c

File tree

3 files changed

+25
-23
lines changed

3 files changed

+25
-23
lines changed

.changeset/early-eggs-lie.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@stackflow/react": patch
3+
---
4+
5+
Attach state tracking instruments to original promise when creating SyncInspectablePromises with Promises

integrations/react/src/__internal__/utils/SyncInspectablePromise.ts

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,17 @@ export function inspect<T>(
4949
}
5050

5151
function makeSyncInspectable<T>(
52-
thenable: PromiseLike<T>,
52+
promise: Promise<T>,
5353
): SyncInspectablePromise<T> {
54+
if (
55+
"status" in promise &&
56+
Object.values(PromiseStatus).some((status) => status === promise.status)
57+
) {
58+
return promise as SyncInspectablePromise<T>;
59+
}
60+
5461
const syncInspectablePromise: SyncInspectablePromise<T> = Object.assign(
55-
new Promise<T>((resolve) => resolve(thenable)),
62+
promise,
5663
{ status: PromiseStatus.PENDING },
5764
);
5865

@@ -72,15 +79,9 @@ function makeSyncInspectable<T>(
7279

7380
export function resolve<T>(value: T): SyncInspectablePromise<Awaited<T>> {
7481
if (isPromiseLike(value)) {
75-
if (
76-
value instanceof Promise &&
77-
"status" in value &&
78-
Object.values(PromiseStatus).some((status) => status === value.status)
79-
) {
80-
return value as SyncInspectablePromise<Awaited<T>>;
81-
}
82-
83-
return makeSyncInspectable(value) as SyncInspectablePromise<Awaited<T>>;
82+
return makeSyncInspectable(
83+
value instanceof Promise ? value : Promise.resolve(value),
84+
);
8485
}
8586

8687
return Object.assign(Promise.resolve(value), {

integrations/react/src/future/loader/loaderPlugin.tsx

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -57,18 +57,14 @@ export function loaderPlugin<
5757
return event;
5858
}
5959

60-
const loaderData = loadData(activityName, activityParams);
61-
62-
if (isPromiseLike(loaderData)) {
63-
Promise.allSettled([loaderData]).then(
64-
([loaderDataPromiseResult]) => {
65-
printLoaderDataPromiseError({
66-
promiseResult: loaderDataPromiseResult,
67-
activityName: matchActivity.name,
68-
});
69-
},
70-
);
71-
}
60+
const loaderData = resolve(loadData(activityName, activityParams));
61+
62+
Promise.allSettled([loaderData]).then(([loaderDataPromiseResult]) => {
63+
printLoaderDataPromiseError({
64+
promiseResult: loaderDataPromiseResult,
65+
activityName: matchActivity.name,
66+
});
67+
});
7268

7369
return {
7470
...event,

0 commit comments

Comments
 (0)