Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion WooCommerce/Classes/ViewRelated/Hub Menu/HubMenu.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -177,6 +179,7 @@ struct HubMenu: View {
}
.linkStyle()
.accessibilityIdentifier("switch-store-button")
.renderedIf(switchStoreEnabled)
}
Spacer()
VStack {
Expand Down
51 changes: 30 additions & 21 deletions WooCommerce/Classes/ViewRelated/Hub Menu/HubMenuViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -29,28 +29,20 @@ 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 = WooConstants.URLs.blog.asURL()

@Published private(set) var woocommerceAdminURL = WooConstants.URLs.blog.asURL()

/// Child items
///
@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
Expand All @@ -61,8 +53,6 @@ final class HubMenuViewModel: ObservableObject {

private var storePickerCoordinator: StorePickerCoordinator?

private var cancellables = Set<AnyCancellable>()

init(siteID: Int64,
navigationController: UINavigationController? = nil,
featureFlagService: FeatureFlagService = ServiceLocator.featureFlagService,
Expand All @@ -73,6 +63,7 @@ final class HubMenuViewModel: ObservableObject {
self.stores = stores
self.featureFlagService = featureFlagService
self.generalAppSettings = generalAppSettings
self.switchStoreEnabled = stores.isAuthenticatedWithoutWPCom == false
observeSiteForUIUpdates()
}

Expand Down Expand Up @@ -139,9 +130,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)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for adding tests. ❤️

// 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 {
Expand Down