From 530c10f532b8e36edb7aa4dc7ad15d2ffb256323 Mon Sep 17 00:00:00 2001 From: Huong Do Date: Tue, 17 Jun 2025 12:29:04 +0700 Subject: [PATCH 1/3] Freeze all data from results controller before reloading order details --- .../OrderDetailsDataSource.swift | 35 ++++++++----------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/WooCommerce/Classes/ViewModels/Order Details/OrderDetailsDataSource.swift b/WooCommerce/Classes/ViewModels/Order Details/OrderDetailsDataSource.swift index 57a29ff0f54..6db8561be87 100644 --- a/WooCommerce/Classes/ViewModels/Order Details/OrderDetailsDataSource.swift +++ b/WooCommerce/Classes/ViewModels/Order Details/OrderDetailsDataSource.swift @@ -136,27 +136,19 @@ final class OrderDetailsDataSource: NSObject { /// Order shipment tracking list /// - var orderTracking: [ShipmentTracking] { - return resultsControllers.orderTracking - } + var orderTracking: [ShipmentTracking] = [] /// Order statuses list /// - var currentSiteStatuses: [OrderStatus] { - return resultsControllers.currentSiteStatuses - } + var currentSiteStatuses: [OrderStatus] = [] /// Products from an Order /// - var products: [Product] { - return resultsControllers.products - } + var products: [Product] = [] /// Custom amounts (fees) from an Order /// - var customAmounts: [OrderFeeLine] { - return resultsControllers.feeLines - } + var customAmounts: [OrderFeeLine] = [] /// OrderItemsRefund Count /// @@ -166,19 +158,13 @@ final class OrderDetailsDataSource: NSObject { /// Refunds on an Order /// - var refunds: [Refund] { - return resultsControllers.refunds - } + var refunds: [Refund] = [] - var addOnGroups: [AddOnGroup] { - resultsControllers.addOnGroups - } + var addOnGroups: [AddOnGroup] = [] /// Shipping Methods list /// - var siteShippingMethods: [ShippingMethod] { - resultsControllers.siteShippingMethods - } + var siteShippingMethods: [ShippingMethod] = [] /// Shipping Labels for an Order /// @@ -1202,6 +1188,13 @@ extension OrderDetailsDataSource { products: products, productVariations: resultsControllers.productVariations ) + refunds = resultsControllers.refunds + customAmounts = resultsControllers.feeLines + orderTracking = resultsControllers.orderTracking + currentSiteStatuses = resultsControllers.currentSiteStatuses + products = resultsControllers.products + addOnGroups = resultsControllers.addOnGroups + siteShippingMethods = resultsControllers.siteShippingMethods var sections = buildStaticSections().compactMap { $0 } let paymentSection = await createPaymentSection() From a3083942803e73f077cb451b5d480280389e3be9 Mon Sep 17 00:00:00 2001 From: Huong Do Date: Tue, 17 Jun 2025 16:48:22 +0700 Subject: [PATCH 2/3] Update release notes --- RELEASE-NOTES.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index f487f0d607f..037e1b7e494 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -3,6 +3,7 @@ 22.7 ----- +- [*] Order Details: Fix crash when reloading data [https://github.com/woocommerce/woocommerce-ios/pull/15764] 22.6 From dc7f0dc6aba19a41a6e62f00a96e695bfed984d6 Mon Sep 17 00:00:00 2001 From: Huong Do Date: Wed, 18 Jun 2025 11:35:42 +0700 Subject: [PATCH 3/3] Freeze product variations --- .../OrderDetailsDataSource.swift | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/WooCommerce/Classes/ViewModels/Order Details/OrderDetailsDataSource.swift b/WooCommerce/Classes/ViewModels/Order Details/OrderDetailsDataSource.swift index 6db8561be87..045dc977bfc 100644 --- a/WooCommerce/Classes/ViewModels/Order Details/OrderDetailsDataSource.swift +++ b/WooCommerce/Classes/ViewModels/Order Details/OrderDetailsDataSource.swift @@ -146,6 +146,10 @@ final class OrderDetailsDataSource: NSObject { /// var products: [Product] = [] + /// Product variations from an order + /// + var productVariations: [ProductVariation] = [] + /// Custom amounts (fees) from an Order /// var customAmounts: [OrderFeeLine] = [] @@ -1157,7 +1161,7 @@ extension OrderDetailsDataSource { } private func lookUpProductVariation(productID: Int64, variationID: Int64) -> ProductVariation? { - return resultsControllers.productVariations.filter({ $0.productID == productID && $0.productVariationID == variationID }).first + return productVariations.filter({ $0.productID == productID && $0.productVariationID == variationID }).first } func lookUpRefund(by refundID: Int64) -> Refund? { @@ -1181,13 +1185,6 @@ extension OrderDetailsDataSource { @MainActor func reloadSections() async { // Freezes any data that require lookup after the sections are reloaded, in case the data from a ResultsController changes before the next reload. - shippingLabels = resultsControllers.shippingLabels - shippingLabelOrderItemsAggregator = AggregatedShippingLabelOrderItems( - shippingLabels: shippingLabels, - orderItems: items, - products: products, - productVariations: resultsControllers.productVariations - ) refunds = resultsControllers.refunds customAmounts = resultsControllers.feeLines orderTracking = resultsControllers.orderTracking @@ -1195,6 +1192,14 @@ extension OrderDetailsDataSource { products = resultsControllers.products addOnGroups = resultsControllers.addOnGroups siteShippingMethods = resultsControllers.siteShippingMethods + productVariations = resultsControllers.productVariations + shippingLabels = resultsControllers.shippingLabels + shippingLabelOrderItemsAggregator = AggregatedShippingLabelOrderItems( + shippingLabels: shippingLabels, + orderItems: items, + products: products, + productVariations: productVariations + ) var sections = buildStaticSections().compactMap { $0 } let paymentSection = await createPaymentSection()