From c42b1ab0728825f6f48539df36e1b9a431e51f0f Mon Sep 17 00:00:00 2001 From: Huong Do Date: Tue, 21 Jan 2025 11:58:25 +0700 Subject: [PATCH 01/12] Use authenticated web view to display product page --- .../Edit Product/ProductFormViewController.swift | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/WooCommerce/Classes/ViewRelated/Products/Edit Product/ProductFormViewController.swift b/WooCommerce/Classes/ViewRelated/Products/Edit Product/ProductFormViewController.swift index 9e8d6d7dc67..615644f25d6 100644 --- a/WooCommerce/Classes/ViewRelated/Products/Edit Product/ProductFormViewController.swift +++ b/WooCommerce/Classes/ViewRelated/Products/Edit Product/ProductFormViewController.swift @@ -254,6 +254,10 @@ final class ProductFormViewController: saveProduct(status: .published) } + @objc func dismissPresentedViewController() { + presentedViewController?.dismiss(animated: true, completion: nil) + } + func saveProductAsDraft() { if viewModel.formType == .add { ServiceLocator.analytics.track(.addProductSaveAsDraftTapped, withProperties: ["product_type": product.productType.rawValue]) @@ -1042,7 +1046,12 @@ private extension ProductFormViewController { guard let url = URL(string: product.permalink) else { return } - WebviewHelper.launch(url, with: self) + + let viewModel = DefaultAuthenticatedWebViewModel(title: product.name, initialURL: url) + let controller = AuthenticatedWebViewController(viewModel: viewModel) + let navigationController = UINavigationController(rootViewController: controller) + navigationController.navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(dismissPresentedViewController)) + present(navigationController, animated: true) } func displayShareProduct(from sourceView: UIBarButtonItem, analyticSource: WooAnalyticsEvent.ProductForm.ShareProductSource) { From ab372902f05bd8a605b6cf851e4a2cdb86517408 Mon Sep 17 00:00:00 2001 From: Huong Do Date: Tue, 21 Jan 2025 11:58:35 +0700 Subject: [PATCH 02/12] Enable viewing product page for private products --- .../Products/Edit Product/ProductFormViewModel.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WooCommerce/Classes/ViewRelated/Products/Edit Product/ProductFormViewModel.swift b/WooCommerce/Classes/ViewRelated/Products/Edit Product/ProductFormViewModel.swift index 4b4354d0713..be13df519d4 100644 --- a/WooCommerce/Classes/ViewRelated/Products/Edit Product/ProductFormViewModel.swift +++ b/WooCommerce/Classes/ViewRelated/Products/Edit Product/ProductFormViewModel.swift @@ -304,7 +304,7 @@ extension ProductFormViewModel { } func canViewProductInStore() -> Bool { - originalProduct.product.productStatus == .published && formType != .add + formType != .add } func canShareProduct() -> Bool { From 1935286d61aa4de02d30e1c6850041da699d490c Mon Sep 17 00:00:00 2001 From: Huong Do Date: Tue, 21 Jan 2025 15:20:38 +0700 Subject: [PATCH 03/12] Fix navigation item for the product page view --- .../Products/Edit Product/ProductFormViewController.swift | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/WooCommerce/Classes/ViewRelated/Products/Edit Product/ProductFormViewController.swift b/WooCommerce/Classes/ViewRelated/Products/Edit Product/ProductFormViewController.swift index 615644f25d6..343bebd5641 100644 --- a/WooCommerce/Classes/ViewRelated/Products/Edit Product/ProductFormViewController.swift +++ b/WooCommerce/Classes/ViewRelated/Products/Edit Product/ProductFormViewController.swift @@ -1046,11 +1046,12 @@ private extension ProductFormViewController { guard let url = URL(string: product.permalink) else { return } - let viewModel = DefaultAuthenticatedWebViewModel(title: product.name, initialURL: url) let controller = AuthenticatedWebViewController(viewModel: viewModel) let navigationController = UINavigationController(rootViewController: controller) - navigationController.navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(dismissPresentedViewController)) + controller.navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .cancel, + target: self, + action: #selector(dismissPresentedViewController)) present(navigationController, animated: true) } From fb3412caba35134edd0900a23d0afecd078827cd Mon Sep 17 00:00:00 2001 From: Huong Do Date: Tue, 21 Jan 2025 16:11:29 +0700 Subject: [PATCH 04/12] Update LabeledTextViewTableViewCell.swift --- .../ViewRelated/ReusableViews/LabeledTextViewTableViewCell.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/WooCommerce/Classes/ViewRelated/ReusableViews/LabeledTextViewTableViewCell.swift b/WooCommerce/Classes/ViewRelated/ReusableViews/LabeledTextViewTableViewCell.swift index 883634d2c03..f2caa28d32d 100644 --- a/WooCommerce/Classes/ViewRelated/ReusableViews/LabeledTextViewTableViewCell.swift +++ b/WooCommerce/Classes/ViewRelated/ReusableViews/LabeledTextViewTableViewCell.swift @@ -44,6 +44,7 @@ private extension LabeledTextViewTableViewCell { func configureBackground() { backgroundColor = .systemColor(.secondarySystemGroupedBackground) productTextField.backgroundColor = .systemColor(.secondarySystemGroupedBackground) + productStatusBadgeHolder.backgroundColor = .listForeground(modal: false) } func configureLabelStyle() { From 5e30b40543b5a4ff6fe41e44b9247842427ace45 Mon Sep 17 00:00:00 2001 From: Huong Do Date: Tue, 21 Jan 2025 16:17:04 +0700 Subject: [PATCH 05/12] Update unit test for editing products with non published status --- .../Products/Edit Product/ProductFormViewModelTests.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WooCommerce/WooCommerceTests/ViewRelated/Products/Edit Product/ProductFormViewModelTests.swift b/WooCommerce/WooCommerceTests/ViewRelated/Products/Edit Product/ProductFormViewModelTests.swift index d5d65c39caf..84482f3a339 100644 --- a/WooCommerce/WooCommerceTests/ViewRelated/Products/Edit Product/ProductFormViewModelTests.swift +++ b/WooCommerce/WooCommerceTests/ViewRelated/Products/Edit Product/ProductFormViewModelTests.swift @@ -56,7 +56,7 @@ final class ProductFormViewModelTests: XCTestCase { XCTAssertFalse(canViewProductInStore) } - func test_edit_product_form_with_non_published_status_cannot_view_product_in_store() { + func test_edit_product_form_with_non_published_status_can_view_product_in_store() { // Arrange let product = Product.fake().copy(name: "Test", statusKey: ProductStatus.pending.rawValue) let viewModel = createViewModel(product: product, formType: .edit) @@ -65,7 +65,7 @@ final class ProductFormViewModelTests: XCTestCase { let canViewProductInStore = viewModel.canViewProductInStore() // Assert - XCTAssertFalse(canViewProductInStore) + XCTAssertTrue(canViewProductInStore) } func test_add_product_form_with_non_published_status_cannot_view_product_in_store() { From fdcc673e114b208847a958f055809f9d6a77ad8f Mon Sep 17 00:00:00 2001 From: Huong Do Date: Tue, 21 Jan 2025 16:18:27 +0700 Subject: [PATCH 06/12] Update release notes --- RELEASE-NOTES.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index 89521f4eebd..dc5eea4654b 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -5,6 +5,7 @@ - [Internal] [*] Improved handling of the navigation to the Woo Installation screen post Jetpack setup [https://github.com/woocommerce/woocommerce-ios/pull/14837] - [*] Receipts: Email receipts can now be sent to customers after failed payments using WooCommerce Stripe 9.1.0+. [https://github.com/woocommerce/woocommerce-ios/pull/14864]. - [*] Dashboard: Updated the drag gesture on the Performance chart to show stats instantly. [https://github.com/woocommerce/woocommerce-ios/pull/14906] +- [*] Product Form: Support previewing products on coming-soon stores and non-published products. [https://github.com/woocommerce/woocommerce-ios/pull/14931] - [Internal] Removed feedback survey for Store Setup feature [https://github.com/woocommerce/woocommerce-ios/pull/14888] - [Internal] Removed feedback survey for shipping label creation [https://github.com/woocommerce/woocommerce-ios/pull/14889] - [Internal] Removed feedback survey for product creation AI [https://github.com/woocommerce/woocommerce-ios/pull/14890] From 24e725da8c9eef8f435aacac95ea276f8dfeb836 Mon Sep 17 00:00:00 2001 From: Huong Do Date: Thu, 23 Jan 2025 21:03:17 +0700 Subject: [PATCH 07/12] Revert "Update unit test for editing products with non published status" This reverts commit 5e30b40543b5a4ff6fe41e44b9247842427ace45. --- .../Products/Edit Product/ProductFormViewModelTests.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WooCommerce/WooCommerceTests/ViewRelated/Products/Edit Product/ProductFormViewModelTests.swift b/WooCommerce/WooCommerceTests/ViewRelated/Products/Edit Product/ProductFormViewModelTests.swift index 84482f3a339..d5d65c39caf 100644 --- a/WooCommerce/WooCommerceTests/ViewRelated/Products/Edit Product/ProductFormViewModelTests.swift +++ b/WooCommerce/WooCommerceTests/ViewRelated/Products/Edit Product/ProductFormViewModelTests.swift @@ -56,7 +56,7 @@ final class ProductFormViewModelTests: XCTestCase { XCTAssertFalse(canViewProductInStore) } - func test_edit_product_form_with_non_published_status_can_view_product_in_store() { + func test_edit_product_form_with_non_published_status_cannot_view_product_in_store() { // Arrange let product = Product.fake().copy(name: "Test", statusKey: ProductStatus.pending.rawValue) let viewModel = createViewModel(product: product, formType: .edit) @@ -65,7 +65,7 @@ final class ProductFormViewModelTests: XCTestCase { let canViewProductInStore = viewModel.canViewProductInStore() // Assert - XCTAssertTrue(canViewProductInStore) + XCTAssertFalse(canViewProductInStore) } func test_add_product_form_with_non_published_status_cannot_view_product_in_store() { From f137a526107d2819d89fe7b1d051a616c73d0723 Mon Sep 17 00:00:00 2001 From: Huong Do Date: Thu, 23 Jan 2025 21:03:30 +0700 Subject: [PATCH 08/12] Revert "Enable viewing product page for private products" This reverts commit ab372902f05bd8a605b6cf851e4a2cdb86517408. --- .../Products/Edit Product/ProductFormViewModel.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WooCommerce/Classes/ViewRelated/Products/Edit Product/ProductFormViewModel.swift b/WooCommerce/Classes/ViewRelated/Products/Edit Product/ProductFormViewModel.swift index be13df519d4..4b4354d0713 100644 --- a/WooCommerce/Classes/ViewRelated/Products/Edit Product/ProductFormViewModel.swift +++ b/WooCommerce/Classes/ViewRelated/Products/Edit Product/ProductFormViewModel.swift @@ -304,7 +304,7 @@ extension ProductFormViewModel { } func canViewProductInStore() -> Bool { - formType != .add + originalProduct.product.productStatus == .published && formType != .add } func canShareProduct() -> Bool { From c844adef52f8d12a2c76bdc0cd924f40a8f593c0 Mon Sep 17 00:00:00 2001 From: Huong Do Date: Thu, 23 Jan 2025 21:49:52 +0700 Subject: [PATCH 09/12] Only authenticate preview page if possible --- .../Products/Edit Product/ProductFormViewController.swift | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/WooCommerce/Classes/ViewRelated/Products/Edit Product/ProductFormViewController.swift b/WooCommerce/Classes/ViewRelated/Products/Edit Product/ProductFormViewController.swift index 343bebd5641..85515e85c12 100644 --- a/WooCommerce/Classes/ViewRelated/Products/Edit Product/ProductFormViewController.swift +++ b/WooCommerce/Classes/ViewRelated/Products/Edit Product/ProductFormViewController.swift @@ -1046,6 +1046,14 @@ private extension ProductFormViewController { guard let url = URL(string: product.permalink) else { return } + + let stores = ServiceLocator.stores + guard let site = stores.sessionManager.defaultSite, + stores.shouldAuthenticateAdminPage(for: site) else { + WebviewHelper.launch(url.absoluteString, with: self) + return + } + let viewModel = DefaultAuthenticatedWebViewModel(title: product.name, initialURL: url) let controller = AuthenticatedWebViewController(viewModel: viewModel) let navigationController = UINavigationController(rootViewController: controller) From 26eef5c605f9353c7479bc3b4d9860ff7032b0b0 Mon Sep 17 00:00:00 2001 From: Huong Do Date: Thu, 23 Jan 2025 22:20:22 +0700 Subject: [PATCH 10/12] Check for Jetpack plugin before authenticate user --- .../ViewRelated/JetpackSetup/JetpackSetupCoordinator.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WooCommerce/Classes/ViewRelated/JetpackSetup/JetpackSetupCoordinator.swift b/WooCommerce/Classes/ViewRelated/JetpackSetup/JetpackSetupCoordinator.swift index 044648c2546..6ae57348e91 100644 --- a/WooCommerce/Classes/ViewRelated/JetpackSetup/JetpackSetupCoordinator.swift +++ b/WooCommerce/Classes/ViewRelated/JetpackSetup/JetpackSetupCoordinator.swift @@ -222,7 +222,7 @@ private extension JetpackSetupCoordinator { /// WPCom credentials to authenticate the user in the Jetpack connection web view automatically let credentials: Credentials = .wpcom(username: username, authToken: authToken, siteAddress: site.url) - guard jetpackConnectedEmail == nil else { + guard jetpackConnectedEmail == nil || !site.isJetpackThePluginInstalled else { // authenticate user immediately return authenticateUserAndRefreshSite(with: credentials) } From 71eebed50d4fdc9e2d78257a6a2bb4946e99b0ee Mon Sep 17 00:00:00 2001 From: Huong Do Date: Thu, 23 Jan 2025 23:18:20 +0700 Subject: [PATCH 11/12] Revert "Check for Jetpack plugin before authenticate user" This reverts commit 26eef5c605f9353c7479bc3b4d9860ff7032b0b0. --- .../ViewRelated/JetpackSetup/JetpackSetupCoordinator.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WooCommerce/Classes/ViewRelated/JetpackSetup/JetpackSetupCoordinator.swift b/WooCommerce/Classes/ViewRelated/JetpackSetup/JetpackSetupCoordinator.swift index 6ae57348e91..044648c2546 100644 --- a/WooCommerce/Classes/ViewRelated/JetpackSetup/JetpackSetupCoordinator.swift +++ b/WooCommerce/Classes/ViewRelated/JetpackSetup/JetpackSetupCoordinator.swift @@ -222,7 +222,7 @@ private extension JetpackSetupCoordinator { /// WPCom credentials to authenticate the user in the Jetpack connection web view automatically let credentials: Credentials = .wpcom(username: username, authToken: authToken, siteAddress: site.url) - guard jetpackConnectedEmail == nil || !site.isJetpackThePluginInstalled else { + guard jetpackConnectedEmail == nil else { // authenticate user immediately return authenticateUserAndRefreshSite(with: credentials) } From eaf703f1e96fe2df353e25b0847fe5f3e22fc865 Mon Sep 17 00:00:00 2001 From: Huong Do Date: Fri, 24 Jan 2025 09:56:22 +0700 Subject: [PATCH 12/12] Update release notes --- RELEASE-NOTES.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index dc5eea4654b..80b940604bf 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -5,7 +5,7 @@ - [Internal] [*] Improved handling of the navigation to the Woo Installation screen post Jetpack setup [https://github.com/woocommerce/woocommerce-ios/pull/14837] - [*] Receipts: Email receipts can now be sent to customers after failed payments using WooCommerce Stripe 9.1.0+. [https://github.com/woocommerce/woocommerce-ios/pull/14864]. - [*] Dashboard: Updated the drag gesture on the Performance chart to show stats instantly. [https://github.com/woocommerce/woocommerce-ios/pull/14906] -- [*] Product Form: Support previewing products on coming-soon stores and non-published products. [https://github.com/woocommerce/woocommerce-ios/pull/14931] +- [*] Product Form: Support previewing products on coming-soon stores. [https://github.com/woocommerce/woocommerce-ios/pull/14931] - [Internal] Removed feedback survey for Store Setup feature [https://github.com/woocommerce/woocommerce-ios/pull/14888] - [Internal] Removed feedback survey for shipping label creation [https://github.com/woocommerce/woocommerce-ios/pull/14889] - [Internal] Removed feedback survey for product creation AI [https://github.com/woocommerce/woocommerce-ios/pull/14890]