#1098 - Working real user suggestion inside the main application.

This commit is contained in:
Stefan Ceriu
2021-10-05 14:30:31 +03:00
parent 388e521a89
commit 71667de9b1
12 changed files with 191 additions and 57 deletions
@@ -20,6 +20,13 @@ import Foundation
import UIKit
import SwiftUI
@available(iOS 14.0, *)
protocol UserSuggestionCoordinatorDelegate: AnyObject {
func userSuggestionCoordinator(_ coordinator: UserSuggestionCoordinator,
didRequestMentionForMember member: MXRoomMember,
textTrigger: String?)
}
@available(iOS 14.0, *)
final class UserSuggestionCoordinator: Coordinator {
@@ -30,7 +37,7 @@ final class UserSuggestionCoordinator: Coordinator {
private let parameters: UserSuggestionCoordinatorParameters
private let userSuggestionHostingController: UIViewController
private var userSuggestionService: UserSuggestionServiceProtocol
private var userSuggestionService: UserSuggestionService
private var userSuggestionViewModel: UserSuggestionViewModelProtocol
// MARK: Public
@@ -39,6 +46,8 @@ final class UserSuggestionCoordinator: Coordinator {
var childCoordinators: [Coordinator] = []
var completion: (() -> Void)?
weak var delegate: UserSuggestionCoordinatorDelegate?
// MARK: - Setup
@available(iOS 14.0, *)
@@ -47,15 +56,33 @@ final class UserSuggestionCoordinator: Coordinator {
userSuggestionService = UserSuggestionService(room: parameters.room)
userSuggestionViewModel = UserSuggestionViewModel.makeUserSuggestionViewModel(userSuggestionService: userSuggestionService)
let view = UserSuggestionList(viewModel: userSuggestionViewModel.context)
.addDependency(AvatarService.instantiate(mediaManager: parameters.mediaManager))
userSuggestionHostingController = UIHostingController(rootView: view)
userSuggestionViewModel.completion = { [weak self] result in
guard let self = self else {
return
}
switch result {
case .selectedItemWithIdentifier(let identifier):
guard let member = self.userSuggestionService.roomMemberForIdentifier(identifier) else {
return
}
self.delegate?.userSuggestionCoordinator(self,
didRequestMentionForMember: member,
textTrigger: self.userSuggestionService.currentTextTrigger)
break
}
}
}
func processPartialUserName(_ userName: String) {
userSuggestionService.processPartialUserName(userName)
func processTextMessage(_ textMessage: String) {
userSuggestionService.processTextMessage(textMessage)
}
// MARK: - Public
@@ -16,6 +16,13 @@
import Foundation
@objc
protocol UserSuggestionCoordinatorBridgeDelegate: AnyObject {
func userSuggestionCoordinatorBridge(_ coordinator: UserSuggestionCoordinatorBridge,
didRequestMentionForMember member: MXRoomMember,
textTrigger: String?)
}
@objcMembers
final class UserSuggestionCoordinatorBridge: NSObject {
@@ -25,16 +32,25 @@ final class UserSuggestionCoordinatorBridge: NSObject {
return _userSuggestionCoordinator as! UserSuggestionCoordinator
}
weak var delegate: UserSuggestionCoordinatorBridgeDelegate?
init(mediaManager: MXMediaManager, room: MXRoom) {
let parameters = UserSuggestionCoordinatorParameters(mediaManager: mediaManager, room: room)
if #available(iOS 14.0, *) {
self._userSuggestionCoordinator = UserSuggestionCoordinator(parameters: parameters)
let userSuggestionCoordinator = UserSuggestionCoordinator(parameters: parameters)
self._userSuggestionCoordinator = userSuggestionCoordinator
}
super.init()
if #available(iOS 14.0, *) {
userSuggestionCoordinator.delegate = self
}
}
func processPartialUserName(_ userName: String) {
func processTextMessage(_ textMessage: String) {
if #available(iOS 14.0, *) {
return self.userSuggestionCoordinator.processPartialUserName(userName)
return self.userSuggestionCoordinator.processTextMessage(textMessage)
}
}
@@ -46,3 +62,14 @@ final class UserSuggestionCoordinatorBridge: NSObject {
return nil
}
}
@available(iOS 14.0, *)
extension UserSuggestionCoordinatorBridge: UserSuggestionCoordinatorDelegate {
func userSuggestionCoordinator(_ coordinator: UserSuggestionCoordinator,
didRequestMentionForMember member: MXRoomMember,
textTrigger: String?) {
delegate?.userSuggestionCoordinatorBridge(self,
didRequestMentionForMember: member,
textTrigger: textTrigger)
}
}