Skip to content

Commit 189addc

Browse files
authored
Merge pull request #7138 from woocommerce/issue/6961-refactor-new-order-flow-2
[Unified Order Editing] Refactor Order Creation form
2 parents 4a207f9 + 198b06f commit 189addc

File tree

11 files changed

+220
-151
lines changed

11 files changed

+220
-151
lines changed

WooCommerce/Classes/ViewRelated/Orders/Order Creation/CustomerNoteSection/CustomerNoteSection.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ import SwiftUI
33
struct CustomerNoteSection: View {
44

55
/// Parent view model to access all data
6-
@ObservedObject var viewModel: NewOrderViewModel
6+
@ObservedObject var viewModel: EditableOrderViewModel
77

88
/// View model to drive the view content
9-
private var notesDataViewModel: NewOrderViewModel.CustomerNoteDataViewModel {
9+
private var notesDataViewModel: EditableOrderViewModel.CustomerNoteDataViewModel {
1010
viewModel.customerNoteDataViewModel
1111
}
1212

@@ -35,7 +35,7 @@ struct CustomerNoteSection: View {
3535

3636
private struct CustomerNoteSectionContent: View {
3737
/// View model to drive the view content
38-
var viewModel: NewOrderViewModel.CustomerNoteDataViewModel
38+
var viewModel: EditableOrderViewModel.CustomerNoteDataViewModel
3939

4040
@Binding var showEditNotesView: Bool
4141

@@ -117,8 +117,8 @@ private extension CustomerNoteSectionContent {
117117

118118
struct CustomerNoteSection_Previews: PreviewProvider {
119119
static var previews: some View {
120-
let emptyViewModel = NewOrderViewModel.CustomerNoteDataViewModel(customerNote: "")
121-
let notesViewModel = NewOrderViewModel.CustomerNoteDataViewModel(customerNote: "some notes")
120+
let emptyViewModel = EditableOrderViewModel.CustomerNoteDataViewModel(customerNote: "")
121+
let notesViewModel = EditableOrderViewModel.CustomerNoteDataViewModel(customerNote: "some notes")
122122

123123
ScrollView {
124124
CustomerNoteSectionContent(viewModel: emptyViewModel, showEditNotesView: .constant(false))

WooCommerce/Classes/ViewRelated/Orders/Order Creation/CustomerNoteSection/NewOrderCustomerNoteViewModel.swift renamed to WooCommerce/Classes/ViewRelated/Orders/Order Creation/CustomerNoteSection/OrderFormCustomerNoteViewModel.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import Foundation
22
import Combine
33

4-
class NewOrderCustomerNoteViewModel: EditCustomerNoteViewModelProtocol {
4+
class OrderFormCustomerNoteViewModel: EditCustomerNoteViewModelProtocol {
55
/// Store for the edited content
66
///
77
@Published var newNote: String

WooCommerce/Classes/ViewRelated/Orders/Order Creation/CustomerSection/OrderCustomerSection.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import SwiftUI
55
struct OrderCustomerSection: View {
66

77
/// Parent view model to access all data
8-
@ObservedObject var viewModel: NewOrderViewModel
8+
@ObservedObject var viewModel: EditableOrderViewModel
99

1010
/// View model for the address form.
1111
///
@@ -33,7 +33,7 @@ struct OrderCustomerSection: View {
3333
private struct OrderCustomerSectionContent: View {
3434

3535
/// View model to drive the view content
36-
var viewModel: NewOrderViewModel.CustomerDataViewModel
36+
var viewModel: EditableOrderViewModel.CustomerDataViewModel
3737

3838
@Binding var showAddressForm: Bool
3939

@@ -138,8 +138,8 @@ private extension OrderCustomerSectionContent {
138138
@available(iOS 15.0, *)
139139
struct OrderCustomerSection_Previews: PreviewProvider {
140140
static var previews: some View {
141-
let emptyViewModel = NewOrderViewModel.CustomerDataViewModel(billingAddress: nil, shippingAddress: nil)
142-
let addressViewModel = NewOrderViewModel.CustomerDataViewModel(fullName: "Johnny Appleseed",
141+
let emptyViewModel = EditableOrderViewModel.CustomerDataViewModel(billingAddress: nil, shippingAddress: nil)
142+
let addressViewModel = EditableOrderViewModel.CustomerDataViewModel(fullName: "Johnny Appleseed",
143143
billingAddressFormatted: nil,
144144
shippingAddressFormatted: """
145145
Johnny Appleseed

WooCommerce/Classes/ViewRelated/Orders/Order Creation/NewOrderViewModel.swift renamed to WooCommerce/Classes/ViewRelated/Orders/Order Creation/EditableOrderViewModel.swift

Lines changed: 43 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ import Experiments
55
import WooFoundation
66
import enum Networking.DotcomError
77

8-
/// View model for `NewOrder`.
8+
/// View model used in Order Creation and Editing flows.
99
///
10-
final class NewOrderViewModel: ObservableObject {
10+
final class EditableOrderViewModel: ObservableObject {
1111
let siteID: Int64
1212
private let stores: StoresManager
1313
private let storageManager: StorageManagerType
@@ -188,7 +188,7 @@ final class NewOrderViewModel: ObservableObject {
188188

189189
/// View model for the customer note section.
190190
///
191-
lazy private(set) var noteViewModel = { NewOrderCustomerNoteViewModel(originalNote: "") }()
191+
lazy private(set) var noteViewModel = { OrderFormCustomerNoteViewModel(originalNote: "") }()
192192

193193
// MARK: Payment properties
194194

@@ -357,6 +357,12 @@ final class NewOrderViewModel: ObservableObject {
357357
trackCreateButtonTapped()
358358
}
359359

360+
/// Action triggered on `Done` button tap in order editing flow.
361+
///
362+
func finishEditing() {
363+
self.onFinished(orderSynchronizer.order)
364+
}
365+
360366
/// Assign this closure to be notified when the flow has finished.
361367
/// For creation it means that the order has been created.
362368
/// For edition it means that the merchant has finished editing the order.
@@ -392,7 +398,7 @@ final class NewOrderViewModel: ObservableObject {
392398
}
393399

394400
// MARK: - Types
395-
extension NewOrderViewModel {
401+
extension EditableOrderViewModel {
396402
/// Representation of possible navigation bar trailing buttons
397403
///
398404
enum NavigationItem: Equatable {
@@ -528,7 +534,7 @@ extension NewOrderViewModel {
528534
}
529535

530536
// MARK: - Helpers
531-
private extension NewOrderViewModel {
537+
private extension EditableOrderViewModel {
532538

533539
/// Sets the view to be `disabled` when `performingNetworkRequest` or when `statePublisher` is `.syncing(blocking: true)`
534540
///
@@ -573,9 +579,9 @@ private extension NewOrderViewModel {
573579
guard let self = self else { return nil }
574580
switch state {
575581
case .error(let error):
576-
DDLogError("⛔️ Error syncing new order remotely: \(error)")
582+
DDLogError("⛔️ Error syncing order remotely: \(error)")
577583
self.trackSyncOrderFailure(error: error)
578-
return NoticeFactory.syncOrderErrorNotice(error, with: self.orderSynchronizer)
584+
return NoticeFactory.syncOrderErrorNotice(error, flow: self.flow, with: self.orderSynchronizer)
579585
default:
580586
return nil
581587
}
@@ -829,15 +835,15 @@ private extension NewOrderViewModel {
829835
}
830836
}
831837

832-
private extension NewOrderViewModel {
838+
private extension EditableOrderViewModel {
833839
/// Fetches products from storage.
834840
///
835841
func updateProductsResultsController() {
836842
do {
837843
try productsResultsController.performFetch()
838844
allProducts = productsResultsController.fetchedObjects
839845
} catch {
840-
DDLogError("⛔️ Error fetching products for new order: \(error)")
846+
DDLogError("⛔️ Error fetching products for order: \(error)")
841847
}
842848
}
843849

@@ -848,16 +854,15 @@ private extension NewOrderViewModel {
848854
try productVariationsResultsController.performFetch()
849855
allProductVariations = productVariationsResultsController.fetchedObjects
850856
} catch {
851-
DDLogError("⛔️ Error fetching product variations for new order: \(error)")
857+
DDLogError("⛔️ Error fetching product variations for order: \(error)")
852858
}
853859
}
854860
}
855861

856862
// MARK: Constants
857863

858-
extension NewOrderViewModel {
859-
/// New Order notices
860-
///
864+
extension EditableOrderViewModel {
865+
861866
enum NoticeFactory {
862867
/// Returns a default order creation error notice.
863868
///
@@ -870,11 +875,20 @@ extension NewOrderViewModel {
870875

871876
/// Returns an order sync error notice.
872877
///
873-
static func syncOrderErrorNotice(_ error: Error, with orderSynchronizer: OrderSynchronizer) -> Notice {
878+
static func syncOrderErrorNotice(_ error: Error, flow: Flow, with orderSynchronizer: OrderSynchronizer) -> Notice {
874879
guard !isEmailError(error, order: orderSynchronizer.order) else {
875880
return Notice(title: Localization.invalidBillingParameters, message: Localization.invalidBillingSuggestion, feedbackType: .error)
876881
}
877-
return Notice(title: Localization.errorMessageOrderSync, feedbackType: .error, actionTitle: Localization.retryOrderSync) {
882+
883+
let errorMessage: String
884+
switch flow {
885+
case .creation:
886+
errorMessage = Localization.errorMessageNewOrderSync
887+
case .editing:
888+
errorMessage = Localization.errorMessageEditOrderSync
889+
}
890+
891+
return Notice(title: errorMessage, feedbackType: .error, actionTitle: Localization.retryOrderSync) {
878892
orderSynchronizer.retryTrigger.send()
879893
}
880894
}
@@ -893,18 +907,24 @@ extension NewOrderViewModel {
893907
}
894908
}
895909

896-
private extension NewOrderViewModel {
910+
private extension EditableOrderViewModel {
897911
enum Localization {
898912
static let titleForNewOrder = NSLocalizedString("New Order", comment: "Title for the order creation screen")
899913
static let titleWithOrderNumber = NSLocalizedString("Order #%1$@", comment: "Order number title. Parameters: %1$@ - order number")
900-
static let errorMessageOrderCreation = NSLocalizedString("Unable to create new order", comment: "Notice displayed when order creation fails")
901-
static let errorMessageOrderSync = NSLocalizedString("Unable to load taxes for order",
902-
comment: "Notice displayed when taxes cannot be synced for new order")
914+
static let errorMessageOrderCreation = NSLocalizedString("Unable to create new order",
915+
comment: "Notice displayed when order creation fails")
916+
static let errorMessageNewOrderSync = NSLocalizedString("Unable to load taxes for order",
917+
comment: "Notice displayed when data cannot be synced for new order")
918+
static let errorMessageEditOrderSync = NSLocalizedString("Unable to save changes. Please try again.",
919+
comment: "Notice displayed when data cannot be synced for edited order")
920+
903921
static let retryOrderSync = NSLocalizedString("Retry", comment: "Action button to retry syncing the draft order")
904922

905-
static let invalidBillingParameters = NSLocalizedString("Unable to set customer details.",
906-
comment: "Error notice title when we fail to update an address when creating an order.")
907-
static let invalidBillingSuggestion = NSLocalizedString("Please make sure you are running the latest version of WooCommerce and try again later.",
908-
comment: "Recovery suggestion when we fail to update an address when creating an order")
923+
static let invalidBillingParameters =
924+
NSLocalizedString("Unable to set customer details.",
925+
comment: "Error notice title when we fail to update an address when creating or editing an order.")
926+
static let invalidBillingSuggestion =
927+
NSLocalizedString("Please make sure you are running the latest version of WooCommerce and try again later.",
928+
comment: "Recovery suggestion when we fail to update an address when creating or editing an order")
909929
}
910930
}

WooCommerce/Classes/ViewRelated/Orders/Order Creation/FlowCoordinator/AddOrderCoordinator.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,13 +75,13 @@ private extension AddOrderCoordinator {
7575
ServiceLocator.analytics.track(event: WooAnalyticsEvent.SimplePayments.simplePaymentsFlowStarted())
7676
}
7777

78-
/// Presents `NewOrderHostingController`.
78+
/// Presents `OrderFormHostingController`.
7979
///
8080
func presentNewOrderController() {
81-
let viewModel = NewOrderViewModel(siteID: siteID)
81+
let viewModel = EditableOrderViewModel(siteID: siteID)
8282
viewModel.onFinished = onOrderCreated
8383

84-
let viewController = NewOrderHostingController(viewModel: viewModel)
84+
let viewController = OrderFormHostingController(viewModel: viewModel)
8585
if ServiceLocator.featureFlagService.isFeatureFlagEnabled(.splitViewInOrdersTab) {
8686
let newOrderNC = WooNavigationController(rootViewController: viewController)
8787
navigationController.present(newOrderNC, animated: true)

0 commit comments

Comments
 (0)