feat: complete community Magic Board across desktop and mobile - #5476
feat: complete community Magic Board across desktop and mobile#5476PIZZALORD713 wants to merge 4 commits into
Conversation
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 8c81578a28
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| /> | ||
| </div> | ||
|
|
||
| <ChannelManagementSheet |
There was a problem hiding this comment.
Navigate away after deleting the board channel
When an administrator deletes the currently viewed channel from this board-specific management sheet, no onDeleted callback is provided. The mutation immediately removes the channel from the shared channel query, so ChannelRouteScreen loses its activeChannel and renders ChannelScreenEmptyState while the URL still points to the deleted channel; unlike the existing stream and global-management paths, nothing calls goHome. Pass a deletion handler that closes the panel and replaces the invalid route.
Useful? React with 👍 / 👎.
Render shared channel canvases as a responsive Board while preserving Stream routing for existing deep links and actions. Co-authored-by: pizzalord.eth <pizzalord.gm@gmail.com> Signed-off-by: pizzalord.eth <pizzalord.gm@gmail.com>
Co-authored-by: pizzalord.eth <pizzalord.gm@gmail.com> Signed-off-by: pizzalord.eth <pizzalord.gm@gmail.com>
Let channel stewards create and edit Markdown-backed cards from the Board, reorder them with pointer or keyboard drag, and persist the shared canvas with optimistic rollback and conflict guards. Cover parsing, permissions, narrow layout, and the durable create-edit-drag flow. Co-authored-by: pizzalord.eth <pizzalord.gm@gmail.com> Signed-off-by: pizzalord.eth <pizzalord.gm@gmail.com>
435c85c to
6637f92
Compare
🔐 Codex Security Review
|
Signed-off-by: pizzalord.eth <pizzalord.gm@gmail.com>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: a89ea281b4
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| const hasRouteTarget = Boolean( | ||
| hasStreamRouteIntent || | ||
| searchHighlight || | ||
| selectedPostId || | ||
| targetMessageId || |
There was a problem hiding this comment.
Preserve stream mode after resolving a message target
In a Dispatch channel or any channel whose saved preference is Board, a messageId only forces Stream until the timeline finds the row: ChannelScreen then calls clearMessageRouteTarget({ replace: true }), making this predicate false and immediately remounting the Board. The linked message therefore appears only briefly before being hidden, so retain Stream for the lifetime of the resolved navigation rather than deriving it solely from the transient URL parameter.
Useful? React with 👍 / 👎.
| let current_event_id = events.first().map(|event| event.id.to_hex()); | ||
| ensure_canvas_revision(expected_event_id.as_deref(), current_event_id.as_deref())?; |
There was a problem hiding this comment.
Use a revision that orders same-second canvas writes
When multiple board mutations occur within one second, their signed events share the same second-resolution created_at; however, query_events orders ties by id ASC (crates/buzz-db/src/store/event.rs:685-693). After the client caches the returned ID of a later drag or status write, this limit-one query can still select the earlier lower-ID event, causing the next save to report a revision conflict despite no concurrent editor and causing reloads to select the earlier canvas. The revision must use an authoritative monotonically ordered token rather than assuming the last submitted event ID will become the query head.
Useful? React with 👍 / 👎.
| .subscribeLive( | ||
| { | ||
| "#h": [channelId], | ||
| kinds: [40100], | ||
| limit: 0, |
There was a problem hiding this comment.
Backfill the desktop live canvas subscription
If the initial useCanvasQuery request completes before this WebSocket subscription becomes active, a canvas update published in that interval is absent from the history result, and limit: 0 prevents the subscription from replaying it. The desktop then displays stale board contents until another update or reconnect; start the live subscription with bounded backfill or establish readiness before refreshing history.
AGENTS.md reference: AGENTS.md:L183-L186
Useful? React with 👍 / 👎.
| useEffect(() { | ||
| if (sessionStatus != SessionStatus.connected || !boardAvailable) { | ||
| return null; |
There was a problem hiding this comment.
Subscribe before a mobile canvas exists
For an ordinary non-Dispatch channel with no canvas yet, boardAvailable is false, so this effect installs no subscription. If another steward creates the canvas while the page remains open, nothing invalidates channelCanvasProvider, the Board selector never appears, and the user must leave and reopen the channel; subscribe for every eligible non-DM channel so creation and recreation events are observable.
AGENTS.md reference: AGENTS.md:L176-L186
Useful? React with 👍 / 👎.
| (await relayClient.sendMessage( | ||
| channel.id, | ||
| buildCanvasBoardCardConversationOpener(card, channel.name), | ||
| [], | ||
| [["client", marker]], |
There was a problem hiding this comment.
Durably recover the thread-to-card linkage
If this top-level message publish succeeds but the subsequent canvas update fails because of a revision conflict or network error, the conversation remains permanently visible in the stream while the card remains unlinked. The catch only displays an error, and the deterministic marker is consulted only if a user manually retries, so this two-write user action needs a durable linkage retry record rather than relying on another click.
AGENTS.md reference: AGENTS.md:L204-L209
Useful? React with 👍 / 👎.
Summary
Product behavior
Cards and Kanban
buzz-board-cardHTML comment.Card work rooms
Start threadcreates an ordinary top-level Buzz conversation and links its event ID into the card metadata.Open threadroutes directly into the linked native thread on desktop and mobile.Collaboration and navigation
Mobile parity
Compatibility
Validation
bin/just cipassed across formatting, linting, Rust, desktop, web, mobile analysis, builds, and full test suitesgit diff --checkclean; no new RustunwraporexpectVerified head:
a89ea281b4679871d95435419cb8c11a326f699c