Skip to content

Commit 9542462

Browse files
authored
[Woo POS] Add new items to the top of the cart (#13802)
2 parents fca2df4 + 88d7502 commit 9542462

File tree

3 files changed

+21
-9
lines changed

3 files changed

+21
-9
lines changed

WooCommerce/Classes/POS/Presentation/CartView.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,9 +95,9 @@ struct CartView: View {
9595
.coordinateSpace(name: Constants.scrollViewCoordinateSpaceIdentifier)
9696
.onChange(of: cartViewModel.itemToScrollToWhenCartUpdated?.id) { _ in
9797
if viewModel.orderStage == .building,
98-
let last = cartViewModel.itemToScrollToWhenCartUpdated?.id {
98+
let itemToScrollTo = cartViewModel.itemToScrollToWhenCartUpdated?.id {
9999
withAnimation {
100-
proxy.scrollTo(last)
100+
proxy.scrollTo(itemToScrollTo)
101101
}
102102
}
103103
}

WooCommerce/Classes/POS/ViewModels/CartViewModel.swift

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ final class CartViewModel: CartViewModelProtocol {
4545

4646
func addItemToCart(_ item: POSItem) {
4747
let cartItem = CartItem(id: UUID(), item: item, quantity: 1)
48-
itemsInCart.append(cartItem)
48+
itemsInCart.insert(cartItem, at: 0)
49+
itemToScrollToWhenCartUpdated = cartItem
4950

5051
analytics.track(.pointOfSaleAddItemToCart)
5152
}
@@ -58,9 +59,7 @@ final class CartViewModel: CartViewModelProtocol {
5859
itemsInCart.removeAll()
5960
}
6061

61-
var itemToScrollToWhenCartUpdated: CartItem? {
62-
return itemsInCart.last
63-
}
62+
var itemToScrollToWhenCartUpdated: CartItem?
6463

6564
var itemsInCartLabel: String? {
6665
switch itemsInCart.count {

WooCommerce/WooCommerceTests/POS/ViewModels/CartViewModelTests.swift

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ final class CartViewModelTests: XCTestCase {
4343
sut.submitCart()
4444
}
4545

46-
func test_cart_when_addItemToCart_is_invoked_then_adds_item_to_cart() {
46+
func test_addItemToCart_then_cart_is_not_empty() {
4747
// Given
4848
XCTAssertTrue(sut.itemsInCart.isEmpty, "Initial state")
4949
let item = Self.makeItem()
@@ -55,6 +55,19 @@ final class CartViewModelTests: XCTestCase {
5555
XCTAssertTrue(sut.itemsInCart.isNotEmpty)
5656
}
5757

58+
func test_addItemToCart_when_multiple_items_added_then_latest_item_is_first() {
59+
// Given
60+
XCTAssertTrue(sut.itemsInCart.isEmpty, "Initial state")
61+
let items = [Self.makeItem(), Self.makeItem(), Self.makeItem()]
62+
63+
// When
64+
items.forEach(sut.addItemToCart)
65+
66+
// Then
67+
XCTAssertEqual(sut.itemsInCart.map(\.item.itemID), items.reversed().map(\.itemID))
68+
XCTAssertNotEqual(sut.itemsInCart.map(\.item.itemID), items.map(\.itemID))
69+
}
70+
5871
func test_removeItemFromCart() {
5972
/* TODO:
6073
https://github.com/woocommerce/woocommerce-ios/issues/13209
@@ -71,15 +84,15 @@ final class CartViewModelTests: XCTestCase {
7184
sut.addItemToCart(item)
7285
sut.addItemToCart(anotherItem)
7386
XCTAssertEqual(sut.itemsInCart.count, 2)
74-
XCTAssertEqual(sut.itemsInCart.map { $0.item.name }, [item, anotherItem].map { $0.name })
87+
XCTAssertEqual(sut.itemsInCart.map { $0.item.name }, [anotherItem, item].map { $0.name })
7588

7689
// When
7790
let firstCartItem = try XCTUnwrap(sut.itemsInCart.first)
7891
sut.removeItemFromCart(firstCartItem)
7992

8093
// Then
8194
XCTAssertEqual(sut.itemsInCart.count, 1)
82-
XCTAssertEqual(sut.itemsInCart.map { $0.item.name }, [anotherItem.name])
95+
XCTAssertEqual(sut.itemsInCart.map { $0.item.name }, [item.name])
8396
}
8497

8598
func test_cart_when_removeAllItemsFromCart_is_invoked_then_removes_all_items_from_cart() {

0 commit comments

Comments
 (0)