Seamlessly switch for the RichTextEditor based message composer to the… (#2753)

* Seemlesly switch for the RichTextEditor based message composer to the plain one depending on whether formatting options are enabled or not.

* Address PR comments

* Fixes #2803 - Add extra padding at the bottom of the composer suggestions list

* Update preview test snapshots

* Update UI test snapshots
This commit is contained in:
Stefan Ceriu
2024-05-08 17:57:32 +03:00
committed by GitHub
parent 75ac523fa2
commit 636274df74
59 changed files with 132 additions and 160 deletions
@@ -125,10 +125,9 @@ final class ComposerToolbarViewModel: ComposerToolbarViewModelType, ComposerTool
case .previewVoiceMessage:
actionsSubject.send(.voiceMessage(.send))
default:
if ServiceLocator.shared.settings.richTextEditorEnabled {
let sendHTML = appSettings.richTextEditorEnabled
if context.composerFormattingEnabled {
actionsSubject.send(.sendMessage(plain: wysiwygViewModel.content.markdown,
html: sendHTML ? wysiwygViewModel.content.html : nil,
html: wysiwygViewModel.content.html,
mode: state.composerMode,
intentionalMentions: wysiwygViewModel.getMentionsState().toIntentionalMentions()))
} else {
@@ -148,7 +147,7 @@ final class ComposerToolbarViewModel: ComposerToolbarViewModelType, ComposerTool
case .handlePasteOrDrop(let provider):
actionsSubject.send(.handlePasteOrDrop(provider: provider))
case .enableTextFormatting:
state.bindings.composerActionsEnabled = true
state.bindings.composerFormattingEnabled = true
state.bindings.composerFocused = true
case .composerAction(let action):
if action == .link {
@@ -162,6 +161,15 @@ final class ComposerToolbarViewModel: ComposerToolbarViewModelType, ComposerTool
processVoiceMessageAction(voiceMessageAction)
case .plainComposerTextChanged:
completionSuggestionService.processTextMessage(state.bindings.plainComposerText.string)
case .didToggleFormattingOptions:
if context.composerFormattingEnabled {
DispatchQueue.main.async {
self.wysiwygViewModel.textView.flushPills()
self.wysiwygViewModel.setMarkdownContent(self.context.plainComposerText.string)
}
} else {
context.plainComposerText = NSAttributedString(string: wysiwygViewModel.attributedContent.text.string)
}
}
}
@@ -244,7 +252,7 @@ final class ComposerToolbarViewModel: ComposerToolbarViewModelType, ComposerTool
private func processVoiceMessageAction(_ action: ComposerToolbarVoiceMessageAction) {
switch action {
case .startRecording:
state.bindings.composerActionsEnabled = false
state.bindings.composerFormattingEnabled = false
actionsSubject.send(.voiceMessage(.startRecording))
case .stopRecording:
actionsSubject.send(.voiceMessage(.stopRecording))
@@ -297,7 +305,7 @@ final class ComposerToolbarViewModel: ComposerToolbarViewModelType, ComposerTool
return
}
if appSettings.richTextEditorEnabled {
if context.composerFormattingEnabled {
wysiwygViewModel.setMention(url: url.absoluteString, name: item.displayName ?? item.id, mentionType: .user)
} else {
let attributedString = NSMutableAttributedString(attributedString: state.bindings.plainComposerText)
@@ -305,7 +313,7 @@ final class ComposerToolbarViewModel: ComposerToolbarViewModelType, ComposerTool
state.bindings.plainComposerText = attributedString
}
case .allUsers:
if appSettings.richTextEditorEnabled {
if context.composerFormattingEnabled {
wysiwygViewModel.setAtRoomMention()
} else {
let attributedString = NSMutableAttributedString(attributedString: state.bindings.plainComposerText)
@@ -333,7 +341,7 @@ final class ComposerToolbarViewModel: ComposerToolbarViewModelType, ComposerTool
}
private func set(text: String) {
if ServiceLocator.shared.settings.richTextEditorEnabled {
if context.composerFormattingEnabled {
wysiwygViewModel.textView.flushPills()
wysiwygViewModel.setHtmlContent(text)