diff --git a/Config/Project.xcconfig b/Config/Project.xcconfig index bbca50a1bf..2413f765f4 100644 --- a/Config/Project.xcconfig +++ b/Config/Project.xcconfig @@ -26,7 +26,7 @@ KEYCHAIN_ACCESS_GROUP = $(AppIdentifierPrefix)$(BASE_BUNDLE_IDENTIFIER).keychain BROADCAST_UPLOAD_EXTENSION_BUNDLE_IDENTIFIER = $(BASE_BUNDLE_IDENTIFIER).broadcastUploadExtension // Build settings -IPHONEOS_DEPLOYMENT_TARGET = 14.0 +IPHONEOS_DEPLOYMENT_TARGET = 15.0 SDKROOT = iphoneos TARGETED_DEVICE_FAMILY = 1,2 SWIFT_VERSION = 5.6 diff --git a/Riot.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Riot.xcworkspace/xcshareddata/swiftpm/Package.resolved index 4a7151c773..85bef8ef2d 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" : "1100b217c04d096dfe072afb4484660ff794d805", - "version" : "2.2.2" + "revision" : "dfb74c89bf54b41ea000d564d6435ac6444ba6b4", + "version" : "2.18.0" } }, { diff --git a/Riot/Modules/MatrixKit/Utils/EventFormatter/HTMLFormatter.swift b/Riot/Modules/MatrixKit/Utils/EventFormatter/HTMLFormatter.swift index 819eb632fd..6c7e43a90a 100644 --- a/Riot/Modules/MatrixKit/Utils/EventFormatter/HTMLFormatter.swift +++ b/Riot/Modules/MatrixKit/Utils/EventFormatter/HTMLFormatter.swift @@ -47,7 +47,9 @@ class HTMLFormatter: NSObject { var options: [AnyHashable: Any] = [ DTUseiOS6Attributes: true, - DTDefaultFontDescriptor: font.fontDescriptor, + DTDefaultFontFamily: font.familyName, + DTDefaultFontName: font.fontName, + DTDefaultFontSize: font.pointSize, DTDefaultLinkDecoration: false, DTDefaultLinkColor: ThemeService.shared().theme.colors.links, DTWillFlushBlockCallBack: sanitizeCallback diff --git a/Riot/Modules/Room/RoomViewController.swift b/Riot/Modules/Room/RoomViewController.swift index 727ca8f806..e9260105e3 100644 --- a/Riot/Modules/Room/RoomViewController.swift +++ b/Riot/Modules/Room/RoomViewController.swift @@ -384,8 +384,8 @@ extension RoomViewController: ComposerLinkActionBridgePresenterDelegate { } // MARK: - PermalinkReplacer -extension RoomViewController: PermalinkReplacer { - public func replacementForLink(_ url: String, text: String) -> NSAttributedString? { +extension RoomViewController: MentionReplacer { + public func replacementForMention(_ url: String, text: String) -> NSAttributedString? { guard #available(iOS 15.0, *), let url = URL(string: url), let session = roomDataSource.mxSession, diff --git a/Riot/Modules/Room/Views/WYSIWYGInputToolbar/WysiwygInputToolbarView.swift b/Riot/Modules/Room/Views/WYSIWYGInputToolbar/WysiwygInputToolbarView.swift index 60b6edf943..66bce9f71b 100644 --- a/Riot/Modules/Room/Views/WYSIWYGInputToolbar/WysiwygInputToolbarView.swift +++ b/Riot/Modules/Room/Views/WYSIWYGInputToolbar/WysiwygInputToolbarView.swift @@ -150,8 +150,8 @@ class WysiwygInputToolbarView: MXKRoomInputToolbarView, NibLoadable, HtmlRoomInp return (delegate as? RoomInputToolbarViewDelegate) ?? nil } - private var permalinkReplacer: PermalinkReplacer? { - return (delegate as? PermalinkReplacer) + private var mentionReplacer: MentionReplacer? { + return (delegate as? MentionReplacer) } override func awakeFromNib() { @@ -227,7 +227,7 @@ class WysiwygInputToolbarView: MXKRoomInputToolbarView, NibLoadable, HtmlRoomInp private func setupComposerIfNeeded() { guard hostingViewController == nil, let toolbarViewDelegate, - let permalinkReplacer else { return } + let mentionReplacer else { return } viewModel = ComposerViewModel( initialViewState: ComposerViewState(textFormattingEnabled: RiotSettings.shared.enableWysiwygTextFormatting, @@ -238,7 +238,7 @@ class WysiwygInputToolbarView: MXKRoomInputToolbarView, NibLoadable, HtmlRoomInp self?.handleViewModelResult(result) } wysiwygViewModel.plainTextMode = !RiotSettings.shared.enableWysiwygTextFormatting - wysiwygViewModel.permalinkReplacer = permalinkReplacer + wysiwygViewModel.mentionReplacer = mentionReplacer inputAccessoryViewForKeyboard = UIView(frame: .zero) @@ -422,6 +422,10 @@ class WysiwygInputToolbarView: MXKRoomInputToolbarView, NibLoadable, HtmlRoomInp toolbarViewDelegate?.didSendLinkAction(LinkActionWrapper(linkAction)) case let .suggestion(pattern): toolbarViewDelegate?.didDetectTextPattern(SuggestionPatternWrapper(pattern)) + case .sendMessage: + let content = wysiwygViewModel.content + sendWysiwygMessage(content: content) + wysiwygViewModel.clearContent() } } diff --git a/RiotSwiftUI/Modules/Room/Composer/Model/ComposerModels.swift b/RiotSwiftUI/Modules/Room/Composer/Model/ComposerModels.swift index 33d73ef4a2..768b92c350 100644 --- a/RiotSwiftUI/Modules/Room/Composer/Model/ComposerModels.swift +++ b/RiotSwiftUI/Modules/Room/Composer/Model/ComposerModels.swift @@ -156,7 +156,7 @@ extension FormatItem { extension FormatType { /// Convenience method to map it to the external ViewModel action - var action: WysiwygAction { + var action: ComposerAction { switch self { case .bold: return .bold @@ -230,6 +230,7 @@ enum ComposerViewAction: Equatable { case linkTapped(linkAction: LinkAction) case storeSelection(selection: NSRange) case suggestion(pattern: SuggestionPattern?) + case sendMessage } enum ComposerViewModelResult: Equatable { @@ -237,6 +238,7 @@ enum ComposerViewModelResult: Equatable { case contentDidChange(isEmpty: Bool) case linkTapped(LinkAction: LinkAction) case suggestion(pattern: SuggestionPattern?) + case sendMessage } final class LinkActionWrapper: NSObject { diff --git a/RiotSwiftUI/Modules/Room/Composer/View/Composer.swift b/RiotSwiftUI/Modules/Room/Composer/View/Composer.swift index a74b0bb4d6..419bc8ca0a 100644 --- a/RiotSwiftUI/Modules/Room/Composer/View/Composer.swift +++ b/RiotSwiftUI/Modules/Room/Composer/View/Composer.swift @@ -140,11 +140,20 @@ struct Composer: View { } HStack(alignment: shouldFixRoundCorner ? .top : .center, spacing: 0) { WysiwygComposerView( - focused: $viewModel.focused, - viewModel: wysiwygViewModel + placeholder: viewModel.viewState.placeholder ?? "", + placeholderColor: theme.colors.tertiaryContent, + viewModel: wysiwygViewModel, itemProviderHelper: EmptyWysiwygProviderHelper(), + keyCommandHandler: { keyCommand in + switch keyCommand { + case .enter: + viewModel.send(viewAction: .sendMessage) + return true + case .shiftEnter: + return false + } + }, + pasteHandler: { _ in } ) - .tintColor(theme.colors.accent) - .placeholder(viewModel.viewState.placeholder, color: theme.colors.tertiaryContent) .onAppear { if wysiwygViewModel.isContentEmpty { wysiwygViewModel.setup() @@ -318,3 +327,9 @@ struct Composer_Previews: PreviewProvider { stateRenderer.screenGroup() } } + +private struct EmptyWysiwygProviderHelper: WysiwygItemProviderHelper { + func isPasteSupported(for itemProvider: NSItemProvider) -> Bool { + false + } +} diff --git a/RiotSwiftUI/Modules/Room/Composer/ViewModel/ComposerViewModel.swift b/RiotSwiftUI/Modules/Room/Composer/ViewModel/ComposerViewModel.swift index 6448b9de33..0484cabefd 100644 --- a/RiotSwiftUI/Modules/Room/Composer/ViewModel/ComposerViewModel.swift +++ b/RiotSwiftUI/Modules/Room/Composer/ViewModel/ComposerViewModel.swift @@ -92,6 +92,8 @@ final class ComposerViewModel: ComposerViewModelType, ComposerViewModelProtocol selectionToRestore = selection case let .suggestion(pattern: pattern): callback?(.suggestion(pattern: pattern)) + case .sendMessage: + callback?(.sendMessage) } } diff --git a/project.yml b/project.yml index 430b39cbc0..a2f34eaa1e 100644 --- a/project.yml +++ b/project.yml @@ -59,10 +59,10 @@ packages: branch: 0.0.1 WysiwygComposer: url: https://github.com/matrix-org/matrix-wysiwyg-composer-swift - version: 2.2.2 + version: 2.18.0 DeviceKit: url: https://github.com/devicekit/DeviceKit majorVersion: 4.7.0 DTCoreText: url: https://github.com/Cocoanetics/DTCoreText - version: 1.6.27 + version: 1.6.26