From 37a8aa57344f1dfe861b77f9e2a4db5dd39c8510 Mon Sep 17 00:00:00 2001 From: aringenbach Date: Tue, 21 Mar 2023 10:26:37 +0100 Subject: [PATCH] Update composer library to 1.3.0 and apply changes --- .../xcshareddata/swiftpm/Package.resolved | 4 +- Riot/Modules/Room/RoomViewController.swift | 75 +++++++++++-------- .../Views/InputToolbar/RoomInputToolbarView.h | 4 +- .../WysiwygInputToolbarView.swift | 27 +++++-- project.yml | 2 +- 5 files changed, 66 insertions(+), 46 deletions(-) diff --git a/Riot.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Riot.xcworkspace/xcshareddata/swiftpm/Package.resolved index daf871ac6..a087c8ac3 100644 --- a/Riot.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Riot.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -50,8 +50,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/matrix-org/matrix-wysiwyg-composer-swift", "state" : { - "revision" : "b81654b30f8b22b2d13f17e5e4c843e1fdc1db32", - "version" : "1.2.2" + "revision" : "aa98d9b6e4c3d2c4927190c09c5a7e56d08dbfb0", + "version" : "1.3.0" } }, { diff --git a/Riot/Modules/Room/RoomViewController.swift b/Riot/Modules/Room/RoomViewController.swift index b36447654..a51beba3b 100644 --- a/Riot/Modules/Room/RoomViewController.swift +++ b/Riot/Modules/Room/RoomViewController.swift @@ -14,6 +14,7 @@ // limitations under the License. // +import HTMLParser import UIKit import WysiwygComposer @@ -38,6 +39,9 @@ extension RoomViewController { newAttributedString.appendString(" ") } else if roomMember.userId == self.mainSession.myUser.userId { newAttributedString.appendString("/me ") + newAttributedString.addAttribute(.font, + value: inputToolbarView.textDefaultFont, + range: .init(location: 0, length: newAttributedString.length)) } else { if #available(iOS 15.0, *) { newAttributedString.append(PillsFormatter.mentionPill(withRoomMember: roomMember, @@ -155,24 +159,7 @@ extension RoomViewController { @objc func togglePlainTextMode() { RiotSettings.shared.enableWysiwygTextFormatting.toggle() - - guard let wysiwygInputToolbar else { return } - - // Switching from plain -> RTE, replace Pills by valid markdown links for parsing. - if !wysiwygInputToolbar.textFormattingEnabled, #available(iOS 15.0, *), - let attributedText = wysiwygInputToolbar.attributedTextMessage { - wysiwygInputToolbar.attributedTextMessage = NSAttributedString(string: PillsFormatter.stringByReplacingPills(in: attributedText, mode: .markdown)) - } - - wysiwygInputToolbar.textFormattingEnabled.toggle() - - // Switching from RTE -> plain, replace markdown links with Pills. - if !wysiwygInputToolbar.textFormattingEnabled, #available(iOS 15.0, *), - let attributedText = wysiwygInputToolbar.attributedTextMessage { - wysiwygInputToolbar.attributedTextMessage = PillsFormatter.insertPills(in: attributedText, - roomState: self.roomDataSource.roomState, - font: self.inputToolbarView.textDefaultFont) - } + wysiwygInputToolbar?.textFormattingEnabled.toggle() } @objc func didChangeMaximisedState(_ isMaximised: Bool) { @@ -270,21 +257,6 @@ extension RoomViewController { composerLinkActionBridgePresenter = presenter presenter.present(from: self, animated: true) } - - @objc func didRequestAttachmentStringForLink(_ link: String, andDisplayName: String) -> NSAttributedString? { - guard #available(iOS 15.0, *), - let userId = PillsFormatter.userIdFromPermalink(link), - let roomState = self.roomDataSource.roomState, - let member = PillsFormatter.roomMember(withUserId: userId, - roomState: roomState, - andLatestRoomState: nil) else { - return nil - } - - return PillsFormatter.mentionPill(withRoomMember: member, - isHighlighted: false, - font: inputToolbarView.textDefaultFont) - } @objc func showWaitingOtherParticipantHeader() { let controller = VectorHostingController(rootView: RoomWaitingForMembers()) @@ -395,6 +367,43 @@ extension RoomViewController: ComposerLinkActionBridgePresenterDelegate { } } +// MARK: - PermalinkReplacer +extension RoomViewController: PermalinkReplacer { + public func replacementForLink(_ url: String, text: String) -> NSAttributedString? { + guard #available(iOS 15.0, *), + let userId = PillsFormatter.userIdFromPermalink(url), + let roomState = roomDataSource.roomState, + let member = PillsFormatter.roomMember(withUserId: userId, + roomState: roomState, + andLatestRoomState: nil) else { + return nil + } + + return PillsFormatter.mentionPill(withRoomMember: member, + isHighlighted: false, + font: inputToolbarView.textDefaultFont) + } + + public func postProcessMarkdown(in attributedString: NSAttributedString) -> NSAttributedString { + guard #available(iOS 15.0, *), + let roomState = roomDataSource.roomState else { + return attributedString + } + + return PillsFormatter.insertPills(in: attributedString, + roomState: roomState, + font: inputToolbarView.textDefaultFont) + } + + public func restoreMarkdown(in attributedString: NSAttributedString) -> String { + if #available(iOS 15.0, *) { + return PillsFormatter.stringByReplacingPills(in: attributedString, mode: .markdown) + } else { + return attributedString.string + } + } +} + // MARK: - VoiceBroadcast extension RoomViewController { @objc func stopUncompletedVoiceBroadcastIfNeeded() { diff --git a/Riot/Modules/Room/Views/InputToolbar/RoomInputToolbarView.h b/Riot/Modules/Room/Views/InputToolbar/RoomInputToolbarView.h index ee1a032e0..ebbb8305a 100644 --- a/Riot/Modules/Room/Views/InputToolbar/RoomInputToolbarView.h +++ b/Riot/Modules/Room/Views/InputToolbar/RoomInputToolbarView.h @@ -60,7 +60,7 @@ typedef NS_ENUM(NSUInteger, RoomInputToolbarViewSendMode) @param toolbarView the room input toolbar view */ -- (void)roomInputToolbarViewDidChangeTextMessage:(RoomInputToolbarView*)toolbarView; +- (void)roomInputToolbarViewDidChangeTextMessage:(MXKRoomInputToolbarView*)toolbarView; /** Inform the delegate that the action menu was opened. @@ -83,8 +83,6 @@ typedef NS_ENUM(NSUInteger, RoomInputToolbarViewSendMode) - (void)didDetectTextPattern: (SuggestionPatternWrapper *)suggestionPattern; -- (nullable NSAttributedString *)didRequestAttachmentStringForLink: (NSString *)link andDisplayName: (NSString *)displayName; - @end /** diff --git a/Riot/Modules/Room/Views/WYSIWYGInputToolbar/WysiwygInputToolbarView.swift b/Riot/Modules/Room/Views/WYSIWYGInputToolbar/WysiwygInputToolbarView.swift index a092a18ea..78989a23e 100644 --- a/Riot/Modules/Room/Views/WYSIWYGInputToolbar/WysiwygInputToolbarView.swift +++ b/Riot/Modules/Room/Views/WYSIWYGInputToolbar/WysiwygInputToolbarView.swift @@ -45,7 +45,7 @@ class WysiwygInputToolbarView: MXKRoomInputToolbarView, NibLoadable, HtmlRoomInp private var hostingViewController: VectorHostingController! private lazy var wysiwygViewModel = WysiwygComposerViewModel( parserStyle: WysiwygInputToolbarView.parserStyle, - permalinkReplacer: self + permalinkReplacer: permalinkReplacer ) /// Compute current HTML parser style for composer. private static var parserStyle: HTMLParserStyle { @@ -73,6 +73,12 @@ class WysiwygInputToolbarView: MXKRoomInputToolbarView, NibLoadable, HtmlRoomInp } // MARK: Public + + override var delegate: MXKRoomInputToolbarViewDelegate! { + didSet { + wysiwygViewModel.permalinkReplacer = permalinkReplacer + } + } override var placeholder: String! { get { @@ -138,6 +144,10 @@ class WysiwygInputToolbarView: MXKRoomInputToolbarView, NibLoadable, HtmlRoomInp private weak var toolbarViewDelegate: RoomInputToolbarViewDelegate? { return (delegate as? RoomInputToolbarViewDelegate) ?? nil } + + private var permalinkReplacer: PermalinkReplacer? { + return (delegate as? PermalinkReplacer) + } override func awakeFromNib() { super.awakeFromNib() @@ -207,6 +217,15 @@ class WysiwygInputToolbarView: MXKRoomInputToolbarView, NibLoadable, HtmlRoomInp if !value { self.voiceMessageBottomConstraint?.constant = 2 } + }, + + wysiwygViewModel.$plainTextContent + .dropFirst() + .removeDuplicates() + .sink { [weak self] value in + guard let self else { return } + self.textMessage = value.string + self.toolbarViewDelegate?.roomInputToolbarViewDidChangeTextMessage(self) } ] @@ -443,12 +462,6 @@ class WysiwygInputToolbarView: MXKRoomInputToolbarView, NibLoadable, HtmlRoomInp } } -extension WysiwygInputToolbarView: PermalinkReplacer { - func replacementForLink(_ link: String, text: String) -> NSAttributedString? { - return toolbarViewDelegate?.didRequestAttachmentString(forLink: link, andDisplayName: text) - } -} - // MARK: - LegacySendModeAdapter fileprivate extension ComposerSendMode { diff --git a/project.yml b/project.yml index 64ab238d2..ff745767a 100644 --- a/project.yml +++ b/project.yml @@ -56,7 +56,7 @@ packages: branch: 0.0.1 WysiwygComposer: url: https://github.com/matrix-org/matrix-wysiwyg-composer-swift - version: 1.2.2 + version: 1.3.0 DeviceKit: url: https://github.com/devicekit/DeviceKit majorVersion: 4.7.0