Commit bfff8e1
fix(overlays): restore presented state after a DOM move (#31400)
Issue number: resolves #31389
---------
## What is the current behavior?
<!-- Please describe the current behavior that you are modifying. -->
Currently, `componentWillUnmount` in `createInlineOverlayComponent`
removes a nested inline overlay host that `CoreDelegate` has teleported
out of its `<template>`. React also runs that hook when it only *hides*
a subtree, so a Suspense fallback, an Offscreen tree, or the StrictMode
cycle deletes an overlay that is still presenting. React did not remove
the host, so React never puts it back. Core emits `ionMount` and then
goes quiet: no `willPresent`, no `didPresent`, and no dismiss lifecycle,
while the React tree still believes the overlay is open. The user sees
nothing at all.
## What is the new behavior?
The wrapper now tells a React hide from a real destroy instead of
treating both as an unmount. The marker `<template>` is the
discriminator, since it stays at the JSX position and leaves the
document only on a real unmount, so the teardown defers a microtask and
runs only if the marker really left. A hide leaves the host exactly
where it is, `present()` and `didDismiss` keep working while the subtree
is hidden, and a destroy that hits while it is already hidden still
cleans up even though React skips the second `componentWillUnmount`
there. This addresses #31223's requirements by making a relocated
portaled host move back into `portalTarget` synchronously, and the
StrictMode cycle still leaves exactly one copy in the DOM.
Separately, the five overlays that release the app root on disconnect
(`modal`, `popover`, `alert`, `action-sheet`, `loading`) now restore it
on reconnect, along with the modal's safe-area overrides and
parent-removal observer, and the button gesture on `alert` and
`action-sheet`. A presented overlay that gets detached and re-inserted
across a task previously came back with the root lock and safe-area
gone.
## Does this introduce a breaking change?
- [ ] Yes
- [X] No
## Other information
This supersedes #31390, which fixes the same issue by recording the
removed host and re-appending it on remount. That works for the reported
case, but it keeps the removal, and the removal costs more than the DOM
node: the disconnect releases the root lock, clears the safe-area
overrides and the sheet's `--ion-modal-offset-top`, destroys the button
gesture, and drops the parent-removal observer. Putting the node back
restores none of that, so the smaller fix needs the core half of this PR
anyway. Not removing it in the first place avoids all of that, and also
covers the portaled overlays, the destroy-while-hidden case, and a
dismiss landing during the hidden window, which #31390 doesn't reach.
Thanks to @ptmkenny for the report, the analysis, and the original
patch, which is where the diagnosis came from.
Note that the core half is defence-in-depth rather than a requirement
for #31389. Once the React wrapper stops removing the host, core no
longer sees a detach and re-attach in the reported flow. It does fix a
real pre-existing bug though, since a presented modal moved by anything
else lost its safe-area, so it's worth keeping.
Preview:
- [Inline modal
(iOS)](https://ionic-framework-git-fix-react-inline-overlay-hide-vs-unmount-ionic1.vercel.app/src/components/modal/test/inline?ionic:mode=ios)
- [Modal safe-area
(iOS)](https://ionic-framework-git-fix-react-inline-overlay-hide-vs-unmount-ionic1.vercel.app/src/components/modal/test/safe-area?ionic:mode=ios)
## Current dev build:
```
9.0.1-dev.11787589191.1e183b55
```
---------
Co-authored-by: ptmkenny <github@ptmkenny.com>1 parent 95e2224 commit bfff8e1
17 files changed
Lines changed: 1741 additions & 137 deletions
File tree
- core/src
- components
- action-sheet
- test/basic
- alert
- test/basic
- loading
- test/basic
- modal
- test
- inline
- safe-area
- popover
- test/basic
- utils
- test
- overlays
- playwright
- packages/react/src/components
- __tests__
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
14 | 14 | | |
15 | 15 | | |
16 | 16 | | |
| 17 | + | |
17 | 18 | | |
18 | 19 | | |
19 | 20 | | |
| |||
455 | 456 | | |
456 | 457 | | |
457 | 458 | | |
| 459 | + | |
| 460 | + | |
| 461 | + | |
| 462 | + | |
| 463 | + | |
| 464 | + | |
| 465 | + | |
| 466 | + | |
| 467 | + | |
458 | 468 | | |
459 | 469 | | |
460 | 470 | | |
| |||
478 | 488 | | |
479 | 489 | | |
480 | 490 | | |
481 | | - | |
482 | | - | |
483 | | - | |
484 | | - | |
485 | | - | |
486 | | - | |
487 | | - | |
488 | | - | |
| 491 | + | |
| 492 | + | |
| 493 | + | |
| 494 | + | |
| 495 | + | |
| 496 | + | |
| 497 | + | |
| 498 | + | |
| 499 | + | |
| 500 | + | |
489 | 501 | | |
490 | | - | |
491 | | - | |
492 | | - | |
493 | | - | |
494 | | - | |
495 | | - | |
496 | | - | |
497 | | - | |
498 | | - | |
499 | | - | |
| 502 | + | |
| 503 | + | |
500 | 504 | | |
| 505 | + | |
| 506 | + | |
| 507 | + | |
| 508 | + | |
| 509 | + | |
| 510 | + | |
| 511 | + | |
| 512 | + | |
| 513 | + | |
| 514 | + | |
| 515 | + | |
| 516 | + | |
| 517 | + | |
| 518 | + | |
| 519 | + | |
| 520 | + | |
501 | 521 | | |
502 | 522 | | |
503 | 523 | | |
| |||
Lines changed: 54 additions & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | | - | |
| 2 | + | |
3 | 3 | | |
4 | 4 | | |
5 | 5 | | |
| |||
166 | 166 | | |
167 | 167 | | |
168 | 168 | | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
17 | 17 | | |
18 | 18 | | |
19 | 19 | | |
| 20 | + | |
20 | 21 | | |
21 | 22 | | |
22 | 23 | | |
| |||
363 | 364 | | |
364 | 365 | | |
365 | 366 | | |
366 | | - | |
367 | | - | |
| 367 | + | |
| 368 | + | |
368 | 369 | | |
369 | 370 | | |
| 371 | + | |
| 372 | + | |
| 373 | + | |
| 374 | + | |
| 375 | + | |
| 376 | + | |
370 | 377 | | |
371 | 378 | | |
372 | 379 | | |
| |||
394 | 401 | | |
395 | 402 | | |
396 | 403 | | |
397 | | - | |
398 | | - | |
399 | | - | |
400 | | - | |
401 | | - | |
402 | | - | |
403 | | - | |
| 404 | + | |
| 405 | + | |
| 406 | + | |
| 407 | + | |
| 408 | + | |
| 409 | + | |
| 410 | + | |
404 | 411 | | |
405 | 412 | | |
406 | 413 | | |
407 | 414 | | |
408 | 415 | | |
409 | 416 | | |
| 417 | + | |
410 | 418 | | |
| 419 | + | |
| 420 | + | |
411 | 421 | | |
412 | 422 | | |
413 | 423 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | 3 | | |
4 | | - | |
| 4 | + | |
5 | 5 | | |
6 | 6 | | |
7 | 7 | | |
| |||
203 | 203 | | |
204 | 204 | | |
205 | 205 | | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
| 255 | + | |
| 256 | + | |
| 257 | + | |
| 258 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
12 | 12 | | |
13 | 13 | | |
14 | 14 | | |
| 15 | + | |
15 | 16 | | |
16 | 17 | | |
17 | 18 | | |
| |||
208 | 209 | | |
209 | 210 | | |
210 | 211 | | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
211 | 217 | | |
212 | 218 | | |
213 | 219 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
| 3 | + | |
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
| |||
100 | 100 | | |
101 | 101 | | |
102 | 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 | + | |
0 commit comments