diff --git a/lib/shared/edit-messages-utils.js b/lib/shared/edit-messages-utils.js --- a/lib/shared/edit-messages-utils.js +++ b/lib/shared/edit-messages-utils.js @@ -1,12 +1,20 @@ // @flow +import invariant from 'invariant'; import * as React from 'react'; +import uuid from 'uuid'; +import { + type OutboundDMOperationSpecification, + dmOperationSpecificationTypes, +} from './dm-ops/dm-op-utils.js'; +import { useProcessAndSendDMOperation } from './dm-ops/process-dm-ops.js'; import { threadIsPending, useThreadHasPermission } from './thread-utils.js'; import { sendEditMessageActionTypes, useSendEditMessage, } from '../actions/message-actions.js'; +import { type DMSendEditMessageOperation } from '../types/dm-ops.js'; import type { ComposableMessageInfo, RawMessageInfo, @@ -15,37 +23,78 @@ import { messageTypes } from '../types/message-types-enum.js'; import type { ThreadInfo } from '../types/minimally-encoded-thread-permissions-types.js'; import { threadPermissions } from '../types/thread-permission-types.js'; +import { + thickThreadTypes, + threadTypeIsThick, +} from '../types/thread-types-enum.js'; import { useDispatchActionPromise } from '../utils/redux-promise-utils.js'; import { useSelector } from '../utils/redux-utils.js'; -function useEditMessage(): ( - messageID: string, - newText: string, -) => Promise { +function useEditMessage( + threadInfo: ThreadInfo, +): (messageID: string, newText: string) => Promise { const callEditMessage = useSendEditMessage(); const dispatchActionPromise = useDispatchActionPromise(); + const processAndSendDMOperation = useProcessAndSendDMOperation(); + const viewerID = useSelector( + state => state.currentUserInfo && state.currentUserInfo.id, + ); return React.useCallback( async (messageID, newText) => { - const editMessagePromise = (async () => { - const result = await callEditMessage({ + if (threadTypeIsThick(threadInfo.type)) { + invariant(viewerID, 'viewerID should be set'); + const op: DMSendEditMessageOperation = { + type: 'send_edit_message', + threadID: threadInfo.id, + creatorID: viewerID, + time: Date.now(), + messageID: uuid.v4(), targetMessageID: messageID, text: newText, - }); + }; + const opSpecification: OutboundDMOperationSpecification = { + type: dmOperationSpecificationTypes.OUTBOUND, + op, + recipients: { + type: 'all_thread_members', + threadID: + threadInfo.type === thickThreadTypes.THICK_SIDEBAR && + threadInfo.parentThreadID + ? threadInfo.parentThreadID + : threadInfo.id, + }, + }; + await processAndSendDMOperation(opSpecification); + } else { + const editMessagePromise = (async () => { + const result = await callEditMessage({ + targetMessageID: messageID, + text: newText, + }); - return ({ - newMessageInfos: result.newMessageInfos, - }: { +newMessageInfos: $ReadOnlyArray }); - })(); + return ({ + newMessageInfos: result.newMessageInfos, + }: { +newMessageInfos: $ReadOnlyArray }); + })(); - void dispatchActionPromise( - sendEditMessageActionTypes, - editMessagePromise, - ); + void dispatchActionPromise( + sendEditMessageActionTypes, + editMessagePromise, + ); - await editMessagePromise; + await editMessagePromise; + } }, - [dispatchActionPromise, callEditMessage], + [ + threadInfo.type, + threadInfo.id, + threadInfo.parentThreadID, + viewerID, + processAndSendDMOperation, + dispatchActionPromise, + callEditMessage, + ], ); } diff --git a/native/chat/chat-input-bar.react.js b/native/chat/chat-input-bar.react.js --- a/native/chat/chat-input-bar.react.js +++ b/native/chat/chat-input-bar.react.js @@ -1280,7 +1280,7 @@ props.threadInfo, getDefaultTextMessageRules(chatMentionCandidates).simpleMarkdownRules, ); - const editMessage = useEditMessage(); + const editMessage = useEditMessage(props.threadInfo); const [selectionState, setSelectionState] = React.useState({ diff --git a/web/chat/edit-text-message.react.js b/web/chat/edit-text-message.react.js --- a/web/chat/edit-text-message.react.js +++ b/web/chat/edit-text-message.react.js @@ -34,7 +34,7 @@ const { background, threadInfo, item } = props; const { editState, clearEditModal, setDraft, setError, updatePosition } = useEditModalContext(); - const editMessage = useEditMessage(); + const editMessage = useEditMessage(threadInfo); const myRef = React.useRef(null);