diff --git a/lib/shared/messages/text-message-spec.js b/lib/shared/messages/text-message-spec.js --- a/lib/shared/messages/text-message-spec.js +++ b/lib/shared/messages/text-message-spec.js @@ -10,7 +10,6 @@ type RawMessageInfoFromServerDBRowParams, } from './message-spec.js'; import { assertSingleMessageInfo, joinResult } from './utils.js'; -import { changeThreadSettingsActionTypes } from '../../actions/thread-actions.js'; import { useChangeThreadSettings } from '../../hooks/thread-hooks.js'; import { messageTypes } from '../../types/message-types-enum.js'; import type { @@ -26,7 +25,6 @@ } from '../../types/messages/text.js'; import type { ThreadInfo } from '../../types/minimally-encoded-thread-permissions-types.js'; import type { NotifTexts } from '../../types/notif-types.js'; -import { threadTypeIsThick } from '../../types/thread-types-enum.js'; import type { RelativeUserInfo } from '../../types/user-types.js'; import { ET } from '../../utils/entity-text.js'; import { useDispatchActionPromise } from '../../utils/redux-promise-utils.js'; @@ -46,7 +44,7 @@ extractNewMentionedParentMembers, threadIsGroupChat, } from '../thread-utils.js'; -import { threadTypeIsSidebar } from '../threads/thread-specs.js'; +import { threadSpecs, threadTypeIsSidebar } from '../threads/thread-specs.js'; /** * most of the markdown leaves contain `content` field @@ -317,26 +315,15 @@ } const newMemberIDs = mentionedNewMembers.map(({ id }) => id); - if (threadTypeIsThick(threadInfo.type)) { - await callAddDMThreadMembers(newMemberIDs, threadInfo); - return; - } - - const changeThreadSettingsInput = { - threadInfo, - threadID: threadInfo.id, - changes: { newMemberIDs }, - }; - - const addMembersPromise = callChangeThreadSettings( - changeThreadSettingsInput, - ); - void dispatchActionPromise( - changeThreadSettingsActionTypes, - addMembersPromise, + await threadSpecs[threadInfo.type].protocol.addThreadMembers( + { newMemberIDs, threadInfo }, + { + dmAddThreadMembers: callAddDMThreadMembers, + changeThreadSettings: callChangeThreadSettings, + dispatchActionPromise, + }, ); - await addMembersPromise; }; }, diff --git a/lib/shared/threads/protocols/dm-thread-protocol.js b/lib/shared/threads/protocols/dm-thread-protocol.js --- a/lib/shared/threads/protocols/dm-thread-protocol.js +++ b/lib/shared/threads/protocols/dm-thread-protocol.js @@ -43,6 +43,8 @@ SetThreadUnreadStatusUtils, ProtocolSendReactionInput, SendReactionUtils, + AddThreadMembersUtils, + ProtocolAddThreadMembersInput, } from '../thread-spec.js'; const dmThreadProtocol: ThreadProtocol = Object.freeze({ @@ -471,6 +473,11 @@ await utils.processAndSendDMOperation(opSpecification); }, + addThreadMembers: ( + input: ProtocolAddThreadMembersInput, + utils: AddThreadMembersUtils, + ) => utils.dmAddThreadMembers(input.newMemberIDs, input.threadInfo), + allowsDeletingSidebarSource: false, presentationDetails: { diff --git a/lib/shared/threads/protocols/keyserver-thread-protocol.js b/lib/shared/threads/protocols/keyserver-thread-protocol.js --- a/lib/shared/threads/protocols/keyserver-thread-protocol.js +++ b/lib/shared/threads/protocols/keyserver-thread-protocol.js @@ -8,6 +8,7 @@ sendEditMessageActionTypes, sendReactionMessageActionTypes, } from '../../../actions/message-actions.js'; +import { changeThreadSettingsActionTypes } from '../../../actions/thread-actions.js'; import { type MediaMetadataReassignmentAction, updateMultimediaMessageMediaActionType, @@ -62,6 +63,8 @@ SetThreadUnreadStatusUtils, ProtocolSendReactionInput, SendReactionUtils, + AddThreadMembersUtils, + ProtocolAddThreadMembersInput, } from '../thread-spec.js'; const keyserverThreadProtocol: ThreadProtocol = Object.freeze({ @@ -288,6 +291,29 @@ await reactionMessagePromise; }, + addThreadMembers: async ( + input: ProtocolAddThreadMembersInput, + utils: AddThreadMembersUtils, + ) => { + const { threadInfo, newMemberIDs } = input; + + const changeThreadSettingsInput = { + threadInfo, + threadID: threadInfo.id, + changes: { newMemberIDs }, + }; + + const addMembersPromise = utils.changeThreadSettings( + changeThreadSettingsInput, + ); + + void utils.dispatchActionPromise( + changeThreadSettingsActionTypes, + addMembersPromise, + ); + await addMembersPromise; + }, + allowsDeletingSidebarSource: true, presentationDetails: { diff --git a/lib/shared/threads/thread-spec.js b/lib/shared/threads/thread-spec.js --- a/lib/shared/threads/thread-spec.js +++ b/lib/shared/threads/thread-spec.js @@ -163,6 +163,19 @@ +dispatchActionPromise: DispatchActionPromise, }; +export type ProtocolAddThreadMembersInput = { + +threadInfo: ThreadInfo, + +newMemberIDs: $ReadOnlyArray, +}; +export type AddThreadMembersUtils = { + +dmAddThreadMembers: ( + newMemberIDs: $ReadOnlyArray, + threadInfo: ThreadInfo, + ) => Promise, + +changeThreadSettings: UseChangeThreadSettingsInput => Promise, + +dispatchActionPromise: DispatchActionPromise, +}; + export type ThreadProtocol = { +sendTextMessage: ( message: ProtocolSendTextMessageInput, @@ -205,6 +218,10 @@ input: ProtocolSendReactionInput, utils: SendReactionUtils, ) => Promise, + +addThreadMembers: ( + input: ProtocolAddThreadMembersInput, + utils: AddThreadMembersUtils, + ) => Promise, +allowsDeletingSidebarSource: boolean, +presentationDetails: { +membershipChangesShownInThreadPreview: boolean, diff --git a/native/chat/settings/add-users-modal.react.js b/native/chat/settings/add-users-modal.react.js --- a/native/chat/settings/add-users-modal.react.js +++ b/native/chat/settings/add-users-modal.react.js @@ -12,8 +12,8 @@ import { useAddDMThreadMembers } from 'lib/shared/dm-ops/dm-op-utils.js'; import { usePotentialMemberItems } from 'lib/shared/search-utils.js'; import { threadActualMembers } from 'lib/shared/thread-utils.js'; +import { threadSpecs } from 'lib/shared/threads/thread-specs.js'; import type { ThreadInfo } from 'lib/types/minimally-encoded-thread-permissions-types.js'; -import { threadTypeIsThick } from 'lib/types/thread-types-enum.js'; import { type AccountUserInfo } from 'lib/types/user-types.js'; import { useDispatchActionPromise } from 'lib/utils/redux-promise-utils.js'; @@ -73,57 +73,44 @@ const userInfoInputIDs = userInfoInputArray.map(userInfo => userInfo.id); const { route } = props; const { threadInfo } = route.params; - const addUsersToThread = React.useCallback(async () => { - try { - const result = await callChangeThreadSettings({ - threadID: threadInfo.id, - changes: { newMemberIDs: userInfoInputIDs }, - threadInfo, - }); - close(); - return result; - } catch (e) { - Alert.alert( - unknownErrorAlertDetails.title, - unknownErrorAlertDetails.message, - [{ text: 'OK', onPress: onUnknownErrorAlertAcknowledged }], - { cancelable: false }, - ); - throw e; - } - }, [ - callChangeThreadSettings, - threadInfo, - userInfoInputIDs, - close, - onUnknownErrorAlertAcknowledged, - ]); const inputLength = userInfoInputArray.length; const dispatchActionPromise = useDispatchActionPromise(); const userInfoInputArrayEmpty = inputLength === 0; const addDMThreadMembers = useAddDMThreadMembers(); - const onPressAdd = React.useCallback(() => { + const onPressAdd = React.useCallback(async () => { if (userInfoInputArrayEmpty) { return; } - if (threadTypeIsThick(threadInfo.type)) { - void addDMThreadMembers(userInfoInputIDs, threadInfo); - } else { - void dispatchActionPromise( - changeThreadSettingsActionTypes, - addUsersToThread(), + try { + await threadSpecs[threadInfo.type].protocol.addThreadMembers( + { newMemberIDs: userInfoInputIDs, threadInfo }, + { + dmAddThreadMembers: addDMThreadMembers, + changeThreadSettings: callChangeThreadSettings, + dispatchActionPromise, + }, + ); + close(); + } catch (e) { + Alert.alert( + unknownErrorAlertDetails.title, + unknownErrorAlertDetails.message, + [{ text: 'OK', onPress: onUnknownErrorAlertAcknowledged }], + { cancelable: false }, ); } }, [ userInfoInputArrayEmpty, threadInfo, dispatchActionPromise, - addUsersToThread, addDMThreadMembers, userInfoInputIDs, + callChangeThreadSettings, + close, + onUnknownErrorAlertAcknowledged, ]); const changeThreadSettingsLoadingStatus = useSelector( diff --git a/web/modals/threads/members/add-members-modal.react.js b/web/modals/threads/members/add-members-modal.react.js --- a/web/modals/threads/members/add-members-modal.react.js +++ b/web/modals/threads/members/add-members-modal.react.js @@ -2,11 +2,10 @@ import * as React from 'react'; -import { changeThreadSettingsActionTypes } from 'lib/actions/thread-actions.js'; import { useChangeThreadSettings } from 'lib/hooks/thread-hooks.js'; import { threadInfoSelector } from 'lib/selectors/thread-selectors.js'; import { useAddDMThreadMembers } from 'lib/shared/dm-ops/dm-op-utils.js'; -import { threadTypeIsThick } from 'lib/types/thread-types-enum.js'; +import { threadSpecs } from 'lib/shared/threads/thread-specs.js'; import { useDispatchActionPromise } from 'lib/utils/redux-promise-utils.js'; import { useSelector } from 'lib/utils/redux-utils.js'; @@ -67,18 +66,14 @@ const addUsers = React.useCallback(() => { const newMemberIDs = Array.from(pendingUsersToAdd.keys()); - if (threadTypeIsThick(threadInfo.type)) { - void addDMThreadMembers(newMemberIDs, threadInfo); - } else { - void dispatchActionPromise( - changeThreadSettingsActionTypes, - callChangeThreadSettings({ - threadID, - threadInfo, - changes: { newMemberIDs }, - }), - ); - } + void threadSpecs[threadInfo.type].protocol.addThreadMembers( + { newMemberIDs, threadInfo }, + { + dmAddThreadMembers: addDMThreadMembers, + changeThreadSettings: callChangeThreadSettings, + dispatchActionPromise, + }, + ); onClose(); }, [ addDMThreadMembers, @@ -86,7 +81,6 @@ dispatchActionPromise, onClose, pendingUsersToAdd, - threadID, threadInfo, ]);