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:
ismailgulek 2022-09-20 11:40:32 +03:00 committed by GitHub
parent 28dc2d0319
commit f201ea59c9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 58 additions and 3 deletions

View file

@ -55,6 +55,7 @@ extern NSNotificationName const RoomGroupCallTileTappedNotification;
// The preview header
@property (weak, nonatomic, nullable) IBOutlet UIView *previewHeaderContainer;
@property (weak, nonatomic, nullable) IBOutlet NSLayoutConstraint *previewHeaderContainerHeightConstraint;
@property (weak, nonatomic, nullable) IBOutlet NSLayoutConstraint *userSuggestionContainerHeightConstraint;
// The jump to last unread banner
@property (weak, nonatomic, nullable) IBOutlet UIView *jumpToLastUnreadBannerContainer;

View file

@ -7757,6 +7757,16 @@ static CGSize kThreadListBarButtonItemImageSize;
[self mention:member];
}
- (void)userSuggestionCoordinatorBridge:(UserSuggestionCoordinatorBridge *)coordinator didUpdateViewHeight:(CGFloat)height
{
if (self.userSuggestionContainerHeightConstraint.constant != height)
{
self.userSuggestionContainerHeightConstraint.constant = height;
[self.view layoutIfNeeded];
}
}
#pragma mark - ThreadsCoordinatorBridgePresenterDelegate
- (void)threadsCoordinatorBridgePresenterDelegateDidComplete:(ThreadsCoordinatorBridgePresenter *)coordinatorBridgePresenter

View file

@ -32,6 +32,7 @@
<outlet property="scrollToBottomBadgeLabel" destination="QHs-rM-UU8" id="wk7-PQ-9Jm"/>
<outlet property="scrollToBottomButton" destination="Ih9-EU-BOU" id="Wwg-gS-Sfp"/>
<outlet property="topBannersStackView" destination="3z2-8P-wlg" id="uf5-gw-zWi"/>
<outlet property="userSuggestionContainerHeightConstraint" destination="1Cd-cT-gOr" id="au5-3q-r54"/>
<outlet property="userSuggestionContainerView" destination="oni-F4-X1U" id="0js-Ji-8Mm"/>
<outlet property="view" destination="iN0-l3-epB" id="ieV-u7-rXU"/>
</connections>
@ -171,7 +172,7 @@
<rect key="frame" x="0.0" y="626" width="375" height="0.0"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="height" placeholder="YES" id="1Cd-cT-gOr"/>
<constraint firstAttribute="height" id="1Cd-cT-gOr"/>
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="nLd-BP-JAE" userLabel="Room Input Toolbar Container">

View file

@ -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 {

View file

@ -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)
}
}

1
changelog.d/6734.bugfix Normal file
View file

@ -0,0 +1 @@
Room: Fix a composer crash after long unsent messages.