Skip to content

Commit 018d02a

Browse files
authored
Merge pull request #8498 from woocommerce/issue/8486-bottom-sheet
Variations: Add options bottom sheet
2 parents 43c667d + 013c7fa commit 018d02a

File tree

3 files changed

+101
-2
lines changed

3 files changed

+101
-2
lines changed
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import UIKit
2+
3+
/// `GenerateVariationsSelectorCommand` for selecting what create variation strategy to follow
4+
///
5+
final class GenerateVariationsSelectorCommand: BottomSheetListSelectorCommand {
6+
7+
/// Available Generation Options
8+
///
9+
enum Options: CaseIterable {
10+
case single
11+
case all
12+
13+
var title: String {
14+
switch self {
15+
case .single:
16+
return Localization.singleTitle
17+
case .all:
18+
return Localization.allTitle
19+
}
20+
}
21+
22+
var description: String {
23+
switch self {
24+
case .single:
25+
return Localization.singleDescription
26+
case .all:
27+
return Localization.allDescription
28+
}
29+
}
30+
}
31+
32+
let data = Options.allCases
33+
var selected: Options? = nil
34+
private let onSelection: (Options) -> Void
35+
36+
init(selected: Options?, onSelection: @escaping (Options) -> Void) {
37+
self.onSelection = onSelection
38+
self.selected = selected
39+
}
40+
41+
func configureCell(cell: ImageAndTitleAndTextTableViewCell, model: Options) {
42+
let viewModel = ImageAndTitleAndTextTableViewCell.ViewModel(title: model.title,
43+
text: model.description,
44+
numberOfLinesForText: 0,
45+
isSelected: isSelected(model: model)
46+
)
47+
cell.updateUI(viewModel: viewModel)
48+
}
49+
50+
func handleSelectedChange(selected: Options) {
51+
onSelection(selected)
52+
}
53+
54+
func isSelected(model: Options) -> Bool {
55+
return model == selected
56+
}
57+
}
58+
59+
private extension GenerateVariationsSelectorCommand {
60+
enum Localization {
61+
static let singleTitle = NSLocalizedString("Add new variation", comment: "Title for the option to generate just one variation")
62+
static let singleDescription = NSLocalizedString("Create one new variation. Manually set which attributes belong to the variable product.",
63+
comment: "Description for the option to generate just one variation")
64+
static let allTitle = NSLocalizedString("Generate all variations", comment: "Title for the option to generate all possible variations")
65+
static let allDescription = NSLocalizedString("Creates variations for all combinations of your attributes.",
66+
comment: "Description for the option to generate all possible variations")
67+
68+
}
69+
}

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

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,8 @@ private extension ProductVariationsViewController {
283283
//
284284
private extension ProductVariationsViewController {
285285
func configureTopStackView() {
286-
addTopButton(title: Localization.generateVariationAction,
286+
let title = featureFlagService.isFeatureFlagEnabled(.generateAllVariations) ? Localization.addVariationAction : Localization.generateVariationAction
287+
addTopButton(title: title,
287288
insets: .init(top: 16, left: 16, bottom: 8, right: 16),
288289
hasBottomBorder: true,
289290
actionSelector: #selector(addButtonTapped),
@@ -563,7 +564,12 @@ private extension ProductVariationsViewController {
563564

564565
@objc func addButtonTapped() {
565566
analytics.track(event: WooAnalyticsEvent.Variations.addMoreVariationsButtonTapped(productID: product.productID))
566-
createVariation()
567+
568+
if featureFlagService.isFeatureFlagEnabled(.generateAllVariations) {
569+
presentGenerateVariationOptions()
570+
} else {
571+
createVariation()
572+
}
567573
}
568574

569575
/// More Options Action Sheet
@@ -594,6 +600,26 @@ private extension ProductVariationsViewController {
594600

595601
present(actionSheet, animated: true)
596602
}
603+
604+
/// Displays a bottom sheet allowing the merchant to choose whether to generate one variation or to generate all variations.
605+
///
606+
private func presentGenerateVariationOptions() {
607+
let viewProperties = BottomSheetListSelectorViewProperties(title: Localization.addVariationAction)
608+
let command = GenerateVariationsSelectorCommand(selected: nil) { [weak self] option in
609+
guard let self else { return }
610+
self.dismiss(animated: true)
611+
switch option {
612+
case .single:
613+
self.createVariation()
614+
case .all:
615+
// TODO: Start generate all variations flow
616+
break
617+
}
618+
619+
}
620+
let bottomSheetPresenter = BottomSheetListSelectorPresenter(viewProperties: viewProperties, command: command)
621+
bottomSheetPresenter.show(from: self, sourceView: topStackView)
622+
}
597623
}
598624

599625
// MARK: - Placeholders

WooCommerce/WooCommerce.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -639,6 +639,7 @@
639639
269098B627D2C09D001FEB07 /* ShippingInputTransformerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 269098B527D2C09D001FEB07 /* ShippingInputTransformerTests.swift */; };
640640
269098B827D68CCD001FEB07 /* FeesInputTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 269098B727D68CCD001FEB07 /* FeesInputTransformer.swift */; };
641641
269098BA27D6922E001FEB07 /* FeesInputTransformerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 269098B927D6922E001FEB07 /* FeesInputTransformerTests.swift */; };
642+
269A2F47295CC683000828A8 /* GenerateVariationsSelectorCommand.swift in Sources */ = {isa = PBXBuildFile; fileRef = 269A2F46295CC683000828A8 /* GenerateVariationsSelectorCommand.swift */; };
642643
26A630ED253F3B5C00CBC3B1 /* RefundCreationUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26A630EC253F3B5C00CBC3B1 /* RefundCreationUseCase.swift */; };
643644
26A630F3253F3CFE00CBC3B1 /* RefundCreationUseCaseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26A630F2253F3CFE00CBC3B1 /* RefundCreationUseCaseTests.swift */; };
644645
26A630FE253F63C300CBC3B1 /* RefundableOrderItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26A630FD253F63C300CBC3B1 /* RefundableOrderItem.swift */; };
@@ -2678,6 +2679,7 @@
26782679
269098B527D2C09D001FEB07 /* ShippingInputTransformerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShippingInputTransformerTests.swift; sourceTree = "<group>"; };
26792680
269098B727D68CCD001FEB07 /* FeesInputTransformer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeesInputTransformer.swift; sourceTree = "<group>"; };
26802681
269098B927D6922E001FEB07 /* FeesInputTransformerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeesInputTransformerTests.swift; sourceTree = "<group>"; };
2682+
269A2F46295CC683000828A8 /* GenerateVariationsSelectorCommand.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GenerateVariationsSelectorCommand.swift; sourceTree = "<group>"; };
26812683
26A630EC253F3B5C00CBC3B1 /* RefundCreationUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RefundCreationUseCase.swift; sourceTree = "<group>"; };
26822684
26A630F2253F3CFE00CBC3B1 /* RefundCreationUseCaseTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RefundCreationUseCaseTests.swift; sourceTree = "<group>"; };
26832685
26A630FD253F63C300CBC3B1 /* RefundableOrderItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RefundableOrderItem.swift; sourceTree = "<group>"; };
@@ -4744,6 +4746,7 @@
47444746
CCD2E67D25DD4DC900BD975D /* ProductVariationsViewModel.swift */,
47454747
0202B68C23876BC100F3EBE0 /* ProductsTabProductViewModel+ProductVariation.swift */,
47464748
26F65C9725DEDAF0008FAE29 /* GenerateVariationUseCase.swift */,
4749+
269A2F46295CC683000828A8 /* GenerateVariationsSelectorCommand.swift */,
47474750
4515262B2577D48D0076B03C /* Add Attributes */,
47484751
AEDDDA0825CA9C0A0077F9B2 /* Edit Attributes */,
47494752
);
@@ -10225,6 +10228,7 @@
1022510228
02E4FD7A230688BA0049610C /* OrderStatsV4Interval+Chart.swift in Sources */,
1022610229
093B265527DE8F020026F92D /* UnitInputViewModel+BulkUpdatePrice.swift in Sources */,
1022710230
0245465F24EE9106004F531C /* ProductVariationFormEventLogger.swift in Sources */,
10231+
269A2F47295CC683000828A8 /* GenerateVariationsSelectorCommand.swift in Sources */,
1022810232
DE19BB1826C3B5C300AB70D9 /* ShippingLabelCustomsFormItemDetails.swift in Sources */,
1022910233
DE1B0310268EB2FB00804330 /* ReviewOrderViewModel.swift in Sources */,
1023010234
02DC2ED2242061BF002F9676 /* ProductPriceSettingsViewModel.swift in Sources */,

0 commit comments

Comments
 (0)