Audit finding from #300 (commit 679f9fe)
Severity: medium
Category: ux / observability
File: crates/web/src/components/sync_queue_view.rs:82
Obvious fix: yes
Description
The mark-as-read action loops through every inbound peer issuing let _ = h.mark_queue_read(peer).await;. Failures are silently dropped; there is no busy state on the button so users can spam it, and no toast / inline message confirms or surfaces failure.
Impact / Threat
User-facing — clicking "mark as read" on a flaky link looks like a no-op; no feedback either way.
Suggested fix
Guard the click with a busy RwSignal, accumulate any Err and emit a toast via the existing toast bus; on success show the queue's own confirmation copy.
Verify
rg "mark_queue_read" crates/web/src/components/sync_queue_view.rs
Audit finding from #300 (commit 679f9fe)
Severity: medium
Category: ux / observability
File: crates/web/src/components/sync_queue_view.rs:82
Obvious fix: yes
Description
The mark-as-read action loops through every inbound peer issuing
let _ = h.mark_queue_read(peer).await;. Failures are silently dropped; there is no busy state on the button so users can spam it, and no toast / inline message confirms or surfaces failure.Impact / Threat
User-facing — clicking "mark as read" on a flaky link looks like a no-op; no feedback either way.
Suggested fix
Guard the click with a busy
RwSignal, accumulate anyErrand emit a toast via the existing toast bus; on success show the queue's own confirmation copy.Verify
rg "mark_queue_read" crates/web/src/components/sync_queue_view.rs