diff --git a/RiotSwiftUI/Modules/Spaces/SpaceSelectorBottomSheet/Coordinator/SpaceSelectorBottomCoordinator.swift b/RiotSwiftUI/Modules/Spaces/SpaceSelectorBottomSheet/Coordinator/SpaceSelectorBottomCoordinator.swift index c649ed558..850d5525a 100644 --- a/RiotSwiftUI/Modules/Spaces/SpaceSelectorBottomSheet/Coordinator/SpaceSelectorBottomCoordinator.swift +++ b/RiotSwiftUI/Modules/Spaces/SpaceSelectorBottomSheet/Coordinator/SpaceSelectorBottomCoordinator.swift @@ -95,7 +95,8 @@ final class SpaceSelectorBottomSheetCoordinator: Coordinator, Presentable { let parameters = SpaceSelectorCoordinatorParameters(session: parameters.session, parentSpaceId: parentSpaceId, selectedSpaceId: parameters.selectedSpaceId, - showHomeSpace: parameters.showHomeSpace) + showHomeSpace: parameters.showHomeSpace, + showCancel: navigationRouter.modules.isEmpty) let coordinator = SpaceSelectorCoordinator(parameters: parameters) coordinator.completion = { [weak self] result in guard let self = self else { return } diff --git a/RiotSwiftUI/Modules/Spaces/SpaceSelectorBottomSheet/SpaceSelector/Coordinator/SpaceSelectorCoordinator.swift b/RiotSwiftUI/Modules/Spaces/SpaceSelectorBottomSheet/SpaceSelector/Coordinator/SpaceSelectorCoordinator.swift index 51766d9f5..5e655ecbd 100644 --- a/RiotSwiftUI/Modules/Spaces/SpaceSelectorBottomSheet/SpaceSelector/Coordinator/SpaceSelectorCoordinator.swift +++ b/RiotSwiftUI/Modules/Spaces/SpaceSelectorBottomSheet/SpaceSelector/Coordinator/SpaceSelectorCoordinator.swift @@ -22,15 +22,18 @@ struct SpaceSelectorCoordinatorParameters { let parentSpaceId: String? let selectedSpaceId: String? let showHomeSpace: Bool + let showCancel: Bool init(session: MXSession, parentSpaceId: String? = nil, selectedSpaceId: String? = nil, - showHomeSpace: Bool = false) { + showHomeSpace: Bool = false, + showCancel: Bool) { self.session = session self.parentSpaceId = parentSpaceId self.selectedSpaceId = selectedSpaceId self.showHomeSpace = showHomeSpace + self.showCancel = showCancel } } @@ -58,7 +61,7 @@ final class SpaceSelectorCoordinator: Coordinator, Presentable { init(parameters: SpaceSelectorCoordinatorParameters) { self.parameters = parameters let service = SpaceSelectorService(session: parameters.session, parentSpaceId: parameters.parentSpaceId, showHomeSpace: parameters.showHomeSpace, selectedSpaceId: parameters.selectedSpaceId) - let viewModel = SpaceSelectorViewModel.makeViewModel(service: service) + let viewModel = SpaceSelectorViewModel.makeViewModel(service: service, showCancel: parameters.showCancel) let view = SpaceSelector(viewModel: viewModel.context) .addDependency(AvatarService.instantiate(mediaManager: parameters.session.mediaManager)) self.viewModel = viewModel diff --git a/RiotSwiftUI/Modules/Spaces/SpaceSelectorBottomSheet/SpaceSelector/MockSpaceSelectorScreenState.swift b/RiotSwiftUI/Modules/Spaces/SpaceSelectorBottomSheet/SpaceSelector/MockSpaceSelectorScreenState.swift index 261c39a90..cedbbb1c2 100644 --- a/RiotSwiftUI/Modules/Spaces/SpaceSelectorBottomSheet/SpaceSelector/MockSpaceSelectorScreenState.swift +++ b/RiotSwiftUI/Modules/Spaces/SpaceSelectorBottomSheet/SpaceSelector/MockSpaceSelectorScreenState.swift @@ -48,7 +48,7 @@ enum MockSpaceSelectorScreenState: MockScreenState, CaseIterable { case .selection: service = MockSpaceSelectorService(selectedSpaceId: MockSpaceSelectorService.defaultSpaceList[2].id) } - let viewModel = SpaceSelectorViewModel.makeViewModel(service: service) + let viewModel = SpaceSelectorViewModel.makeViewModel(service: service, showCancel: true) // can simulate service and viewModel actions here if needs be. diff --git a/RiotSwiftUI/Modules/Spaces/SpaceSelectorBottomSheet/SpaceSelector/SpaceSelectorModels.swift b/RiotSwiftUI/Modules/Spaces/SpaceSelectorBottomSheet/SpaceSelector/SpaceSelectorModels.swift index ade9a78f0..829919958 100644 --- a/RiotSwiftUI/Modules/Spaces/SpaceSelectorBottomSheet/SpaceSelector/SpaceSelectorModels.swift +++ b/RiotSwiftUI/Modules/Spaces/SpaceSelectorBottomSheet/SpaceSelector/SpaceSelectorModels.swift @@ -96,6 +96,8 @@ struct SpaceSelectorViewState: BindableState { var selectedSpaceId: String? /// String to be displayed as title for the navigation bar var navigationTitle: String + /// `true` if the view should display the cancel button in the navigation bar + let showCancel: Bool } enum SpaceSelectorViewAction { diff --git a/RiotSwiftUI/Modules/Spaces/SpaceSelectorBottomSheet/SpaceSelector/SpaceSelectorViewModel.swift b/RiotSwiftUI/Modules/Spaces/SpaceSelectorBottomSheet/SpaceSelector/SpaceSelectorViewModel.swift index fe3abd531..15db1691f 100644 --- a/RiotSwiftUI/Modules/Spaces/SpaceSelectorBottomSheet/SpaceSelector/SpaceSelectorViewModel.swift +++ b/RiotSwiftUI/Modules/Spaces/SpaceSelectorBottomSheet/SpaceSelector/SpaceSelectorViewModel.swift @@ -35,20 +35,21 @@ class SpaceSelectorViewModel: SpaceSelectorViewModelType, SpaceSelectorViewModel // MARK: - Setup - static func makeViewModel(service: SpaceSelectorServiceProtocol) -> SpaceSelectorViewModelProtocol { - return SpaceSelectorViewModel(service: service) + static func makeViewModel(service: SpaceSelectorServiceProtocol, showCancel: Bool) -> SpaceSelectorViewModelProtocol { + return SpaceSelectorViewModel(service: service, showCancel: showCancel) } - private init(service: SpaceSelectorServiceProtocol) { + private init(service: SpaceSelectorServiceProtocol, showCancel: Bool) { self.service = service - super.init(initialViewState: Self.defaultState(service: service)) + super.init(initialViewState: Self.defaultState(service: service, showCancel: showCancel)) } - private static func defaultState(service: SpaceSelectorServiceProtocol) -> SpaceSelectorViewState { + private static func defaultState(service: SpaceSelectorServiceProtocol, showCancel: Bool) -> SpaceSelectorViewState { let parentName = service.parentSpaceNameSubject.value return SpaceSelectorViewState(items: service.spaceListSubject.value, selectedSpaceId: service.selectedSpaceId, - navigationTitle: parentName ?? VectorL10n.spaceSelectorTitle) + navigationTitle: parentName ?? VectorL10n.spaceSelectorTitle, + showCancel: showCancel) } // MARK: - Public diff --git a/RiotSwiftUI/Modules/Spaces/SpaceSelectorBottomSheet/SpaceSelector/SpaceSelectorViewModelProtocol.swift b/RiotSwiftUI/Modules/Spaces/SpaceSelectorBottomSheet/SpaceSelector/SpaceSelectorViewModelProtocol.swift index eb53edc93..79263720d 100644 --- a/RiotSwiftUI/Modules/Spaces/SpaceSelectorBottomSheet/SpaceSelector/SpaceSelectorViewModelProtocol.swift +++ b/RiotSwiftUI/Modules/Spaces/SpaceSelectorBottomSheet/SpaceSelector/SpaceSelectorViewModelProtocol.swift @@ -19,6 +19,6 @@ import Foundation protocol SpaceSelectorViewModelProtocol { var completion: ((SpaceSelectorViewModelResult) -> Void)? { get set } - static func makeViewModel(service: SpaceSelectorServiceProtocol) -> SpaceSelectorViewModelProtocol + static func makeViewModel(service: SpaceSelectorServiceProtocol, showCancel: Bool) -> SpaceSelectorViewModelProtocol var context: SpaceSelectorViewModelType.Context { get } } diff --git a/RiotSwiftUI/Modules/Spaces/SpaceSelectorBottomSheet/SpaceSelector/View/SpaceSelector.swift b/RiotSwiftUI/Modules/Spaces/SpaceSelectorBottomSheet/SpaceSelector/View/SpaceSelector.swift index 11ea3aa0e..d9cc21c77 100644 --- a/RiotSwiftUI/Modules/Spaces/SpaceSelectorBottomSheet/SpaceSelector/View/SpaceSelector.swift +++ b/RiotSwiftUI/Modules/Spaces/SpaceSelectorBottomSheet/SpaceSelector/View/SpaceSelector.swift @@ -59,8 +59,10 @@ struct SpaceSelector: View { } } ToolbarItem(placement: .cancellationAction) { - Button(VectorL10n.cancel) { - viewModel.send(viewAction: .cancel) + if viewModel.viewState.showCancel { + Button(VectorL10n.cancel) { + viewModel.send(viewAction: .cancel) + } } } } diff --git a/changelog.d/6572.bugfix b/changelog.d/6572.bugfix new file mode 100644 index 000000000..d0d247de4 --- /dev/null +++ b/changelog.d/6572.bugfix @@ -0,0 +1 @@ +App Layout: fixed Cancel and Back on Spaces Bottom Sheet \ No newline at end of file