App Layout: Cancel and Back on Spaces Bottom Sheet

- Fixed
This commit is contained in:
Gil Eluard
2022-08-17 17:22:03 +02:00
parent 53e17f9c5e
commit 55191b3a7c
8 changed files with 23 additions and 13 deletions
@@ -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
@@ -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.
@@ -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 {
@@ -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
@@ -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 }
}
@@ -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)
}
}
}
}