Skip to content

Commit

Permalink
[Woo POS] Simplify CartViewModel (#14482)
Browse files Browse the repository at this point in the history
  • Loading branch information
joshheald authored Nov 22, 2024
2 parents b30914c + ab3af49 commit 60b8cab
Show file tree
Hide file tree
Showing 10 changed files with 21 additions and 195 deletions.
28 changes: 4 additions & 24 deletions WooCommerce/Classes/POS/Presentation/CartView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,8 @@ import protocol Yosemite.POSItem

struct CartView: View {
@EnvironmentObject private var posModel: PointOfSaleAggregateModel
private let viewModel = CartViewModel()

@ObservedObject private var viewModel: PointOfSaleDashboardViewModel
@ObservedObject private var cartViewModel: CartViewModel
@Environment(\.floatingControlAreaSize) var floatingControlAreaSize: CGSize
@Environment(\.dynamicTypeSize) var dynamicTypeSize
@Environment(\.colorScheme) var colorScheme
Expand All @@ -16,11 +15,6 @@ struct CartView: View {
posModel.cart.isNotEmpty && offSetPosition < 0
}

init(viewModel: PointOfSaleDashboardViewModel, cartViewModel: CartViewModel) {
self.viewModel = viewModel
self.cartViewModel = cartViewModel
}

var body: some View {
VStack {
DynamicHStack(spacing: Constants.cartHeaderSpacing) {
Expand All @@ -37,7 +31,7 @@ struct CartView: View {

Spacer()

if let itemsInCartLabel = cartViewModel.itemsInCartLabel {
if let itemsInCartLabel = viewModel.itemsInCartLabel(for: posModel.cart.count) {
Text(itemsInCartLabel)
.font(Constants.itemsFont)
.foregroundColor(Color.posSecondaryText)
Expand Down Expand Up @@ -150,7 +144,7 @@ private extension CartView {
}

var shouldPreventCartEditing: Bool {
cartViewModel.shouldPreventCartEditing(
viewModel.shouldPreventCartEditing(
orderState: posModel.orderState,
paymentState: posModel.paymentState)
}
Expand Down Expand Up @@ -251,21 +245,7 @@ private extension CartView {
}

#if DEBUG
import Combine
import class WooFoundation.MockAnalyticsPreview
import class WooFoundation.MockAnalyticsProviderPreview

#Preview {
let posModel = PointOfSaleAggregateModel(
itemProvider: POSItemProviderPreview(),
cardPresentPaymentService: CardPresentPaymentPreviewService(),
orderService: POSOrderPreviewService())
// TODO:
// Simplify this by mocking `CartViewModel`
let cartViewModel = CartViewModel(posModel: posModel)
let dashboardViewModel = PointOfSaleDashboardViewModel(posModel: posModel,
cartViewModel: cartViewModel,
connectivityObserver: POSConnectivityObserverPreview())
CartView(viewModel: dashboardViewModel, cartViewModel: cartViewModel)
CartView()
}
#endif
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,9 @@ import SwiftUI
struct PointOfSaleDashboardView: View {
@EnvironmentObject private var posModel: PointOfSaleAggregateModel
@ObservedObject private var viewModel: PointOfSaleDashboardViewModel
@ObservedObject private var cartViewModel: CartViewModel

init(viewModel: PointOfSaleDashboardViewModel,
cartViewModel: CartViewModel) {
init(viewModel: PointOfSaleDashboardViewModel) {
self.viewModel = viewModel
self.cartViewModel = cartViewModel
}

@State private var floatingSize: CGSize = .zero
Expand Down Expand Up @@ -83,13 +80,13 @@ struct PointOfSaleDashboardView: View {
GeometryReader { geometry in
HStack {
if posModel.orderStage == .building {
productListView
ItemListView()
.accessibilitySortPriority(2)
.transition(.move(edge: .leading))
}

if !posModel.paymentState.shownFullScreen {
cartView
CartView()
.accessibilitySortPriority(1)
.frame(width: geometry.size.width * Constants.cartWidth)
.ignoresSafeArea(edges: .bottom)
Expand Down Expand Up @@ -170,17 +167,6 @@ private extension PointOfSaleDashboardView {
}
}

/// Helpers to generate all Dashboard subviews
private extension PointOfSaleDashboardView {
var cartView: some View {
CartView(viewModel: viewModel, cartViewModel: cartViewModel)
}

var productListView: some View {
ItemListView()
}
}

#if DEBUG
import class WooFoundation.MockAnalyticsPreview
import class WooFoundation.MockAnalyticsProviderPreview
Expand All @@ -190,14 +176,11 @@ import class WooFoundation.MockAnalyticsProviderPreview
itemProvider: POSItemProviderPreview(),
cardPresentPaymentService: CardPresentPaymentPreviewService(),
orderService: POSOrderPreviewService())
let cartVM = CartViewModel(posModel: posModel)
let posVM = PointOfSaleDashboardViewModel(posModel: posModel,
cartViewModel: cartVM,
connectivityObserver: POSConnectivityObserverPreview())

return NavigationStack {
PointOfSaleDashboardView(viewModel: posVM,
cartViewModel: cartVM)
PointOfSaleDashboardView(viewModel: posVM)
}
}
#endif
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import protocol WooFoundation.Analytics
struct PointOfSaleEntryPointView: View {
@StateObject private var posModel: PointOfSaleAggregateModel
@StateObject private var viewModel: PointOfSaleDashboardViewModel
@StateObject private var cartViewModel: CartViewModel
@StateObject private var posModalManager = POSModalManager()

private let onPointOfSaleModeActiveStateChange: ((Bool) -> Void)
Expand All @@ -23,20 +22,16 @@ struct PointOfSaleEntryPointView: View {
let posModel = PointOfSaleAggregateModel(itemProvider: itemProvider,
cardPresentPaymentService: cardPresentPaymentService,
orderService: orderService)
let cartViewModel = CartViewModel(posModel: posModel)

self._posModel = StateObject(wrappedValue: posModel)
self._viewModel = StateObject(wrappedValue: PointOfSaleDashboardViewModel(
posModel: posModel,
cartViewModel: cartViewModel,
connectivityObserver: ServiceLocator.connectivityObserver)
)
self._cartViewModel = StateObject(wrappedValue: cartViewModel)
}

var body: some View {
PointOfSaleDashboardView(viewModel: viewModel,
cartViewModel: cartViewModel)
PointOfSaleDashboardView(viewModel: viewModel)
.environmentObject(posModalManager)
.environmentObject(posModel)
.onAppear {
Expand Down
13 changes: 2 additions & 11 deletions WooCommerce/Classes/POS/ViewModels/CartViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,8 @@ import SwiftUI
import Combine
import protocol Yosemite.POSItem

final class CartViewModel: CartViewModelProtocol {
let posModel: PointOfSaleAggregateModel

init(posModel: PointOfSaleAggregateModel) {
self.posModel = posModel
}

var itemsInCartLabel: String? {
let itemsCount = posModel.cart.count
final class CartViewModel {
func itemsInCartLabel(for itemsCount: Int) -> String? {
guard itemsCount > 0 else {
return nil
}
Expand All @@ -28,8 +21,6 @@ final class CartViewModel: CartViewModelProtocol {
}
}



private extension PointOfSalePaymentState {
var allowsCartEditing: Bool {
switch self {
Expand Down
10 changes: 0 additions & 10 deletions WooCommerce/Classes/POS/ViewModels/CartViewModelProtocol.swift

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@ import struct Yosemite.POSCartItem
import struct Yosemite.Order

final class PointOfSaleDashboardViewModel: ObservableObject {
let cartViewModel: any CartViewModelProtocol

@ObservedObject var posModel: PointOfSaleAggregateModel

private let connectivityObserver: ConnectivityObserver
Expand All @@ -20,10 +18,8 @@ final class PointOfSaleDashboardViewModel: ObservableObject {
private var cancellables: Set<AnyCancellable> = []

init(posModel: PointOfSaleAggregateModel,
cartViewModel: any CartViewModelProtocol,
connectivityObserver: ConnectivityObserver) {
self.posModel = posModel
self.cartViewModel = cartViewModel
self.connectivityObserver = connectivityObserver

observeConnectivity()
Expand Down
8 changes: 0 additions & 8 deletions WooCommerce/WooCommerce.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@
015D99AA2C58C780001D7186 /* PointOfSaleCardPresentPaymentLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 015D99A92C58C780001D7186 /* PointOfSaleCardPresentPaymentLayout.swift */; };
01620C4E2C5394B200D3EA2F /* POSProgressViewStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01620C4D2C5394B200D3EA2F /* POSProgressViewStyle.swift */; };
01664F9E2C50E685007CB5DD /* POSFontStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01664F9D2C50E685007CB5DD /* POSFontStyle.swift */; };
016BCAFF2C4F907F009D8367 /* CartViewModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 016BCAFE2C4F907F009D8367 /* CartViewModelProtocol.swift */; };
016C6B972C74AB17000D86FD /* POSConnectivityView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 016C6B962C74AB17000D86FD /* POSConnectivityView.swift */; };
0174DDBB2CE5FD60005D20CA /* ReceiptEmailViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0174DDBA2CE5FD5D005D20CA /* ReceiptEmailViewModel.swift */; };
0174DDBF2CE600C5005D20CA /* ReceiptEmailViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0174DDBE2CE600C0005D20CA /* ReceiptEmailViewModelTests.swift */; };
Expand Down Expand Up @@ -2061,7 +2060,6 @@
C0A37CB8282957EB00E0826D /* orders_3337_add_customer_details.json in Resources */ = {isa = PBXBuildFile; fileRef = C0A37CB7282957EB00E0826D /* orders_3337_add_customer_details.json */; };
C0CE1F84282AB1590019138E /* countries.json in Resources */ = {isa = PBXBuildFile; fileRef = C0CE1F83282AB1590019138E /* countries.json */; };
C7533D1E2C1E38E0002EBAE7 /* OrderSearchUICommandTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7533D1D2C1E38E0002EBAE7 /* OrderSearchUICommandTests.swift */; };
C7F746C32C485B3B0023ADD0 /* MockCartViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7F746C22C485B3B0023ADD0 /* MockCartViewModel.swift */; };
CC0324A3263AD9F40056C6B7 /* MockShippingLabelAccountSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC0324A2263AD9F40056C6B7 /* MockShippingLabelAccountSettings.swift */; };
CC04918D292BB74500F719D8 /* StatsDataTextFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC04918C292BB74500F719D8 /* StatsDataTextFormatter.swift */; };
CC04918F292BD6AC00F719D8 /* StatsDataTextFormatterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC04918E292BD6AC00F719D8 /* StatsDataTextFormatterTests.swift */; };
Expand Down Expand Up @@ -3148,7 +3146,6 @@
015D99A92C58C780001D7186 /* PointOfSaleCardPresentPaymentLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PointOfSaleCardPresentPaymentLayout.swift; sourceTree = "<group>"; };
01620C4D2C5394B200D3EA2F /* POSProgressViewStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = POSProgressViewStyle.swift; sourceTree = "<group>"; };
01664F9D2C50E685007CB5DD /* POSFontStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = POSFontStyle.swift; sourceTree = "<group>"; };
016BCAFE2C4F907F009D8367 /* CartViewModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartViewModelProtocol.swift; sourceTree = "<group>"; };
016C6B962C74AB17000D86FD /* POSConnectivityView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = POSConnectivityView.swift; sourceTree = "<group>"; };
0174DDBA2CE5FD5D005D20CA /* ReceiptEmailViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReceiptEmailViewModel.swift; sourceTree = "<group>"; };
0174DDBE2CE600C0005D20CA /* ReceiptEmailViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReceiptEmailViewModelTests.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -5148,7 +5145,6 @@
C0CE1F83282AB1590019138E /* countries.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = countries.json; sourceTree = "<group>"; };
C5EFBA3D6E428FD34F5A4171 /* Pods_NotificationExtension.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_NotificationExtension.framework; sourceTree = BUILT_PRODUCTS_DIR; };
C7533D1D2C1E38E0002EBAE7 /* OrderSearchUICommandTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrderSearchUICommandTests.swift; sourceTree = "<group>"; };
C7F746C22C485B3B0023ADD0 /* MockCartViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockCartViewModel.swift; sourceTree = "<group>"; };
CB4839361AA061340BE98DA9 /* Pods-StoreWidgetsExtension.release-alpha.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-StoreWidgetsExtension.release-alpha.xcconfig"; path = "../Pods/Target Support Files/Pods-StoreWidgetsExtension/Pods-StoreWidgetsExtension.release-alpha.xcconfig"; sourceTree = "<group>"; };
CC0324A2263AD9F40056C6B7 /* MockShippingLabelAccountSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockShippingLabelAccountSettings.swift; sourceTree = "<group>"; };
CC04918C292BB74500F719D8 /* StatsDataTextFormatter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatsDataTextFormatter.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -6857,7 +6853,6 @@
children = (
026826922BF59D830036F959 /* PointOfSaleDashboardViewModel.swift */,
6885E2CB2C32B14B004C8D70 /* TotalsViewModel.swift */,
016BCAFE2C4F907F009D8367 /* CartViewModelProtocol.swift */,
6837631B2C2E847D00AD51D0 /* CartViewModel.swift */,
);
path = ViewModels;
Expand Down Expand Up @@ -7373,7 +7368,6 @@
children = (
02CD3BFD2C35D04C00E575C4 /* MockCardPresentPaymentService.swift */,
207E71CA2C60F765008540FC /* MockPOSOrderService.swift */,
C7F746C22C485B3B0023ADD0 /* MockCartViewModel.swift */,
20FCBCE02CE24CE70082DCA3 /* MockPOSItemProvider.swift */,
20FCBCE22CE24F5D0082DCA3 /* MockPointOfSaleAggregateModel.swift */,
);
Expand Down Expand Up @@ -15897,7 +15891,6 @@
020886572499E643001D784E /* ProductExternalLinkViewController.swift in Sources */,
DEC2962526C122DF005A056B /* ShippingLabelCustomsFormInputViewModel.swift in Sources */,
02F4F50F237AFC1E00E13A9C /* ImageAndTitleAndTextTableViewCell.swift in Sources */,
016BCAFF2C4F907F009D8367 /* CartViewModelProtocol.swift in Sources */,
26E7EE7029300F6200793045 /* DeltaTag.swift in Sources */,
021E2A1C23AA0DD100B1DE07 /* ProductBackordersSettingListSelectorCommand.swift in Sources */,
26F94E21267A41BE00DB6CCF /* ProductAddOnsListViewModel.swift in Sources */,
Expand Down Expand Up @@ -16966,7 +16959,6 @@
023EC2E024DA87460021DA91 /* ProductInventorySettingsViewModelTests.swift in Sources */,
AEB73C1725CD8E5800A8454A /* AttributePickerViewModelTests.swift in Sources */,
02DE5CAB279F8754007CBEF3 /* Double+RoundingTests.swift in Sources */,
C7F746C32C485B3B0023ADD0 /* MockCartViewModel.swift in Sources */,
AE90475C27A99D6000073E1D /* CreateOrderAddressFormViewModelTests.swift in Sources */,
B56C721421B5BBC000E5E85B /* MockStoresManager.swift in Sources */,
26B119C024D0C69500FED5C7 /* SurveyViewControllerTests.swift in Sources */,
Expand Down
32 changes: 0 additions & 32 deletions WooCommerce/WooCommerceTests/POS/Mocks/MockCartViewModel.swift

This file was deleted.

Loading

0 comments on commit 60b8cab

Please sign in to comment.