From 875b70aa4f0b13716d1d43ec47b60c00de353ebd Mon Sep 17 00:00:00 2001 From: iamgabrielma Date: Thu, 3 Jul 2025 18:42:09 +0700 Subject: [PATCH 1/5] make SalesChannelType --- .../Sources/NetworkingCore/Model/Order.swift | 36 +++++++++++++++++++ .../Orders/Cells/OrderListCellViewModel.swift | 15 +------- .../SummaryTableViewCellViewModel.swift | 14 +++----- 3 files changed, 42 insertions(+), 23 deletions(-) diff --git a/Modules/Sources/NetworkingCore/Model/Order.swift b/Modules/Sources/NetworkingCore/Model/Order.swift index c774a7b2680..dd18a2c80f5 100644 --- a/Modules/Sources/NetworkingCore/Model/Order.swift +++ b/Modules/Sources/NetworkingCore/Model/Order.swift @@ -1,6 +1,37 @@ import Foundation import Codegen +public enum SalesChannelType { + case pointOfSale +} + +extension SalesChannelType: RawRepresentable { + public init?(rawValue: String) { + switch rawValue { + case "pos-rest-api": + self = .pointOfSale + default: + return nil + } + } + + public var rawValue: String { + switch self { + case .pointOfSale: + return description + } + } + + public var description: String { + switch self { + case .pointOfSale: + return NSLocalizedString("", + value: "POS", + comment: "The acronym for 'Point of Sale' that is shown for certain orders.") + } + } +} + /// Represents an Order Entity. /// public struct Order: Decodable, Sendable, GeneratedCopiable, GeneratedFakeable { @@ -68,6 +99,11 @@ public struct Order: Decodable, Sendable, GeneratedCopiable, GeneratedFakeable { /// Set to orders created via specific sources (e.g. checkout, store-api, Point of Sale, ...) /// public let createdVia: String? + + public var salesChannel: SalesChannelType? { + guard let createdVia else { return nil } + return SalesChannelType(rawValue: createdVia) + } /// Order struct initializer. /// diff --git a/WooCommerce/Classes/ViewRelated/Orders/Cells/OrderListCellViewModel.swift b/WooCommerce/Classes/ViewRelated/Orders/Cells/OrderListCellViewModel.swift index 9221b386d92..014a9dd8117 100644 --- a/WooCommerce/Classes/ViewRelated/Orders/Cells/OrderListCellViewModel.swift +++ b/WooCommerce/Classes/ViewRelated/Orders/Cells/OrderListCellViewModel.swift @@ -79,16 +79,7 @@ struct OrderListCellViewModel { /// Textual representation of the sales channel /// var salesChannel: String? { - guard let createdVia = order.createdVia else { - return nil - } - - switch createdVia { - case "pos-rest-api": - return Localization.salesChannelPOSText - default: - return nil - } + order.salesChannel?.description } /// The localized unabbreviated total for a given order item, which includes the currency. @@ -128,9 +119,5 @@ extension OrderListCellViewModel { "orderlistcellviewmodel.customerName.guestName", value: "Guest", comment: "In Order List, the name of the billed person when there are no first and last name.") - static let salesChannelPOSText = NSLocalizedString( - "orderlistcellviewmodel.salesChannel.salesChannelPOSText", - value: "POS", - comment: "In Order List, the acronym for 'Point of Sale' that is shown as a badge for certain orders.") } } diff --git a/WooCommerce/Classes/ViewRelated/Orders/Order Details/Order Summary Section/SummaryTableViewCellViewModel.swift b/WooCommerce/Classes/ViewRelated/Orders/Order Details/Order Summary Section/SummaryTableViewCellViewModel.swift index 4d30c0fa662..f458c75ac59 100644 --- a/WooCommerce/Classes/ViewRelated/Orders/Order Details/Order Summary Section/SummaryTableViewCellViewModel.swift +++ b/WooCommerce/Classes/ViewRelated/Orders/Order Details/Order Summary Section/SummaryTableViewCellViewModel.swift @@ -14,10 +14,14 @@ struct SummaryTableViewCellViewModel { let presentation: OrderStatusPresentation private let calendar: Calendar + + private let order: Order init(order: Order, status: OrderStatus?, calendar: Calendar = .current) { + + self.order = order billingAddress = order.billingAddress dateCreated = order.dateCreated @@ -52,15 +56,7 @@ struct SummaryTableViewCellViewModel { /// Textual representation of the sales channel /// var formattedSalesChannel: String? { - guard let salesChannel = salesChannel else { - return nil - } - switch salesChannel { - case "pos-rest-api": - return "POS" - default: - return nil - } + order.salesChannel?.description } } From 2cb210e382855b0c918e239b3d91fdf380874605 Mon Sep 17 00:00:00 2001 From: iamgabrielma Date: Fri, 4 Jul 2025 11:40:44 +0700 Subject: [PATCH 2/5] Extract SalesChannelType to separate file. Make compile --- .../Sources/NetworkingCore/Model/Order.swift | 31 ------------------ .../Model/SalesChannelType.swift | 32 +++++++++++++++++++ .../Orders/OrderListCellViewModelTests.swift | 2 +- 3 files changed, 33 insertions(+), 32 deletions(-) create mode 100644 Modules/Sources/NetworkingCore/Model/SalesChannelType.swift diff --git a/Modules/Sources/NetworkingCore/Model/Order.swift b/Modules/Sources/NetworkingCore/Model/Order.swift index dd18a2c80f5..bb85c9fff18 100644 --- a/Modules/Sources/NetworkingCore/Model/Order.swift +++ b/Modules/Sources/NetworkingCore/Model/Order.swift @@ -1,37 +1,6 @@ import Foundation import Codegen -public enum SalesChannelType { - case pointOfSale -} - -extension SalesChannelType: RawRepresentable { - public init?(rawValue: String) { - switch rawValue { - case "pos-rest-api": - self = .pointOfSale - default: - return nil - } - } - - public var rawValue: String { - switch self { - case .pointOfSale: - return description - } - } - - public var description: String { - switch self { - case .pointOfSale: - return NSLocalizedString("", - value: "POS", - comment: "The acronym for 'Point of Sale' that is shown for certain orders.") - } - } -} - /// Represents an Order Entity. /// public struct Order: Decodable, Sendable, GeneratedCopiable, GeneratedFakeable { diff --git a/Modules/Sources/NetworkingCore/Model/SalesChannelType.swift b/Modules/Sources/NetworkingCore/Model/SalesChannelType.swift new file mode 100644 index 00000000000..09846c9a679 --- /dev/null +++ b/Modules/Sources/NetworkingCore/Model/SalesChannelType.swift @@ -0,0 +1,32 @@ +import Foundation + +public enum SalesChannelType { + case pointOfSale +} + +extension SalesChannelType: RawRepresentable { + public init?(rawValue: String) { + switch rawValue { + case "pos-rest-api": + self = .pointOfSale + default: + return nil + } + } + + public var rawValue: String { + switch self { + case .pointOfSale: + return description + } + } + + public var description: String { + switch self { + case .pointOfSale: + return NSLocalizedString("saleschanneltype.pos.description", + value: "POS", + comment: "The acronym for 'Point of Sale'.") + } + } +} diff --git a/WooCommerce/WooCommerceTests/ViewRelated/Orders/OrderListCellViewModelTests.swift b/WooCommerce/WooCommerceTests/ViewRelated/Orders/OrderListCellViewModelTests.swift index 678621356b7..bf687ee4612 100644 --- a/WooCommerce/WooCommerceTests/ViewRelated/Orders/OrderListCellViewModelTests.swift +++ b/WooCommerce/WooCommerceTests/ViewRelated/Orders/OrderListCellViewModelTests.swift @@ -70,7 +70,7 @@ final class OrderListCellViewModelTests: XCTestCase { let viewModel = OrderListCellViewModel(order: order, currencySettings: ServiceLocator.currencySettings) // Then - XCTAssertEqual(viewModel.salesChannel, OrderListCellViewModel.Localization.salesChannelPOSText) + XCTAssertEqual(viewModel.salesChannel, "POS") } func test_salesChannel_when_createdVia_is_nil_then_returns_nil() { From 251eabeebabacae9415362f50d61ffabbc33934c Mon Sep 17 00:00:00 2001 From: iamgabrielma Date: Fri, 4 Jul 2025 11:43:39 +0700 Subject: [PATCH 3/5] lint --- Modules/Sources/NetworkingCore/Model/Order.swift | 2 +- .../Order Summary Section/SummaryTableViewCellViewModel.swift | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/Modules/Sources/NetworkingCore/Model/Order.swift b/Modules/Sources/NetworkingCore/Model/Order.swift index bb85c9fff18..5bdc40add90 100644 --- a/Modules/Sources/NetworkingCore/Model/Order.swift +++ b/Modules/Sources/NetworkingCore/Model/Order.swift @@ -68,7 +68,7 @@ public struct Order: Decodable, Sendable, GeneratedCopiable, GeneratedFakeable { /// Set to orders created via specific sources (e.g. checkout, store-api, Point of Sale, ...) /// public let createdVia: String? - + public var salesChannel: SalesChannelType? { guard let createdVia else { return nil } return SalesChannelType(rawValue: createdVia) diff --git a/WooCommerce/Classes/ViewRelated/Orders/Order Details/Order Summary Section/SummaryTableViewCellViewModel.swift b/WooCommerce/Classes/ViewRelated/Orders/Order Details/Order Summary Section/SummaryTableViewCellViewModel.swift index f458c75ac59..d7cc0caa2f9 100644 --- a/WooCommerce/Classes/ViewRelated/Orders/Order Details/Order Summary Section/SummaryTableViewCellViewModel.swift +++ b/WooCommerce/Classes/ViewRelated/Orders/Order Details/Order Summary Section/SummaryTableViewCellViewModel.swift @@ -14,13 +14,11 @@ struct SummaryTableViewCellViewModel { let presentation: OrderStatusPresentation private let calendar: Calendar - private let order: Order init(order: Order, status: OrderStatus?, calendar: Calendar = .current) { - self.order = order billingAddress = order.billingAddress From 98aaff957f39c465f98c1d50b2dcd6748173f42f Mon Sep 17 00:00:00 2001 From: iamgabrielma Date: Mon, 7 Jul 2025 08:55:02 +0700 Subject: [PATCH 4/5] update enum naming --- Modules/Sources/NetworkingCore/Model/Order.swift | 4 ++-- .../Model/{SalesChannelType.swift => SalesChannel.swift} | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) rename Modules/Sources/NetworkingCore/Model/{SalesChannelType.swift => SalesChannel.swift} (79%) diff --git a/Modules/Sources/NetworkingCore/Model/Order.swift b/Modules/Sources/NetworkingCore/Model/Order.swift index 5bdc40add90..e88d265c792 100644 --- a/Modules/Sources/NetworkingCore/Model/Order.swift +++ b/Modules/Sources/NetworkingCore/Model/Order.swift @@ -69,9 +69,9 @@ public struct Order: Decodable, Sendable, GeneratedCopiable, GeneratedFakeable { /// public let createdVia: String? - public var salesChannel: SalesChannelType? { + public var salesChannel: SalesChannel? { guard let createdVia else { return nil } - return SalesChannelType(rawValue: createdVia) + return SalesChannel(rawValue: createdVia) } /// Order struct initializer. diff --git a/Modules/Sources/NetworkingCore/Model/SalesChannelType.swift b/Modules/Sources/NetworkingCore/Model/SalesChannel.swift similarity index 79% rename from Modules/Sources/NetworkingCore/Model/SalesChannelType.swift rename to Modules/Sources/NetworkingCore/Model/SalesChannel.swift index 09846c9a679..7c8127724e6 100644 --- a/Modules/Sources/NetworkingCore/Model/SalesChannelType.swift +++ b/Modules/Sources/NetworkingCore/Model/SalesChannel.swift @@ -1,10 +1,10 @@ import Foundation -public enum SalesChannelType { +public enum SalesChannel { case pointOfSale } -extension SalesChannelType: RawRepresentable { +extension SalesChannel: RawRepresentable { public init?(rawValue: String) { switch rawValue { case "pos-rest-api": @@ -24,7 +24,7 @@ extension SalesChannelType: RawRepresentable { public var description: String { switch self { case .pointOfSale: - return NSLocalizedString("saleschanneltype.pos.description", + return NSLocalizedString("salesChannel.pos.description", value: "POS", comment: "The acronym for 'Point of Sale'.") } From 7df616bf8cf54b996e06f070f28a0a6121adc9a5 Mon Sep 17 00:00:00 2001 From: iamgabrielma Date: Mon, 7 Jul 2025 09:31:20 +0700 Subject: [PATCH 5/5] simplify salesChannel property accessor --- .../Order Summary Section/SummaryTableViewCell.swift | 2 +- .../SummaryTableViewCellViewModel.swift | 12 ++---------- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/WooCommerce/Classes/ViewRelated/Orders/Order Details/Order Summary Section/SummaryTableViewCell.swift b/WooCommerce/Classes/ViewRelated/Orders/Order Details/Order Summary Section/SummaryTableViewCell.swift index 08ac33c5730..fc8af08b230 100644 --- a/WooCommerce/Classes/ViewRelated/Orders/Order Details/Order Summary Section/SummaryTableViewCell.swift +++ b/WooCommerce/Classes/ViewRelated/Orders/Order Details/Order Summary Section/SummaryTableViewCell.swift @@ -31,7 +31,7 @@ final class SummaryTableViewCell: UITableViewCell { func configure(_ viewModel: SummaryTableViewCellViewModel) { titleLabel.text = viewModel.billedPersonName subtitleLabel.text = viewModel.subtitle - salesChannelLabel.text = viewModel.formattedSalesChannel + salesChannelLabel.text = viewModel.salesChannel salesChannelLabel.isHidden = (salesChannelLabel.text == nil) display(presentation: viewModel.presentation) } diff --git a/WooCommerce/Classes/ViewRelated/Orders/Order Details/Order Summary Section/SummaryTableViewCellViewModel.swift b/WooCommerce/Classes/ViewRelated/Orders/Order Details/Order Summary Section/SummaryTableViewCellViewModel.swift index d7cc0caa2f9..8cfe47f2ae3 100644 --- a/WooCommerce/Classes/ViewRelated/Orders/Order Details/Order Summary Section/SummaryTableViewCellViewModel.swift +++ b/WooCommerce/Classes/ViewRelated/Orders/Order Details/Order Summary Section/SummaryTableViewCellViewModel.swift @@ -9,21 +9,19 @@ struct SummaryTableViewCellViewModel { private let billingAddress: Address? private let dateCreated: Date - private let salesChannel: String? + private(set) var salesChannel: String? let presentation: OrderStatusPresentation private let calendar: Calendar - private let order: Order init(order: Order, status: OrderStatus?, calendar: Calendar = .current) { - self.order = order billingAddress = order.billingAddress dateCreated = order.dateCreated - salesChannel = order.createdVia + salesChannel = order.salesChannel?.description presentation = OrderStatusPresentation( style: status?.status ?? order.status, @@ -50,12 +48,6 @@ struct SummaryTableViewCellViewModel { formatter.timeZone = .siteTimezone return formatter.string(from: dateCreated) } - - /// Textual representation of the sales channel - /// - var formattedSalesChannel: String? { - order.salesChannel?.description - } } private extension SummaryTableViewCellViewModel {