mirror of
https://gitlab.opencode.de/bwi/bundesmessenger/clients/bundesmessenger-ios.git
synced 2026-04-25 02:52:45 +02:00
Timeline composer layout loop fix (#6743)
* Publish suitable view height for user suggestions * Update container view height * Add changelog * Fix user suggestions layout for pre iOS 16
This commit is contained in:
+39
-2
@@ -17,9 +17,11 @@
|
||||
import Foundation
|
||||
import UIKit
|
||||
import SwiftUI
|
||||
import Combine
|
||||
|
||||
protocol UserSuggestionCoordinatorDelegate: AnyObject {
|
||||
func userSuggestionCoordinator(_ coordinator: UserSuggestionCoordinator, didRequestMentionForMember member: MXRoomMember, textTrigger: String?)
|
||||
func userSuggestionCoordinator(_ coordinator: UserSuggestionCoordinator, didUpdateViewHeight height: CGFloat)
|
||||
}
|
||||
|
||||
struct UserSuggestionCoordinatorParameters {
|
||||
@@ -35,10 +37,12 @@ final class UserSuggestionCoordinator: Coordinator, Presentable {
|
||||
|
||||
private let parameters: UserSuggestionCoordinatorParameters
|
||||
|
||||
private var userSuggestionHostingController: UIViewController
|
||||
private var userSuggestionHostingController: UIHostingController<AnyView>
|
||||
private var userSuggestionService: UserSuggestionServiceProtocol
|
||||
private var userSuggestionViewModel: UserSuggestionViewModelProtocol
|
||||
private var roomMemberProvider: UserSuggestionCoordinatorRoomMemberProvider
|
||||
|
||||
private var cancellables = Set<AnyCancellable>()
|
||||
|
||||
// MARK: Public
|
||||
|
||||
@@ -77,12 +81,18 @@ final class UserSuggestionCoordinator: Coordinator, Presentable {
|
||||
self.delegate?.userSuggestionCoordinator(self, didRequestMentionForMember: member, textTrigger: self.userSuggestionService.currentTextTrigger)
|
||||
}
|
||||
}
|
||||
|
||||
userSuggestionService.items.sink { [weak self] _ in
|
||||
guard let self = self else { return }
|
||||
self.delegate?.userSuggestionCoordinator(self,
|
||||
didUpdateViewHeight: self.calculateViewHeight())
|
||||
}.store(in: &cancellables)
|
||||
}
|
||||
|
||||
func processTextMessage(_ textMessage: String) {
|
||||
userSuggestionService.processTextMessage(textMessage)
|
||||
}
|
||||
|
||||
|
||||
// MARK: - Public
|
||||
func start() {
|
||||
|
||||
@@ -91,6 +101,33 @@ final class UserSuggestionCoordinator: Coordinator, Presentable {
|
||||
func toPresentable() -> UIViewController {
|
||||
return self.userSuggestionHostingController
|
||||
}
|
||||
|
||||
// MARK: - Private
|
||||
|
||||
private func calculateViewHeight() -> CGFloat {
|
||||
let viewModel = UserSuggestionViewModel(userSuggestionService: userSuggestionService)
|
||||
let view = UserSuggestionList(viewModel: viewModel.context)
|
||||
.addDependency(AvatarService.instantiate(mediaManager: parameters.mediaManager))
|
||||
|
||||
let controller = VectorHostingController(rootView: view)
|
||||
guard let view = controller.view else {
|
||||
return 0
|
||||
}
|
||||
view.isHidden = true
|
||||
|
||||
toPresentable().view.addSubview(view)
|
||||
controller.didMove(toParent: toPresentable())
|
||||
|
||||
view.setNeedsLayout()
|
||||
view.layoutIfNeeded()
|
||||
|
||||
let result = view.intrinsicContentSize.height
|
||||
|
||||
controller.didMove(toParent: nil)
|
||||
view.removeFromSuperview()
|
||||
|
||||
return result
|
||||
}
|
||||
}
|
||||
|
||||
private class UserSuggestionCoordinatorRoomMemberProvider: RoomMembersProviderProtocol {
|
||||
|
||||
+5
@@ -19,6 +19,7 @@ import Foundation
|
||||
@objc
|
||||
protocol UserSuggestionCoordinatorBridgeDelegate: AnyObject {
|
||||
func userSuggestionCoordinatorBridge(_ coordinator: UserSuggestionCoordinatorBridge, didRequestMentionForMember member: MXRoomMember, textTrigger: String?)
|
||||
func userSuggestionCoordinatorBridge(_ coordinator: UserSuggestionCoordinatorBridge, didUpdateViewHeight height: CGFloat)
|
||||
}
|
||||
|
||||
@objcMembers
|
||||
@@ -54,4 +55,8 @@ extension UserSuggestionCoordinatorBridge: UserSuggestionCoordinatorDelegate {
|
||||
func userSuggestionCoordinator(_ coordinator: UserSuggestionCoordinator, didRequestMentionForMember member: MXRoomMember, textTrigger: String?) {
|
||||
delegate?.userSuggestionCoordinatorBridge(self, didRequestMentionForMember: member, textTrigger: textTrigger)
|
||||
}
|
||||
|
||||
func userSuggestionCoordinator(_ coordinator: UserSuggestionCoordinator, didUpdateViewHeight height: CGFloat) {
|
||||
delegate?.userSuggestionCoordinatorBridge(self, didUpdateViewHeight: height)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user