@@ -130,14 +130,33 @@ String wrapWithBacktickFence({required String content, String? infoString}) {
130130/// To omit the user ID part ("|13313") whenever the name part is unambiguous,
131131/// pass the full UserStore. This means accepting a linear scan
132132/// through all users; avoid it in performance-sensitive codepaths.
133+ ///
134+ /// See also [userMentionFromMessage] .
133135String userMention (User user, {bool silent = false , UserStore ? users}) {
134136 bool includeUserId = users == null
135137 || users.allUsers.where ((u) => u.fullName == user.fullName)
136138 .take (2 ).length == 2 ;
137-
138- return '@${silent ? '_' : '' }**${user .fullName }${includeUserId ? '|${user .userId }' : '' }**' ;
139+ return _userMentionImpl (
140+ silent: silent,
141+ fullName: user.fullName,
142+ userId: includeUserId ? user.userId : null );
139143}
140144
145+ /// An @-mention of an individual user, like @**Chris Bobbe|13313**,
146+ /// from sender data in a [Message] .
147+ ///
148+ /// The user ID part ("|13313") is always included.
149+ ///
150+ /// See also [userMention] .
151+ String userMentionFromMessage (Message message, {bool silent = false , required UserStore users}) =>
152+ _userMentionImpl (
153+ silent: silent,
154+ fullName: users.senderDisplayName (message),
155+ userId: message.senderId);
156+
157+ String _userMentionImpl ({required bool silent, required String fullName, int ? userId}) =>
158+ '@${silent ? '_' : '' }**$fullName ${userId != null ? '|$userId ' : '' }**' ;
159+
141160/// An @-mention of all the users in a conversation, like @**channel**.
142161String wildcardMention (WildcardMentionOption wildcardOption, {
143162 required PerAccountStore store,
@@ -190,13 +209,11 @@ String quoteAndReplyPlaceholder(
190209 PerAccountStore store, {
191210 required Message message,
192211}) {
193- final sender = store.getUser (message.senderId);
194- assert (sender != null ); // TODO(#716): should use `store.senderDisplayName`
195212 final url = narrowLink (store,
196213 SendableNarrow .ofMessage (message, selfUserId: store.selfUserId),
197214 nearMessageId: message.id);
198- // See note in [quoteAndReply] about asking `mention` to omit the |<id> part.
199- return '${ userMention ( sender !, silent : true )} ${inlineLink ('said' , url )}: ' // TODO(#1285)
215+ return '${ userMentionFromMessage ( message , silent : true , users : store )} '
216+ ' ${inlineLink ('said' , url )}: ' // TODO(#1285)
200217 '*${zulipLocalizations .composeBoxLoadingMessage (message .id )}*\n ' ;
201218}
202219
@@ -212,14 +229,14 @@ String quoteAndReply(PerAccountStore store, {
212229 required Message message,
213230 required String rawContent,
214231}) {
215- final sender = store.getUser (message.senderId);
216- assert (sender != null ); // TODO(#716): should use `store.senderDisplayName`
217232 final url = narrowLink (store,
218233 SendableNarrow .ofMessage (message, selfUserId: store.selfUserId),
219234 nearMessageId: message.id);
220- // Could ask `mention` to omit the |<id> part unless the mention is ambiguous…
221- // but that would mean a linear scan through all users, and the extra noise
222- // won't much matter with the already probably-long message link in there too.
223- return '${userMention (sender !, silent : true )} ${inlineLink ('said' , url )}:\n ' // TODO(#1285)
224- '${wrapWithBacktickFence (content : rawContent , infoString : 'quote' )}' ;
235+ // Could ask userMentionFromMessage to omit the |<id> part unless the mention
236+ // is ambiguous… but that would mean a linear scan through all users,
237+ // and the extra noise won't much matter with the already probably-long
238+ // message link in there too.
239+ return '${userMentionFromMessage (message , silent : true , users : store )} '
240+ '${inlineLink ('said' , url )}:\n ' // TODO(#1285)
241+ '${wrapWithBacktickFence (content : rawContent , infoString : 'quote' )}' ;
225242}
0 commit comments