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
9 changes: 0 additions & 9 deletions WooCommerce/Classes/CIAB/CIABEligibilityChecker.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,6 @@
import Foundation
import Yosemite

protocol CIABEligibilityCheckerProtocol {
var isCurrentSiteCIAB: Bool { get }

func isSiteCIAB(_ site: Site) -> Bool

func isFeatureSupportedForCurrentSite(_ feature: CIABAffectedFeature) -> Bool
func isFeatureSupported(_ feature: CIABAffectedFeature, for site: Site) -> Bool
}

final class CIABEligibilityChecker {
private let stores: StoresManager

Expand Down
12 changes: 12 additions & 0 deletions WooCommerce/Classes/CIAB/CIABEligibilityCheckerProtocol.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import Foundation
import Yosemite

/// periphery: ignore - Will be used in upcoming changes for app feature gating
protocol CIABEligibilityCheckerProtocol {
var isCurrentSiteCIAB: Bool { get }

func isSiteCIAB(_ site: Site) -> Bool

func isFeatureSupportedForCurrentSite(_ feature: CIABAffectedFeature) -> Bool
func isFeatureSupported(_ feature: CIABAffectedFeature, for site: Site) -> Bool
}
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ private extension WooShippingCreateLabelsView {
.padding(.horizontal)
}
.accessibilityHint(Localization.Accessibility.editButtonHint)
.renderedIf(viewModel.hasUnfulfilledShipments)
.renderedIf(viewModel.editSplitShipmentsOptionVisible)
}
.disabled(viewModel.isPurchasingLabel)
}
Expand All @@ -191,7 +191,7 @@ private extension WooShippingCreateLabelsView {
var mainView: some View {
ScrollView {
VStack(spacing: Layout.verticalSpacing) {
if viewModel.splitShipmentsAvailable {
if viewModel.splitShipmentsRowVisible {
WooShippingSplitShipmentsRow(onShowingSplitShipments: {
showingSplitShipments = true
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,12 +80,6 @@ final class WooShippingCreateLabelsViewModel: ObservableObject {
/// View model for split shipments.
private(set) var splitShipmentsViewModel: WooShippingSplitShipmentsViewModel

var splitShipmentsAvailable: Bool {
itemsDataSource.items.map(\.quantity).reduce(0, +) > 1 &&
shipments.count == 1 &&
canViewLabel == false
}

private(set) var shipmentDetailViewModels: [WooShippingShipmentDetailsViewModel] = []

var currentShipmentDetailsViewModel: WooShippingShipmentDetailsViewModel {
Expand Down Expand Up @@ -241,6 +235,10 @@ final class WooShippingCreateLabelsViewModel: ObservableObject {
)
}()

/// Provides checks for CIAB
/// Used to determine "Split Shipments" feature availability
private let siteCIABEligibilityChecker: CIABEligibilityCheckerProtocol

/// Initialize the view model with or without an existing shipping label.
init(order: Order,
preselection: WooShippingCreateLabelSelection? = nil,
Expand All @@ -249,10 +247,15 @@ final class WooShippingCreateLabelsViewModel: ObservableObject {
stores: StoresManager = ServiceLocator.stores,
storageManager: StorageManagerType = ServiceLocator.storageManager,
analytics: Analytics = ServiceLocator.analytics,
siteCIABEligibilityChecker: CIABEligibilityCheckerProtocol = CIABEligibilityChecker(),
initialNoticeDelay: RunLoop.SchedulerTimeType.Stride = .seconds(2),
onLabelPurchase: ((Bool) -> Void)? = nil) {
self.order = order
self.itemsDataSource = DefaultWooShippingItemsDataSource(order: order)
self.itemsDataSource = DefaultWooShippingItemsDataSource(
order: order,
storageManager: storageManager,
stores: stores
)
self.orderItems = WooShippingItemsViewModel(dataSource: itemsDataSource)
self.onLabelPurchase = onLabelPurchase
self.currencySettings = currencySettings
Expand All @@ -261,6 +264,7 @@ final class WooShippingCreateLabelsViewModel: ObservableObject {
self.stores = stores
self.storageManager = storageManager
self.analytics = analytics
self.siteCIABEligibilityChecker = siteCIABEligibilityChecker
self.shippingSettingsService = shippingSettingsService
self.weightUnit = shippingSettingsService.weightUnit ?? ""
self.dimensionsUnit = shippingSettingsService.dimensionUnit ?? ""
Expand Down Expand Up @@ -504,6 +508,33 @@ private extension WooShippingCreateLabelsViewModel {
}
}

// MARK: Split Shipments
// Accessors describing Split Shipments elements availability
extension WooShippingCreateLabelsViewModel {
private var hasMultipleProducts: Bool {
return itemsDataSource.items.map(\.quantity).reduce(0, +) > 1
}

private var splitShipmentsFeatureAvailable: Bool {
return siteCIABEligibilityChecker.isFeatureSupportedForCurrentSite(.splitShipments)
}

/// Determines if the "Edit split shipments" (pencil icon) is visible in top shipments bar.
var editSplitShipmentsOptionVisible: Bool {
splitShipmentsFeatureAvailable &&
hasMultipleProducts &&
hasUnfulfilledShipments
}

/// Determines if the "Split Shipments" row is visible above the "Products" section
var splitShipmentsRowVisible: Bool {
splitShipmentsFeatureAvailable &&
hasMultipleProducts &&
shipments.count == 1 &&
canViewLabel == false
}
}

// MARK: Utils
private extension WooShippingCreateLabelsViewModel {

Expand Down
8 changes: 8 additions & 0 deletions WooCommerce/WooCommerce.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -1245,6 +1245,8 @@
2DB8916E2E27F7840001B175 /* OrderListCellViewModel+Localizations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DB8916A2E27F6CE0001B175 /* OrderListCellViewModel+Localizations.swift */; };
2DCB54FA2E6AE8E100621F90 /* CIABEligibilityChecker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DCB54F92E6AE8D800621F90 /* CIABEligibilityChecker.swift */; };
2DCB54FC2E6AFE6A00621F90 /* CIABAffectedFeature.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DCB54FB2E6AFE6900621F90 /* CIABAffectedFeature.swift */; };
2DE9DDFB2E6EF4A500155408 /* MockCIABEligibilityChecker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DE9DDFA2E6EF4A300155408 /* MockCIABEligibilityChecker.swift */; };
2DE9DDFD2E6EF53C00155408 /* CIABEligibilityCheckerProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DE9DDFC2E6EF52E00155408 /* CIABEligibilityCheckerProtocol.swift */; };
2DF0D1BC2E2907C100F8995C /* MarkOrderAsReadUseCase+Woo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DB88DA32E27DD790001B175 /* MarkOrderAsReadUseCase+Woo.swift */; };
310D1B482734919E001D55B4 /* InPersonPaymentsLiveSiteInTestModeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 310D1B472734919E001D55B4 /* InPersonPaymentsLiveSiteInTestModeView.swift */; };
311237EE2714DA240033C44E /* CardPresentModalDisplayMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 311237ED2714DA240033C44E /* CardPresentModalDisplayMessage.swift */; };
Expand Down Expand Up @@ -4434,6 +4436,8 @@
2DB8916A2E27F6CE0001B175 /* OrderListCellViewModel+Localizations.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "OrderListCellViewModel+Localizations.swift"; sourceTree = "<group>"; };
2DCB54F92E6AE8D800621F90 /* CIABEligibilityChecker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CIABEligibilityChecker.swift; sourceTree = "<group>"; };
2DCB54FB2E6AFE6900621F90 /* CIABAffectedFeature.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CIABAffectedFeature.swift; sourceTree = "<group>"; };
2DE9DDFA2E6EF4A300155408 /* MockCIABEligibilityChecker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockCIABEligibilityChecker.swift; sourceTree = "<group>"; };
2DE9DDFC2E6EF52E00155408 /* CIABEligibilityCheckerProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CIABEligibilityCheckerProtocol.swift; sourceTree = "<group>"; };
310D1B472734919E001D55B4 /* InPersonPaymentsLiveSiteInTestModeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InPersonPaymentsLiveSiteInTestModeView.swift; sourceTree = "<group>"; };
311237ED2714DA240033C44E /* CardPresentModalDisplayMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardPresentModalDisplayMessage.swift; sourceTree = "<group>"; };
311D21E7264AEDB900102316 /* CardPresentModalScanningForReader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardPresentModalScanningForReader.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -9058,6 +9062,7 @@
2DCB54F82E6AE8C900621F90 /* CIAB */ = {
isa = PBXGroup;
children = (
2DE9DDFC2E6EF52E00155408 /* CIABEligibilityCheckerProtocol.swift */,
2DCB54FB2E6AFE6900621F90 /* CIABAffectedFeature.swift */,
2DCB54F92E6AE8D800621F90 /* CIABEligibilityChecker.swift */,
);
Expand Down Expand Up @@ -10093,6 +10098,7 @@
746791642108D853007CF1DC /* Mocks */ = {
isa = PBXGroup;
children = (
2DE9DDFA2E6EF4A300155408 /* MockCIABEligibilityChecker.swift */,
022900892E3019020028F6D7 /* MockPluginsService.swift */,
02F36C3F2E0130E900DD8CB6 /* MockPOSEligibilityService.swift */,
02B8E41A2DFBC33C001D01FD /* MockPOSEligibilityChecker.swift */,
Expand Down Expand Up @@ -16257,6 +16263,7 @@
B626C71B287659D60083820C /* CustomFieldsListView.swift in Sources */,
02ECD1E624FFB4E900735BE5 /* ProductFactory.swift in Sources */,
260520F42B87BA23005D5D59 /* WooAnalyticsEvent+ConnectivityTool.swift in Sources */,
2DE9DDFD2E6EF53C00155408 /* CIABEligibilityCheckerProtocol.swift in Sources */,
579CDEFF274D7E7900E8903D /* StoreStatsUsageTracksEventEmitter.swift in Sources */,
203163AD2C1C5C54001C96DA /* PointOfSaleCardPresentPaymentConnectingFailedNonRetryableAlertViewModel.swift in Sources */,
CEDBDA472B6BEF2E002047D4 /* AnalyticsWebReport.swift in Sources */,
Expand Down Expand Up @@ -17150,6 +17157,7 @@
EE8B421B2C04D18B0077C4E7 /* LastOrdersDashboardCardViewModelTests.swift in Sources */,
095A077E27CF486C007A61D2 /* ValueOneTableViewCellTests.swift in Sources */,
E17E3BF9266917C10009D977 /* CardPresentModalScanningFailedTests.swift in Sources */,
2DE9DDFB2E6EF4A500155408 /* MockCIABEligibilityChecker.swift in Sources */,
DE66C56F2978F24200DAA978 /* ApplicationPasswordDisabledViewModelTests.swift in Sources */,
EE1905942B62AE9100617C53 /* BlazeCreateCampaignIntroViewModelTests.swift in Sources */,
269098B627D2C09D001FEB07 /* ShippingInputTransformerTests.swift in Sources */,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import Foundation
import Yosemite
@testable import WooCommerce

final class MockCIABEligibilityChecker: CIABEligibilityCheckerProtocol {
private let mockedIsCurrentSiteCIAB: Bool
private let mockedCIABSites: [Site]
private let mockedCIABDisabledFeatures: [CIABAffectedFeature]

init(mockedIsCurrentSiteCIAB: Bool, mockedCIABSites: [Site] = [], mockedCIABDisabledFeatures: [CIABAffectedFeature] = CIABAffectedFeature.allCases) {
self.mockedIsCurrentSiteCIAB = mockedIsCurrentSiteCIAB
self.mockedCIABSites = mockedCIABSites
self.mockedCIABDisabledFeatures = mockedCIABDisabledFeatures
}

var isCurrentSiteCIAB: Bool {
return mockedIsCurrentSiteCIAB
}

func isSiteCIAB(_ site: Site) -> Bool {
return mockedCIABSites.contains(site)
}

func isFeatureSupportedForCurrentSite(_ feature: CIABAffectedFeature) -> Bool {
return !mockedCIABDisabledFeatures.contains(feature)
}

func isFeatureSupported(_ feature: CIABAffectedFeature, for site: Site) -> Bool {
return !mockedCIABDisabledFeatures.contains(feature) && mockedCIABSites.contains(site)
}
}
Loading