Skip to content

Update quoted replies (next/core)#390

Open
corinagum wants to merge 3 commits intonext/corefrom
cg/core-quoted-replies
Open

Update quoted replies (next/core)#390
corinagum wants to merge 3 commits intonext/corefrom
cg/core-quoted-replies

Conversation

@corinagum
Copy link
Contributor

@corinagum corinagum commented Mar 24, 2026

next/core port of #389 — quoted replies support adapted to core conventions.

Changes (matching #389)

  • Add QuotedReplyEntity with nested QuotedReplyData (MessageId required, SenderId/SenderName/Preview/Time/IsReplyDeleted/ValidatedMessageReference optional); register in EntityList.FromJsonArray() type switch and TeamsActivityJsonContext
  • Add GetQuotedMessages() extension on TeamsActivity to read inbound quoted reply entities
  • Add AddQuotedReply(messageId, response?) extension on TeamsActivity
  • Add WithQuotedReply(messageId, response?) on TeamsActivityBuilder
  • Add ReplyAsync() on Context to stamp QuotedReplyEntity + <quoted messageId="..."/> placeholder (auto-quotes inbound message)
  • Add QuoteReplyAsync() on Context to quote a specific message by ID
  • Remove WithReplyToId() from CoreActivityBuilder and its call in WithConversationReference()
  • Remove dead ReplyToId URL append in ConversationClient.SendActivityAsync()
  • Mark all quoted reply types and methods as [Experimental("ExperimentalTeamsQuotedReplies")]
  • Add entity, extension, and builder unit tests
  • Add QuotedReplies sample exercising all APIs

Deviations from #389 (next/core conventions)

  • Entity pattern: QuotedReplyEntity uses Properties dictionary backing store (not direct JSON properties) — matches MentionEntity, ClientInfoEntity
  • Extensions vs methods: GetQuotedMessages() and AddQuotedReply() are extension methods on TeamsActivity (not instance methods on MessageActivity) — matches GetMentions(), AddMention() pattern
  • Builder: WithQuotedReply() added to TeamsActivityBuilder (main has AddQuotedReply() on MessageActivity directly)
  • Context methods: ReplyAsync()/QuoteReplyAsync() (new methods, main modifies existing Reply())
  • WithReplyToId() removal: Broader scope in next/core — also removed dead URL construction in ConversationClient and the WithConversationReference() call
  • No ToQuoteReply() deprecation: Method never existed in next/core
  • No ;messageid= stripping removal: Pattern never existed in next/core
  • Rebase() calls: Required after entity mutation to sync EntityList back to base JsonArray
  • Source-gen registration: QuotedReplyEntity and QuotedReplyData registered in TeamsActivityJsonContext
  • Project-level NoWarn: ExperimentalTeamsQuotedReplies suppressed in Apps .csproj (required for source-generated JSON code)

Test plan

  • All 303 unit tests pass (Core: 115, Apps: 149, Compat: 39)
  • E2E tested in Teams

🤖 Generated with Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant