Skip to content

Commit 5b02539

Browse files
authored
Shipping Labels: Optimize country syncing requests (#15875)
2 parents f689348 + 3fdaad5 commit 5b02539

File tree

8 files changed

+34
-68
lines changed

8 files changed

+34
-68
lines changed

RELEASE-NOTES.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
- [*] Shipping Labels: Enable the confirm button on the payment method sheet even when there are no changes. [https://github.com/woocommerce/woocommerce-ios/pull/15856]
1010
- [*] POS: start a new cart by scanning a barcode on the payment success screen [https://github.com/woocommerce/woocommerce-ios/pull/15870]
1111
- [*] Watch app: Fixed connection issue upon fresh install [https://github.com/woocommerce/woocommerce-ios/pull/15867]
12+
- [Internal] Shipping Labels: Optimize requests for syncing countries [https://github.com/woocommerce/woocommerce-ios/pull/15875]
1213
- [*] Shipping Labels: Display label size from account settings as default [https://github.com/woocommerce/woocommerce-ios/pull/15873]
1314

1415
22.7

WooCommerce/Classes/ViewRelated/Orders/Order Details/Shipping Labels/WooShipping Create Shipping Labels/ShipmentDetails/WooShippingShipmentDetailsViewModel.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ final class WooShippingShipmentDetailsViewModel: ObservableObject {
7070
order: order,
7171
shipment: shipment,
7272
originCountryCode: originCountryCodePublisher(),
73-
stores: stores,
7473
storageManager: storageManager
7574
) { [weak self] form in
7675
self?.customsForm = form

WooCommerce/Classes/ViewRelated/Orders/Order Details/Shipping Labels/WooShipping Create Shipping Labels/WooShipping Customs/WooShippingCustomsFormViewModel.swift

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ final class WooShippingCustomsFormViewModel: ObservableObject {
4242
init(order: Order,
4343
shipment: Shipment,
4444
originCountryCode: AnyPublisher<String?, Never>? = nil,
45-
stores: StoresManager = ServiceLocator.stores,
4645
storageManager: StorageManagerType = ServiceLocator.storageManager,
4746
onFormReady: @escaping (ShippingLabelCustomsForm) -> ()) {
4847
self.onFormReady = onFormReady
@@ -55,8 +54,7 @@ final class WooShippingCustomsFormViewModel: ObservableObject {
5554
itemWeight: $0.weight,
5655
currencySymbol: currencySymbol(from: order),
5756
originCountryCode: originCountryCode,
58-
storageManager: storageManager,
59-
stores: stores)
57+
storageManager: storageManager)
6058
}
6159

6260
listenToItemsRequiredInformationValues()

WooCommerce/Classes/ViewRelated/Orders/Order Details/Shipping Labels/WooShipping Create Shipping Labels/WooShipping Customs/WooShippingCustomsItemViewModel.swift

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@ final class WooShippingCustomsItemViewModel: ObservableObject {
1515
@Published private var originCountryCode: String?
1616

1717
private let storageManager: StorageManagerType
18-
private let stores: StoresManager
19-
private let siteID: Int64
2018
let currencySymbol: String
2119

2220
let itemProductID: Int64
@@ -75,8 +73,7 @@ final class WooShippingCustomsItemViewModel: ObservableObject {
7573
itemWeight: Double,
7674
currencySymbol: String,
7775
originCountryCode: AnyPublisher<String?, Never>? = nil,
78-
storageManager: StorageManagerType = ServiceLocator.storageManager,
79-
stores: StoresManager = ServiceLocator.stores) {
76+
storageManager: StorageManagerType = ServiceLocator.storageManager) {
8077
self.title = itemName
8178
self.description = itemName
8279
self.itemProductID = itemProductID
@@ -85,8 +82,6 @@ final class WooShippingCustomsItemViewModel: ObservableObject {
8582
self.weightPerUnit = String(itemWeight)
8683
self.currencySymbol = currencySymbol
8784
self.storageManager = storageManager
88-
self.stores = stores
89-
self.siteID = stores.sessionManager.defaultStoreID ?? Int64.min
9085

9186
originCountryCode?
9287
.assign(to: &$originCountryCode)
@@ -113,21 +108,20 @@ private extension WooShippingCustomsItemViewModel {
113108
}
114109

115110
func fetchCountries() {
116-
try? resultsController.performFetch()
117-
countries = resultsController.fetchedObjects
111+
resultsController.onDidChangeContent = { [weak self] in
112+
self?.updateCountries()
113+
}
118114

119-
let action = DataAction.synchronizeCountries(siteID: siteID) { [weak self] (result) in
120-
guard let self = self else { return }
121-
switch result {
122-
case .success:
123-
try? self.resultsController.performFetch()
124-
self.countries = self.resultsController.fetchedObjects
125-
case .failure:
126-
break
127-
}
115+
resultsController.onDidResetContent = { [weak self] in
116+
self?.updateCountries()
128117
}
129118

130-
stores.dispatch(action)
119+
try? resultsController.performFetch()
120+
updateCountries()
121+
}
122+
123+
func updateCountries() {
124+
countries = resultsController.fetchedObjects
131125
}
132126

133127
func combineRequiredInformationIsEntered() {

WooCommerce/Classes/ViewRelated/Orders/Order Details/Shipping Labels/WooShipping Create Shipping Labels/WooShippingAddresses/WooShippingEditAddressViewModel.swift

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -628,22 +628,19 @@ private extension WooShippingEditAddressViewModel {
628628
// MARK: Remote
629629
private extension WooShippingEditAddressViewModel {
630630
func fetchCountries() {
631-
refreshCountriesAndUpdateSelections()
632-
let action = DataAction.synchronizeCountries(siteID: siteID) { [weak self] (result) in
633-
guard let self = self else { return }
634-
switch result {
635-
case .success:
636-
refreshCountriesAndUpdateSelections()
637-
case .failure:
638-
break
639-
}
631+
resultsController.onDidChangeContent = { [weak self] in
632+
self?.refreshCountriesAndUpdateSelections()
633+
}
634+
635+
resultsController.onDidResetContent = { [weak self] in
636+
self?.refreshCountriesAndUpdateSelections()
640637
}
641638

642-
stores.dispatch(action)
639+
try? resultsController.performFetch()
640+
refreshCountriesAndUpdateSelections()
643641
}
644642

645643
func refreshCountriesAndUpdateSelections() {
646-
try? resultsController.performFetch()
647644
// Updating the selected country clears the selected state.
648645
// We track the initial state code so we can set the correct selected state.
649646
let stateCode = state.value

WooCommerce/Classes/ViewRelated/Orders/Order Details/Shipping Labels/WooShipping Create Shipping Labels/WooShippingCreateLabelsViewModel.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,7 @@ final class WooShippingCreateLabelsViewModel: ObservableObject {
233233
loadDestinationAddress()
234234
}
235235

236+
syncCountries()
236237
updateShipmentDetailsViewModels()
237238
observeSelectedOriginAddress()
238239
observeDestinationAddress()
@@ -467,6 +468,12 @@ private extension WooShippingCreateLabelsViewModel {
467468
}
468469
stores.dispatch(action)
469470
}
471+
472+
/// Sync countries to update the storage with latest data from remote.
473+
/// This is useful for checking countries in the customs form and listing countries in the edit address form.
474+
func syncCountries() {
475+
stores.dispatch(DataAction.synchronizeCountries(siteID: order.siteID) { _ in })
476+
}
470477
}
471478

472479
// MARK: Utils

WooCommerce/WooCommerceTests/ViewRelated/Shipping Label/WooShipping Create Shipping Labels/WooShippingEditAddressViewModelTests.swift

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -356,18 +356,11 @@ final class WooShippingEditAddressViewModelTests: XCTestCase {
356356
XCTAssertEqual(viewModel.countries.count, 2, "Should include all countries for destination addresses")
357357
}
358358

359-
func test_init_fetches_countries_from_remote() {
359+
func test_init_fetches_countries_from_storage() {
360360
// Given
361-
let stores = MockStoresManager(sessionManager: .testingInstance)
362361
let storageManager = MockStorageManager()
363362
let country = Country(code: "US", name: "United States", states: [])
364-
stores.whenReceivingAction(ofType: DataAction.self) { action in
365-
switch action {
366-
case .synchronizeCountries(_, let completion):
367-
storageManager.insertSampleCountries(readOnlyCountries: [country])
368-
completion(.success([country]))
369-
}
370-
}
363+
storageManager.insertSampleCountries(readOnlyCountries: [country])
371364

372365
// When
373366
let viewModel = WooShippingEditAddressViewModel(type: .destination(orderID: sampleOrderID),
@@ -384,12 +377,10 @@ final class WooShippingEditAddressViewModelTests: XCTestCase {
384377
isDefaultAddress: true,
385378
showCompanyField: true,
386379
isVerified: true,
387-
stores: stores,
388380
storageManager: storageManager)
389381

390382
// Then
391383
XCTAssertEqual(viewModel.countries.count, 1)
392-
XCTAssertTrue(stores.receivedActions.first is DataAction)
393384
}
394385

395386
func test_state_required_when_selected_country_contains_states() {

WooCommerce/WooCommerceTests/ViewRelated/Shipping Label/WooShipping Create Shipping Labels/WooShippingShipmentDetailsViewModelTests.swift

Lines changed: 3 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -359,14 +359,7 @@ final class WooShippingShipmentDetailsViewModelTests: XCTestCase {
359359
Country(code: "US", name: "United States", states: []),
360360
Country(code: "CA", name: "Canada", states: [])
361361
]
362-
363-
stores.whenReceivingAction(ofType: DataAction.self) { action in
364-
switch action {
365-
case let .synchronizeCountries(_, onCompletion):
366-
storageManager.insertSampleCountries(readOnlyCountries: countries)
367-
onCompletion(.success(countries))
368-
}
369-
}
362+
storageManager.insertSampleCountries(readOnlyCountries: countries)
370363

371364
let originAddressSubject = CurrentValueSubject<WooShippingAddress?, Never>(
372365
sampleOriginAddress(country: "US", state: "NY")
@@ -790,14 +783,7 @@ final class WooShippingShipmentDetailsViewModelTests: XCTestCase {
790783
Country(code: "US", name: "United States", states: []),
791784
Country(code: "CA", name: "Canada", states: [])
792785
]
793-
794-
stores.whenReceivingAction(ofType: DataAction.self) { action in
795-
switch action {
796-
case let .synchronizeCountries(_, onCompletion):
797-
storageManager.insertSampleCountries(readOnlyCountries: countries)
798-
onCompletion(.success(countries))
799-
}
800-
}
786+
storageManager.insertSampleCountries(readOnlyCountries: countries)
801787

802788
let viewModel = WooShippingShipmentDetailsViewModel(
803789
order: Order.fake(),
@@ -833,14 +819,7 @@ final class WooShippingShipmentDetailsViewModelTests: XCTestCase {
833819
originCountry,
834820
destinationCountry
835821
]
836-
837-
stores.whenReceivingAction(ofType: DataAction.self) { action in
838-
switch action {
839-
case let .synchronizeCountries(_, onCompletion):
840-
storageManager.insertSampleCountries(readOnlyCountries: countries)
841-
onCompletion(.success(countries))
842-
}
843-
}
822+
storageManager.insertSampleCountries(readOnlyCountries: countries)
844823

845824
let shipment = sampleShipment
846825

0 commit comments

Comments
 (0)