mirror of
https://gitlab.opencode.de/bwi/bundesmessenger/clients/bundesmessenger-ios.git
synced 2026-04-27 11:46:58 +02:00
Refactor PollHistoryViewState
This commit is contained in:
@@ -27,44 +27,18 @@ enum PollHistoryMode: CaseIterable {
|
||||
case past
|
||||
}
|
||||
|
||||
enum PollHistoryLoadingState {
|
||||
case idle
|
||||
case loading(firstLoad: Bool)
|
||||
}
|
||||
|
||||
extension PollHistoryLoadingState {
|
||||
var isLoadingOnLanding: Bool {
|
||||
switch self {
|
||||
case .idle:
|
||||
return false
|
||||
case .loading(let firstLoad):
|
||||
return firstLoad
|
||||
}
|
||||
}
|
||||
|
||||
var isLoading: Bool {
|
||||
switch self {
|
||||
case .idle:
|
||||
return false
|
||||
case .loading:
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct PollHistoryViewBindings {
|
||||
var mode: PollHistoryMode
|
||||
}
|
||||
|
||||
struct PollHistoryViewState: BindableState {
|
||||
init(mode: PollHistoryMode, loadingState: PollHistoryLoadingState) {
|
||||
init(mode: PollHistoryMode) {
|
||||
bindings = .init(mode: mode)
|
||||
self.loadingState = loadingState
|
||||
}
|
||||
|
||||
var bindings: PollHistoryViewBindings
|
||||
var loadingState: PollHistoryLoadingState
|
||||
var polls: [TimelinePollDetails] = []
|
||||
var isLoading = false
|
||||
var polls: [TimelinePollDetails]?
|
||||
}
|
||||
|
||||
enum PollHistoryViewAction {
|
||||
|
||||
@@ -23,12 +23,13 @@ final class PollHistoryViewModel: PollHistoryViewModelType, PollHistoryViewModel
|
||||
private let pollService: PollHistoryServiceProtocol
|
||||
private var polls: [TimelinePollDetails] = []
|
||||
private var subcriptions: Set<AnyCancellable> = .init()
|
||||
private var hasLoadedFirstGroup: Bool = false
|
||||
|
||||
var completion: ((PollHistoryViewModelResult) -> Void)?
|
||||
|
||||
init(mode: PollHistoryMode, pollService: PollHistoryServiceProtocol) {
|
||||
self.pollService = pollService
|
||||
super.init(initialViewState: PollHistoryViewState(mode: mode, loadingState: .loading(firstLoad: true)))
|
||||
super.init(initialViewState: PollHistoryViewState(mode: mode))
|
||||
}
|
||||
|
||||
// MARK: - Public
|
||||
@@ -39,7 +40,7 @@ final class PollHistoryViewModel: PollHistoryViewModelType, PollHistoryViewModel
|
||||
setupSubscriptions()
|
||||
pollService.next()
|
||||
case .segmentDidChange:
|
||||
updateState()
|
||||
updateViewState()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -52,7 +53,7 @@ private extension PollHistoryViewModel {
|
||||
.pollHistory
|
||||
.sink { [weak self] detail in
|
||||
self?.updatePolls(with: detail)
|
||||
self?.updateState()
|
||||
self?.updateViewState()
|
||||
}
|
||||
.store(in: &subcriptions)
|
||||
|
||||
@@ -63,20 +64,21 @@ private extension PollHistoryViewModel {
|
||||
}
|
||||
.store(in: &subcriptions)
|
||||
|
||||
pollService
|
||||
let didCompleteFirstFetch = pollService
|
||||
.isFetching
|
||||
.filter { $0 == false }
|
||||
.first()
|
||||
|
||||
didCompleteFirstFetch
|
||||
.sink { isFetching in
|
||||
self.state.loadingState = isFetching ? .loading(firstLoad: true) : .idle
|
||||
self.hasLoadedFirstGroup = true
|
||||
self.updateViewState()
|
||||
}
|
||||
.store(in: &subcriptions)
|
||||
|
||||
pollService
|
||||
.isFetching
|
||||
.dropFirst()
|
||||
.sink { isFetching in
|
||||
self.state.loadingState = isFetching ? .loading(firstLoad: false) : .idle
|
||||
}
|
||||
.weakAssign(to: \.state.isLoading, on: self)
|
||||
.store(in: &subcriptions)
|
||||
}
|
||||
|
||||
@@ -88,7 +90,11 @@ private extension PollHistoryViewModel {
|
||||
}
|
||||
}
|
||||
|
||||
func updateState() {
|
||||
func updateViewState() {
|
||||
guard hasLoadedFirstGroup else {
|
||||
return
|
||||
}
|
||||
|
||||
let renderedPolls: [TimelinePollDetails]
|
||||
|
||||
switch context.mode {
|
||||
|
||||
@@ -31,9 +31,9 @@ struct PollHistory: View {
|
||||
.frame(maxWidth: .infinity, alignment: .leading)
|
||||
.padding(.horizontal, 16)
|
||||
|
||||
if viewModel.viewState.loadingState.isLoadingOnLanding {
|
||||
if viewModel.viewState.polls == nil {
|
||||
loadingView
|
||||
} else if viewModel.viewState.loadingState.isLoading == false, viewModel.viewState.polls.isEmpty {
|
||||
} else if viewModel.viewState.polls?.isEmpty == true {
|
||||
noPollsView
|
||||
} else {
|
||||
pollListView
|
||||
@@ -55,7 +55,7 @@ struct PollHistory: View {
|
||||
private var pollListView: some View {
|
||||
ScrollView {
|
||||
LazyVStack(spacing: 32) {
|
||||
ForEach(viewModel.viewState.polls) { pollData in
|
||||
ForEach(viewModel.viewState.polls ?? []) { pollData in
|
||||
PollListItem(pollData: pollData)
|
||||
}
|
||||
.frame(maxWidth: .infinity, alignment: .leading)
|
||||
@@ -69,7 +69,7 @@ struct PollHistory: View {
|
||||
|
||||
private var loadMoreButton: some View {
|
||||
HStack(spacing: 8) {
|
||||
if viewModel.viewState.loadingState.isLoading {
|
||||
if viewModel.viewState.isLoading {
|
||||
ProgressView()
|
||||
.progressViewStyle(CircularProgressViewStyle())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user