diff --git a/lib/shared/markdown.js b/lib/shared/markdown.js --- a/lib/shared/markdown.js +++ b/lib/shared/markdown.js @@ -2,8 +2,15 @@ import invariant from 'invariant'; -import { markdownMentionRegex } from './mention-utils.js'; -import type { RelativeMemberInfo } from '../types/thread-types.js'; +import { + markdownMentionRegex, + decodeChatMentionText, +} from './mention-utils.js'; +import type { + RelativeMemberInfo, + ResolvedThreadInfo, + ChatMentionCandidates, +} from '../types/thread-types.js'; // simple-markdown types export type State = { @@ -218,6 +225,24 @@ return match; } +function parseChatMention( + chatMentionCandidates: ChatMentionCandidates, + capture: Capture, +): { + threadInfo: ?ResolvedThreadInfo, + content: string, + hasAccessToChat: boolean, +} { + const threadInfo = chatMentionCandidates[capture[2]]; + const threadName = threadInfo?.uiName ?? decodeChatMentionText(capture[3]); + const content = `@${threadName}`; + return { + threadInfo, + content, + hasAccessToChat: !!threadInfo, + }; +} + const blockQuoteRegex: RegExp = /^( *>[^\n]+(?:\n[^\n]+)*)(?:\n|$)/; const blockQuoteStripFollowingNewlineRegex: RegExp = /^( *>[^\n]+(?:\n[^\n]+)*)(?:\n|$){2}/; @@ -317,4 +342,5 @@ matchMentions, stripSpoilersFromNotifications, stripSpoilersFromMarkdownAST, + parseChatMention, }; diff --git a/lib/shared/mention-utils.js b/lib/shared/mention-utils.js --- a/lib/shared/mention-utils.js +++ b/lib/shared/mention-utils.js @@ -2,7 +2,10 @@ import { oldValidUsernameRegexString } from './account-utils.js'; import SearchIndex from './search-index.js'; -import { threadOtherMembers } from './thread-utils.js'; +import { + threadOtherMembers, + validChatNameRegexString, +} from './thread-utils.js'; import { stringForUserExplicit } from './user-utils.js'; import { threadTypes } from '../types/thread-types-enum.js'; import { @@ -35,6 +38,13 @@ 'g', ); +const chatMentionRegexString = `^(? matches[2]); @@ -117,4 +127,6 @@ getNewTextAndSelection, getTypeaheadRegexMatches, getMentionsCandidates, + chatMentionRegex, + decodeChatMentionText, }; diff --git a/lib/shared/thread-utils.js b/lib/shared/thread-utils.js --- a/lib/shared/thread-utils.js +++ b/lib/shared/thread-utils.js @@ -110,8 +110,8 @@ const chatNameMaxLength = 191; const chatNameMinLength = 0; const secondCharRange = `{${chatNameMinLength},${chatNameMaxLength}}`; -const validChatNameRegexString = `^.${secondCharRange}$`; -const validChatNameRegex: RegExp = new RegExp(validChatNameRegexString); +const validChatNameRegexString = `.${secondCharRange}`; +const validChatNameRegex: RegExp = new RegExp(`^${validChatNameRegexString}$`); function threadHasPermission( threadInfo: ?(ThreadInfo | RawThreadInfo), @@ -1833,6 +1833,7 @@ getAvailableThreadMemberActions, threadMembersWithoutAddedAshoat, validChatNameRegex, + validChatNameRegexString, chatNameMaxLength, patchThreadInfoToIncludeMentionedMembersOfParent, threadInfoInsideCommunity,