Commit 162f108
fix(components): apply new form defaultValues in the commit that renders them (#3001)
The form applies a `defaultValues` change by resetting react-hook-form to it.
While that ran in a PASSIVE effect there was a window: the render had already
committed, so the new inputs were mounted and interactive, but the form still
held the old record. Anything typed in that window was destroyed — the pending
`reset()` overwrote the whole record with `defaultValues`, dropping the field
the user had just filled, with no error and nothing in the payload.
It surfaced as the flaky wizard test fixed in #2983: a step transition changes
`defaultValues`, and `note` typed on the new step vanished from the create
body. That fix drained pending effects in the test, which AVOIDS the window;
this one CLOSES it. Measured with the pre-fix test pattern, 1500 replays under
CPU load: 6 failures before, 0 after.
Running the reset as a layout effect is only half of it. The `form_change`
subscription was silent across a reset by accident of ordering, not by design:
`onAction` is usually an inline arrow, so its identity changes every render and
the subscription effect re-runs each commit — and React runs every passive
DESTROY before any passive CREATE, so the watcher was unsubscribed before the
reset fired. Hoisting only the reset to the layout phase puts it AHEAD of that
cleanup, so the still-live previous subscription sees it and a record landing
looks like the user having edited every field it filled. That regressed #2968
deterministically (`changes=[{"category":"not-offered","status":"pending"}]`).
Both `form.watch` subscriptions therefore move to the same phase, restoring the
destroy-then-create order exactly.
The new test pins the window shut without depending on timing: React flushes
passive effects in tree order, so a probe sibling rendered before the form is
guaranteed to run inside the window and types from there. It fails on every run
against the previous code.
Co-authored-by: Jack Zhuang <277994282+os-zhuang@users.noreply.github.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>1 parent 5b084eb commit 162f108
2 files changed
Lines changed: 165 additions & 5 deletions
Lines changed: 139 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
560 | 560 | | |
561 | 561 | | |
562 | 562 | | |
563 | | - | |
| 563 | + | |
| 564 | + | |
| 565 | + | |
| 566 | + | |
| 567 | + | |
| 568 | + | |
| 569 | + | |
| 570 | + | |
| 571 | + | |
| 572 | + | |
| 573 | + | |
| 574 | + | |
564 | 575 | | |
565 | 576 | | |
566 | 577 | | |
| |||
614 | 625 | | |
615 | 626 | | |
616 | 627 | | |
617 | | - | |
618 | | - | |
| 628 | + | |
| 629 | + | |
| 630 | + | |
| 631 | + | |
| 632 | + | |
| 633 | + | |
| 634 | + | |
| 635 | + | |
| 636 | + | |
| 637 | + | |
| 638 | + | |
619 | 639 | | |
620 | 640 | | |
621 | 641 | | |
| |||
632 | 652 | | |
633 | 653 | | |
634 | 654 | | |
635 | | - | |
636 | | - | |
| 655 | + | |
| 656 | + | |
| 657 | + | |
637 | 658 | | |
638 | 659 | | |
639 | 660 | | |
| |||
0 commit comments