From 9625440508bb03b030e09896025a5b36f6d2f36c Mon Sep 17 00:00:00 2001 From: Alfonso Grillo Date: Fri, 20 Jan 2023 12:25:52 +0100 Subject: [PATCH] Refine loading logic --- .../MockPollHistoryScreenState.swift | 4 +++ .../PollHistory/PollHistoryViewModel.swift | 4 +-- .../Service/Mock/MockPollHistoryService.swift | 5 ++-- .../Room/PollHistory/View/PollHistory.swift | 27 ++++++++++++++----- 4 files changed, 29 insertions(+), 11 deletions(-) diff --git a/RiotSwiftUI/Modules/Room/PollHistory/MockPollHistoryScreenState.swift b/RiotSwiftUI/Modules/Room/PollHistory/MockPollHistoryScreenState.swift index 65d393957..00b7880f8 100644 --- a/RiotSwiftUI/Modules/Room/PollHistory/MockPollHistoryScreenState.swift +++ b/RiotSwiftUI/Modules/Room/PollHistory/MockPollHistoryScreenState.swift @@ -27,6 +27,7 @@ enum MockPollHistoryScreenState: MockScreenState, CaseIterable { case past case activeEmpty case pastEmpty + case loading /// The associated screen var screenType: Any.Type { @@ -49,6 +50,9 @@ enum MockPollHistoryScreenState: MockScreenState, CaseIterable { case .pastEmpty: pollHistoryMode = .past pollService.pastPollsData = [] + case .loading: + pollHistoryMode = .active + pollService.fetchState = true } let viewModel = PollHistoryViewModel(mode: pollHistoryMode, pollService: pollService) diff --git a/RiotSwiftUI/Modules/Room/PollHistory/PollHistoryViewModel.swift b/RiotSwiftUI/Modules/Room/PollHistory/PollHistoryViewModel.swift index 30133dc13..de987925a 100644 --- a/RiotSwiftUI/Modules/Room/PollHistory/PollHistoryViewModel.swift +++ b/RiotSwiftUI/Modules/Room/PollHistory/PollHistoryViewModel.swift @@ -65,15 +65,15 @@ private extension PollHistoryViewModel { pollService .isFetching - .filter { $0 } .first() .sink { isFetching in - self.state.loadingState = .loading(firstLoad: true) + self.state.loadingState = isFetching ? .loading(firstLoad: true) : .idle } .store(in: &subcriptions) pollService .isFetching + .dropFirst() .sink { isFetching in self.state.loadingState = isFetching ? .loading(firstLoad: false) : .idle } diff --git a/RiotSwiftUI/Modules/Room/PollHistory/Service/Mock/MockPollHistoryService.swift b/RiotSwiftUI/Modules/Room/PollHistory/Service/Mock/MockPollHistoryService.swift index 80c2ac2dc..b8646c771 100644 --- a/RiotSwiftUI/Modules/Room/PollHistory/Service/Mock/MockPollHistoryService.swift +++ b/RiotSwiftUI/Modules/Room/PollHistory/Service/Mock/MockPollHistoryService.swift @@ -32,9 +32,10 @@ final class MockPollHistoryService: PollHistoryServiceProtocol { polls.send(poll) } } - + + var fetchState: Bool = false var isFetching: AnyPublisher { - Just(false).eraseToAnyPublisher() + Just(fetchState).eraseToAnyPublisher() } var activePollsData: [TimelinePollDetails] = (1..<10) diff --git a/RiotSwiftUI/Modules/Room/PollHistory/View/PollHistory.swift b/RiotSwiftUI/Modules/Room/PollHistory/View/PollHistory.swift index 916445cff..fc8d14fad 100644 --- a/RiotSwiftUI/Modules/Room/PollHistory/View/PollHistory.swift +++ b/RiotSwiftUI/Modules/Room/PollHistory/View/PollHistory.swift @@ -33,6 +33,8 @@ struct PollHistory: View { if viewModel.viewState.loadingState.isLoadingOnLanding { loadingView + } else if viewModel.viewState.loadingState.isLoading == false, viewModel.viewState.polls.isEmpty { + noPollsView } else { pollListView } @@ -57,19 +59,30 @@ struct PollHistory: View { PollListItem(pollData: pollData) } .frame(maxWidth: .infinity, alignment: .leading) - - Button { - #warning("handle action") - } label: { - Text("Load more polls") - } - .frame(maxWidth: .infinity, alignment: .leading) + + loadMoreButton } .padding(.top, 32) .padding(.horizontal, 16) } } + private var loadMoreButton: some View { + HStack(spacing: 8) { + if viewModel.viewState.loadingState.isLoading { + ProgressView() + .progressViewStyle(CircularProgressViewStyle()) + } + + Button { + #warning("handle action") + } label: { + Text("Load more polls") + } + } + .frame(maxWidth: .infinity, alignment: .leading) + } + private var noPollsView: some View { Text(viewModel.mode == .active ? VectorL10n.pollHistoryNoActivePollText : VectorL10n.pollHistoryNoPastPollText) .font(theme.fonts.body)