Removed sections

This commit is contained in:
Aleksandrs Proskurins
2022-10-20 12:07:55 +03:00
parent 1a0fbad7f2
commit b0d5accc2e
3 changed files with 48 additions and 56 deletions
@@ -33,21 +33,14 @@ enum UserOtherSessionsViewModelResult: Equatable {
struct UserOtherSessionsViewState: BindableState, Equatable {
var bindings: UserOtherSessionsBindings
let title: String
var sections: [UserOtherSessionsSection]
var header: UserOtherSessionsHeaderViewData
var emptyItemsTitle: String?
}
struct UserOtherSessionsBindings: Equatable {
var filter: UserOtherSessionsFilter
var isEditModeEnabled: Bool
}
enum UserOtherSessionsSection: Hashable, Identifiable {
var id: Self {
self
}
case sessionItems(header: UserOtherSessionsHeaderViewData, items: [UserSessionListItemViewData])
case emptySessionItems(header: UserOtherSessionsHeaderViewData, title: String)
var items: [UserSessionListItemViewData]
}
enum UserOtherSessionsViewAction {
@@ -27,9 +27,14 @@ class UserOtherSessionsViewModel: UserOtherSessionsViewModelType, UserOtherSessi
filter: UserOtherSessionsFilter,
title: String) {
self.sessionInfos = sessionInfos
super.init(initialViewState: UserOtherSessionsViewState(bindings: UserOtherSessionsBindings(filter: filter, isEditModeEnabled: false),
let bindings = UserOtherSessionsBindings(filter: filter,
isEditModeEnabled: false,
items: [])
let header = UserOtherSessionsHeaderViewDataFactory().createHeaderData(filter: filter)
super.init(initialViewState: UserOtherSessionsViewState(bindings: bindings,
title: title,
sections: []))
header: header,
emptyItemsTitle: nil))
updateViewState()
}
@@ -73,18 +78,16 @@ class UserOtherSessionsViewModel: UserOtherSessionsViewModelType, UserOtherSessi
// MARK: - Private
private func updateViewState() {
let sectionItems = createSectionItems(sessionInfos: sessionInfos, filter: state.bindings.filter)
let sectionHeader = createHeaderData(filter: state.bindings.filter)
if sectionItems.isEmpty {
state.sections = [.emptySessionItems(header: sectionHeader,
title: noSessionsTitle(filter: state.bindings.filter))]
} else {
state.sections = [.sessionItems(header: sectionHeader,
items: sectionItems)]
state.bindings.items = createItems(sessionInfos: sessionInfos, filter: state.bindings.filter)
state.header = UserOtherSessionsHeaderViewDataFactory().createHeaderData(filter: state.bindings.filter)
if state.bindings.items.isEmpty {
state.emptyItemsTitle = noSessionsTitle(filter: state.bindings.filter)
}
}
private func createSectionItems(sessionInfos: [UserSessionInfo], filter: UserOtherSessionsFilter) -> [UserSessionListItemViewData] {
private func createItems(sessionInfos: [UserSessionInfo], filter: UserOtherSessionsFilter) -> [UserSessionListItemViewData] {
filterSessions(sessionInfos: sessionInfos, by: filter)
.map {
UserSessionListItemViewDataFactory().create(from: $0,
@@ -106,7 +109,26 @@ class UserOtherSessionsViewModel: UserOtherSessionsViewModelType, UserOtherSessi
}
}
private func createHeaderData(filter: UserOtherSessionsFilter) -> UserOtherSessionsHeaderViewData {
private func noSessionsTitle(filter: UserOtherSessionsFilter) -> String {
switch filter {
case .all:
assertionFailure("The view is not intended to be displayed without any session")
return ""
case .verified:
return VectorL10n.userOtherSessionNoVerifiedSessions
case .unverified:
return VectorL10n.userOtherSessionNoUnverifiedSessions
case .inactive:
return VectorL10n.userOtherSessionNoInactiveSessions
}
}
}
struct UserOtherSessionsHeaderViewDataFactory {
func createHeaderData(filter: UserOtherSessionsFilter) -> UserOtherSessionsHeaderViewData {
switch filter {
case .all:
return UserOtherSessionsHeaderViewData(title: nil,
@@ -126,18 +148,4 @@ class UserOtherSessionsViewModel: UserOtherSessionsViewModelType, UserOtherSessi
iconName: Asset.Images.userOtherSessionsVerified.name)
}
}
private func noSessionsTitle(filter: UserOtherSessionsFilter) -> String {
switch filter {
case .all:
assertionFailure("The view is not intended to be displayed without any session")
return ""
case .verified:
return VectorL10n.userOtherSessionNoVerifiedSessions
case .unverified:
return VectorL10n.userOtherSessionNoUnverifiedSessions
case .inactive:
return VectorL10n.userOtherSessionNoInactiveSessions
}
}
}
@@ -23,13 +23,17 @@ struct UserOtherSessions: View {
var body: some View {
ScrollView {
ForEach(viewModel.viewState.sections) { section in
switch section {
case let .sessionItems(header: header, items: items):
createSessionItemsSection(header: header, items: items)
case let .emptySessionItems(header: header, title: title):
createEmptySessionsItemsSection(header: header, title: title)
SwiftUI.Section {
LazyVStack(spacing: 0) {
ForEach(viewModel.items) { viewData in
UserSessionListItem(viewData: viewData, isEditModeEnabled: viewModel.isEditModeEnabled, onBackgroundTap: { sessionId in
viewModel.send(viewAction: .userOtherSessionSelected(sessionId: sessionId))
})
}
}
.background(theme.colors.background)
} header: {
headerView(header: viewModel.viewState.header)
}
}
.background(theme.colors.system.ignoresSafeArea())
@@ -73,20 +77,7 @@ struct UserOtherSessions: View {
.accentColor(theme.colors.accent)
}
private func createSessionItemsSection(header: UserOtherSessionsHeaderViewData, items: [UserSessionListItemViewData]) -> some View {
SwiftUI.Section {
LazyVStack(spacing: 0) {
ForEach(items) { viewData in
UserSessionListItem(viewData: viewData, isEditModeEnabled: viewModel.isEditModeEnabled, onBackgroundTap: { sessionId in
viewModel.send(viewAction: .userOtherSessionSelected(sessionId: sessionId))
})
}
}
.background(theme.colors.background)
} header: {
headerView(header: header)
}
}
private func createEmptySessionsItemsSection(header: UserOtherSessionsHeaderViewData, title: String) -> some View {
SwiftUI.Section {