feat(ux): forward to multiple rooms + live bookmark previews (P6-3)

Forward: checkbox multi-select room picker + "Send to N rooms" batch send
(Promise.allSettled). Full success auto-closes; partial failure keeps the dialog
open with a "Forwarded to X/N — failed: …" summary and prunes the selection to
only the failures (retry won't duplicate to already-sent rooms). Content builder
extracted to a unit-tested forwardContent.ts (edit-forwarding, reply-strip,
undecryptable-refused; 4 tests).

Bookmarks: BookmarksPanel resolves each saved message's live event (useRoomEvent)
so previews reflect edits and show a deleted indicator for redactions; the stored
snapshot stays as the fallback while loading, on fetch failure, or after leaving
the room. Stored bookmark shape unchanged.

Gates: tsc/eslint/prettier clean, build OK, 665 tests. Reviewed (dup-resend on
retry + Checkbox readOnly fixed).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-02 14:30:33 -04:00
parent 4ff07ea2bd
commit ebcd8ec926
7 changed files with 391 additions and 108 deletions
+7 -1
View File
@@ -541,7 +541,13 @@ Replace cinny's fragile iframe-`contentDocument` reaches with proper `io.lotus.*
- Retire the `useCallSpeakers` DOM-scrape fallback once `io.lotus.call_state` is verified.
Fork commits are local (coordinator); publishing needs the user's npm token.
### [ ] P6-3 · Web UX wins (from the audit ADD list)
### [~] P6-3 · Web UX wins - DONE (2026-07): forward multi-select + live bookmark previews
**Shipped:** Forward Message multi-select (checkbox rooms + "Send to N", batch `Promise.allSettled` with partial-failure summary; content builder extracted to tested `forwardContent.ts`). Live bookmark previews (`BookmarksPanel` renders the live event via `useRoomEvent` - edits + redactions - snapshot as fallback / left-room). Both `lotus`, gate-green (665 tests).
_Original scope:_
### [ ] P6-3-orig · Web UX wins (from the audit ADD list)
- **Forward to multiple rooms** — multi-select (checkbox + "Send to N") in `ForwardMessageDialog` (currently one room per open, capped at 60).
- **Live bookmark previews** — `BookmarksPanel` shows a stale snapshot captured at save time; resolve live from the event when cached (edits/redactions), fall back to the snapshot.