fix(desktop): resolve typed @name mentions on send (parity with CLI/relay) - #3991
fix(desktop): resolve typed @name mentions on send (parity with CLI/relay)#3991HyperfocuSam wants to merge 1 commit into
Conversation
…elay) Signed-off-by: Sam Wong <hyperfocusam@gmail.com>
The mobile composer only collected mention pubkeys from the map populated when a suggestion is tapped (insertMention), so a mention typed by hand — never selected from the suggestion list — went out as plain text: no p tag, no notification, silently. Desktop already handles this case: extractMentionPubkeys in useMentions.ts scans the outgoing text against channel-member candidates at send time. Mirror that member scan at send time: _selectedMentionCandidates (in compose_bar/helpers.dart, keeping compose_bar.dart under the mobile file-size ratchet) collects picker-selected mentions, then matches remaining channel-member display names against the text with the existing hasMention matcher. Suggestion picks keep precedence for a name, and the scan is members-only, so it can never trigger the non-member invite prompt on its own. Adds a widget test that types a member mention without touching the suggestion list and asserts the pubkey reaches onSend. Duplicate search: no existing PR or issue covers send-time extraction of typed mentions on mobile. Desktop's equivalent gap was fixed in block#3991; adjacent autocomplete-discovery issues (block#4187, block#4128, block#3971, block#2508) do not cover this. No UI changes — the composer renders identically; only the outgoing event's tags change. Screenshots not applicable. Manual test: on a debug build, type '@<member name> hi' into a channel composer without tapping the suggestion popup and send; the recipient now gets a mention notification and the raw event carries their p tag. Local validation (Flutter 3.41.7, Windows): dart format clean, analyzer clean, mobile file-size ratchet clean, mobile suite green except one failure in channel_detail_page_test.dart (follow-mode) that fails identically on the untouched base commit and is unrelated. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Co-authored-by: technicallybrantley <bprice23@outlook.com> Signed-off-by: technicallybrantley <bprice23@outlook.com>
|
heads up — #4506 adds warn logging for ambiguous workflow @mentions on the same resolve path you're extracting into buzz-core. if your tip lands first, the warn should move with the shared helper. |
|
Thanks for the heads-up — agreed, they collide. I'd rather #4506 went first. Yours is a behaviour fix that stands on its own; this one is a structural move (323 lines out of If #4506 lands first I'll rebase on top and carry the warn into the shared helper, so the relay keeps identical behaviour and the desktop and CLI paths inherit it for free. If a maintainer prefers the other order, say the word and I'll post the helper signature so you can write against it directly. |
What
Hand-typed
@Namementions in the desktop composer (typed in full instead of selected from the autocomplete picker) send with noptag — the mention renders as plain text and the target is silently never notified. The relay's workflow sink and the CLI already resolve typed names ("uniquely resolved member names still notify"); the desktop send path was the one surface without this behavior.How
resolve_mention_pubkeysfrombuzz-relay/src/workflow_sink.rsinto sharedbuzz-core/src/mentions.rs(with its full test suite); relay now consumes the shared copy.send_channel_message(desktop) resolves typed@Nametokens against channel members via the existing member/profile hydration path and merges resolved pubkeys into the mention list — deduplicated against picker-resolvedmention_pubkeys— across all three build paths (stream message, forum post, forum comment).@skips resolution.Semantics preserved exactly: case-insensitive, longest-name-first, left-boundary anchor, ambiguous display names wake no one, first-appearance dedup, unicode-safe folding.
Testing
cargo test -p buzz-core: 254 passed (includes the moved resolver suite + new cases)cargo test -p buzz-desktop --lib: 2004 passed, 0 failed (includes new merge/dedupe send-path tests)cargo test -p buzz-relay --lib: 775 passed; the 10 failures inapi::admin/api::media/api::mesh_demoreproduce identically on untouchedmain(infra-tier tests, pre-existing)cargo clippy -p buzz-core --all-targets -- -D warningsclean;cargo fmt --checkcleanOut of scope by design: a composer preview pill for typed mentions (frontend UX) — this PR is backend parity only.