From ebcd8ec926c2026e07fd8fac82a044bbed0f27db Mon Sep 17 00:00:00 2001 From: Jared Vititoe Date: Thu, 2 Jul 2026 14:30:33 -0400 Subject: [PATCH] feat(ux): forward to multiple rooms + live bookmark previews (P6-3) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- LOTUS_BUGS.md | 1 + LOTUS_FEATURES.md | 8 + LOTUS_TODO.md | 8 +- src/app/features/bookmarks/BookmarksPanel.tsx | 72 +++++- .../room/message/ForwardMessageDialog.tsx | 233 ++++++++++-------- .../room/message/forwardContent.test.ts | 138 +++++++++++ .../features/room/message/forwardContent.ts | 39 +++ 7 files changed, 391 insertions(+), 108 deletions(-) create mode 100644 src/app/features/room/message/forwardContent.test.ts create mode 100644 src/app/features/room/message/forwardContent.ts diff --git a/LOTUS_BUGS.md b/LOTUS_BUGS.md index 9e1f146df..8f68d695a 100644 --- a/LOTUS_BUGS.md +++ b/LOTUS_BUGS.md @@ -44,6 +44,7 @@ Implemented and gate-green; confirm each per `LOTUS_TESTING.md`, then delete the | P3-4 | Accessibility compliance pass (collapsed-msg SR sender, form/overlay labels, typing announce, focus-return, `?` help, jsx-a11y CI gate) | `message/*`, `RoomViewTyping`, `features/shortcuts/*`, `eslint.config.mjs` | LOTUS_TESTING §P — axe-core + VoiceOver/NVDA on the golden path | | P6-1 | Desktop Linux parity (no-sleep in calls, launcher badge), autostart toggle, tray Do-Not-Disturb | `native/power.rs`, `lib.rs`, `useTauriDnd`, `General.tsx` | Linux desktop: no display sleep during a call; tray DND silences notifications; launch-on-login persists; Unity badge (Ubuntu); DND toggle polarity | | P6-2 | EC deafen/screenshare-audio-mute via `io.lotus.set_deafen` (retires the `