From 7c0d2ef51ee36b17d0b4490d94bb09ef5803e2a3 Mon Sep 17 00:00:00 2001 From: Elizaveta Semenova Date: Thu, 13 Jul 2023 17:58:07 +0300 Subject: [PATCH 1/2] [PWN-9213] Fix banner tap processing logic --- .../AccountList/HomeAccountsViewModel.swift | 52 +++++++++--------- .../Subview/Empty/HomeEmptyViewModel.swift | 53 ++++++++++--------- 2 files changed, 56 insertions(+), 49 deletions(-) diff --git a/p2p_wallet/Scenes/Main/NewHome/Subview/AccountList/HomeAccountsViewModel.swift b/p2p_wallet/Scenes/Main/NewHome/Subview/AccountList/HomeAccountsViewModel.swift index 59d9722934..c2d95a865d 100644 --- a/p2p_wallet/Scenes/Main/NewHome/Subview/AccountList/HomeAccountsViewModel.swift +++ b/p2p_wallet/Scenes/Main/NewHome/Subview/AccountList/HomeAccountsViewModel.swift @@ -29,7 +29,7 @@ final class HomeAccountsViewModel: BaseViewModel, ObservableObject { let navigation: PassthroughSubject let bannerTapped = PassthroughSubject() - private let tappedBannerSubject = PassthroughSubject() + private let shouldOpenBankTransfer = PassthroughSubject() private let shouldShowErrorSubject = CurrentValueSubject(false) @Published private(set) var balance: String = "" @@ -312,16 +312,10 @@ private extension HomeAccountsViewModel { guard let bannerVisibility = self?.smallBannerVisibility else { return true } return bannerVisibility.id != $0.value.kycStatus.rawValue || !bannerVisibility.closed } - .map { [weak self] value -> HomeBannerParameters? in - guard let self else { return nil } - - if value.value.isIBANNotReady && !shouldShowErrorSubject.value { - self.shouldShowErrorSubject.send(true) - } - - return HomeBannerParameters( + .map { value in + HomeBannerParameters( status: value.value.kycStatus, - action: { [weak self] in self?.requestCloseBanner(for: value.value) }, + action: { [weak self] in self?.bannerTapped.send() }, isLoading: false, isSmallBanner: true ) @@ -329,39 +323,49 @@ private extension HomeAccountsViewModel { .assignWeak(to: \.smallBanner, on: self) .store(in: &subscriptions) - tappedBannerSubject + shouldOpenBankTransfer .withLatestFrom(bankTransferService.value.state) - .filter { !$0.isFetching } .receive(on: RunLoop.main) .sink{ [weak self] state in - guard let self else { return } if state.value.isIBANNotReady { - self.smallBanner?.button?.isLoading = true - self.shouldShowErrorSubject.send(false) - Task { - await self.bankTransferService.value.reload() - self.tappedBannerSubject.send(.bankTransfer) - } + self?.shouldShowErrorSubject.send(true) } else { - self.navigation.send(.bankTransfer) + self?.navigation.send(.bankTransfer) } } .store(in: &subscriptions) shouldShowErrorSubject .filter { $0 } - .receive(on: DispatchQueue.main) - .sink { [weak self] _ in self?.notificationService.showToast(title: "❌", text: L10n.somethingWentWrong) } + .receive(on: RunLoop.main) + .sink { [weak self] _ in + self?.notificationService.showToast(title: "❌", text: L10n.somethingWentWrong) + self?.shouldShowErrorSubject.send(false) + } .store(in: &subscriptions) bannerTapped .withLatestFrom(bankTransferService.value.state) - .sink { [weak self] state in self?.requestCloseBanner(for: state.value) } + .filter { !$0.isFetching } + .receive(on: RunLoop.main) + .sink { [weak self] state in + guard let self else { return } + self.requestCloseBanner(for: state.value) + + if state.value.isIBANNotReady { + self.smallBanner?.button?.isLoading = true + Task { + await self.bankTransferService.value.reload() + self.shouldOpenBankTransfer.send() + } + } else { + self.shouldOpenBankTransfer.send() + } + } .store(in: &subscriptions) } func requestCloseBanner(for data: UserData) { - tappedBannerSubject.send(.bankTransfer) switch data.kycStatus { case .onHold, .pendingReview: shouldCloseBanner = false diff --git a/p2p_wallet/Scenes/Main/NewHome/Subview/Empty/HomeEmptyViewModel.swift b/p2p_wallet/Scenes/Main/NewHome/Subview/Empty/HomeEmptyViewModel.swift index 8a7e8a84e6..784bdc8321 100644 --- a/p2p_wallet/Scenes/Main/NewHome/Subview/Empty/HomeEmptyViewModel.swift +++ b/p2p_wallet/Scenes/Main/NewHome/Subview/Empty/HomeEmptyViewModel.swift @@ -24,7 +24,7 @@ final class HomeEmptyViewModel: BaseViewModel, ObservableObject { @Published var popularCoins = [PopularCoin]() @Published var banner: HomeBannerParameters let bannerTapped = PassthroughSubject() - private let tappedBannerSubject = PassthroughSubject() + private let shouldOpenBankTransfer = PassthroughSubject() private let shouldShowErrorSubject = CurrentValueSubject(false) // MARK: - Initializer @@ -77,18 +77,10 @@ private extension HomeEmptyViewModel { .filter { !$0.isFetching } .filter { $0.value.userId != nil && $0.value.mobileVerified } .receive(on: RunLoop.main) - .compactMap { [weak self] value -> HomeBannerParameters? in - guard let self else { return nil } - - if value.value.isIBANNotReady && !shouldShowErrorSubject.value { - self.shouldShowErrorSubject.send(true) - } - - return HomeBannerParameters( + .map { value in + HomeBannerParameters( status: value.value.kycStatus, - action: { [weak self] in - self?.tappedBannerSubject.send(.bankTransfer) - }, + action: { [weak self] in self?.bannerTapped.send() }, isLoading: false, isSmallBanner: false ) @@ -96,33 +88,44 @@ private extension HomeEmptyViewModel { .assignWeak(to: \.banner, on: self) .store(in: &subscriptions) - tappedBannerSubject + shouldOpenBankTransfer .withLatestFrom(bankTransferService.state) - .filter { !$0.isFetching } .receive(on: RunLoop.main) .sink{ [weak self] state in - guard let self else { return } if state.value.isIBANNotReady { - self.banner.button?.isLoading = true - self.shouldShowErrorSubject.send(false) - Task { - await self.bankTransferService.reload() - self.tappedBannerSubject.send(.bankTransfer) - } + self?.shouldShowErrorSubject.send(true) } else { - self.navigation.send(.bankTransfer) + self?.navigation.send(.bankTransfer) } } .store(in: &subscriptions) shouldShowErrorSubject .filter { $0 } - .receive(on: DispatchQueue.main) - .sink { [weak self] _ in self?.notificationService.showToast(title: "❌", text: L10n.somethingWentWrong) } + .receive(on: RunLoop.main) + .sink { [weak self] _ in + self?.notificationService.showToast(title: "❌", text: L10n.somethingWentWrong) + self?.shouldShowErrorSubject.send(false) + } .store(in: &subscriptions) bannerTapped - .sink { [weak self] _ in self?.tappedBannerSubject.send(.bankTransfer) } + .withLatestFrom(bankTransferService.state) + .filter { !$0.isFetching } + .receive(on: RunLoop.main) + .sink { [weak self] state in + guard let self else { return } + + if state.value.isIBANNotReady { + self.banner.button?.isLoading = true + Task { + await self.bankTransferService.reload() + self.shouldOpenBankTransfer.send() + } + } else { + self.shouldOpenBankTransfer.send() + } + } .store(in: &subscriptions) } } From 7828efa16b3decc4c810b7edec8791da6679a271 Mon Sep 17 00:00:00 2001 From: Elizaveta Semenova Date: Fri, 14 Jul 2023 12:41:28 +0300 Subject: [PATCH 2/2] [PWN-9213] Fix processing and error states on topUp bottom sheet --- .../Topup/Actions/TopupActionsViewModel.swift | 42 ++++++++++--------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/p2p_wallet/Scenes/Main/Topup/Actions/TopupActionsViewModel.swift b/p2p_wallet/Scenes/Main/Topup/Actions/TopupActionsViewModel.swift index 26c755fa33..e67882327d 100644 --- a/p2p_wallet/Scenes/Main/Topup/Actions/TopupActionsViewModel.swift +++ b/p2p_wallet/Scenes/Main/Topup/Actions/TopupActionsViewModel.swift @@ -49,6 +49,7 @@ final class TopupActionsViewModel: BaseViewModel, ObservableObject { } private let tappedItemSubject = PassthroughSubject() + private let shouldCheckBankTransfer = PassthroughSubject() private let shouldShowErrorSubject = CurrentValueSubject(false) private var shouldShowBankTransfer: Bool { // always enabled for mocking @@ -80,31 +81,34 @@ final class TopupActionsViewModel: BaseViewModel, ObservableObject { } private func bindBankTransfer() { - // Sending tapped event only after BTS is in ready state - Publishers.CombineLatest( - bankTransferService.state, - tappedItemSubject.eraseToAnyPublisher() - ).filter { _, action in - action == .transfer - }.sinkAsync { [weak self] state, action in - await MainActor.run { - self?.setTransferLoadingState(isLoading: (state.status != .ready && !state.hasError) || !state.value.isIBANNotReady) + shouldCheckBankTransfer + .withLatestFrom(bankTransferService.state) + .filter({ !$0.isFetching }) + .receive(on: RunLoop.main) + .sink { [weak self] state in + self?.setTransferLoadingState(isLoading: false) // Toggling error if self?.shouldShowErrorSubject.value == false { self?.shouldShowErrorSubject.send(state.hasError || state.value.isIBANNotReady) } } - }.store(in: &subscriptions) - - tappedItemSubject.withLatestFrom(bankTransferService.state).filter({ state in - state.hasError || state.value.isIBANNotReady - }).sinkAsync { [weak self] state in - await MainActor.run { - self?.setTransferLoadingState(isLoading: true) - self?.shouldShowErrorSubject.send(false) + .store(in: &subscriptions) + + tappedItemSubject + .filter({ $0 == .transfer }) + .withLatestFrom(bankTransferService.state).filter({ state in + state.hasError || state.value.isIBANNotReady + }) + .sinkAsync { [weak self] state in + guard let self else { return } + await MainActor.run { + self.setTransferLoadingState(isLoading: true) + self.shouldShowErrorSubject.send(false) + } + await self.bankTransferService.reload() + self.shouldCheckBankTransfer.send(()) } - await self?.bankTransferService.reload() - }.store(in: &subscriptions) + .store(in: &subscriptions) shouldShowErrorSubject.filter { $0 }.sinkAsync { [weak self] value in await MainActor.run {