diff --git a/lib/shared/dm-ops/add-members-spec.js b/lib/shared/dm-ops/add-members-spec.js --- a/lib/shared/dm-ops/add-members-spec.js +++ b/lib/shared/dm-ops/add-members-spec.js @@ -57,7 +57,7 @@ const { parentThreadID } = threadInfo; const parentThreadInfo = parentThreadID - ? utilities.threadInfos[parentThreadID] + ? utilities.rawThreadInfos[parentThreadID] : null; if (parentThreadID && !parentThreadInfo) { console.log( @@ -85,7 +85,7 @@ utilities: ProcessDMOperationUtilities, ) => { const { editorID, time, addedUserIDs, threadID } = dmOperation; - const { viewerID, threadInfos } = utilities; + const { viewerID, rawThreadInfos } = utilities; const messageDataWithMessageInfos = createAddNewMembersMessageDataWithInfoFromDMOperation(dmOperation); @@ -93,7 +93,7 @@ const { rawMessageInfo } = messageDataWithMessageInfos; const rawMessageInfos = [rawMessageInfo]; - const currentThreadInfo = threadInfos[threadID]; + const currentThreadInfo = rawThreadInfos[threadID]; const { membershipPermissions, roleID } = createPermissionsForNewMembers( currentThreadInfo, @@ -169,7 +169,7 @@ dmOperation: DMAddMembersOperation, utilities: ProcessDMOperationUtilities, ) => { - if (utilities.threadInfos[dmOperation.threadID]) { + if (utilities.rawThreadInfos[dmOperation.threadID]) { return { isProcessingPossible: true }; } return { diff --git a/lib/shared/dm-ops/add-viewer-to-thread-members-spec.js b/lib/shared/dm-ops/add-viewer-to-thread-members-spec.js --- a/lib/shared/dm-ops/add-viewer-to-thread-members-spec.js +++ b/lib/shared/dm-ops/add-viewer-to-thread-members-spec.js @@ -53,7 +53,7 @@ ) => { const { time, messageID, addedUserIDs, existingThreadDetails, editorID } = dmOperation; - const { threadInfos } = utilities; + const { rawThreadInfos } = utilities; let rawMessageInfos: Array = []; let messageDataWithMessageInfos: ?{ @@ -70,7 +70,7 @@ } const threadID = existingThreadDetails.threadID; - const currentThreadInfo = threadInfos[threadID]; + const currentThreadInfo = rawThreadInfos[threadID]; const memberTimestamps = { ...currentThreadInfo?.timestamps?.members, diff --git a/lib/shared/dm-ops/change-thread-read-status-spec.js b/lib/shared/dm-ops/change-thread-read-status-spec.js --- a/lib/shared/dm-ops/change-thread-read-status-spec.js +++ b/lib/shared/dm-ops/change-thread-read-status-spec.js @@ -27,7 +27,7 @@ notificationsCreationData = { rescindData: { threadID } }; } - const threadInfo = utilities.threadInfos[threadID]; + const threadInfo = utilities.rawThreadInfos[threadID]; if (threadInfo.timestamps.currentUser.unread > time) { return { rawMessageInfos: [], @@ -58,12 +58,12 @@ utilities: ProcessDMOperationUtilities, ) => { const { creatorID, threadID } = dmOperation; - const { threadInfos, viewerID } = utilities; + const { rawThreadInfos, viewerID } = utilities; if (viewerID !== creatorID) { return { isProcessingPossible: false, reason: { type: 'invalid' } }; } - if (!threadInfos[threadID]) { + if (!rawThreadInfos[threadID]) { return { isProcessingPossible: false, reason: { type: 'missing_thread', threadID }, diff --git a/lib/shared/dm-ops/change-thread-settings-spec.js b/lib/shared/dm-ops/change-thread-settings-spec.js --- a/lib/shared/dm-ops/change-thread-settings-spec.js +++ b/lib/shared/dm-ops/change-thread-settings-spec.js @@ -141,7 +141,7 @@ const { time } = dmOperation; const threadID = getThreadIDFromChangeThreadSettingsDMOp(dmOperation); - const threadInfo = utilities.threadInfos[threadID]; + const threadInfo = utilities.rawThreadInfos[threadID]; const updateInfos: Array = []; const { fieldNameToMessageData, threadInfoUpdate } = @@ -197,7 +197,7 @@ dmOperation: DMChangeThreadSettingsOperation, utilities: ProcessDMOperationUtilities, ) => { - if (!utilities.threadInfos[dmOperation.threadID]) { + if (!utilities.rawThreadInfos[dmOperation.threadID]) { return { isProcessingPossible: false, reason: { diff --git a/lib/shared/dm-ops/change-thread-subscription.js b/lib/shared/dm-ops/change-thread-subscription.js --- a/lib/shared/dm-ops/change-thread-subscription.js +++ b/lib/shared/dm-ops/change-thread-subscription.js @@ -21,9 +21,9 @@ utilities: ProcessDMOperationUtilities, ) => { const { creatorID, threadID, subscription, time } = dmOperation; - const { viewerID, threadInfos } = utilities; + const { viewerID, rawThreadInfos } = utilities; - const threadInfo = threadInfos[threadID]; + const threadInfo = rawThreadInfos[threadID]; if (threadInfo.timestamps.members[creatorID].subscription > time) { return { @@ -91,7 +91,7 @@ utilities: ProcessDMOperationUtilities, ) => { const { threadID, creatorID } = dmOperation; - if (!utilities.threadInfos[threadID]) { + if (!utilities.rawThreadInfos[threadID]) { return { isProcessingPossible: false, reason: { type: 'missing_thread', threadID }, @@ -99,7 +99,7 @@ } if ( - !utilities.threadInfos[threadID].members.find( + !utilities.rawThreadInfos[threadID].members.find( memberInfo => memberInfo.id === creatorID, ) ) { diff --git a/lib/shared/dm-ops/create-entry-spec.js b/lib/shared/dm-ops/create-entry-spec.js --- a/lib/shared/dm-ops/create-entry-spec.js +++ b/lib/shared/dm-ops/create-entry-spec.js @@ -72,7 +72,7 @@ const notificationsCreationData = { messageDatasWithMessageInfos: [messageDataWithMessageInfos], thickRawThreadInfos: { - [threadID]: utilities.threadInfos[threadID], + [threadID]: utilities.rawThreadInfos[threadID], }, }; @@ -99,7 +99,7 @@ }, }; } - if (utilities.threadInfos[dmOperation.threadID]) { + if (utilities.rawThreadInfos[dmOperation.threadID]) { return { isProcessingPossible: true }; } return { diff --git a/lib/shared/dm-ops/create-sidebar-spec.js b/lib/shared/dm-ops/create-sidebar-spec.js --- a/lib/shared/dm-ops/create-sidebar-spec.js +++ b/lib/shared/dm-ops/create-sidebar-spec.js @@ -13,22 +13,29 @@ } from '../../types/dm-ops.js'; import { messageTypes } from '../../types/message-types-enum.js'; import { - type RawMessageInfo, messageTruncationStatus, + type RawMessageInfo, + type ValidRawSidebarSourceMessageInfo, } from '../../types/message-types.js'; import { joinThreadSubscription } from '../../types/subscription-types.js'; import { threadTypes } from '../../types/thread-types-enum.js'; import { updateTypes } from '../../types/update-types-enum.js'; import { generatePendingThreadColor } from '../color-utils.js'; import { + createMessageInfo, isValidRawSidebarSourceMessageInfo, rawMessageInfoFromMessageData, } from '../message-utils.js'; +import { + createSidebarThreadName, + createSidebarTitle, +} from '../sidebar-utils.js'; import { createThreadTimestamps } from '../thread-utils.js'; -async function createMessageDatasWithInfosFromDMOperation( +function createMessageDatasWithInfosFromDMOperation( dmOperation: DMCreateSidebarOperation, utilities: ProcessDMOperationUtilities, + sourceMessage: ValidRawSidebarSourceMessageInfo, threadColor?: string, ) { const { @@ -37,26 +44,12 @@ time, parentThreadID, memberIDs, - sourceMessageID, newSidebarSourceMessageID, newCreateSidebarMessageID, } = dmOperation; const allMemberIDs = [creatorID, ...memberIDs]; const color = threadColor ?? generatePendingThreadColor(allMemberIDs); - const sourceMessage = await utilities.fetchMessage(sourceMessageID); - - if (!sourceMessage) { - throw new Error( - `could not find sourceMessage ${sourceMessageID}... probably ` + - 'joined thick thread ${parentThreadID} after its creation', - ); - } - if (!isValidRawSidebarSourceMessageInfo(sourceMessage)) { - throw new Error( - `sourceMessage ${sourceMessageID} is an invalid sidebar source`, - ); - } const sidebarSourceMessageData = { type: messageTypes.SIDEBAR_SOURCE, @@ -117,6 +110,40 @@ subscription: joinThreadSubscription, })); + const sourceMessage = await utilities.fetchMessage(sourceMessageID); + if (!sourceMessage) { + throw new Error( + `could not find sourceMessage ${sourceMessageID}... probably ` + + 'joined thick thread ${parentThreadID} after its creation', + ); + } + if (!isValidRawSidebarSourceMessageInfo(sourceMessage)) { + throw new Error( + `sourceMessage ${sourceMessageID} is an invalid sidebar source`, + ); + } + + const sourceMessageInfo = createMessageInfo( + sourceMessage, + viewerID, + utilities.userInfos, + utilities.threadInfos, + ); + const parentThreadInfo = utilities.threadInfos[parentThreadID]; + let messageTitle = null; + if (sourceMessageInfo && parentThreadInfo) { + messageTitle = await createSidebarTitle( + sourceMessageInfo, + parentThreadInfo, + utilities.markdownRules, + utilities.getENSNames, + utilities.getFCNames, + ); + } + const threadName = messageTitle + ? createSidebarThreadName(messageTitle) + : null; + const rawThreadInfo = createThickRawThreadInfo( { threadID, @@ -126,6 +153,7 @@ allMemberIDsWithSubscriptions, roleID, unread: creatorID !== viewerID, + name: threadName, sourceMessageID, containingThreadID: parentThreadID, timestamps: createThreadTimestamps(time, allMemberIDs), @@ -138,9 +166,10 @@ createSidebarMessageData, createSidebarMessageInfo, sidebarSourceMessageInfo, - } = await createMessageDatasWithInfosFromDMOperation( + } = createMessageDatasWithInfosFromDMOperation( dmOperation, utilities, + sourceMessage, rawThreadInfo.color, ); @@ -172,7 +201,7 @@ ], thickRawThreadInfos: { [threadID]: rawThreadInfo, - [parentThreadID]: utilities.threadInfos[parentThreadID], + [parentThreadID]: utilities.rawThreadInfos[parentThreadID], }, }; @@ -187,7 +216,7 @@ dmOperation: DMCreateSidebarOperation, utilities: ProcessDMOperationUtilities, ) => { - if (utilities.threadInfos[dmOperation.threadID]) { + if (utilities.rawThreadInfos[dmOperation.threadID]) { console.log( 'Discarded a CREATE_SIDEBAR operation because thread ' + `with the same ID ${dmOperation.threadID} already exists ` + diff --git a/lib/shared/dm-ops/create-thread-spec.js b/lib/shared/dm-ops/create-thread-spec.js --- a/lib/shared/dm-ops/create-thread-spec.js +++ b/lib/shared/dm-ops/create-thread-spec.js @@ -130,7 +130,7 @@ const threadColor = color ?? generatePendingThreadColor(memberIDs); const parentThreadInfo = parentThreadID - ? utilities.threadInfos[parentThreadID] + ? utilities.rawThreadInfos[parentThreadID] : null; if (parentThreadID && !parentThreadInfo) { console.log( @@ -290,7 +290,7 @@ dmOperation: DMCreateThreadOperation, utilities: ProcessDMOperationUtilities, ) => { - if (utilities.threadInfos[dmOperation.threadID]) { + if (utilities.rawThreadInfos[dmOperation.threadID]) { console.log( 'Discarded a CREATE_THREAD operation because thread ' + `with the same ID ${dmOperation.threadID} already exists ` + diff --git a/lib/shared/dm-ops/delete-entry-spec.js b/lib/shared/dm-ops/delete-entry-spec.js --- a/lib/shared/dm-ops/delete-entry-spec.js +++ b/lib/shared/dm-ops/delete-entry-spec.js @@ -65,7 +65,7 @@ const notificationsCreationData = { messageDatasWithMessageInfos: [messageDataWithMessageInfos], thickRawThreadInfos: { - [threadID]: utilities.threadInfos[threadID], + [threadID]: utilities.rawThreadInfos[threadID], }, }; diff --git a/lib/shared/dm-ops/dm-op-spec.js b/lib/shared/dm-ops/dm-op-spec.js --- a/lib/shared/dm-ops/dm-op-spec.js +++ b/lib/shared/dm-ops/dm-op-spec.js @@ -6,16 +6,26 @@ import type { RawEntryInfos } from '../../types/entry-types.js'; import type { UserIdentitiesResponse } from '../../types/identity-service-types.js'; import type { RawMessageInfo } from '../../types/message-types.js'; +import type { ThreadInfo } from '../../types/minimally-encoded-thread-permissions-types.js'; import type { ThickRawThreadInfos } from '../../types/thread-types.js'; +import type { UserInfos } from '../../types/user-types.js'; +import type { GetENSNames } from '../../utils/ens-helpers.js'; +import type { GetFCNames } from '../../utils/farcaster-helpers.js'; +import type { ParserRules } from '../markdown.js'; export type ProcessDMOperationUtilities = { +viewerID: string, +fetchMessage: (messageID: string) => Promise, - +threadInfos: ThickRawThreadInfos, + +rawThreadInfos: ThickRawThreadInfos, + +threadInfos: { +[id: string]: ThreadInfo }, +entryInfos: RawEntryInfos, +findUserIdentities: ( userIDs: $ReadOnlyArray, ) => Promise, + +userInfos: UserInfos, + +getENSNames: ?GetENSNames, + +getFCNames: ?GetFCNames, + +markdownRules: ParserRules, }; export type ProcessingPossibilityCheckResult = diff --git a/lib/shared/dm-ops/dm-op-utils.js b/lib/shared/dm-ops/dm-op-utils.js --- a/lib/shared/dm-ops/dm-op-utils.js +++ b/lib/shared/dm-ops/dm-op-utils.js @@ -18,11 +18,16 @@ removePeerUsersActionType, } from '../../actions/aux-user-actions.js'; import { useFindUserIdentities } from '../../actions/find-user-identities-actions.js'; +import { ENSCacheContext } from '../../components/ens-cache-provider.react.js'; +import { NeynarClientContext } from '../../components/neynar-client-provider.react.js'; import { useLoggedInUserInfo } from '../../hooks/account-hooks.js'; import { useGetLatestMessageEdit } from '../../hooks/latest-message-edit.js'; import { useGetAndUpdateDeviceListsForUsers } from '../../hooks/peer-list-hooks.js'; import { mergeUpdatesWithMessageInfos } from '../../reducers/message-reducer.js'; -import { thickRawThreadInfosSelector } from '../../selectors/thread-selectors.js'; +import { + thickRawThreadInfosSelector, + threadInfoSelector, +} from '../../selectors/thread-selectors.js'; import { getAllPeerUserIDAndDeviceIDs } from '../../selectors/user-selectors.js'; import { type P2PMessageRecipient } from '../../tunnelbroker/peer-to-peer-context.js'; import type { @@ -47,6 +52,7 @@ AccountDeletionUpdateInfo, ClientUpdateInfo, } from '../../types/update-types.js'; +import { getConfig } from '../../utils/config.js'; import { getContentSigningKey } from '../../utils/crypto-utils.js'; import { useSelector, useDispatch } from '../../utils/redux-utils.js'; import { @@ -200,7 +206,7 @@ operation: DMOperation, recipients: OutboundDMOperationSpecificationRecipients, ): Promise<$ReadOnlyArray> => { - const { viewerID, threadInfos } = utilities; + const { viewerID, rawThreadInfos } = utilities; if (!viewerID) { return []; } @@ -220,14 +226,14 @@ ); } else if (recipients.type === 'all_thread_members') { const { threadID } = recipients; - if (!threadInfos[threadID]) { + if (!rawThreadInfos[threadID]) { console.log( `all_thread_members called for threadID ${threadID}, which is ` + 'missing from the ThreadStore. if sending a message soon after ' + 'thread creation, consider some_users instead', ); } - const members = threadInfos[recipients.threadID]?.members ?? []; + const members = rawThreadInfos[recipients.threadID]?.members ?? []; const memberIDs = members.map(member => member.id); const missingPeers = await getMissingPeers(memberIDs); @@ -431,20 +437,50 @@ viewerID: ?string, }> { const fetchMessage = useGetLatestMessageEdit(); - const threadInfos = useSelector(thickRawThreadInfosSelector); + const rawThreadInfos = useSelector(thickRawThreadInfosSelector); + const threadInfos = useSelector(threadInfoSelector); const entryInfos = useSelector(state => state.entryStore.entryInfos); + const userInfos = useSelector(state => state.userStore.userInfos); const findUserIdentities = useFindUserIdentities(); const loggedInUserInfo = useLoggedInUserInfo(); const viewerID = loggedInUserInfo?.id; + + const ensCache = React.useContext(ENSCacheContext); + const getENSNames = ensCache?.getENSNames; + + const neynarClientContext = React.useContext(NeynarClientContext); + const getFCNames = neynarClientContext?.getFCNames; + + const markdownRules = React.useMemo( + () => getConfig().getDefaultTextMessageRules({}).simpleMarkdownRules, + [], + ); + return React.useMemo( () => ({ viewerID, fetchMessage, + rawThreadInfos, threadInfos, entryInfos, + userInfos, findUserIdentities, + getENSNames, + getFCNames, + markdownRules, }), - [viewerID, fetchMessage, threadInfos, entryInfos, findUserIdentities], + [ + viewerID, + fetchMessage, + rawThreadInfos, + threadInfos, + entryInfos, + userInfos, + findUserIdentities, + getENSNames, + getFCNames, + markdownRules, + ], ); } diff --git a/lib/shared/dm-ops/edit-entry-spec.js b/lib/shared/dm-ops/edit-entry-spec.js --- a/lib/shared/dm-ops/edit-entry-spec.js +++ b/lib/shared/dm-ops/edit-entry-spec.js @@ -66,7 +66,7 @@ const notificationsCreationData = { messageDatasWithMessageInfos: [messageDataWithMessageInfos], thickRawThreadInfos: { - [threadID]: utilities.threadInfos[threadID], + [threadID]: utilities.rawThreadInfos[threadID], }, }; diff --git a/lib/shared/dm-ops/join-thread-spec.js b/lib/shared/dm-ops/join-thread-spec.js --- a/lib/shared/dm-ops/join-thread-spec.js +++ b/lib/shared/dm-ops/join-thread-spec.js @@ -49,8 +49,8 @@ utilities: ProcessDMOperationUtilities, ) => { const { joinerID, time, existingThreadDetails } = dmOperation; - const { viewerID, threadInfos } = utilities; - const currentThreadInfo = threadInfos[existingThreadDetails.threadID]; + const { viewerID, rawThreadInfos } = utilities; + const currentThreadInfo = rawThreadInfos[existingThreadDetails.threadID]; const messageDataWithMessageInfos = createMessageDataWithInfoFromDMOperation(dmOperation); @@ -137,7 +137,7 @@ const parentThreadID = existingThreadDetails.parentThreadID; const parentThreadInfo = parentThreadID - ? utilities.threadInfos[parentThreadID] + ? utilities.rawThreadInfos[parentThreadID] : null; if (parentThreadID && !parentThreadInfo) { console.log( @@ -194,9 +194,9 @@ dmOperation: DMJoinThreadOperation, utilities: ProcessDMOperationUtilities, ) => { - const { viewerID, threadInfos } = utilities; + const { viewerID, rawThreadInfos } = utilities; if ( - threadInfos[dmOperation.existingThreadDetails.threadID] || + rawThreadInfos[dmOperation.existingThreadDetails.threadID] || dmOperation.joinerID === viewerID ) { return { isProcessingPossible: true }; diff --git a/lib/shared/dm-ops/leave-thread-spec.js b/lib/shared/dm-ops/leave-thread-spec.js --- a/lib/shared/dm-ops/leave-thread-spec.js +++ b/lib/shared/dm-ops/leave-thread-spec.js @@ -113,8 +113,8 @@ utilities: ProcessDMOperationUtilities, ) => { const { editorID, time, threadID } = dmOperation; - const { viewerID, threadInfos } = utilities; - const threadInfo = threadInfos[threadID]; + const { viewerID, rawThreadInfos } = utilities; + const threadInfo = rawThreadInfos[threadID]; const messageDataWithMessageInfos = createMessageDataWithInfoFromDMOperation(dmOperation); @@ -163,7 +163,7 @@ ...createDeleteSubthreadsUpdates( dmOperation, threadInfo, - threadInfos, + rawThreadInfos, ), ], blobOps: [], @@ -173,7 +173,7 @@ const parentThreadID = threadInfo.parentThreadID; const parentThreadInfo = parentThreadID - ? utilities.threadInfos[parentThreadID] + ? utilities.rawThreadInfos[parentThreadID] : null; if (parentThreadID && !parentThreadInfo) { console.log( @@ -223,7 +223,7 @@ const updateInfos = createLeaveSubthreadsUpdates( dmOperation, threadInfo, - threadInfos, + rawThreadInfos, ); // It is possible that the editor has joined this thread after leaving it, @@ -264,7 +264,7 @@ dmOperation: DMLeaveThreadOperation, utilities: ProcessDMOperationUtilities, ) => { - if (utilities.threadInfos[dmOperation.threadID]) { + if (utilities.rawThreadInfos[dmOperation.threadID]) { return { isProcessingPossible: true }; } return { diff --git a/lib/shared/dm-ops/send-edit-message-spec.js b/lib/shared/dm-ops/send-edit-message-spec.js --- a/lib/shared/dm-ops/send-edit-message-spec.js +++ b/lib/shared/dm-ops/send-edit-message-spec.js @@ -42,7 +42,8 @@ const notificationsCreationData = { messageDatasWithMessageInfos: [messageDataWithMessageInfos], thickRawThreadInfos: { - [dmOperation.threadID]: utilities.threadInfos[dmOperation.threadID], + [dmOperation.threadID]: + utilities.rawThreadInfos[dmOperation.threadID], }, }; diff --git a/lib/shared/dm-ops/send-multimedia-message-spec.js b/lib/shared/dm-ops/send-multimedia-message-spec.js --- a/lib/shared/dm-ops/send-multimedia-message-spec.js +++ b/lib/shared/dm-ops/send-multimedia-message-spec.js @@ -77,7 +77,8 @@ const notificationsCreationData = { messageDatasWithMessageInfos: [messageDataWithMessageInfos], thickRawThreadInfos: { - [dmOperation.threadID]: utilities.threadInfos[dmOperation.threadID], + [dmOperation.threadID]: + utilities.rawThreadInfos[dmOperation.threadID], }, }; @@ -92,7 +93,7 @@ dmOperation: DMSendMultimediaMessageOperation, utilities: ProcessDMOperationUtilities, ) => { - if (!utilities.threadInfos[dmOperation.threadID]) { + if (!utilities.rawThreadInfos[dmOperation.threadID]) { return { isProcessingPossible: false, reason: { diff --git a/lib/shared/dm-ops/send-reaction-message-spec.js b/lib/shared/dm-ops/send-reaction-message-spec.js --- a/lib/shared/dm-ops/send-reaction-message-spec.js +++ b/lib/shared/dm-ops/send-reaction-message-spec.js @@ -50,7 +50,8 @@ const notificationsCreationData = { messageDatasWithMessageInfos: [messageDataWithMessageInfos], thickRawThreadInfos: { - [dmOperation.threadID]: utilities.threadInfos[dmOperation.threadID], + [dmOperation.threadID]: + utilities.rawThreadInfos[dmOperation.threadID], }, }; diff --git a/lib/shared/dm-ops/send-text-message-spec.js b/lib/shared/dm-ops/send-text-message-spec.js --- a/lib/shared/dm-ops/send-text-message-spec.js +++ b/lib/shared/dm-ops/send-text-message-spec.js @@ -42,7 +42,8 @@ const notificationsCreationData = { messageDatasWithMessageInfos: [messageDataWithMessageInfos], thickRawThreadInfos: { - [dmOperation.threadID]: utilities.threadInfos[dmOperation.threadID], + [dmOperation.threadID]: + utilities.rawThreadInfos[dmOperation.threadID], }, }; @@ -57,7 +58,7 @@ dmOperation: DMSendTextMessageOperation, utilities: ProcessDMOperationUtilities, ) => { - if (!utilities.threadInfos[dmOperation.threadID]) { + if (!utilities.rawThreadInfos[dmOperation.threadID]) { return { isProcessingPossible: false, reason: { diff --git a/lib/shared/dm-ops/update-relationship-spec.js b/lib/shared/dm-ops/update-relationship-spec.js --- a/lib/shared/dm-ops/update-relationship-spec.js +++ b/lib/shared/dm-ops/update-relationship-spec.js @@ -74,7 +74,8 @@ const notificationsCreationData = { messageDatasWithMessageInfos: [messageDataWithMessageInfos], thickRawThreadInfos: { - [dmOperation.threadID]: utilities.threadInfos[dmOperation.threadID], + [dmOperation.threadID]: + utilities.rawThreadInfos[dmOperation.threadID], }, }; diff --git a/lib/shared/message-utils.js b/lib/shared/message-utils.js --- a/lib/shared/message-utils.js +++ b/lib/shared/message-utils.js @@ -30,7 +30,6 @@ import type { Media } from '../types/media-types.js'; import { messageTypes } from '../types/message-types-enum.js'; import { - type ComposableMessageInfo, type FetchMessageInfosPayload, type MessageData, type MessageInfo, @@ -43,12 +42,8 @@ type ValidRawSidebarSourceMessageInfo, type ValidSidebarSourceMessageInfo, } from '../types/message-types.js'; -import type { CompoundReactionMessageInfo } from '../types/messages/compound-reaction.js'; -import type { DeleteMessageInfo } from '../types/messages/delete.js'; -import type { EditMessageInfo } from '../types/messages/edit.js'; import type { ImagesMessageData } from '../types/messages/images.js'; import type { MediaMessageData } from '../types/messages/media.js'; -import type { ReactionMessageInfo } from '../types/messages/reaction.js'; import type { RawThreadInfo, ThreadInfo, @@ -254,13 +249,7 @@ } function getMessageTitle( - messageInfo: - | ComposableMessageInfo - | RobotextMessageInfo - | ReactionMessageInfo - | EditMessageInfo - | DeleteMessageInfo - | CompoundReactionMessageInfo, + messageInfo: MessageInfo, threadInfo: ThreadInfo, parentThreadInfo: ?ThreadInfo, markdownRules: ParserRules, @@ -277,7 +266,8 @@ messageInfo.type !== messageTypes.REACTION && messageInfo.type !== messageTypes.EDIT_MESSAGE && messageInfo.type !== messageTypes.DELETE_MESSAGE && - messageInfo.type !== messageTypes.COMPOUND_REACTION, + messageInfo.type !== messageTypes.COMPOUND_REACTION && + messageInfo.type !== messageTypes.SIDEBAR_SOURCE, 'messageTitle can only be auto-generated for RobotextMessageInfo', ); return robotextForMessageInfo(messageInfo, threadInfo, parentThreadInfo); diff --git a/lib/shared/sidebar-utils.js b/lib/shared/sidebar-utils.js --- a/lib/shared/sidebar-utils.js +++ b/lib/shared/sidebar-utils.js @@ -7,18 +7,19 @@ import { relationshipBlockedInEitherDirection } from './relationship-utils.js'; import { createPendingThread, - getSingleOtherUser, extractMentionedMembers, - useThreadHasPermission, + getSingleOtherUser, userIsMember, + useThreadHasPermission, } from './thread-utils.js'; import { threadSpecs, threadTypeIsPersonal } from './threads/thread-specs.js'; import type { ChatMessageInfoItem } from '../selectors/chat-selectors.js'; import { chatMessageItemEngagementTargetMessageInfo } from '../shared/chat-message-item-utils.js'; import { messageTypes } from '../types/message-types-enum.js'; import type { - RobotextMessageInfo, ComposableMessageInfo, + MessageInfo, + RobotextMessageInfo, } from '../types/message-types.js'; import type { ThreadInfo } from '../types/minimally-encoded-thread-permissions-types.js'; import { threadPermissions } from '../types/thread-permission-types.js'; @@ -159,6 +160,26 @@ +getFCNames: ?GetFCNames, }; +async function createSidebarTitle( + sourceMessageInfo: MessageInfo, + parentThreadInfo: ThreadInfo, + markdownRules: ParserRules, + getENSNames: ?GetENSNames, + getFCNames: ?GetFCNames, +): Promise { + const messageTitleEntityText = getMessageTitle( + sourceMessageInfo, + parentThreadInfo, + parentThreadInfo, + markdownRules, + ); + return await getEntityTextAsString( + messageTitleEntityText, + { getENSNames, getFCNames }, + { ignoreViewer: true }, + ); +} + async function createPendingSidebar( input: CreatePendingSidebarInput, ): Promise { @@ -171,16 +192,12 @@ getFCNames, } = input; - const messageTitleEntityText = getMessageTitle( + const messageTitle = await createSidebarTitle( sourceMessageInfo, parentThreadInfo, - parentThreadInfo, markdownRules, - ); - const messageTitle = await getEntityTextAsString( - messageTitleEntityText, - { getENSNames, getFCNames }, - { ignoreViewer: true }, + getENSNames, + getFCNames, ); invariant( messageTitle !== null && messageTitle !== undefined, @@ -250,4 +267,5 @@ useCanCreateSidebarFromMessage, useSidebarExistsOrCanBeCreated, createSidebarThreadName, + createSidebarTitle, }; diff --git a/lib/utils/__mocks__/config.js b/lib/utils/__mocks__/config.js --- a/lib/utils/__mocks__/config.js +++ b/lib/utils/__mocks__/config.js @@ -70,6 +70,9 @@ }, showAlert: jest.fn(), isStaffRelease: false, + getDefaultTextMessageRules: jest.fn(() => ({ + simpleMarkdownRules: {}, + })), }); const hasConfig = (): boolean => true; diff --git a/lib/utils/config.js b/lib/utils/config.js --- a/lib/utils/config.js +++ b/lib/utils/config.js @@ -6,11 +6,13 @@ import type { CallSingleKeyserverEndpoint } from '../keyserver-conn/call-single-keyserver-endpoint.js'; import type { CallKeyserverEndpoint } from '../keyserver-conn/keyserver-conn-types.js'; import type { InitialNotifMessageOptions } from '../shared/crypto-utils.js'; +import type { ParserRules } from '../shared/markdown.js'; import type { RecoveryActionSource } from '../types/account-types.js'; import type { OlmAPI } from '../types/crypto-types.js'; import type { PlatformDetails } from '../types/device-types.js'; import type { EncryptedNotifUtilsAPI } from '../types/notif-types.js'; import type { SQLiteAPI } from '../types/sqlite-types.js'; +import type { ChatMentionCandidates } from '../types/thread-types.js'; export type Config = { +resolveKeyserverSessionInvalidationUsingNativeCredentials: ?( @@ -44,6 +46,9 @@ }, ) => mixed, +isStaffRelease: boolean, + +getDefaultTextMessageRules: ( + chatMentionCandidates?: ChatMentionCandidates, + ) => { +simpleMarkdownRules: ParserRules, ... }, }; let registeredConfig: ?Config = null; diff --git a/native/config.js b/native/config.js --- a/native/config.js +++ b/native/config.js @@ -9,6 +9,7 @@ import { authoritativeKeyserverID } from './authoritative-keyserver.js'; import { olmAPI } from './crypto/olm-api.js'; import { sqliteAPI } from './database/sqlite-api.js'; +import { getDefaultTextMessageRules } from './markdown/rules.react.js'; import encryptedNotifUtilsAPI from './push/encrypted-notif-utils-api.js'; import { persistConfig, codeVersion } from './redux/persist.js'; import Alert from './utils/alert.js'; @@ -56,4 +57,5 @@ Alert.alert(title, message, alertButtons, alertOptions); }, isStaffRelease: __DEV__ || isStaffRelease, + getDefaultTextMessageRules, }); diff --git a/web/app.react.js b/web/app.react.js --- a/web/app.react.js +++ b/web/app.react.js @@ -80,6 +80,7 @@ import InviteLinkHandler from './invite-links/invite-link-handler.react.js'; import InviteLinksRefresher from './invite-links/invite-links-refresher.react.js'; import LoadingIndicator from './loading-indicator.react.js'; +import { getDefaultTextMessageRules } from './markdown/rules.react.js'; import { MenuProvider } from './menu-provider.react.js'; import UpdateModalHandler from './modals/update-modal.react.js'; import SettingsSwitcher from './navigation-panels/settings-switcher.react.js'; @@ -144,6 +145,7 @@ showAlert: (title: string, message: string) => window.alert(`${title}: ${message}`), isStaffRelease: isDev, + getDefaultTextMessageRules, }); const versionBroadcast = new BroadcastChannel('comm_version');