@@ -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
718765private extension WooShippingCreateLabelsViewModel {
0 commit comments