Skip to content

Commit 2496765

Browse files
Merge pull request #9818 from woocommerce/feat/9817-share-only-if-public-site
Enable "Share Product" only for public site
2 parents cc70060 + 56ef9d5 commit 2496765

File tree

6 files changed

+71
-20
lines changed

6 files changed

+71
-20
lines changed

WooCommerce/Classes/ViewRelated/Products/Add Product/AddProductCoordinator.swift

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,8 @@ private extension AddProductCoordinator {
244244
guard let self else { return }
245245
self.onProductCreated(product)
246246
if self.isFirstProduct, let url = URL(string: product.permalink) {
247-
self.showFirstProductCreatedView(productURL: url)
247+
self.showFirstProductCreatedView(productURL: url,
248+
showShareProductButton: viewModel.canShareProduct())
248249
}
249250
}
250251
let viewController = ProductFormViewController(viewModel: viewModel,
@@ -303,8 +304,9 @@ private extension AddProductCoordinator {
303304

304305
/// Presents the celebratory view for the first created product.
305306
///
306-
func showFirstProductCreatedView(productURL: URL) {
307-
let viewController = FirstProductCreatedHostingController(productURL: productURL)
307+
func showFirstProductCreatedView(productURL: URL, showShareProductButton: Bool) {
308+
let viewController = FirstProductCreatedHostingController(productURL: productURL,
309+
showShareProductButton: showShareProductButton)
308310
navigationController.present(UINavigationController(rootViewController: viewController), animated: true)
309311
}
310312
}

WooCommerce/Classes/ViewRelated/Products/Add Product/FirstProductCreatedView.swift

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@ import ConfettiSwiftUI
22
import SwiftUI
33

44
final class FirstProductCreatedHostingController: UIHostingController<FirstProductCreatedView> {
5-
init(productURL: URL) {
6-
super.init(rootView: FirstProductCreatedView())
5+
init(productURL: URL,
6+
showShareProductButton: Bool) {
7+
super.init(rootView: FirstProductCreatedView(showShareProductButton: showShareProductButton))
78
rootView.onSharingProduct = { [weak self] in
89
guard let self else { return }
910
SharingHelper.shareURL(url: productURL, from: self.view, in: self)
@@ -38,6 +39,7 @@ private extension FirstProductCreatedHostingController {
3839
/// Celebratory screen after creating the first product 🎉
3940
///
4041
struct FirstProductCreatedView: View {
42+
let showShareProductButton: Bool
4143
var onSharingProduct: () -> Void = {}
4244
@State private var confettiCounter: Int = 0
4345

@@ -51,10 +53,13 @@ struct FirstProductCreatedView: View {
5153
Text(Localization.message)
5254
.secondaryBodyStyle()
5355
.multilineTextAlignment(.center)
56+
5457
Button(Localization.shareAction,
5558
action: onSharingProduct)
56-
.buttonStyle(PrimaryButtonStyle())
57-
.padding(.horizontal)
59+
.buttonStyle(PrimaryButtonStyle())
60+
.padding(.horizontal)
61+
.renderedIf(showShareProductButton)
62+
5863
Spacer()
5964
}
6065
.padding()
@@ -93,11 +98,14 @@ private extension FirstProductCreatedView {
9398

9499
struct FirstProductCreatedView_Previews: PreviewProvider {
95100
static var previews: some View {
96-
FirstProductCreatedView()
97-
.environment(\.colorScheme, .light)
101+
FirstProductCreatedView(showShareProductButton: true)
102+
.environment(\.colorScheme, .light)
103+
104+
FirstProductCreatedView(showShareProductButton: false)
105+
.environment(\.colorScheme, .light)
98106

99-
FirstProductCreatedView()
100-
.environment(\.colorScheme, .dark)
101-
.previewInterfaceOrientation(.landscapeLeft)
107+
FirstProductCreatedView(showShareProductButton: false)
108+
.environment(\.colorScheme, .dark)
109+
.previewInterfaceOrientation(.landscapeLeft)
102110
}
103111
}

WooCommerce/Classes/ViewRelated/Products/Edit Product/ProductFormViewModel.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ extension ProductFormViewModel {
261261
}
262262

263263
func canShareProduct() -> Bool {
264-
formType != .add
264+
stores.sessionManager.defaultSite?.isPublic == true && formType != .add
265265
}
266266

267267
func canDeleteProduct() -> Bool {

WooCommerce/Classes/ViewRelated/Products/Edit Product/ProductVariationFormViewModel.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ extension ProductVariationFormViewModel {
167167
}
168168

169169
func canShareProduct() -> Bool {
170-
formType != .add
170+
storesManager.sessionManager.defaultSite?.isPublic == true && formType != .add
171171
}
172172

173173
func canDeleteProduct() -> Bool {

WooCommerce/WooCommerceTests/ViewRelated/Products/Edit Product/ProductFormViewModelTests.swift

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,10 @@ final class ProductFormViewModelTests: XCTestCase {
8282
func test_edit_product_form_with_published_status_can_share_product() {
8383
// Arrange
8484
let product = Product.fake().copy(name: "Test", statusKey: ProductStatus.published.rawValue)
85-
let viewModel = createViewModel(product: product, formType: .edit)
85+
let sessionManager = SessionManager.makeForTesting()
86+
sessionManager.defaultSite = Site.fake().copy(isPublic: true)
87+
let stores = MockStoresManager(sessionManager: sessionManager)
88+
let viewModel = createViewModel(product: product, formType: .edit, stores: stores)
8689

8790
// Action
8891
let canShareProduct = viewModel.canShareProduct()
@@ -106,7 +109,10 @@ final class ProductFormViewModelTests: XCTestCase {
106109
func test_edit_product_form_with_non_published_status_can_share_product() {
107110
// Arrange
108111
let product = Product.fake().copy(name: "Test", statusKey: ProductStatus.pending.rawValue)
109-
let viewModel = createViewModel(product: product, formType: .edit)
112+
let sessionManager = SessionManager.makeForTesting()
113+
sessionManager.defaultSite = Site.fake().copy(isPublic: true)
114+
let stores = MockStoresManager(sessionManager: sessionManager)
115+
let viewModel = createViewModel(product: product, formType: .edit, stores: stores)
110116

111117
// Action
112118
let canShareProduct = viewModel.canShareProduct()
@@ -127,6 +133,21 @@ final class ProductFormViewModelTests: XCTestCase {
127133
XCTAssertFalse(canShareProduct)
128134
}
129135

136+
func test_edit_product_form_with_non_public_site_cannot_share_product() {
137+
// Given
138+
let product = Product.fake().copy(name: "Test", statusKey: ProductStatus.published.rawValue)
139+
let sessionManager = SessionManager.makeForTesting()
140+
sessionManager.defaultSite = Site.fake().copy(isPublic: false)
141+
let stores = MockStoresManager(sessionManager: sessionManager)
142+
let viewModel = createViewModel(product: product, formType: .edit, stores: stores)
143+
144+
// When
145+
let canShareProduct = viewModel.canShareProduct()
146+
147+
// Then
148+
XCTAssertFalse(canShareProduct)
149+
}
150+
130151
// MARK: `canDeleteProduct`
131152

132153
func test_edit_product_form_with_published_status_can_delete_product() {
@@ -349,7 +370,7 @@ final class ProductFormViewModelTests: XCTestCase {
349370

350371
func test_action_buttons_for_existing_published_product_and_no_pending_changes() {
351372
// Given
352-
sessionManager.defaultSite = Site.fake().copy(frameNonce: "abc123")
373+
sessionManager.defaultSite = Site.fake().copy(frameNonce: "abc123", isPublic: true)
353374
let product = Product.fake().copy(productID: 123, statusKey: ProductStatus.published.rawValue)
354375
let viewModel = createViewModel(product: product, formType: .edit, stores: stores)
355376

@@ -416,7 +437,7 @@ final class ProductFormViewModelTests: XCTestCase {
416437

417438
func test_action_buttons_for_any_product_in_read_only_mode() {
418439
// Given
419-
sessionManager.defaultSite = Site.fake().copy(frameNonce: "abc123")
440+
sessionManager.defaultSite = Site.fake().copy(frameNonce: "abc123", isPublic: true)
420441
let product = Product.fake().copy(productID: 123, statusKey: ProductStatus.published.rawValue)
421442
let viewModel = createViewModel(product: product, formType: .readonly, stores: stores)
422443
viewModel.updateName("new name")

WooCommerce/WooCommerceTests/ViewRelated/Products/Edit Product/ProductVariationFormViewModelTests.swift

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,10 @@ final class ProductVariationFormViewModelTests: XCTestCase {
6060
func test_edit_product_variation_form_with_published_status_can_share_product() {
6161
// Given
6262
let product = ProductVariation.fake().copy(status: ProductStatus.published)
63-
let viewModel = createViewModel(product: product, formType: .edit)
63+
let sessionManager = SessionManager.makeForTesting()
64+
sessionManager.defaultSite = Site.fake().copy(isPublic: true)
65+
let stores = MockStoresManager(sessionManager: sessionManager)
66+
let viewModel = createViewModel(product: product, formType: .edit, stores: stores)
6467

6568
// When
6669
let canShareProduct = viewModel.canShareProduct()
@@ -84,7 +87,10 @@ final class ProductVariationFormViewModelTests: XCTestCase {
8487
func test_edit_product_variation_form_with_non_published_status_can_share_product() {
8588
// Given
8689
let product = ProductVariation.fake().copy(status: ProductStatus.pending)
87-
let viewModel = createViewModel(product: product, formType: .edit)
90+
let sessionManager = SessionManager.makeForTesting()
91+
sessionManager.defaultSite = Site.fake().copy(isPublic: true)
92+
let stores = MockStoresManager(sessionManager: sessionManager)
93+
let viewModel = createViewModel(product: product, formType: .edit, stores: stores)
8894

8995
// When
9096
let canShareProduct = viewModel.canShareProduct()
@@ -105,6 +111,20 @@ final class ProductVariationFormViewModelTests: XCTestCase {
105111
XCTAssertFalse(canShareProduct)
106112
}
107113

114+
func test_edit_product_form_with_non_public_site_cannot_share_product() {
115+
// Given
116+
let product = ProductVariation.fake().copy(status: ProductStatus.published)
117+
let sessionManager = SessionManager.makeForTesting()
118+
sessionManager.defaultSite = Site.fake().copy(isPublic: false)
119+
let stores = MockStoresManager(sessionManager: sessionManager)
120+
let viewModel = createViewModel(product: product, formType: .edit, stores: stores)
121+
122+
// When
123+
let canShareProduct = viewModel.canShareProduct()
124+
125+
// Then
126+
XCTAssertFalse(canShareProduct)
127+
}
108128
}
109129

110130
private extension ProductVariationFormViewModelTests {

0 commit comments

Comments
 (0)