From bc7b9f4255455a67202b373acfa431f3a1a0f5cb Mon Sep 17 00:00:00 2001 From: Evgeny Aleksandrov Date: Tue, 18 Oct 2022 18:20:12 +0300 Subject: [PATCH 1/3] Add completion closures to saveProduct --- .../Products/Edit Product/ProductFormViewController.swift | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/WooCommerce/Classes/ViewRelated/Products/Edit Product/ProductFormViewController.swift b/WooCommerce/Classes/ViewRelated/Products/Edit Product/ProductFormViewController.swift index ea217926e8a..346a9143432 100644 --- a/WooCommerce/Classes/ViewRelated/Products/Edit Product/ProductFormViewController.swift +++ b/WooCommerce/Classes/ViewRelated/Products/Edit Product/ProductFormViewController.swift @@ -716,14 +716,14 @@ private extension ProductFormViewController { // MARK: Navigation actions // private extension ProductFormViewController { - func saveProduct(status: ProductStatus? = nil) { + func saveProduct(status: ProductStatus? = nil, onCompletion: @escaping (Result) -> Void = { _ in }) { let productStatus = status ?? product.status let messageType = viewModel.saveMessageType(for: productStatus) showSavingProgress(messageType) - saveProductRemotely(status: status) + saveProductRemotely(status: status, onCompletion: onCompletion) } - func saveProductRemotely(status: ProductStatus?) { + func saveProductRemotely(status: ProductStatus?, onCompletion: @escaping (Result) -> Void = { _ in }) { viewModel.saveProductRemotely(status: status) { [weak self] result in switch result { case .failure(let error): @@ -732,6 +732,7 @@ private extension ProductFormViewController { // Dismisses the in-progress UI then presents the error alert. self?.navigationController?.dismiss(animated: true) { self?.displayError(error: error) + onCompletion(.failure(error)) } case .success: // Dismisses the in-progress UI, then presents the confirmation alert. @@ -741,6 +742,7 @@ private extension ProductFormViewController { // Show linked products promo banner after product save (self?.viewModel as? ProductFormViewModel)?.isLinkedProductsPromoEnabled = true self?.reloadLinkedPromoCellAnimated() + onCompletion(.success(())) } } } From ec8d76b45d5d0d28caea8c2b1033c5da213cdb4d Mon Sep 17 00:00:00 2001 From: Evgeny Aleksandrov Date: Tue, 18 Oct 2022 18:20:30 +0300 Subject: [PATCH 2/3] Add preview option in action sheet --- .../ProductFormViewController.swift | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/WooCommerce/Classes/ViewRelated/Products/Edit Product/ProductFormViewController.swift b/WooCommerce/Classes/ViewRelated/Products/Edit Product/ProductFormViewController.swift index 346a9143432..8f5fc519f40 100644 --- a/WooCommerce/Classes/ViewRelated/Products/Edit Product/ProductFormViewController.swift +++ b/WooCommerce/Classes/ViewRelated/Products/Edit Product/ProductFormViewController.swift @@ -229,6 +229,20 @@ final class ProductFormViewController: } } + if viewModel.canSaveAsDraft() || viewModel.productModel.status == .draft { + actionSheet.addDefaultActionWithTitle(ActionSheetStrings.previewProduct) { [weak self] _ in + if self?.viewModel.canSaveAsDraft() == true || self?.viewModel.hasUnsavedChanges() == true { + self?.saveProduct(status: .draft) { result in + if result.isSuccess { + self?.displayProductPreview() + } + } + } else { + self?.displayProductPreview() + } + } + } + /// The "View product in store" action will be shown only if the product is published. if viewModel.canViewProductInStore() { actionSheet.addDefaultActionWithTitle(ActionSheetStrings.viewProduct) { [weak self] _ in @@ -780,6 +794,9 @@ private extension ProductFormViewController { SharingHelper.shareURL(url: url, title: product.name, from: view, in: self) } + func displayProductPreview() { + } + func duplicateProduct() { showSavingProgress(.duplicate) viewModel.duplicateProduct(onCompletion: { [weak self] result in @@ -1557,6 +1574,8 @@ private enum Localization { private enum ActionSheetStrings { static let saveProductAsDraft = NSLocalizedString("Save as draft", comment: "Button title to save a product as draft in Product More Options Action Sheet") + static let previewProduct = NSLocalizedString("Preview", + comment: "Button title to open preview link for a product in Product More Options Action Sheet") static let viewProduct = NSLocalizedString("View Product in Store", comment: "Button title View product in store in Edit Product More Options Action Sheet") static let share = NSLocalizedString("Share", comment: "Button title Share in Edit Product More Options Action Sheet") From 3451283022b80a1f3a0a898d1e2ddde4d38c55ff Mon Sep 17 00:00:00 2001 From: Evgeny Aleksandrov Date: Tue, 18 Oct 2022 18:20:50 +0300 Subject: [PATCH 3/3] Open product URL with preview parameter --- .../Edit Product/ProductFormViewController.swift | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/WooCommerce/Classes/ViewRelated/Products/Edit Product/ProductFormViewController.swift b/WooCommerce/Classes/ViewRelated/Products/Edit Product/ProductFormViewController.swift index 8f5fc519f40..4b7ab91ee9a 100644 --- a/WooCommerce/Classes/ViewRelated/Products/Edit Product/ProductFormViewController.swift +++ b/WooCommerce/Classes/ViewRelated/Products/Edit Product/ProductFormViewController.swift @@ -795,6 +795,15 @@ private extension ProductFormViewController { } func displayProductPreview() { + var permalink = URLComponents(string: product.permalink) + var updatedQueryItems = permalink?.queryItems ?? [] + updatedQueryItems.append(.init(name: "preview", value: "true")) + permalink?.queryItems = updatedQueryItems + guard let url = permalink?.url else { + return + } + + WebviewHelper.launch(url, with: self) } func duplicateProduct() {