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 @@ -734,6 +734,7 @@ updateText = (text: string) => { this.setState({ text, textEdited: true }); + this.props.inputState?.setEditedMessageChanged(this.isMessageEdited(text)); if (this.isEditMode() || this.state.isExitingEditMode) { return; } @@ -843,8 +844,8 @@ return editState && editState.editedMessage !== null && isThisThread; }; - isMessageEdited = () => { - let text = this.state.text; + isMessageEdited = newText => { + let text = newText ?? this.state.text; text = trimMessage(text); const originalText = this.props.editedMessageInfo?.text; return text !== originalText; diff --git a/native/chat/text-message-tooltip-modal.react.js b/native/chat/text-message-tooltip-modal.react.js --- a/native/chat/text-message-tooltip-modal.react.js +++ b/native/chat/text-message-tooltip-modal.react.js @@ -81,7 +81,8 @@ const enterEditMode = () => { inputState.setEditedMessage(messageInfo, updateInputBar); }; - if (inputState.editState.editedMessage) { + const { editedMessage, isEditedMessageChanged } = inputState.editState; + if (isEditedMessageChanged && editedMessage) { exitEditAlert(enterEditMode); } else { enterEditMode(); diff --git a/native/chat/text-message.react.js b/native/chat/text-message.react.js --- a/native/chat/text-message.react.js +++ b/native/chat/text-message.react.js @@ -22,6 +22,7 @@ import textMessageSendFailed from './text-message-send-failed.js'; import { getMessageTooltipKey } from './utils.js'; import { ChatContext, type ChatContextType } from '../chat/chat-context.js'; +import { InputStateContext } from '../input/input-state.js'; import { MarkdownContext } from '../markdown/markdown-context.js'; import type { AppNavigationProp } from '../navigation/app-navigator.react'; import { @@ -248,6 +249,7 @@ const overlayContext = React.useContext(OverlayContext); const chatContext = React.useContext(ChatContext); const markdownContext = React.useContext(MarkdownContext); + const inputContext = React.useContext(InputStateContext); invariant(markdownContext, 'markdownContext should be set'); const { linkModalActive, clearMarkdownContextData } = markdownContext; @@ -264,10 +266,12 @@ props.item.messageInfo, ); - const canEditMessage = useCanEditMessage( - props.item.threadInfo, - props.item.messageInfo, - ); + const isThisMessageEdited = + inputContext?.editState.editedMessage?.id === props.item.messageInfo.id; + + const canEditMessage = + useCanEditMessage(props.item.threadInfo, props.item.messageInfo) && + !isThisMessageEdited; const canTogglePins = threadHasPermission( props.item.threadInfo, diff --git a/native/input/input-state-container.react.js b/native/input/input-state-container.react.js --- a/native/input/input-state-container.react.js +++ b/native/input/input-state-container.react.js @@ -175,6 +175,7 @@ pendingUploads: {}, editState: { editedMessage: null, + isEditedMessageChanged: false, }, }; sendCallbacks: Array<() => void> = []; @@ -423,6 +424,7 @@ setPendingThreadUpdateHandler: this.setPendingThreadUpdateHandler, editState, setEditedMessage: this.setEditedMessage, + setEditedMessageChanged: this.setEditedMessageChanged, scrollToMessage: this.scrollToMessage, addScrollToMessageListener: this.addScrollToMessageListener, removeScrollToMessageListener: this.removeScrollToMessageListener, @@ -1427,12 +1429,18 @@ setEditedMessage = (editedMessage: ?MessageInfo, callback?: () => void) => { this.setState( { - editState: { editedMessage }, + editState: { editedMessage, isEditedMessageChanged: false }, }, callback, ); }; + setEditedMessageChanged = (isEditedMessageChanged: boolean) => { + this.setState(prevState => ({ + editState: { ...prevState.editState, isEditedMessageChanged }, + })); + }; + removeEditInputMessageListener = ( callbackEditInputBar: (params: EditInputBarMessageParameters) => void, ) => { diff --git a/native/input/input-state.js b/native/input/input-state.js --- a/native/input/input-state.js +++ b/native/input/input-state.js @@ -25,6 +25,7 @@ export type EditState = { +editedMessage: ?MessageInfo, + +isEditedMessageChanged: boolean, }; export type EditInputBarMessageParameters = { @@ -69,6 +70,7 @@ editedMessage: ?MessageInfo, callback?: () => void, ) => void, + +setEditedMessageChanged: (isEditedMessageChanged: boolean) => void, +scrollToMessage: (messageKey: string) => void, +addScrollToMessageListener: ((messageKey: string) => void) => void, +removeScrollToMessageListener: ((messageKey: string) => void) => void,