Skip to content

Commit d2a2a66

Browse files
committed
Fix: useOptimistic should return passthrough value when there are no updates pending (#27936)
This fixes a bug that happened when the canonical value passed to useOptimistic without an accompanying call to setOptimistic. In this scenario, useOptimistic should pass through the new canonical value. I had written tests for the more complicated scenario, where a new value is passed while there are still pending optimistic updates, but not this simpler one. DiffTrain build for commit 60a927d.
1 parent cbb38c7 commit d2a2a66

File tree

13 files changed

+117
-84
lines changed

13 files changed

+117
-84
lines changed

compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react-test-renderer/cjs/ReactTestRenderer-dev.js

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* @noflow
88
* @nolint
99
* @preventMunge
10-
* @generated SignedSource<<fc408c74cd117076cbc05c2d9747b81d>>
10+
* @generated SignedSource<<c2d754b18a9eb7cb4c4c644819a4d828>>
1111
*/
1212

1313
"use strict";
@@ -7685,10 +7685,19 @@ if (__DEV__) {
76857685
queue.pending = null;
76867686
}
76877687

7688-
if (baseQueue !== null) {
7688+
var baseState = hook.baseState;
7689+
7690+
if (baseQueue === null) {
7691+
// If there are no pending updates, then the memoized state should be the
7692+
// same as the base state. Currently these only diverge in the case of
7693+
// useOptimistic, because useOptimistic accepts a new baseState on
7694+
// every render.
7695+
hook.memoizedState = baseState; // We don't need to call markWorkInProgressReceivedUpdate because
7696+
// baseState is derived from other reactive values.
7697+
} else {
76897698
// We have a queue to process.
76907699
var first = baseQueue.next;
7691-
var newState = hook.baseState;
7700+
var newState = baseState;
76927701
var newBaseState = null;
76937702
var newBaseQueueFirst = null;
76947703
var newBaseQueueLast = null;
@@ -25531,7 +25540,7 @@ if (__DEV__) {
2553125540
return root;
2553225541
}
2553325542

25534-
var ReactVersion = "18.3.0-canary-33068c9db-20240112";
25543+
var ReactVersion = "18.3.0-canary-60a927d04-20240113";
2553525544

2553625545
// Might add PROFILE later.
2553725546

compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react-test-renderer/cjs/ReactTestRenderer-prod.js

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* @noflow
88
* @nolint
99
* @preventMunge
10-
* @generated SignedSource<<09dbf4f778ca917e96108791bdd4cd8e>>
10+
* @generated SignedSource<<d07c017ce198fa80983d34f3c3d63dda>>
1111
*/
1212

1313
"use strict";
@@ -2531,9 +2531,10 @@ function updateReducerImpl(hook, current, reducer) {
25312531
current.baseQueue = baseQueue = pendingQueue;
25322532
queue.pending = null;
25332533
}
2534-
if (null !== baseQueue) {
2534+
pendingQueue = hook.baseState;
2535+
if (null === baseQueue) hook.memoizedState = pendingQueue;
2536+
else {
25352537
current = baseQueue.next;
2536-
pendingQueue = hook.baseState;
25372538
var newBaseQueueFirst = (baseFirst = null),
25382539
newBaseQueueLast = null,
25392540
update = current;
@@ -9121,7 +9122,7 @@ var devToolsConfig$jscomp$inline_1037 = {
91219122
throw Error("TestRenderer does not support findFiberByHostInstance()");
91229123
},
91239124
bundleType: 0,
9124-
version: "18.3.0-canary-33068c9db-20240112",
9125+
version: "18.3.0-canary-60a927d04-20240113",
91259126
rendererPackageName: "react-test-renderer"
91269127
};
91279128
var internals$jscomp$inline_1230 = {
@@ -9152,7 +9153,7 @@ var internals$jscomp$inline_1230 = {
91529153
scheduleRoot: null,
91539154
setRefreshHandler: null,
91549155
getCurrentFiber: null,
9155-
reconcilerVersion: "18.3.0-canary-33068c9db-20240112"
9156+
reconcilerVersion: "18.3.0-canary-60a927d04-20240113"
91569157
};
91579158
if ("undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) {
91589159
var hook$jscomp$inline_1231 = __REACT_DEVTOOLS_GLOBAL_HOOK__;

compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react-test-renderer/cjs/ReactTestRenderer-profiling.js

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* @noflow
88
* @nolint
99
* @preventMunge
10-
* @generated SignedSource<<7b9b447b7ed58bc7f344d3fd301db92f>>
10+
* @generated SignedSource<<cc5b4b4d4992af1878302a2a335f8e0a>>
1111
*/
1212

1313
"use strict";
@@ -2551,9 +2551,10 @@ function updateReducerImpl(hook, current, reducer) {
25512551
current.baseQueue = baseQueue = pendingQueue;
25522552
queue.pending = null;
25532553
}
2554-
if (null !== baseQueue) {
2554+
pendingQueue = hook.baseState;
2555+
if (null === baseQueue) hook.memoizedState = pendingQueue;
2556+
else {
25552557
current = baseQueue.next;
2556-
pendingQueue = hook.baseState;
25572558
var newBaseQueueFirst = (baseFirst = null),
25582559
newBaseQueueLast = null,
25592560
update = current;
@@ -9549,7 +9550,7 @@ var devToolsConfig$jscomp$inline_1079 = {
95499550
throw Error("TestRenderer does not support findFiberByHostInstance()");
95509551
},
95519552
bundleType: 0,
9552-
version: "18.3.0-canary-33068c9db-20240112",
9553+
version: "18.3.0-canary-60a927d04-20240113",
95539554
rendererPackageName: "react-test-renderer"
95549555
};
95559556
var internals$jscomp$inline_1271 = {
@@ -9580,7 +9581,7 @@ var internals$jscomp$inline_1271 = {
95809581
scheduleRoot: null,
95819582
setRefreshHandler: null,
95829583
getCurrentFiber: null,
9583-
reconcilerVersion: "18.3.0-canary-33068c9db-20240112"
9584+
reconcilerVersion: "18.3.0-canary-60a927d04-20240113"
95849585
};
95859586
if ("undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) {
95869587
var hook$jscomp$inline_1272 = __REACT_DEVTOOLS_GLOBAL_HOOK__;

compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/cjs/React-dev.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ if (__DEV__) {
2424
) {
2525
__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error());
2626
}
27-
var ReactVersion = "18.3.0-canary-33068c9db-20240112";
27+
var ReactVersion = "18.3.0-canary-60a927d04-20240113";
2828

2929
// ATTENTION
3030
// When adding new symbols to this file,

compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/cjs/React-prod.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -580,4 +580,4 @@ exports.useSyncExternalStore = function (
580580
exports.useTransition = function () {
581581
return ReactCurrentDispatcher.current.useTransition();
582582
};
583-
exports.version = "18.3.0-canary-33068c9db-20240112";
583+
exports.version = "18.3.0-canary-60a927d04-20240113";

compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/cjs/React-profiling.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -576,7 +576,7 @@ exports.useSyncExternalStore = function (
576576
exports.useTransition = function () {
577577
return ReactCurrentDispatcher.current.useTransition();
578578
};
579-
exports.version = "18.3.0-canary-33068c9db-20240112";
579+
exports.version = "18.3.0-canary-60a927d04-20240113";
580580
"undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&
581581
"function" ===
582582
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
33068c9db9153a479bb29d138397cb9c32fabfdd
1+
60a927d04ad3888facebcdf7da620aa1cfc9528f

compiled-rn/facebook-fbsource/xplat/js/react-native-github/Libraries/Renderer/implementations/ReactFabric-dev.fb.js

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* @noflow
88
* @nolint
99
* @preventMunge
10-
* @generated SignedSource<<8093e023e848964848b2e08a5762599f>>
10+
* @generated SignedSource<<3bbc5516aa8fca4c50bd6b2679dc8923>>
1111
*/
1212

1313
"use strict";
@@ -11498,10 +11498,19 @@ to return true:wantsResponderID| |
1149811498
queue.pending = null;
1149911499
}
1150011500

11501-
if (baseQueue !== null) {
11501+
var baseState = hook.baseState;
11502+
11503+
if (baseQueue === null) {
11504+
// If there are no pending updates, then the memoized state should be the
11505+
// same as the base state. Currently these only diverge in the case of
11506+
// useOptimistic, because useOptimistic accepts a new baseState on
11507+
// every render.
11508+
hook.memoizedState = baseState; // We don't need to call markWorkInProgressReceivedUpdate because
11509+
// baseState is derived from other reactive values.
11510+
} else {
1150211511
// We have a queue to process.
1150311512
var first = baseQueue.next;
11504-
var newState = hook.baseState;
11513+
var newState = baseState;
1150511514
var newBaseState = null;
1150611515
var newBaseQueueFirst = null;
1150711516
var newBaseQueueLast = null;
@@ -27829,7 +27838,7 @@ to return true:wantsResponderID| |
2782927838
return root;
2783027839
}
2783127840

27832-
var ReactVersion = "18.3.0-canary-247f0e0d";
27841+
var ReactVersion = "18.3.0-canary-58de2f66";
2783327842

2783427843
function createPortal$1(
2783527844
children,

compiled-rn/facebook-fbsource/xplat/js/react-native-github/Libraries/Renderer/implementations/ReactFabric-prod.fb.js

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* @noflow
88
* @nolint
99
* @preventMunge
10-
* @generated SignedSource<<f143c1c3879cd2bea8f0434af516bbbf>>
10+
* @generated SignedSource<<6e407622da5495d67c0b1b946f5635a4>>
1111
*/
1212

1313
"use strict";
@@ -3814,9 +3814,10 @@ function updateReducer(reducer) {
38143814
current.baseQueue = baseQueue = pendingQueue;
38153815
queue.pending = null;
38163816
}
3817-
if (null !== baseQueue) {
3817+
pendingQueue = hook.baseState;
3818+
if (null === baseQueue) hook.memoizedState = pendingQueue;
3819+
else {
38183820
current = baseQueue.next;
3819-
pendingQueue = hook.baseState;
38203821
var newBaseQueueFirst = (baseFirst = null),
38213822
newBaseQueueLast = null,
38223823
update = current;
@@ -9549,10 +9550,10 @@ batchedUpdatesImpl = function (fn, a) {
95499550
}
95509551
};
95519552
var roots = new Map(),
9552-
devToolsConfig$jscomp$inline_1053 = {
9553+
devToolsConfig$jscomp$inline_1054 = {
95539554
findFiberByHostInstance: getInstanceFromNode,
95549555
bundleType: 0,
9555-
version: "18.3.0-canary-e5b06734",
9556+
version: "18.3.0-canary-4aee1a03",
95569557
rendererPackageName: "react-native-renderer",
95579558
rendererConfig: {
95589559
getInspectorDataForInstance: getInspectorDataForInstance,
@@ -9568,11 +9569,11 @@ var roots = new Map(),
95689569
}.bind(null, findNodeHandle)
95699570
}
95709571
};
9571-
var internals$jscomp$inline_1292 = {
9572-
bundleType: devToolsConfig$jscomp$inline_1053.bundleType,
9573-
version: devToolsConfig$jscomp$inline_1053.version,
9574-
rendererPackageName: devToolsConfig$jscomp$inline_1053.rendererPackageName,
9575-
rendererConfig: devToolsConfig$jscomp$inline_1053.rendererConfig,
9572+
var internals$jscomp$inline_1293 = {
9573+
bundleType: devToolsConfig$jscomp$inline_1054.bundleType,
9574+
version: devToolsConfig$jscomp$inline_1054.version,
9575+
rendererPackageName: devToolsConfig$jscomp$inline_1054.rendererPackageName,
9576+
rendererConfig: devToolsConfig$jscomp$inline_1054.rendererConfig,
95769577
overrideHookState: null,
95779578
overrideHookStateDeletePath: null,
95789579
overrideHookStateRenamePath: null,
@@ -9588,26 +9589,26 @@ var internals$jscomp$inline_1292 = {
95889589
return null === fiber ? null : fiber.stateNode;
95899590
},
95909591
findFiberByHostInstance:
9591-
devToolsConfig$jscomp$inline_1053.findFiberByHostInstance ||
9592+
devToolsConfig$jscomp$inline_1054.findFiberByHostInstance ||
95929593
emptyFindFiberByHostInstance,
95939594
findHostInstancesForRefresh: null,
95949595
scheduleRefresh: null,
95959596
scheduleRoot: null,
95969597
setRefreshHandler: null,
95979598
getCurrentFiber: null,
9598-
reconcilerVersion: "18.3.0-canary-e5b06734"
9599+
reconcilerVersion: "18.3.0-canary-4aee1a03"
95999600
};
96009601
if ("undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) {
9601-
var hook$jscomp$inline_1293 = __REACT_DEVTOOLS_GLOBAL_HOOK__;
9602+
var hook$jscomp$inline_1294 = __REACT_DEVTOOLS_GLOBAL_HOOK__;
96029603
if (
9603-
!hook$jscomp$inline_1293.isDisabled &&
9604-
hook$jscomp$inline_1293.supportsFiber
9604+
!hook$jscomp$inline_1294.isDisabled &&
9605+
hook$jscomp$inline_1294.supportsFiber
96059606
)
96069607
try {
9607-
(rendererID = hook$jscomp$inline_1293.inject(
9608-
internals$jscomp$inline_1292
9608+
(rendererID = hook$jscomp$inline_1294.inject(
9609+
internals$jscomp$inline_1293
96099610
)),
9610-
(injectedHook = hook$jscomp$inline_1293);
9611+
(injectedHook = hook$jscomp$inline_1294);
96119612
} catch (err) {}
96129613
}
96139614
exports.createPortal = function (children, containerTag) {

compiled-rn/facebook-fbsource/xplat/js/react-native-github/Libraries/Renderer/implementations/ReactFabric-profiling.fb.js

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* @noflow
88
* @nolint
99
* @preventMunge
10-
* @generated SignedSource<<2607cd5e41323c146ac09ecbb5682ce5>>
10+
* @generated SignedSource<<e63c28c66e569a08046155e4355e34c0>>
1111
*/
1212

1313
"use strict";
@@ -3938,9 +3938,10 @@ function updateReducer(reducer) {
39383938
current.baseQueue = baseQueue = pendingQueue;
39393939
queue.pending = null;
39403940
}
3941-
if (null !== baseQueue) {
3941+
pendingQueue = hook.baseState;
3942+
if (null === baseQueue) hook.memoizedState = pendingQueue;
3943+
else {
39423944
current = baseQueue.next;
3943-
pendingQueue = hook.baseState;
39443945
var newBaseQueueFirst = (baseFirst = null),
39453946
newBaseQueueLast = null,
39463947
update = current;
@@ -10251,10 +10252,10 @@ batchedUpdatesImpl = function (fn, a) {
1025110252
}
1025210253
};
1025310254
var roots = new Map(),
10254-
devToolsConfig$jscomp$inline_1131 = {
10255+
devToolsConfig$jscomp$inline_1132 = {
1025510256
findFiberByHostInstance: getInstanceFromNode,
1025610257
bundleType: 0,
10257-
version: "18.3.0-canary-1b36a89c",
10258+
version: "18.3.0-canary-575afa21",
1025810259
rendererPackageName: "react-native-renderer",
1025910260
rendererConfig: {
1026010261
getInspectorDataForInstance: getInspectorDataForInstance,
@@ -10284,10 +10285,10 @@ var roots = new Map(),
1028410285
} catch (err) {}
1028510286
return hook.checkDCE ? !0 : !1;
1028610287
})({
10287-
bundleType: devToolsConfig$jscomp$inline_1131.bundleType,
10288-
version: devToolsConfig$jscomp$inline_1131.version,
10289-
rendererPackageName: devToolsConfig$jscomp$inline_1131.rendererPackageName,
10290-
rendererConfig: devToolsConfig$jscomp$inline_1131.rendererConfig,
10288+
bundleType: devToolsConfig$jscomp$inline_1132.bundleType,
10289+
version: devToolsConfig$jscomp$inline_1132.version,
10290+
rendererPackageName: devToolsConfig$jscomp$inline_1132.rendererPackageName,
10291+
rendererConfig: devToolsConfig$jscomp$inline_1132.rendererConfig,
1029110292
overrideHookState: null,
1029210293
overrideHookStateDeletePath: null,
1029310294
overrideHookStateRenamePath: null,
@@ -10303,14 +10304,14 @@ var roots = new Map(),
1030310304
return null === fiber ? null : fiber.stateNode;
1030410305
},
1030510306
findFiberByHostInstance:
10306-
devToolsConfig$jscomp$inline_1131.findFiberByHostInstance ||
10307+
devToolsConfig$jscomp$inline_1132.findFiberByHostInstance ||
1030710308
emptyFindFiberByHostInstance,
1030810309
findHostInstancesForRefresh: null,
1030910310
scheduleRefresh: null,
1031010311
scheduleRoot: null,
1031110312
setRefreshHandler: null,
1031210313
getCurrentFiber: null,
10313-
reconcilerVersion: "18.3.0-canary-1b36a89c"
10314+
reconcilerVersion: "18.3.0-canary-575afa21"
1031410315
});
1031510316
exports.createPortal = function (children, containerTag) {
1031610317
return createPortal$1(

0 commit comments

Comments
 (0)