dm: focus the selected recipient instead of the top conversation

Clicking "Message" on a profile (or selecting anyone you'd never DMed) set the
recipient, but buildDmConversationData discarded it: a recipient with no
existing thread wasn't in conversationMap, so it fell back to conversations[0]
(the top conversation). The inbox silently jumped to the top thread, and any
message sent then went to the wrong person ("says sent but I don't see it").

Fixes:
- setDirectMessageRecipient now focuses the selected recipient's conversation
  so a stale activeDmConversationId can't win.
- buildDmConversationData synthesizes an empty conversation for a
  selected-but-threadless recipient and treats it as active, including an
  activeRemotePubkey fallback so the composer targets the right person.
- The legacy renderProfileMessages list no longer clobbers a non-null
  recipient with threadsToRender[0].

Regression: tests/ui/dm-conversation-focus.test.mjs.

Co-Authored-By: Claude Opus 4.8 <[email protected]>
This commit is contained in:
thePR0M3TH3ANandClaude Opus 4.8 committed 2026-06-23 20:37:30 -04:00
1 parent 4f7baa3e99
commit d29287a580
5 files changed
+193 -11

No files matched your search

@@ -242,6 +242,17 @@ export class ProfileDirectMessageController {
this.updateMessageThreadSelection(nextRecipient);
if (nextRecipient) {
// Focus this recipient's conversation so a freshly-selected recipient
// (e.g. the "Message" button for someone with no existing thread) isn't
// overridden by a stale activeDmConversationId pointing at the top of the
// inbox.
const actor = this.helper.resolveActiveDmActor();
const conversationId = actor
? this.helper.buildDmConversationId(actor, nextRecipient)
: "";
if (conversationId) {
this.setFocusedDmConversation(conversationId);
}
void this.helper.ensureDmRecipientData(nextRecipient);
this.renderer.setMessagesAnnouncement("Ready to message this recipient.");
} else if (reason === "clear") {