Repository navigation
fix: respect create-list dialog dismissal - #292
Conversation
|
🚅 Deployed to the boop-pr-292 environment in Friends
|
There was a problem hiding this comment.
ℹ️ No critical issues. One minor suggestion inline.
Reviewed changes
I reviewed the single commit that makes create-list dismissal final, along with the Panel timer and dedupe changes it depends on. Both new suites pass under node --test and bun test (56/56), and npx tsc -b --force is clean.
- Dismissal invalidates in-flight work:
CreateListDialogchecksmountedRefanddismissedRefafter eachawait. A sign/save that resolves or rejects after Close, Escape, backdrop or swipe no longer firesonListCreated, haptics, analytics, errors or navigation. - Identity isolation:
CreateListModalrendersCreateListDialog key={did}. When the account changes, the dialog remounts and the old account's pending work is orphaned. - Double-submit guard:
pendingRefandcompletedRefblock a second submit in the same event turn and any resubmit after success. The plan-limit banner is cleared on retry. - Success dismissal no longer navigates: X, Escape, backdrop and swipe now just close the success view. Only "Go to list" and "Share with people" navigate, and both are blocked once a dismissal has started.
- Honest pending Close: the footer button stays enabled while creating and its label becomes "Close". A
role="status"note warns that a save already in flight may still complete. Panelclose lifecycle: adds theonCloseStartcallback and removesisAnimating, so!isOpenrenders nothing. Repeated dismissals are deduped, and the close timer is cleared on unmount or whenisOpenchanges. Every current consumer passesisOpen={true}and unmounts inonClose, so the dedupe latch, which only resets whenisOpenchanges, is safe today.
claude-opus-5-5 | 𝕏
| setIsCreating(false); | ||
| onListCreated?.(listId, trimmedName); | ||
| } catch (err) { | ||
| if (!mountedRef.current || dismissedRef.current) return; |
There was a problem hiding this comment.
Returning before console.error means a sign or save that fails after the user dismisses the dialog leaves no trace. That is exactly the case where someone will later ask whether the list was created. Suppressing the user-facing feedback is right, but keeping the log would help debugging. The dismissal tests will then print the expected rejections to stderr; they still pass.
| if (!mountedRef.current || dismissedRef.current) return; | |
| console.error("Failed to create list:", err); | |
| if (!mountedRef.current || dismissedRef.current) return; |
There was a problem hiding this comment.
Correction: this suggestion replaces only line 116, so applying it as-is would duplicate the log line. Move the guard below the existing console.error on line 117 by hand instead.
claude-opus-5-5 | 𝕏

Keep create-list dismissal final
Summary
Verification
56 new rendered regression cases pass, plus 9 independent adversarial Panel checks.
The actual Home callback path is exercised. Seven targeted regressions fail on
unchanged main. Independent review found and verified the repair of one initial
Panel regression; no remaining blocker was reported.
Focused TypeScript with service type stubs passes. CreateListModal lint passes;
Panel retains the existing set-state-in-effect lint failure. Full repository
build, aggregate checks, real browser/native behavior and live backend verification
still need a complete checkout.
Draft for review against main
8bfcdb78f14925c4e4e164a5f19187d9606c0fb8. No merge or deployment. Existing PRs #289/#290 are preserved.Note
Fix create-list dialog to respect dismissal during async list creation
CreateListModalso any dismissal (Escape, backdrop, header, footer, swipe) during sign-in or saving invalidates the in-flight attempt. Late success or failure results, feedback, analytics, and navigation are suppressed after dismissal or unmount.CreateListDialogthat remounts when the current identity changes, so one account's pending request cannot affect another account's draft.Panelin Panel.tsx: the first dismissal starts the animation, callsonCloseStartimmediately, and firesonCloseonce after the 200ms delay. Timers are cancelled on unmount or reopen.Macroscope summarized c6290e0.