Skip to content

Commit 37422ce

Browse files
committed
Load store settings asynchronously if data has been cached
1 parent 08437b0 commit 37422ce

File tree

1 file changed

+53
-6
lines changed

1 file changed

+53
-6
lines changed

WooCommerce/Classes/ViewRelated/Orders/Order Details/Shipping Labels/WooShipping Create Shipping Labels/WooShippingCreateLabelsViewModel.swift

Lines changed: 53 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,18 @@ final class WooShippingCreateLabelsViewModel: ObservableObject {
229229
return ResultsController<StorageWooShippingOriginAddress>(storageManager: storageManager, matching: predicate, sortedBy: [descriptor])
230230
}()
231231

232+
/// Shipping Label Account Settings ResultsController
233+
///
234+
private lazy var accountSettingsResultsController: ResultsController<StorageShippingLabelAccountSettings> = {
235+
let predicate = NSPredicate(format: "siteID == %lld", order.siteID)
236+
return ResultsController<StorageShippingLabelAccountSettings>(
237+
storageManager: storageManager,
238+
matching: predicate,
239+
fetchLimit: 1,
240+
sortedBy: []
241+
)
242+
}()
243+
232244
/// Initialize the view model with or without an existing shipping label.
233245
init(order: Order,
234246
preselection: WooShippingCreateLabelSelection? = nil,
@@ -250,6 +262,8 @@ final class WooShippingCreateLabelsViewModel: ObservableObject {
250262
self.storageManager = storageManager
251263
self.analytics = analytics
252264
self.shippingSettingsService = shippingSettingsService
265+
self.weightUnit = shippingSettingsService.weightUnit ?? ""
266+
self.dimensionsUnit = shippingSettingsService.dimensionUnit ?? ""
253267
self.initialNoticeDelay = initialNoticeDelay
254268
self.isOrderCompleted = order.status == .completed
255269

@@ -277,6 +291,7 @@ final class WooShippingCreateLabelsViewModel: ObservableObject {
277291
observePaymentMethod()
278292
configureShipmentResultsController()
279293
configureOriginAddressResultsController()
294+
configureAccountSettingsResultsController()
280295

281296
Task { @MainActor in
282297
await loadRequiredData()
@@ -301,10 +316,14 @@ final class WooShippingCreateLabelsViewModel: ObservableObject {
301316
func loadRequiredData() async {
302317
state = .loading
303318
await withTaskGroup(of: Void.self) { group in
319+
/// Only load store options synchronously if no settings have been saved in storage yet.
304320
if isMissingStoreSettings {
305321
group.addTask {
306322
await self.loadStoreOptions()
307323
}
324+
} else {
325+
/// load asynchronously to update the local storage and unblock UI
326+
stores.dispatch(WooShippingAction.loadAccountSettings(siteID: order.siteID, completion: { _ in }))
308327
}
309328

310329
/// Only load origin addresses synchronously if no addresses have been saved in storage yet.
@@ -432,12 +451,7 @@ private extension WooShippingCreateLabelsViewModel {
432451
}
433452
weightUnit = settings?.storeOptions.weightUnit ?? shippingSettingsService.weightUnit ?? ""
434453
dimensionsUnit = settings?.storeOptions.dimensionUnit ?? shippingSettingsService.dimensionUnit ?? ""
435-
markOrderComplete = settings?.accountSettings.lastOrderCompleted ?? false
436-
437-
if let accountSettings = settings?.accountSettings {
438-
paymentMethodsViewModel = ShippingLabelPaymentMethodsViewModel(accountSettings: accountSettings)
439-
}
440-
setupPaymentMethod(accountSettings: settings?.accountSettings)
454+
updateAccountSettings(accountSettings: settings?.accountSettings)
441455
}
442456

443457
/// Syncs origin addresses to use for shipping label from remote.
@@ -713,6 +727,39 @@ private extension WooShippingCreateLabelsViewModel {
713727
self?.selectedOriginAddress = selectedAddress
714728
}
715729
}
730+
731+
/// Shipping Label Account Settings ResultsController monitoring
732+
///
733+
func configureAccountSettingsResultsController() {
734+
let updateSettings = { [weak self] in
735+
guard let self else { return }
736+
let settings = accountSettingsResultsController.fetchedObjects.first
737+
updateAccountSettings(accountSettings: settings)
738+
}
739+
accountSettingsResultsController.onDidChangeContent = {
740+
updateSettings()
741+
}
742+
743+
accountSettingsResultsController.onDidResetContent = {
744+
updateSettings()
745+
}
746+
747+
do {
748+
try accountSettingsResultsController.performFetch()
749+
updateSettings()
750+
} catch {
751+
DDLogError("⛔️ Unable to fetch woo shipping account settings: \(error)")
752+
}
753+
}
754+
755+
func updateAccountSettings(accountSettings: ShippingLabelAccountSettings?) {
756+
markOrderComplete = accountSettings?.lastOrderCompleted ?? false
757+
758+
if let accountSettings {
759+
paymentMethodsViewModel = ShippingLabelPaymentMethodsViewModel(accountSettings: accountSettings)
760+
}
761+
setupPaymentMethod(accountSettings: accountSettings)
762+
}
716763
}
717764

718765
private extension WooShippingCreateLabelsViewModel {

0 commit comments

Comments
 (0)