Skip to content

fix(ui): show deletes in the open channel and keep the message toolbar after a reaction is removed - #648

Merged
iamnbutler merged 3 commits into
mainfrom
fix-live-deletes
Oct 22, 2026
Merged

iamnbutler merged 3 commits into
mainfrom
fix-live-deletes

Conversation

@iamnbutler

Copy link
Copy Markdown
Contributor

Two stale-screen bugs in the open channel:

  • Deleting a message left the old text on screen until you switched channels or the window resized. The deleted frame did arrive and the data updated, but the timeline never re-rendered. When a render found a markdown parse already in flight, it didn't queue that parse, so its tick depended on an earlier render's effect, and React had already cancelled that effect. Every render with an unparsed chunk now queues it, and start() reuses the in-flight promise.
  • The message toolbar stopped appearing on every message after you removed your own reaction, until a reload. Removing the chip shrinks the content, the browser clamps scrollTop with a scroll event but sends no scrollend, and the timeline stayed in its scrolling state, which hides hover. ScrollView now also ends a scroll after 200 ms with no scroll events.

Part of #619 (^561's pill counts and picker search colour are not in this PR). Map: ^559, ^562.

Smoke: loopback source host with its own ACE_HOME, channels made with ace new / ace say, headless Chromium (WebKit too for the reaction).

  • Delete: in a new channel, More → Delete → Delete message showed Message deleted within 500 ms without a resize. Before the fix it still showed "Fresh two" 4 s later, and only a resize brought it in.
  • Reaction: in a channel long enough to scroll, I added 👀 to the last message and clicked the chip to remove it. Hovering that message and another one then showed Add reaction / Copy / Copy message link / More. Before the fix, Chromium logged a scroll with no scrollend and no toolbar appeared. WebKit didn't reproduce the bug and still works.

Built in Ace

No: made from Claude Code (a fix-train worker), with headless Chromium and WebKit for the smoke test. Dogfooding gap tracked in #5.

…r after a reaction is removed

Why: packages/ui/src/components/timeline/layout.ts#function textBlocks | every render with an unparsed chunk must queue its job, even one already in flight, or a cancelled effect leaves the old text on screen
Why: packages/ui/src/components/scroll-view/scroll-view.tsx | a quiet period must end a scroll; browsers send no scrollend when they clamp scrollTop after content shrinks
@iamnbutler
iamnbutler merged commit 10de32e into main Oct 22, 2026
1 check passed
@iamnbutler
iamnbutler deleted the fix-live-deletes branch October 22, 2026 21:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant