Skip to content

Commit 42d22b0

Browse files
committed
Update syncAllVariations action to return the saved variations
1 parent e95aadd commit 42d22b0

File tree

5 files changed

+43
-31
lines changed

5 files changed

+43
-31
lines changed

WooCommerce/Classes/ViewRelated/Products/Variations/ProductVariationsViewController.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -699,7 +699,7 @@ extension ProductVariationsViewController: SyncingCoordinatorDelegate {
699699
}
700700
}
701701

702-
/// Generates all possible variations for the product attibutes.
702+
/// Generates all possible variations for the product attributes.
703703
///
704704
private func generateAllVariations() {
705705
viewModel.generateAllVariations(for: product) { [weak self] result in

WooCommerce/Classes/ViewRelated/Products/Variations/ProductVariationsViewModel.swift

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -28,33 +28,31 @@ final class ProductVariationsViewModel {
2828
/// Generates all missing variations for a product. Up to 100 variations.
2929
///
3030
func generateAllVariations(for product: Product, onCompletion: @escaping (Result<Void, GenerationError>) -> Void) {
31-
let action = ProductVariationAction.synchronizeAllProductVariations(siteID: product.siteID, productID: product.productID) { [weak self] result in
32-
// TODO: Fetch this via a results controller
33-
let existingVariations = ServiceLocator.storageManager.viewStorage.loadProductVariations(siteID: product.siteID, productID: product.productID)?
34-
.map {
35-
$0.toReadOnly()
36-
} ?? []
37-
38-
let variationsToGenerate = ProductVariationGenerator.generateVariations(for: product, excluding: existingVariations)
39-
40-
// Guard for 100 variation limit
41-
guard variationsToGenerate.count <= 100 else {
42-
return onCompletion(.failure(.tooManyVariations(variationCount: variationsToGenerate.count)))
43-
}
4431

45-
guard variationsToGenerate.count > 0 else {
46-
// TODO: Inform user that no variation will be created
47-
return onCompletion(.success(()))
48-
}
32+
fetchAllVariations(of: product) { [weak self] result in
33+
guard let self else { return }
34+
switch result {
35+
case .success(let existingVariations):
4936

50-
self?.createVariationsRemotely(for: product, variations: variationsToGenerate, onCompletion: onCompletion)
37+
let variationsToGenerate = ProductVariationGenerator.generateVariations(for: product, excluding: existingVariations)
5138

52-
}
53-
stores.dispatch(action)
39+
// Guard for 100 variation limit
40+
guard variationsToGenerate.count <= 100 else {
41+
return onCompletion(.failure(.tooManyVariations(variationCount: variationsToGenerate.count)))
42+
}
43+
44+
guard variationsToGenerate.count > 0 else {
45+
// TODO: Inform user that no variation will be created
46+
return onCompletion(.success(()))
47+
}
5448

55-
// TODO:
56-
// - Alert if there are more than 100 variations to create
57-
// - Create variations remotely
49+
self.createVariationsRemotely(for: product, variations: variationsToGenerate, onCompletion: onCompletion)
50+
51+
case .failure:
52+
// TODO: Log and inform error
53+
break
54+
}
55+
}
5856
}
5957

6058
/// Updates the internal `formType` to `edit` if the given product exists remotely and previous formType was `.add`
@@ -66,6 +64,13 @@ final class ProductVariationsViewModel {
6664
formType = .edit
6765
}
6866

67+
/// Fetches all remote variations.
68+
///
69+
private func fetchAllVariations(of product: Product, onCompletion: @escaping (Result<[ProductVariation], Error>) -> Void) {
70+
let action = ProductVariationAction.synchronizeAllProductVariations(siteID: product.siteID, productID: product.productID, onCompletion: onCompletion)
71+
stores.dispatch(action)
72+
}
73+
6974
/// Creates the provided variations remotely.
7075
///
7176
private func createVariationsRemotely(for product: Product,

WooCommerce/WooCommerceTests/ViewRelated/Products/Variations/ProductVariationsViewModelTests.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ final class ProductVariationsViewModelTests: XCTestCase {
127127
stores.whenReceivingAction(ofType: ProductVariationAction.self) { action in
128128
switch action {
129129
case .synchronizeAllProductVariations(_, _, let onCompletion):
130-
onCompletion(.success(()))
130+
onCompletion(.success([]))
131131
default:
132132
break
133133
}
@@ -159,7 +159,7 @@ final class ProductVariationsViewModelTests: XCTestCase {
159159
stores.whenReceivingAction(ofType: ProductVariationAction.self) { action in
160160
switch action {
161161
case .synchronizeAllProductVariations(_, _, let onCompletion):
162-
onCompletion(.success(()))
162+
onCompletion(.success([]))
163163
case .createProductVariations(_, _, _, let onCompletion):
164164
onCompletion(.success([]))
165165
default:

Yosemite/Yosemite/Actions/ProductVariationAction.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ public enum ProductVariationAction: Action {
88

99
/// Synchronizes all the ProductVariation's available in the store.
1010
///
11-
case synchronizeAllProductVariations(siteID: Int64, productID: Int64, onCompletion: (Result<Void, Error>) -> Void)
11+
case synchronizeAllProductVariations(siteID: Int64, productID: Int64, onCompletion: (Result<[ProductVariation], Error>) -> Void)
1212

1313
/// Synchronizes the ProductVariation's matching the specified criteria.
1414
/// If successful, the result boolean value, will indicate weather there are more variations to fetch or not.

Yosemite/Yosemite/Stores/ProductVariationStore.swift

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,14 +67,21 @@ private extension ProductVariationStore {
6767

6868
/// Synchronizes all the product reviews associated with a given Site ID (if any!).
6969
///
70-
func synchronizeAllProductVariations(siteID: Int64, productID: Int64, onCompletion: @escaping (Result<Void, Error>) -> Void) {
70+
func synchronizeAllProductVariations(siteID: Int64, productID: Int64, onCompletion: @escaping (Result<[ProductVariation], Error>) -> Void) {
7171
let maxPageSize = 100 // API only allows to fetch a max of 100 variations at a time
7272
recursivelySyncAllVariations(siteID: siteID,
7373
productID: productID,
7474
pageNumber: Default.firstPageNumber,
75-
pageSize: maxPageSize) { result in
76-
// Transforms Result<Bool, Error> -> Result<Void, Error> as the bool value is not needed anymore.
77-
onCompletion(result.map { _ in () }) //
75+
pageSize: maxPageSize) { [weak self] result in
76+
guard let self else { return }
77+
switch result {
78+
case .success:
79+
let storedVariations = self.storageManager.viewStorage.loadProductVariations(siteID: siteID, productID: productID) ?? []
80+
let readOnlyVariations = storedVariations.map { $0.toReadOnly() }
81+
onCompletion(.success(readOnlyVariations))
82+
case .failure(let error):
83+
onCompletion(.failure(error))
84+
}
7885
}
7986
}
8087

0 commit comments

Comments
 (0)