mirror of
https://gitlab.opencode.de/bwi/bundesmessenger/clients/bundesmessenger-ios.git
synced 2026-04-17 15:09:31 +02:00
Update environment object setup and view model context wrapping to restore SwiftUI UI tests
This commit is contained in:
@@ -5154,11 +5154,16 @@ static CGSize kThreadListBarButtonItemImageSize;
|
||||
[self.userSuggestionCoordinator processSuggestionPattern:suggestionPattern];
|
||||
}
|
||||
|
||||
- (UserSuggestionSharedContext *)userSuggestionContext
|
||||
- (UserSuggestionViewModelContextWrapper *)userSuggestionContext
|
||||
{
|
||||
return [self.userSuggestionCoordinator sharedContext];
|
||||
}
|
||||
|
||||
- (MXMediaManager *)mediaManager
|
||||
{
|
||||
return self.roomDataSource.mxSession.mediaManager;
|
||||
}
|
||||
|
||||
- (void)roomInputToolbarViewDidOpenActionMenu:(RoomInputToolbarView*)toolbarView
|
||||
{
|
||||
// Consider opening the action menu as beginning to type and share encryption keys if requested.
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
@class RoomInputToolbarView;
|
||||
@class LinkActionWrapper;
|
||||
@class SuggestionPatternWrapper;
|
||||
@class UserSuggestionSharedContext;
|
||||
@class UserSuggestionViewModelContextWrapper;
|
||||
|
||||
/**
|
||||
Destination of the message in the composer
|
||||
@@ -84,7 +84,9 @@ typedef NS_ENUM(NSUInteger, RoomInputToolbarViewSendMode)
|
||||
|
||||
- (void)didDetectTextPattern: (SuggestionPatternWrapper *)suggestionPattern;
|
||||
|
||||
- (UserSuggestionSharedContext *)userSuggestionContext;
|
||||
- (UserSuggestionViewModelContextWrapper *)userSuggestionContext;
|
||||
|
||||
- (MXMediaManager *)mediaManager;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@@ -219,7 +219,7 @@ class WysiwygInputToolbarView: MXKRoomInputToolbarView, NibLoadable, HtmlRoomInp
|
||||
let composer = Composer(
|
||||
viewModel: viewModel.context,
|
||||
wysiwygViewModel: wysiwygViewModel,
|
||||
userSuggestionSharedContext: toolbarViewDelegate.userSuggestionContext(),
|
||||
userSuggestionSharedContext: toolbarViewDelegate.userSuggestionContext().context,
|
||||
resizeAnimationDuration: Double(kResizeComposerAnimationDuration),
|
||||
sendMessageAction: { [weak self] content in
|
||||
guard let self = self else { return }
|
||||
@@ -227,10 +227,12 @@ class WysiwygInputToolbarView: MXKRoomInputToolbarView, NibLoadable, HtmlRoomInp
|
||||
}, showSendMediaActions: { [weak self] in
|
||||
guard let self = self else { return }
|
||||
self.showSendMediaActions()
|
||||
}).introspectTextView { [weak self] textView in
|
||||
guard let self = self else { return }
|
||||
textView.inputAccessoryView = self.inputAccessoryViewForKeyboard
|
||||
}
|
||||
})
|
||||
.introspectTextView { [weak self] textView in
|
||||
guard let self = self else { return }
|
||||
textView.inputAccessoryView = self.inputAccessoryViewForKeyboard
|
||||
}
|
||||
.environmentObject(AvatarViewModel(avatarService: AvatarService(mediaManager: toolbarViewDelegate.mediaManager())))
|
||||
|
||||
hostingViewController = VectorHostingController(rootView: composer)
|
||||
hostingViewController.publishHeightChanges = true
|
||||
|
||||
@@ -30,8 +30,6 @@ enum MockComposerScreenState: MockScreenState, CaseIterable {
|
||||
var screenView: ([Any], AnyView) {
|
||||
let viewModel: ComposerViewModel
|
||||
let userSuggestionViewModel = MockUserSuggestionViewModel(initialViewState: UserSuggestionViewState(items: []))
|
||||
let userSuggestionSharedContext = UserSuggestionSharedContext(context: userSuggestionViewModel.context,
|
||||
mediaManager: MXMediaManager())
|
||||
let bindings = ComposerBindings(focused: false)
|
||||
|
||||
switch self {
|
||||
@@ -69,7 +67,7 @@ enum MockComposerScreenState: MockScreenState, CaseIterable {
|
||||
Spacer()
|
||||
Composer(viewModel: viewModel.context,
|
||||
wysiwygViewModel: wysiwygviewModel,
|
||||
userSuggestionSharedContext: userSuggestionSharedContext,
|
||||
userSuggestionSharedContext: userSuggestionViewModel.context,
|
||||
resizeAnimationDuration: 0.1,
|
||||
sendMessageAction: { _ in },
|
||||
showSendMediaActions: { })
|
||||
|
||||
@@ -23,7 +23,7 @@ struct Composer: View {
|
||||
// MARK: Private
|
||||
@ObservedObject private var viewModel: ComposerViewModelType.Context
|
||||
@ObservedObject private var wysiwygViewModel: WysiwygComposerViewModel
|
||||
private let userSuggestionSharedContext: UserSuggestionSharedContext
|
||||
private let userSuggestionSharedContext: UserSuggestionViewModelType.Context
|
||||
private let resizeAnimationDuration: Double
|
||||
|
||||
private let sendMessageAction: (WysiwygComposerContent) -> Void
|
||||
@@ -223,7 +223,7 @@ struct Composer: View {
|
||||
init(
|
||||
viewModel: ComposerViewModelType.Context,
|
||||
wysiwygViewModel: WysiwygComposerViewModel,
|
||||
userSuggestionSharedContext: UserSuggestionSharedContext,
|
||||
userSuggestionSharedContext: UserSuggestionViewModelType.Context,
|
||||
resizeAnimationDuration: Double,
|
||||
sendMessageAction: @escaping (WysiwygComposerContent) -> Void,
|
||||
showSendMediaActions: @escaping () -> Void) {
|
||||
@@ -256,8 +256,7 @@ struct Composer: View {
|
||||
}
|
||||
}
|
||||
if wysiwygViewModel.maximised {
|
||||
UserSuggestionList(viewModel: userSuggestionSharedContext.context, showBackgroundShadow: false)
|
||||
.environmentObject(AvatarViewModel(avatarService: AvatarService(mediaManager: userSuggestionSharedContext.mediaManager)))
|
||||
UserSuggestionList(viewModel: userSuggestionSharedContext, showBackgroundShadow: false)
|
||||
}
|
||||
}
|
||||
.frame(height: composerHeight)
|
||||
|
||||
@@ -30,16 +30,12 @@ struct UserSuggestionCoordinatorParameters {
|
||||
let room: MXRoom
|
||||
}
|
||||
|
||||
/// Defines a shared context providing the ability to use a single `UserSuggestionViewModel` for multiple
|
||||
/// `UserSuggestionList` e.g. the list component can then be displayed seemlessly in both `RoomViewController`
|
||||
/// UIKit hosted context, and in Rich-Text-Editor's SwiftUI fullscreen mode, without need to reload data.
|
||||
final class UserSuggestionSharedContext: NSObject {
|
||||
/// Wrapper around `UserSuggestionViewModelType.Context` to pass it through obj-c.
|
||||
final class UserSuggestionViewModelContextWrapper: NSObject {
|
||||
let context: UserSuggestionViewModelType.Context
|
||||
let mediaManager: MXMediaManager
|
||||
|
||||
init(context: UserSuggestionViewModelType.Context, mediaManager: MXMediaManager) {
|
||||
init(context: UserSuggestionViewModelType.Context) {
|
||||
self.context = context
|
||||
self.mediaManager = mediaManager
|
||||
}
|
||||
}
|
||||
|
||||
@@ -118,9 +114,8 @@ final class UserSuggestionCoordinator: Coordinator, Presentable {
|
||||
userSuggestionHostingController
|
||||
}
|
||||
|
||||
func sharedContext() -> UserSuggestionSharedContext {
|
||||
UserSuggestionSharedContext(context: userSuggestionViewModel.sharedContext,
|
||||
mediaManager: parameters.mediaManager)
|
||||
func sharedContext() -> UserSuggestionViewModelContextWrapper {
|
||||
UserSuggestionViewModelContextWrapper(context: userSuggestionViewModel.sharedContext)
|
||||
}
|
||||
|
||||
// MARK: - Private
|
||||
|
||||
@@ -53,7 +53,7 @@ final class UserSuggestionCoordinatorBridge: NSObject {
|
||||
userSuggestionCoordinator.toPresentable()
|
||||
}
|
||||
|
||||
func sharedContext() -> UserSuggestionSharedContext {
|
||||
func sharedContext() -> UserSuggestionViewModelContextWrapper {
|
||||
userSuggestionCoordinator.sharedContext()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,6 +17,9 @@
|
||||
import Foundation
|
||||
|
||||
protocol UserSuggestionViewModelProtocol {
|
||||
/// Defines a shared context providing the ability to use a single `UserSuggestionViewModel` for multiple
|
||||
/// `UserSuggestionList` e.g. the list component can then be displayed seemlessly in both `RoomViewController`
|
||||
/// UIKit hosted context, and in Rich-Text-Editor's SwiftUI fullscreen mode, without need to reload the data.
|
||||
var sharedContext: UserSuggestionViewModelType.Context { get }
|
||||
var completion: ((UserSuggestionViewModelResult) -> Void)? { get set }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user