Skip to content

Commit 877e2c2

Browse files
authored
[Order Editing] Show exit confirmation for unsynced changes in a split view (#15394)
2 parents 7c87081 + b4bda32 commit 877e2c2

File tree

5 files changed

+48
-4
lines changed

5 files changed

+48
-4
lines changed

RELEASE-NOTES.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
22.1
55
-----
6+
- [*] Order Creation: Resolved an issue where the exit confirmation was not displayed when there were unsaved changes in a split view [https://github.com/woocommerce/woocommerce-ios/pull/15394].
67
- [*] Order Creation: Fixed an issue where order recalculation would stop working after canceling a confirmation with unsaved changes [https://github.com/woocommerce/woocommerce-ios/pull/15392].
78
- [internal] Improve data fetching in Order Details, to avoid I/O performance on the main thread. [https://github.com/woocommerce/woocommerce-ios/pull/14999]
89

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,10 @@ final class EditableOrderViewModel: ObservableObject {
7777
switch flow {
7878
case .creation: // Creation can be dismissed when there aren't changes pending to commit.
7979
return !hasChanges
80-
case .editing: // Editing can always be dismissed because changes are committed instantly.
81-
return true
80+
case .editing:
81+
// In a single-view layout: Editing can always be dismissed because changes are committed instantly.
82+
// In a split-view layout: Editing can be dismissed when there aren't product changes pending to recalculate.
83+
return !(selectionSyncApproach == .onRecalculateButtonTap && syncRequired)
8284
}
8385
}
8486

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,9 @@ private extension OrderFormHostingController {
9090
}
9191

9292
func discardOrderAndDismiss() {
93-
viewModel.discardOrder()
93+
if viewModel.flow == .creation {
94+
viewModel.discardOrder()
95+
}
9496
dismiss(animated: true)
9597
}
9698

WooCommerce/WooCommerce.xcodeproj/xcshareddata/xcschemes/WooCommerce.xcscheme

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@
148148
</CommandLineArgument>
149149
<CommandLineArgument
150150
argument = "-simulate-stripe-card-reader"
151-
isEnabled = "NO">
151+
isEnabled = "YES">
152152
</CommandLineArgument>
153153
<CommandLineArgument
154154
argument = "-force-crash-logging 1"

WooCommerce/WooCommerceTests/ViewRelated/Orders/Order Creation/EditableOrderViewModelTests.swift

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3312,6 +3312,45 @@ final class EditableOrderViewModelTests: XCTestCase {
33123312
assertEqual(customerData.billing, orderToUpdate.billingAddress)
33133313
assertEqual(customerData.shipping, orderToUpdate.shippingAddress)
33143314
}
3315+
3316+
func test_canBeDismissed_whenEditing_withNoChanges_returnsTrue() {
3317+
// Given
3318+
let initialOrder = Order.fake()
3319+
let viewModel = EditableOrderViewModel(siteID: 123, flow: .editing(initialOrder: initialOrder))
3320+
3321+
// When
3322+
viewModel.selectionSyncApproach = .onRecalculateButtonTap
3323+
viewModel.syncRequired = false
3324+
3325+
// Then
3326+
XCTAssertTrue(viewModel.canBeDismissed)
3327+
}
3328+
3329+
func test_canBeDismissed_whenEditing_withPendingRecalculation_returnsFalse() {
3330+
// Given
3331+
let initialOrder = Order.fake()
3332+
let viewModel = EditableOrderViewModel(siteID: 123, flow: .editing(initialOrder: initialOrder))
3333+
3334+
// When
3335+
viewModel.selectionSyncApproach = .onRecalculateButtonTap
3336+
viewModel.syncRequired = true
3337+
3338+
// Then
3339+
XCTAssertFalse(viewModel.canBeDismissed)
3340+
}
3341+
3342+
func test_canBeDismissed_whenEditing_withImmediateSync_returnsTrue() {
3343+
// Given
3344+
let initialOrder = Order.fake()
3345+
let viewModel = EditableOrderViewModel(siteID: 123, flow: .editing(initialOrder: initialOrder))
3346+
3347+
// When
3348+
viewModel.selectionSyncApproach = .immediate
3349+
viewModel.syncRequired = true
3350+
3351+
// Then
3352+
XCTAssertTrue(viewModel.canBeDismissed)
3353+
}
33153354
}
33163355

33173356
private extension EditableOrderViewModelTests {

0 commit comments

Comments
 (0)