@@ -2,6 +2,7 @@ import Foundation
22import Observation
33import enum Yosemite. POSItem
44import protocol Yosemite. PointOfSaleItemServiceProtocol
5+ import enum Yosemite. PointOfSaleItemServiceError
56import struct Yosemite. POSVariableParentProduct
67import class Yosemite. Store
78
@@ -162,26 +163,33 @@ private extension PointOfSaleItemsController {
162163 /// - Returns: A boolean that indicates whether there is next page for the paginated items.
163164 @MainActor
164165 func fetchItems( pageNumber: Int , appendToExistingItems: Bool = true ) async throws -> Bool {
165- let pagedItems = try await itemProvider. providePointOfSaleItems ( pageNumber: pageNumber)
166- let newItems = pagedItems. items
167- var allItems = appendToExistingItems ? itemsViewState. itemsStack. root. items : [ ]
168- let uniqueNewItems = newItems. filter { newItem in
169- // Note that this uniquing won't currently work, as POSItem has a UUID.
170- !allItems. contains ( newItem)
171- }
172- allItems. append ( contentsOf: uniqueNewItems)
173- if allItems. isEmpty {
174- itemsViewState. containerState = . empty
175- itemsViewState. itemsStack = ItemsStackState ( root: . loaded( [ ] , hasMoreItems: false ) ,
176- itemStates: [ : ] )
177- } else {
178- let itemStates = itemsViewState. itemsStack. itemStates
179- . filter { allItems. contains ( $0. key) }
166+ do {
167+ let pagedItems = try await itemProvider. providePointOfSaleItems ( pageNumber: pageNumber)
168+ let newItems = pagedItems. items
169+ var allItems = appendToExistingItems ? itemsViewState. itemsStack. root. items : [ ]
170+ let uniqueNewItems = newItems. filter { newItem in
171+ // Note that this uniquing won't currently work, as POSItem has a UUID.
172+ !allItems. contains ( newItem)
173+ }
174+ allItems. append ( contentsOf: uniqueNewItems)
175+ if allItems. isEmpty {
176+ itemsViewState. containerState = . empty
177+ itemsViewState. itemsStack = ItemsStackState ( root: . loaded( [ ] , hasMoreItems: false ) ,
178+ itemStates: [ : ] )
179+ } else {
180+ let itemStates = itemsViewState. itemsStack. itemStates
181+ . filter { allItems. contains ( $0. key) }
182+ itemsViewState. containerState = . content
183+ itemsViewState. itemsStack = ItemsStackState ( root: . loaded( allItems, hasMoreItems: pagedItems. hasMorePages) ,
184+ itemStates: itemStates)
185+ }
186+ return pagedItems. hasMorePages
187+ } catch PointOfSaleItemServiceError . requestCancelled {
180188 itemsViewState. containerState = . content
181- itemsViewState. itemsStack = ItemsStackState ( root: . loaded( allItems, hasMoreItems: pagedItems. hasMorePages) ,
182- itemStates: itemStates)
189+ itemsViewState. itemsStack. root = . loaded( itemsViewState. itemsStack. root. items, hasMoreItems: true )
190+ // Assume that we have more pages since we'd made a request, and it was cancelled
191+ return true
183192 }
184- return pagedItems. hasMorePages
185193 }
186194
187195 /// Fetches variation items given a page number and appends new unique items to the existing items array.
@@ -192,20 +200,28 @@ private extension PointOfSaleItemsController {
192200 parentItem: POSItem ,
193201 pageNumber: Int ,
194202 appendToExistingItems: Bool = true ) async throws -> Bool {
195- let pagedItems = try await itemProvider. providePointOfSaleVariationItems (
196- for: parentProduct,
197- pageNumber: pageNumber
198- )
199- let newItems = pagedItems. items
200- var allItems : [ POSItem ] = appendToExistingItems ? ( itemsViewState. itemsStack. itemStates [ parentItem] ? . items ?? [ ] ) : [ ]
201- let uniqueNewItems = newItems. filter { newItem in
202- // Note that this uniquing won't currently work, as POSItem has a UUID.
203- !allItems. contains ( newItem)
204- }
205- allItems. append ( contentsOf: uniqueNewItems)
203+ do {
204+ let pagedItems = try await itemProvider. providePointOfSaleVariationItems (
205+ for: parentProduct,
206+ pageNumber: pageNumber
207+ )
208+ let newItems = pagedItems. items
209+ var allItems : [ POSItem ] = appendToExistingItems ? ( itemsViewState. itemsStack. itemStates [ parentItem] ? . items ?? [ ] ) : [ ]
210+ let uniqueNewItems = newItems. filter { newItem in
211+ // Note that this uniquing won't currently work, as POSItem has a UUID.
212+ !allItems. contains ( newItem)
213+ }
214+ allItems. append ( contentsOf: uniqueNewItems)
206215
207- updateState ( for: parentItem, to: . loaded( allItems, hasMoreItems: pagedItems. hasMorePages) )
208- return pagedItems. hasMorePages
216+ updateState ( for: parentItem, to: . loaded( allItems, hasMoreItems: pagedItems. hasMorePages) )
217+ return pagedItems. hasMorePages
218+ } catch PointOfSaleItemServiceError . requestCancelled {
219+ itemsViewState. containerState = . content
220+ updateState ( for: parentItem, to: . loaded( itemsViewState. itemsStack. itemStates [ parentItem] ? . items ?? [ ] ,
221+ hasMoreItems: true ) )
222+ // Assume that we have more pages since we'd made a request, and it was cancelled
223+ return true
224+ }
209225 }
210226}
211227
0 commit comments