Enable user mentions in Rich Text Editor

This commit is contained in:
aringenbach
2023-03-08 15:16:19 +01:00
parent fe6218558e
commit 3db15471ee
16 changed files with 267 additions and 39 deletions
@@ -229,12 +229,14 @@ enum ComposerViewAction: Equatable {
case contentDidChange(isEmpty: Bool)
case linkTapped(linkAction: LinkAction)
case storeSelection(selection: NSRange)
case suggestion(pattern: SuggestionPattern?)
}
enum ComposerViewModelResult: Equatable {
case cancel
case contentDidChange(isEmpty: Bool)
case linkTapped(LinkAction: LinkAction)
case suggestion(pattern: SuggestionPattern?)
}
final class LinkActionWrapper: NSObject {
@@ -245,3 +247,12 @@ final class LinkActionWrapper: NSObject {
super.init()
}
}
final class SuggestionPatternWrapper: NSObject {
let suggestionPattern: SuggestionPattern?
init(_ suggestionPattern: SuggestionPattern?) {
self.suggestionPattern = suggestionPattern
super.init()
}
}
@@ -248,6 +248,9 @@ struct Composer: View {
wysiwygViewModel.maximised = false
}
}
.onChange(of: wysiwygViewModel.suggestionPattern) { newValue in
sendMentionPattern(pattern: newValue)
}
}
private func storeCurrentSelection() {
@@ -258,6 +261,10 @@ struct Composer: View {
let linkAction = wysiwygViewModel.getLinkAction()
viewModel.send(viewAction: .linkTapped(linkAction: linkAction))
}
private func sendMentionPattern(pattern: SuggestionPattern?) {
viewModel.send(viewAction: .suggestion(pattern: pattern))
}
}
private extension WysiwygComposerViewModel {
@@ -90,6 +90,8 @@ final class ComposerViewModel: ComposerViewModelType, ComposerViewModelProtocol
callback?(.linkTapped(LinkAction: linkAction))
case let .storeSelection(selection):
selectionToRestore = selection
case let .suggestion(pattern: pattern):
callback?(.suggestion(pattern: pattern))
}
}
@@ -18,6 +18,7 @@ import Combine
import Foundation
import SwiftUI
import UIKit
import WysiwygComposer
protocol UserSuggestionCoordinatorDelegate: AnyObject {
func userSuggestionCoordinator(_ coordinator: UserSuggestionCoordinator, didRequestMentionForMember member: MXRoomMember, textTrigger: String?)
@@ -92,6 +93,10 @@ final class UserSuggestionCoordinator: Coordinator, Presentable {
userSuggestionService.processTextMessage(textMessage)
}
func processSuggestionPattern(_ suggestionPattern: SuggestionPattern?) {
userSuggestionService.processSuggestionPattern(suggestionPattern)
}
// MARK: - Public
func start() { }
@@ -44,6 +44,10 @@ final class UserSuggestionCoordinatorBridge: NSObject {
func processTextMessage(_ textMessage: String) {
userSuggestionCoordinator.processTextMessage(textMessage)
}
func processSuggestionPattern(_ suggestionPatternWrapper: SuggestionPatternWrapper) {
userSuggestionCoordinator.processSuggestionPattern(suggestionPatternWrapper.suggestionPattern)
}
func toPresentable() -> UIViewController? {
userSuggestionCoordinator.toPresentable()
@@ -16,6 +16,7 @@
import Combine
import Foundation
import WysiwygComposer
struct RoomMembersProviderMember {
var userId: String
@@ -85,6 +86,16 @@ class UserSuggestionService: UserSuggestionServiceProtocol {
currentTextTriggerSubject.send(lastComponent)
}
func processSuggestionPattern(_ suggestionPattern: SuggestionPattern?) {
guard let suggestionPattern, suggestionPattern.key == .at else {
items.send([])
currentTextTriggerSubject.send(nil)
return
}
currentTextTriggerSubject.send("@" + suggestionPattern.text)
}
// MARK: - Private
@@ -16,6 +16,7 @@
import Combine
import Foundation
import WysiwygComposer
protocol UserSuggestionItemProtocol: Avatarable {
var userId: String { get }
@@ -29,6 +30,7 @@ protocol UserSuggestionServiceProtocol {
var currentTextTrigger: String? { get }
func processTextMessage(_ textMessage: String?)
func processSuggestionPattern(_ suggestionPattern: SuggestionPattern?)
}
// MARK: Avatarable