@@ -130,14 +130,33 @@ String wrapWithBacktickFence({required String content, String? infoString}) {
130
130
/// To omit the user ID part ("|13313") whenever the name part is unambiguous,
131
131
/// pass the full UserStore. This means accepting a linear scan
132
132
/// through all users; avoid it in performance-sensitive codepaths.
133
+ ///
134
+ /// See also [userMentionFromMessage] .
133
135
String userMention (User user, {bool silent = false , UserStore ? users}) {
134
136
bool includeUserId = users == null
135
137
|| users.allUsers.where ((u) => u.fullName == user.fullName)
136
138
.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 );
139
143
}
140
144
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
+
141
160
/// An @-mention of all the users in a conversation, like @**channel**.
142
161
String wildcardMention (WildcardMentionOption wildcardOption, {
143
162
required PerAccountStore store,
@@ -190,13 +209,11 @@ String quoteAndReplyPlaceholder(
190
209
PerAccountStore store, {
191
210
required Message message,
192
211
}) {
193
- final sender = store.getUser (message.senderId);
194
- assert (sender != null ); // TODO(#716): should use `store.senderDisplayName`
195
212
final url = narrowLink (store,
196
213
SendableNarrow .ofMessage (message, selfUserId: store.selfUserId),
197
214
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)
200
217
'*${zulipLocalizations .composeBoxLoadingMessage (message .id )}*\n ' ;
201
218
}
202
219
@@ -212,14 +229,14 @@ String quoteAndReply(PerAccountStore store, {
212
229
required Message message,
213
230
required String rawContent,
214
231
}) {
215
- final sender = store.getUser (message.senderId);
216
- assert (sender != null ); // TODO(#716): should use `store.senderDisplayName`
217
232
final url = narrowLink (store,
218
233
SendableNarrow .ofMessage (message, selfUserId: store.selfUserId),
219
234
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' )}' ;
225
242
}
0 commit comments