mirror of
https://gitlab.opencode.de/bwi/bundesmessenger/clients/bundesmessenger-ios.git
synced 2026-04-26 11:30:50 +02:00
Enable user mentions in Rich Text Editor
This commit is contained in:
@@ -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() { }
|
||||
|
||||
+4
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user