From 192a8d81563745eebb17940db4407f9c0e703fe1 Mon Sep 17 00:00:00 2001 From: Huong Do Date: Mon, 2 Jan 2023 17:50:09 +0800 Subject: [PATCH 1/4] Observe site publisher to update site title and URL --- .../ViewRelated/Hub Menu/HubMenu.swift | 2 +- .../Hub Menu/HubMenuViewModel.swift | 46 ++++++++++--------- 2 files changed, 26 insertions(+), 22 deletions(-) diff --git a/WooCommerce/Classes/ViewRelated/Hub Menu/HubMenu.swift b/WooCommerce/Classes/ViewRelated/Hub Menu/HubMenu.swift index abe036c6d92..17a293a86eb 100644 --- a/WooCommerce/Classes/ViewRelated/Hub Menu/HubMenu.swift +++ b/WooCommerce/Classes/ViewRelated/Hub Menu/HubMenu.swift @@ -34,7 +34,7 @@ struct HubMenu: View { VStack { TopBar(avatarURL: viewModel.avatarURL, storeTitle: viewModel.storeTitle, - storeURL: viewModel.storeURL.absoluteString) { + storeURL: viewModel.storeURL?.absoluteString) { viewModel.presentSwitchStore() } .padding([.leading, .trailing], Constants.padding) diff --git a/WooCommerce/Classes/ViewRelated/Hub Menu/HubMenuViewModel.swift b/WooCommerce/Classes/ViewRelated/Hub Menu/HubMenuViewModel.swift index e5e02f8b249..4c5ab6bb052 100644 --- a/WooCommerce/Classes/ViewRelated/Hub Menu/HubMenuViewModel.swift +++ b/WooCommerce/Classes/ViewRelated/Hub Menu/HubMenuViewModel.swift @@ -29,23 +29,11 @@ final class HubMenuViewModel: ObservableObject { return url } - var storeTitle: String { - stores.sessionManager.defaultSite?.name ?? Localization.myStore - } + @Published private(set) var storeTitle = Localization.myStore - var storeURL: URL { - guard let urlString = stores.sessionManager.defaultSite?.url, let url = URL(string: urlString) else { - return WooConstants.URLs.blog.asURL() - } - return url - } - var woocommerceAdminURL: URL { - guard let urlString = stores.sessionManager.defaultSite?.adminURL, let url = URL(string: urlString) else { - return stores.sessionManager.defaultSite?.adminURLWithFallback() ?? - WooConstants.URLs.blog.asURL() - } - return url - } + @Published private(set) var storeURL: URL? + + @Published private(set) var woocommerceAdminURL: URL? /// Child items /// @@ -61,8 +49,6 @@ final class HubMenuViewModel: ObservableObject { private var storePickerCoordinator: StorePickerCoordinator? - private var cancellables = Set() - init(siteID: Int64, navigationController: UINavigationController? = nil, featureFlagService: FeatureFlagService = ServiceLocator.featureFlagService, @@ -139,9 +125,27 @@ final class HubMenuViewModel: ObservableObject { } private func observeSiteForUIUpdates() { - stores.site.sink { site in - // This will be useful in the future for updating some info of the screen depending on the store site info - }.store(in: &cancellables) + stores.site + .compactMap { site -> URL? in + guard let urlString = site?.url, let url = URL(string: urlString) else { + return nil + } + return url + } + .assign(to: &$storeURL) + + stores.site + .compactMap { $0?.name } + .assign(to: &$storeTitle) + + stores.site + .compactMap { site -> URL? in + guard let urlString = site?.adminURL, let url = URL(string: urlString) else { + return site?.adminURLWithFallback() + } + return url + } + .assign(to: &$woocommerceAdminURL) } } From 424f8425b9d209b704e8c434eaec250685acbfc4 Mon Sep 17 00:00:00 2001 From: Huong Do Date: Mon, 2 Jan 2023 17:56:43 +0800 Subject: [PATCH 2/4] Hide switch store button if the user is authenticated without WPCom --- WooCommerce/Classes/ViewRelated/Hub Menu/HubMenu.swift | 5 ++++- .../Classes/ViewRelated/Hub Menu/HubMenuViewModel.swift | 5 +++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/WooCommerce/Classes/ViewRelated/Hub Menu/HubMenu.swift b/WooCommerce/Classes/ViewRelated/Hub Menu/HubMenu.swift index 17a293a86eb..5b16794981f 100644 --- a/WooCommerce/Classes/ViewRelated/Hub Menu/HubMenu.swift +++ b/WooCommerce/Classes/ViewRelated/Hub Menu/HubMenu.swift @@ -34,7 +34,8 @@ struct HubMenu: View { VStack { TopBar(avatarURL: viewModel.avatarURL, storeTitle: viewModel.storeTitle, - storeURL: viewModel.storeURL?.absoluteString) { + storeURL: viewModel.storeURL?.absoluteString, + switchStoreEnabled: viewModel.switchStoreEnabled) { viewModel.presentSwitchStore() } .padding([.leading, .trailing], Constants.padding) @@ -141,6 +142,7 @@ struct HubMenu: View { let avatarURL: URL? let storeTitle: String let storeURL: String? + let switchStoreEnabled: Bool var switchStoreHandler: (() -> Void)? @State private var showSettings = false @@ -177,6 +179,7 @@ struct HubMenu: View { } .linkStyle() .accessibilityIdentifier("switch-store-button") + .renderedIf(switchStoreEnabled) } Spacer() VStack { diff --git a/WooCommerce/Classes/ViewRelated/Hub Menu/HubMenuViewModel.swift b/WooCommerce/Classes/ViewRelated/Hub Menu/HubMenuViewModel.swift index 4c5ab6bb052..43def62af83 100644 --- a/WooCommerce/Classes/ViewRelated/Hub Menu/HubMenuViewModel.swift +++ b/WooCommerce/Classes/ViewRelated/Hub Menu/HubMenuViewModel.swift @@ -39,6 +39,10 @@ final class HubMenuViewModel: ObservableObject { /// @Published private(set) var menuElements: [HubMenuItem] = [] + /// The switch store button should be hidden when logged in with site credentials only. + /// + @Published private(set) var switchStoreEnabled = false + @Published var showingReviewDetail = false private let stores: StoresManager @@ -59,6 +63,7 @@ final class HubMenuViewModel: ObservableObject { self.stores = stores self.featureFlagService = featureFlagService self.generalAppSettings = generalAppSettings + self.switchStoreEnabled = stores.isAuthenticatedWithoutWPCom == false observeSiteForUIUpdates() } From 6da4c57ef95cf3ea4e8bd2b546485643b60a2c29 Mon Sep 17 00:00:00 2001 From: Huong Do Date: Mon, 2 Jan 2023 18:07:35 +0800 Subject: [PATCH 3/4] Keep Woo URL as the default store URL --- WooCommerce/Classes/ViewRelated/Hub Menu/HubMenu.swift | 2 +- .../Classes/ViewRelated/Hub Menu/HubMenuViewModel.swift | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/WooCommerce/Classes/ViewRelated/Hub Menu/HubMenu.swift b/WooCommerce/Classes/ViewRelated/Hub Menu/HubMenu.swift index 5b16794981f..9d2057af34d 100644 --- a/WooCommerce/Classes/ViewRelated/Hub Menu/HubMenu.swift +++ b/WooCommerce/Classes/ViewRelated/Hub Menu/HubMenu.swift @@ -34,7 +34,7 @@ struct HubMenu: View { VStack { TopBar(avatarURL: viewModel.avatarURL, storeTitle: viewModel.storeTitle, - storeURL: viewModel.storeURL?.absoluteString, + storeURL: viewModel.storeURL.absoluteString, switchStoreEnabled: viewModel.switchStoreEnabled) { viewModel.presentSwitchStore() } diff --git a/WooCommerce/Classes/ViewRelated/Hub Menu/HubMenuViewModel.swift b/WooCommerce/Classes/ViewRelated/Hub Menu/HubMenuViewModel.swift index 43def62af83..5318cedbe32 100644 --- a/WooCommerce/Classes/ViewRelated/Hub Menu/HubMenuViewModel.swift +++ b/WooCommerce/Classes/ViewRelated/Hub Menu/HubMenuViewModel.swift @@ -31,9 +31,9 @@ final class HubMenuViewModel: ObservableObject { @Published private(set) var storeTitle = Localization.myStore - @Published private(set) var storeURL: URL? + @Published private(set) var storeURL = WooConstants.URLs.blog.asURL() - @Published private(set) var woocommerceAdminURL: URL? + @Published private(set) var woocommerceAdminURL = WooConstants.URLs.blog.asURL() /// Child items /// From 41e08af821b16f9fc56c0cfb0de62d50366e294b Mon Sep 17 00:00:00 2001 From: Huong Do Date: Mon, 2 Jan 2023 18:07:46 +0800 Subject: [PATCH 4/4] Add tests for switchStoreEnabled --- .../HubMenu/HubMenuViewModelTests.swift | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/WooCommerce/WooCommerceTests/ViewRelated/HubMenu/HubMenuViewModelTests.swift b/WooCommerce/WooCommerceTests/ViewRelated/HubMenu/HubMenuViewModelTests.swift index 689c259fcaa..c252fc08021 100644 --- a/WooCommerce/WooCommerceTests/ViewRelated/HubMenu/HubMenuViewModelTests.swift +++ b/WooCommerce/WooCommerceTests/ViewRelated/HubMenu/HubMenuViewModelTests.swift @@ -271,6 +271,42 @@ final class HubMenuViewModelTests: XCTestCase { XCTAssertNotNil(viewModel.woocommerceAdminURL) XCTAssertEqual(viewModel.woocommerceAdminURL, try URL(string: expectedAdminURL)?.asURL()) } + + func test_switchStoreEnabled_returns_true_when_logged_in_with_wpcom() { + // Given + let sampleStoreURL = "https://testshop.com" + let sampleAdminURL = "" + let expectedAdminURL = "https://testshop.com/wp-admin" + let sessionManager = SessionManager.makeForTesting(authenticated: true, isWPCom: true) + let site = Site.fake().copy(url: sampleStoreURL, adminURL: sampleAdminURL) + sessionManager.defaultSite = site + let stores = MockStoresManager(sessionManager: sessionManager) + + // When + let viewModel = HubMenuViewModel(siteID: site.siteID, + stores: stores) + + // Then + XCTAssertTrue(viewModel.switchStoreEnabled) + } + + func test_switchStoreEnabled_returns_false_when_logged_in_with_wpcom() { + // Given + let sampleStoreURL = "https://testshop.com" + let sampleAdminURL = "" + let expectedAdminURL = "https://testshop.com/wp-admin" + let sessionManager = SessionManager.makeForTesting(authenticated: true, isWPCom: false) + let site = Site.fake().copy(url: sampleStoreURL, adminURL: sampleAdminURL) + sessionManager.defaultSite = site + let stores = MockStoresManager(sessionManager: sessionManager) + + // When + let viewModel = HubMenuViewModel(siteID: site.siteID, + stores: stores) + + // Then + XCTAssertFalse(viewModel.switchStoreEnabled) + } } private extension HubMenuViewModelTests {