From 03cb46c1e3f92f74e6643363d5a7c661b4903dea Mon Sep 17 00:00:00 2001 From: FelixSFD Date: Sat, 27 May 2023 11:26:19 +0200 Subject: [PATCH 1/3] refactored code for HTTP requests to maybe fix cancelled tasks --- Shared/Model/GrocyAPI.swift | 64 +++++++++++++++++++++++++++---------- 1 file changed, 48 insertions(+), 16 deletions(-) diff --git a/Shared/Model/GrocyAPI.swift b/Shared/Model/GrocyAPI.swift index 949d7893..eb54b362 100644 --- a/Shared/Model/GrocyAPI.swift +++ b/Shared/Model/GrocyAPI.swift @@ -255,6 +255,38 @@ public class GrocyApi: GrocyAPI { } } + + private func executeUrlRequestSync( + _ urlRequest: URLRequest, + _ type: T.Type, + completion: @escaping (T?, Error?) -> Void + ) throws { + let dataTask = URLSession.shared.dataTask(with: urlRequest) { data, response, error in + if let httpResponse = response as? HTTPURLResponse { + if (200...299).contains(httpResponse.statusCode) { + do { + // TODO: remove force cast + let responseDataDecoded = try JSONDecoder().decode(T.self, from: data!) + completion(responseDataDecoded, nil) + } catch { + completion(nil, APIError.decodingError(error: error)) + } + } else { + do { + // TODO: remove force cast + let responseErrorDecoded = try JSONDecoder().decode(ErrorMessage.self, from: data!) + completion(nil, APIError.errorString(description: responseErrorDecoded.errorMessage)) + } catch { + completion(nil, APIError.decodingError(error: error)) + } + } + } + } + + dataTask.resume() + } + + private func callAPI( _ endPoint: Endpoint, method: Method, @@ -273,25 +305,25 @@ public class GrocyApi: GrocyAPI { query: query, hassIngressToken: hassIngressToken ) - let result = try await URLSession.shared.data(for: urlRequest) - if let httpResponse = result.1 as? HTTPURLResponse { - if (200...299).contains(httpResponse.statusCode) { - do { - let responseDataDecoded = try JSONDecoder().decode(T.self, from: result.0) - return responseDataDecoded - } catch { - throw APIError.decodingError(error: error) - } - } else { - do { - let responseErrorDecoded = try JSONDecoder().decode(ErrorMessage.self, from: result.0) - throw APIError.errorString(description: responseErrorDecoded.errorMessage) - } catch { - throw APIError.decodingError(error: error) + + return try await withCheckedThrowingContinuation { (continuation: CheckedContinuation) in + do { + try executeUrlRequestSync(urlRequest, T.self) { result, error in + if result == nil { + guard let safeError = error else { + continuation.resume(throwing: APIError.internalError) + return + } + + continuation.resume(throwing: safeError) + } else { + continuation.resume(returning: result!) + } } + } catch { + continuation.resume(throwing: error) } } - throw APIError.internalError } private func request( From 964cdc4d0fc7f88cf59743f69e7d12a2a5ad0284 Mon Sep 17 00:00:00 2001 From: FelixSFD Date: Sat, 27 May 2023 11:33:50 +0200 Subject: [PATCH 2/3] use ObservedObject instead of SteteObject for grocyVM --- Shared/Model/OpenFoodFacts/OpenFoodFactsViewModel.swift | 2 +- Shared/Views/Additional/ServerProblemView.swift | 2 +- Shared/Views/Admin/UserManagementView.swift | 2 +- Shared/Views/Admin/UserRowView.swift | 2 +- Shared/Views/Components/AmountSelectionView.swift | 2 +- Shared/Views/Components/MyDoubleStepper.swift | 4 ++-- Shared/Views/Components/ProductField.swift | 2 +- Shared/Views/Components/ServerSettingsItems.swift | 8 ++++---- Shared/Views/MasterData/MDBarcodesView.swift | 6 +++--- Shared/Views/MasterData/MDBatteriesView.swift | 2 +- Shared/Views/MasterData/MDForms/MDBarcodeFormView.swift | 2 +- Shared/Views/MasterData/MDForms/MDLocationFormView.swift | 2 +- Shared/Views/MasterData/MDForms/MDProductFormView.swift | 4 ++-- .../Views/MasterData/MDForms/MDProductGroupFormView.swift | 2 +- .../MasterData/MDForms/MDProductPictureFormView.swift | 2 +- .../MDForms/MDQuantityUnitConversionFormView.swift | 2 +- .../Views/MasterData/MDForms/MDQuantityUnitFormView.swift | 2 +- .../MasterData/MDForms/MDShoppingLocationFormView.swift | 2 +- .../Views/MasterData/MDForms/MDTaskCategoryFormView.swift | 2 +- .../Views/MasterData/MDForms/MDUserEntityFormView.swift | 2 +- Shared/Views/MasterData/MDForms/MDUserFieldFormView.swift | 2 +- Shared/Views/MasterData/MDLocationsView.swift | 4 ++-- Shared/Views/MasterData/MDProductGroupsView.swift | 2 +- Shared/Views/MasterData/MDProductsView.swift | 4 ++-- Shared/Views/MasterData/MDQuantityUnitsView.swift | 2 +- Shared/Views/MasterData/MDShoppingLocationsView.swift | 2 +- Shared/Views/MasterData/MDTaskCategoriesView.swift | 2 +- Shared/Views/MasterData/MDUserEntitiesView.swift | 2 +- Shared/Views/MasterData/MDUserFieldsView.swift | 2 +- Shared/Views/Navigation/AppSidebarNavigation.swift | 2 +- Shared/Views/Onboarding/LoginView.swift | 2 +- .../OpenFoodFacts/OpenFoodFactsFillProductView.swift | 2 +- Shared/Views/OpenFoodFacts/OpenFoodFactsScannerView.swift | 2 +- Shared/Views/Recipes/RecipeRowView.swift | 2 +- Shared/Views/Recipes/RecipesView.swift | 2 +- Shared/Views/Settings/GrocyUserInfoView.swift | 2 +- Shared/Views/Settings/LogView.swift | 2 +- Shared/Views/Settings/SettingsAppView.swift | 2 +- Shared/Views/Settings/SettingsShoppingListView.swift | 2 +- Shared/Views/Settings/SettingsStockView.swift | 2 +- Shared/Views/Settings/SettingsView.swift | 2 +- Shared/Views/ShoppingList/ShoppingListEntriesView.swift | 4 ++-- Shared/Views/ShoppingList/ShoppingListEntryFormView.swift | 2 +- Shared/Views/ShoppingList/ShoppingListFormView.swift | 2 +- .../Views/ShoppingList/ShoppingListRowActionsView.swift | 2 +- Shared/Views/ShoppingList/ShoppingListView.swift | 2 +- Shared/Views/Stock/StockEntriesView.swift | 4 ++-- Shared/Views/Stock/StockEntryFormView.swift | 2 +- Shared/Views/Stock/StockFilterActionsView.swift | 2 +- Shared/Views/Stock/StockFilterBarView.swift | 2 +- .../Views/Stock/StockInteraction/ConsumeProductView.swift | 2 +- .../Stock/StockInteraction/InventoryProductView.swift | 2 +- .../Stock/StockInteraction/PurchaseProductView.swift | 2 +- .../Stock/StockInteraction/TransferProductView.swift | 2 +- Shared/Views/Stock/StockJournalView.swift | 6 +++--- Shared/Views/Stock/StockProductInfoView.swift | 2 +- Shared/Views/Stock/StockTableMenuEntriesView.swift | 2 +- Shared/Views/Stock/StockTableRow.swift | 2 +- Shared/Views/Stock/StockTableRowActionsView.swift | 2 +- Shared/Views/Stock/StockView.swift | 2 +- iOS/ActivitiesView.swift | 2 +- iOS/QuickScan/QuickScanModeInputView.swift | 2 +- iOS/QuickScan/QuickScanModeSelectProductView.swift | 2 +- iOS/QuickScan/QuickScanModeView.swift | 2 +- macOS/StockTable.swift | 2 +- 65 files changed, 78 insertions(+), 78 deletions(-) diff --git a/Shared/Model/OpenFoodFacts/OpenFoodFactsViewModel.swift b/Shared/Model/OpenFoodFacts/OpenFoodFactsViewModel.swift index 862c6b10..6d47425b 100644 --- a/Shared/Model/OpenFoodFacts/OpenFoodFactsViewModel.swift +++ b/Shared/Model/OpenFoodFacts/OpenFoodFactsViewModel.swift @@ -10,7 +10,7 @@ import Foundation import Combine class OpenFoodFactsViewModel: ObservableObject { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @Published var offData: OpenFoodFactsResult? @Published var errorMessage: String? = nil diff --git a/Shared/Views/Additional/ServerProblemView.swift b/Shared/Views/Additional/ServerProblemView.swift index bacd1c33..bd0d4062 100644 --- a/Shared/Views/Additional/ServerProblemView.swift +++ b/Shared/Views/Additional/ServerProblemView.swift @@ -10,7 +10,7 @@ import SwiftUI struct ServerProblemView: View { var isCompact: Bool = false - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @AppStorage("devMode") private var devMode: Bool = false diff --git a/Shared/Views/Admin/UserManagementView.swift b/Shared/Views/Admin/UserManagementView.swift index 8f33a798..b829ac28 100644 --- a/Shared/Views/Admin/UserManagementView.swift +++ b/Shared/Views/Admin/UserManagementView.swift @@ -8,7 +8,7 @@ import SwiftUI struct UserManagementView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @State private var searchString: String = "" diff --git a/Shared/Views/Admin/UserRowView.swift b/Shared/Views/Admin/UserRowView.swift index 4a693e32..726c4dfe 100644 --- a/Shared/Views/Admin/UserRowView.swift +++ b/Shared/Views/Admin/UserRowView.swift @@ -8,7 +8,7 @@ import SwiftUI struct UserRowActionsView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared var user: GrocyUser var isCurrentUser: Bool diff --git a/Shared/Views/Components/AmountSelectionView.swift b/Shared/Views/Components/AmountSelectionView.swift index ec768720..5cb14ff7 100644 --- a/Shared/Views/Components/AmountSelectionView.swift +++ b/Shared/Views/Components/AmountSelectionView.swift @@ -8,7 +8,7 @@ import SwiftUI struct AmountSelectionView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @Binding var productID: Int? @Binding var amount: Double diff --git a/Shared/Views/Components/MyDoubleStepper.swift b/Shared/Views/Components/MyDoubleStepper.swift index 2a897fe7..0fb91477 100644 --- a/Shared/Views/Components/MyDoubleStepper.swift +++ b/Shared/Views/Components/MyDoubleStepper.swift @@ -8,7 +8,7 @@ import SwiftUI struct MyDoubleStepper: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @Binding var amount: Double var description: String @@ -90,7 +90,7 @@ struct MyDoubleStepper: View { struct MyDoubleStepperOptional: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @Binding var amount: Double? var description: String diff --git a/Shared/Views/Components/ProductField.swift b/Shared/Views/Components/ProductField.swift index 0c1b21e0..cc9d832d 100644 --- a/Shared/Views/Components/ProductField.swift +++ b/Shared/Views/Components/ProductField.swift @@ -48,7 +48,7 @@ struct ProductField: View { #endif - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @Binding var productID: Int? var description: String diff --git a/Shared/Views/Components/ServerSettingsItems.swift b/Shared/Views/Components/ServerSettingsItems.swift index 1a119c23..92fca59e 100644 --- a/Shared/Views/Components/ServerSettingsItems.swift +++ b/Shared/Views/Components/ServerSettingsItems.swift @@ -8,7 +8,7 @@ import SwiftUI struct ServerSettingsToggle: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @State private var isOn: Bool = false @@ -60,7 +60,7 @@ struct ServerSettingsToggle: View { } struct ServerSettingsIntStepper: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @State private var value: Int = 0 @@ -108,7 +108,7 @@ struct ServerSettingsIntStepper: View { } struct ServerSettingsDoubleStepper: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @State private var value: Double = 0 @@ -156,7 +156,7 @@ struct ServerSettingsDoubleStepper: View { } struct ServerSettingsObjectPicker: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @State private var objectID: Int? = nil diff --git a/Shared/Views/MasterData/MDBarcodesView.swift b/Shared/Views/MasterData/MDBarcodesView.swift index 5cb83f58..f648e263 100644 --- a/Shared/Views/MasterData/MDBarcodesView.swift +++ b/Shared/Views/MasterData/MDBarcodesView.swift @@ -8,7 +8,7 @@ import SwiftUI struct MDBarcodeRowView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared var barcode: MDProductBarcode @@ -36,7 +36,7 @@ struct MDBarcodeRowView: View { } struct MDBarcodesView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared var productID: Int @@ -230,7 +230,7 @@ struct MDBarcodesView: View { } struct MDBarcodesView_Previews: PreviewProvider { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared static var previews: some View { NavigationView{ MDBarcodesView(productID: 27, toastType: Binding.constant(nil)) diff --git a/Shared/Views/MasterData/MDBatteriesView.swift b/Shared/Views/MasterData/MDBatteriesView.swift index 68a72bc2..077e765e 100644 --- a/Shared/Views/MasterData/MDBatteriesView.swift +++ b/Shared/Views/MasterData/MDBatteriesView.swift @@ -8,7 +8,7 @@ import SwiftUI struct MDBatteriesView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared var body: some View { VStack{ diff --git a/Shared/Views/MasterData/MDForms/MDBarcodeFormView.swift b/Shared/Views/MasterData/MDForms/MDBarcodeFormView.swift index 36ae7129..b2adcb0b 100644 --- a/Shared/Views/MasterData/MDForms/MDBarcodeFormView.swift +++ b/Shared/Views/MasterData/MDForms/MDBarcodeFormView.swift @@ -8,7 +8,7 @@ import SwiftUI struct MDBarcodeFormView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @Environment(\.dismiss) var dismiss diff --git a/Shared/Views/MasterData/MDForms/MDLocationFormView.swift b/Shared/Views/MasterData/MDForms/MDLocationFormView.swift index b43b9efb..5ea5184f 100644 --- a/Shared/Views/MasterData/MDForms/MDLocationFormView.swift +++ b/Shared/Views/MasterData/MDForms/MDLocationFormView.swift @@ -8,7 +8,7 @@ import SwiftUI struct MDLocationFormView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @Environment(\.dismiss) var dismiss diff --git a/Shared/Views/MasterData/MDForms/MDProductFormView.swift b/Shared/Views/MasterData/MDForms/MDProductFormView.swift index 17d783e5..b1959da2 100644 --- a/Shared/Views/MasterData/MDForms/MDProductFormView.swift +++ b/Shared/Views/MasterData/MDForms/MDProductFormView.swift @@ -8,7 +8,7 @@ import SwiftUI struct MDProductFormOFFView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @StateObject var offVM: OpenFoodFactsViewModel @Binding var name: String @@ -96,7 +96,7 @@ struct MDProductFormOFFView: View { } struct MDProductFormView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @Environment(\.dismiss) var dismiss diff --git a/Shared/Views/MasterData/MDForms/MDProductGroupFormView.swift b/Shared/Views/MasterData/MDForms/MDProductGroupFormView.swift index f2f9eaa2..1043661a 100644 --- a/Shared/Views/MasterData/MDForms/MDProductGroupFormView.swift +++ b/Shared/Views/MasterData/MDForms/MDProductGroupFormView.swift @@ -8,7 +8,7 @@ import SwiftUI struct MDProductGroupFormView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @Environment(\.dismiss) var dismiss diff --git a/Shared/Views/MasterData/MDForms/MDProductPictureFormView.swift b/Shared/Views/MasterData/MDForms/MDProductPictureFormView.swift index 0407b5aa..f7de4c68 100644 --- a/Shared/Views/MasterData/MDForms/MDProductPictureFormView.swift +++ b/Shared/Views/MasterData/MDForms/MDProductPictureFormView.swift @@ -8,7 +8,7 @@ import SwiftUI struct MDProductPictureFormView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared var product: MDProduct? diff --git a/Shared/Views/MasterData/MDForms/MDQuantityUnitConversionFormView.swift b/Shared/Views/MasterData/MDForms/MDQuantityUnitConversionFormView.swift index 02eb7cd9..272b35cb 100644 --- a/Shared/Views/MasterData/MDForms/MDQuantityUnitConversionFormView.swift +++ b/Shared/Views/MasterData/MDForms/MDQuantityUnitConversionFormView.swift @@ -8,7 +8,7 @@ import SwiftUI struct MDQuantityUnitConversionFormView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @Environment(\.dismiss) var dismiss diff --git a/Shared/Views/MasterData/MDForms/MDQuantityUnitFormView.swift b/Shared/Views/MasterData/MDForms/MDQuantityUnitFormView.swift index bf5915b8..d4fefb75 100644 --- a/Shared/Views/MasterData/MDForms/MDQuantityUnitFormView.swift +++ b/Shared/Views/MasterData/MDForms/MDQuantityUnitFormView.swift @@ -8,7 +8,7 @@ import SwiftUI struct MDQuantityUnitFormView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @Environment(\.dismiss) var dismiss diff --git a/Shared/Views/MasterData/MDForms/MDShoppingLocationFormView.swift b/Shared/Views/MasterData/MDForms/MDShoppingLocationFormView.swift index fb0887e0..c13d8e90 100644 --- a/Shared/Views/MasterData/MDForms/MDShoppingLocationFormView.swift +++ b/Shared/Views/MasterData/MDForms/MDShoppingLocationFormView.swift @@ -8,7 +8,7 @@ import SwiftUI struct MDStoreFormView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @Environment(\.dismiss) var dismiss diff --git a/Shared/Views/MasterData/MDForms/MDTaskCategoryFormView.swift b/Shared/Views/MasterData/MDForms/MDTaskCategoryFormView.swift index 0f28f261..c0b28211 100644 --- a/Shared/Views/MasterData/MDForms/MDTaskCategoryFormView.swift +++ b/Shared/Views/MasterData/MDForms/MDTaskCategoryFormView.swift @@ -8,7 +8,7 @@ import SwiftUI struct MDTaskCategoryFormView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @Environment(\.dismiss) var dismiss diff --git a/Shared/Views/MasterData/MDForms/MDUserEntityFormView.swift b/Shared/Views/MasterData/MDForms/MDUserEntityFormView.swift index 1292a90a..3efc64fe 100644 --- a/Shared/Views/MasterData/MDForms/MDUserEntityFormView.swift +++ b/Shared/Views/MasterData/MDForms/MDUserEntityFormView.swift @@ -8,7 +8,7 @@ import SwiftUI struct MDUserEntityFormView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @Environment(\.dismiss) var dismiss diff --git a/Shared/Views/MasterData/MDForms/MDUserFieldFormView.swift b/Shared/Views/MasterData/MDForms/MDUserFieldFormView.swift index f244e66b..db9b028e 100644 --- a/Shared/Views/MasterData/MDForms/MDUserFieldFormView.swift +++ b/Shared/Views/MasterData/MDForms/MDUserFieldFormView.swift @@ -8,7 +8,7 @@ import SwiftUI struct MDUserFieldFormView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @Environment(\.dismiss) var dismiss diff --git a/Shared/Views/MasterData/MDLocationsView.swift b/Shared/Views/MasterData/MDLocationsView.swift index fc8663cf..a71ca183 100644 --- a/Shared/Views/MasterData/MDLocationsView.swift +++ b/Shared/Views/MasterData/MDLocationsView.swift @@ -8,7 +8,7 @@ import SwiftUI struct MDLocationRowView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared var location: MDLocation @@ -32,7 +32,7 @@ struct MDLocationRowView: View { } struct MDLocationsView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @State private var searchString: String = "" diff --git a/Shared/Views/MasterData/MDProductGroupsView.swift b/Shared/Views/MasterData/MDProductGroupsView.swift index 5b94975d..8ddcf14c 100644 --- a/Shared/Views/MasterData/MDProductGroupsView.swift +++ b/Shared/Views/MasterData/MDProductGroupsView.swift @@ -24,7 +24,7 @@ struct MDProductGroupRowView: View { } struct MDProductGroupsView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @Environment(\.dismiss) var dismiss diff --git a/Shared/Views/MasterData/MDProductsView.swift b/Shared/Views/MasterData/MDProductsView.swift index 9ddd5ce3..9f956a28 100644 --- a/Shared/Views/MasterData/MDProductsView.swift +++ b/Shared/Views/MasterData/MDProductsView.swift @@ -8,7 +8,7 @@ import SwiftUI struct MDProductRowView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared var product: MDProduct @@ -67,7 +67,7 @@ struct MDProductRowView: View { } struct MDProductsView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @State private var searchString: String = "" diff --git a/Shared/Views/MasterData/MDQuantityUnitsView.swift b/Shared/Views/MasterData/MDQuantityUnitsView.swift index 707f2caa..5c4a6317 100644 --- a/Shared/Views/MasterData/MDQuantityUnitsView.swift +++ b/Shared/Views/MasterData/MDQuantityUnitsView.swift @@ -28,7 +28,7 @@ struct MDQuantityUnitRowView: View { } struct MDQuantityUnitsView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @Environment(\.dismiss) var dismiss diff --git a/Shared/Views/MasterData/MDShoppingLocationsView.swift b/Shared/Views/MasterData/MDShoppingLocationsView.swift index 8eb4c6df..5713401e 100644 --- a/Shared/Views/MasterData/MDShoppingLocationsView.swift +++ b/Shared/Views/MasterData/MDShoppingLocationsView.swift @@ -24,7 +24,7 @@ struct MDStoreRowView: View { } struct MDStoresView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @State private var searchString: String = "" diff --git a/Shared/Views/MasterData/MDTaskCategoriesView.swift b/Shared/Views/MasterData/MDTaskCategoriesView.swift index 6045b1c1..ee512072 100644 --- a/Shared/Views/MasterData/MDTaskCategoriesView.swift +++ b/Shared/Views/MasterData/MDTaskCategoriesView.swift @@ -24,7 +24,7 @@ struct MDTaskCategoryRowView: View { } struct MDTaskCategoriesView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @Environment(\.dismiss) var dismiss diff --git a/Shared/Views/MasterData/MDUserEntitiesView.swift b/Shared/Views/MasterData/MDUserEntitiesView.swift index 7d24f7d6..f6d5f620 100644 --- a/Shared/Views/MasterData/MDUserEntitiesView.swift +++ b/Shared/Views/MasterData/MDUserEntitiesView.swift @@ -21,7 +21,7 @@ struct MDUserEntityRowView: View { } struct MDUserEntitiesView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @Environment(\.dismiss) var dismiss diff --git a/Shared/Views/MasterData/MDUserFieldsView.swift b/Shared/Views/MasterData/MDUserFieldsView.swift index e0811758..8e47e680 100644 --- a/Shared/Views/MasterData/MDUserFieldsView.swift +++ b/Shared/Views/MasterData/MDUserFieldsView.swift @@ -25,7 +25,7 @@ struct MDUserFieldRowView: View { } struct MDUserFieldsView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @Environment(\.dismiss) var dismiss diff --git a/Shared/Views/Navigation/AppSidebarNavigation.swift b/Shared/Views/Navigation/AppSidebarNavigation.swift index 0540d264..67373b2a 100644 --- a/Shared/Views/Navigation/AppSidebarNavigation.swift +++ b/Shared/Views/Navigation/AppSidebarNavigation.swift @@ -45,7 +45,7 @@ extension AppSidebarNavigation { } struct AppSidebarNavigation: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @State private var firstAppear: Bool = true diff --git a/Shared/Views/Onboarding/LoginView.swift b/Shared/Views/Onboarding/LoginView.swift index 82fbbb5c..1b5e5e6d 100644 --- a/Shared/Views/Onboarding/LoginView.swift +++ b/Shared/Views/Onboarding/LoginView.swift @@ -306,7 +306,7 @@ struct LoginStatusView: View { @State var loginState: LoginState var animation: Namespace.ID - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @AppStorage("demoServerURL") var demoServerURL: String = GrocyAPP.DemoServers.noLanguage.rawValue @AppStorage("grocyServerURL") var grocyServerURL: String = "" diff --git a/Shared/Views/OpenFoodFacts/OpenFoodFactsFillProductView.swift b/Shared/Views/OpenFoodFacts/OpenFoodFactsFillProductView.swift index 8c344716..0d4e42d1 100644 --- a/Shared/Views/OpenFoodFacts/OpenFoodFactsFillProductView.swift +++ b/Shared/Views/OpenFoodFacts/OpenFoodFactsFillProductView.swift @@ -8,7 +8,7 @@ import SwiftUI struct OpenFoodFactsFillProductView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @ObservedObject var offVM: OpenFoodFactsViewModel = OpenFoodFactsViewModel() @Environment(\.dismiss) var dismiss diff --git a/Shared/Views/OpenFoodFacts/OpenFoodFactsScannerView.swift b/Shared/Views/OpenFoodFacts/OpenFoodFactsScannerView.swift index be5ee054..d13f45e6 100644 --- a/Shared/Views/OpenFoodFacts/OpenFoodFactsScannerView.swift +++ b/Shared/Views/OpenFoodFacts/OpenFoodFactsScannerView.swift @@ -8,7 +8,7 @@ import SwiftUI struct OpenFoodFactsScannerView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @State private var scanBarcode: String = "" @State private var isShowingResult: Bool = false diff --git a/Shared/Views/Recipes/RecipeRowView.swift b/Shared/Views/Recipes/RecipeRowView.swift index 3c2b4adf..f07e4148 100644 --- a/Shared/Views/Recipes/RecipeRowView.swift +++ b/Shared/Views/Recipes/RecipeRowView.swift @@ -8,7 +8,7 @@ import SwiftUI struct RecipeRowView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared var recipe: Recipe diff --git a/Shared/Views/Recipes/RecipesView.swift b/Shared/Views/Recipes/RecipesView.swift index 525ffc73..b20e8b77 100644 --- a/Shared/Views/Recipes/RecipesView.swift +++ b/Shared/Views/Recipes/RecipesView.swift @@ -10,7 +10,7 @@ import SwiftUI struct RecipesView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared #if os(iOS) private var idiom : UIUserInterfaceIdiom { UIDevice.current.userInterfaceIdiom } diff --git a/Shared/Views/Settings/GrocyUserInfoView.swift b/Shared/Views/Settings/GrocyUserInfoView.swift index c2fc34c5..9069e44d 100644 --- a/Shared/Views/Settings/GrocyUserInfoView.swift +++ b/Shared/Views/Settings/GrocyUserInfoView.swift @@ -8,7 +8,7 @@ import SwiftUI struct GrocyUserInfoView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @State private var userPictureURL: URL? = nil diff --git a/Shared/Views/Settings/LogView.swift b/Shared/Views/Settings/LogView.swift index bd3a762f..47dda779 100644 --- a/Shared/Views/Settings/LogView.swift +++ b/Shared/Views/Settings/LogView.swift @@ -10,7 +10,7 @@ import UniformTypeIdentifiers import OSLog struct LogView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @AppStorage("localizationKey") var localizationKey: String = "en" diff --git a/Shared/Views/Settings/SettingsAppView.swift b/Shared/Views/Settings/SettingsAppView.swift index 21598f7f..5caca61f 100644 --- a/Shared/Views/Settings/SettingsAppView.swift +++ b/Shared/Views/Settings/SettingsAppView.swift @@ -8,7 +8,7 @@ import SwiftUI struct SettingsAppView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @AppStorage("devMode") private var devMode: Bool = false diff --git a/Shared/Views/Settings/SettingsShoppingListView.swift b/Shared/Views/Settings/SettingsShoppingListView.swift index 6eca4f3f..4bb53064 100644 --- a/Shared/Views/Settings/SettingsShoppingListView.swift +++ b/Shared/Views/Settings/SettingsShoppingListView.swift @@ -8,7 +8,7 @@ import SwiftUI struct SettingsShoppingListView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @AppStorage("devMode") private var devMode: Bool = false @AppStorage("syncShoppingListToReminders") private var syncShoppingListToReminders: Bool = false diff --git a/Shared/Views/Settings/SettingsStockView.swift b/Shared/Views/Settings/SettingsStockView.swift index 17950488..a06ea62a 100644 --- a/Shared/Views/Settings/SettingsStockView.swift +++ b/Shared/Views/Settings/SettingsStockView.swift @@ -8,7 +8,7 @@ import SwiftUI struct SettingsStockView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @State private var useQuickConsume: Bool = false diff --git a/Shared/Views/Settings/SettingsView.swift b/Shared/Views/Settings/SettingsView.swift index 0ffca1c8..d8914a0d 100644 --- a/Shared/Views/Settings/SettingsView.swift +++ b/Shared/Views/Settings/SettingsView.swift @@ -8,7 +8,7 @@ import SwiftUI struct SettingsView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @Environment(\.dismiss) var dismiss diff --git a/Shared/Views/ShoppingList/ShoppingListEntriesView.swift b/Shared/Views/ShoppingList/ShoppingListEntriesView.swift index da184627..6e1bc26f 100644 --- a/Shared/Views/ShoppingList/ShoppingListEntriesView.swift +++ b/Shared/Views/ShoppingList/ShoppingListEntriesView.swift @@ -8,7 +8,7 @@ import SwiftUI struct ShoppingListRowView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @Environment(\.colorScheme) var colorScheme @@ -59,7 +59,7 @@ struct ShoppingListRowView: View { } struct ShoppingListEntriesView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @Environment(\.colorScheme) var colorScheme diff --git a/Shared/Views/ShoppingList/ShoppingListEntryFormView.swift b/Shared/Views/ShoppingList/ShoppingListEntryFormView.swift index 78d8aea3..925d4e39 100644 --- a/Shared/Views/ShoppingList/ShoppingListEntryFormView.swift +++ b/Shared/Views/ShoppingList/ShoppingListEntryFormView.swift @@ -8,7 +8,7 @@ import SwiftUI struct ShoppingListEntryFormView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @Environment(\.dismiss) var dismiss diff --git a/Shared/Views/ShoppingList/ShoppingListFormView.swift b/Shared/Views/ShoppingList/ShoppingListFormView.swift index 172dd9a9..b47136ce 100644 --- a/Shared/Views/ShoppingList/ShoppingListFormView.swift +++ b/Shared/Views/ShoppingList/ShoppingListFormView.swift @@ -8,7 +8,7 @@ import SwiftUI struct ShoppingListFormView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @Environment(\.dismiss) var dismiss diff --git a/Shared/Views/ShoppingList/ShoppingListRowActionsView.swift b/Shared/Views/ShoppingList/ShoppingListRowActionsView.swift index b0f34494..ae9611ee 100644 --- a/Shared/Views/ShoppingList/ShoppingListRowActionsView.swift +++ b/Shared/Views/ShoppingList/ShoppingListRowActionsView.swift @@ -8,7 +8,7 @@ import SwiftUI struct ShoppingListRowActionsView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared var shoppingListItem: ShoppingListItem diff --git a/Shared/Views/ShoppingList/ShoppingListView.swift b/Shared/Views/ShoppingList/ShoppingListView.swift index ca17b8a9..19c23531 100644 --- a/Shared/Views/ShoppingList/ShoppingListView.swift +++ b/Shared/Views/ShoppingList/ShoppingListView.swift @@ -13,7 +13,7 @@ struct ShoppingListItemWrapped { } struct ShoppingListView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @State private var selectedShoppingListID: Int = 1 diff --git a/Shared/Views/Stock/StockEntriesView.swift b/Shared/Views/Stock/StockEntriesView.swift index 968d0436..9eb6b874 100644 --- a/Shared/Views/Stock/StockEntriesView.swift +++ b/Shared/Views/Stock/StockEntriesView.swift @@ -8,7 +8,7 @@ import SwiftUI struct StockEntryRowView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @AppStorage("localizationKey") var localizationKey: String = "en" @Environment(\.colorScheme) var colorScheme @@ -170,7 +170,7 @@ struct StockEntryRowView: View { } struct StockEntriesView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared var stockElement: StockElement diff --git a/Shared/Views/Stock/StockEntryFormView.swift b/Shared/Views/Stock/StockEntryFormView.swift index ebe812b9..e0734a21 100644 --- a/Shared/Views/Stock/StockEntryFormView.swift +++ b/Shared/Views/Stock/StockEntryFormView.swift @@ -8,7 +8,7 @@ import SwiftUI struct StockEntryFormView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @Environment(\.dismiss) var dismiss @AppStorage("localizationKey") var localizationKey: String = "en" diff --git a/Shared/Views/Stock/StockFilterActionsView.swift b/Shared/Views/Stock/StockFilterActionsView.swift index b236a387..8a47f3d1 100644 --- a/Shared/Views/Stock/StockFilterActionsView.swift +++ b/Shared/Views/Stock/StockFilterActionsView.swift @@ -8,7 +8,7 @@ import SwiftUI private struct StockFilterItemView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @Environment(\.colorScheme) var colorScheme var num: Int? @Binding var filteredStatus: ProductStatus diff --git a/Shared/Views/Stock/StockFilterBarView.swift b/Shared/Views/Stock/StockFilterBarView.swift index 8a322c0b..a36708c4 100644 --- a/Shared/Views/Stock/StockFilterBarView.swift +++ b/Shared/Views/Stock/StockFilterBarView.swift @@ -8,7 +8,7 @@ import SwiftUI struct StockFilterBar: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @Binding var searchString: String @Binding var filteredLocation: Int? diff --git a/Shared/Views/Stock/StockInteraction/ConsumeProductView.swift b/Shared/Views/Stock/StockInteraction/ConsumeProductView.swift index 2ccddc84..a4339661 100644 --- a/Shared/Views/Stock/StockInteraction/ConsumeProductView.swift +++ b/Shared/Views/Stock/StockInteraction/ConsumeProductView.swift @@ -8,7 +8,7 @@ import SwiftUI struct ConsumeProductView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @Environment(\.dismiss) var dismiss diff --git a/Shared/Views/Stock/StockInteraction/InventoryProductView.swift b/Shared/Views/Stock/StockInteraction/InventoryProductView.swift index 7fc2e99f..2e3da188 100644 --- a/Shared/Views/Stock/StockInteraction/InventoryProductView.swift +++ b/Shared/Views/Stock/StockInteraction/InventoryProductView.swift @@ -8,7 +8,7 @@ import SwiftUI struct InventoryProductView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @Environment(\.dismiss) var dismiss diff --git a/Shared/Views/Stock/StockInteraction/PurchaseProductView.swift b/Shared/Views/Stock/StockInteraction/PurchaseProductView.swift index 6ec3f5fb..9c0c1424 100644 --- a/Shared/Views/Stock/StockInteraction/PurchaseProductView.swift +++ b/Shared/Views/Stock/StockInteraction/PurchaseProductView.swift @@ -8,7 +8,7 @@ import SwiftUI struct PurchaseProductView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @Environment(\.dismiss) var dismiss @AppStorage("localizationKey") var localizationKey: String = "en" diff --git a/Shared/Views/Stock/StockInteraction/TransferProductView.swift b/Shared/Views/Stock/StockInteraction/TransferProductView.swift index 352f6aef..bd45fd73 100644 --- a/Shared/Views/Stock/StockInteraction/TransferProductView.swift +++ b/Shared/Views/Stock/StockInteraction/TransferProductView.swift @@ -8,7 +8,7 @@ import SwiftUI struct TransferProductView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @AppStorage("localizationKey") var localizationKey: String = "en" diff --git a/Shared/Views/Stock/StockJournalView.swift b/Shared/Views/Stock/StockJournalView.swift index ea3ec224..adea20f9 100644 --- a/Shared/Views/Stock/StockJournalView.swift +++ b/Shared/Views/Stock/StockJournalView.swift @@ -8,7 +8,7 @@ import SwiftUI struct StockJournalFilterBar: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @Binding var searchString: String @Binding var filteredProductID: Int? @@ -185,7 +185,7 @@ struct StockJournalFilterBar: View { } struct StockJournalRowView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @AppStorage("localizationKey") var localizationKey: String = "en" @@ -253,7 +253,7 @@ struct StockJournalRowView: View { } struct StockJournalView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @Environment(\.dismiss) var dismiss diff --git a/Shared/Views/Stock/StockProductInfoView.swift b/Shared/Views/Stock/StockProductInfoView.swift index 4175021e..85c1e8f7 100644 --- a/Shared/Views/Stock/StockProductInfoView.swift +++ b/Shared/Views/Stock/StockProductInfoView.swift @@ -8,7 +8,7 @@ import SwiftUI struct StockProductInfoView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @Environment(\.dismiss) var dismiss diff --git a/Shared/Views/Stock/StockTableMenuEntriesView.swift b/Shared/Views/Stock/StockTableMenuEntriesView.swift index 6c09031b..8f9d5ce7 100644 --- a/Shared/Views/Stock/StockTableMenuEntriesView.swift +++ b/Shared/Views/Stock/StockTableMenuEntriesView.swift @@ -8,7 +8,7 @@ import SwiftUI struct StockTableMenuEntriesView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared var stockElement: StockElement @Binding var selectedStockElement: StockElement? diff --git a/Shared/Views/Stock/StockTableRow.swift b/Shared/Views/Stock/StockTableRow.swift index 0909cd1a..80f3434e 100644 --- a/Shared/Views/Stock/StockTableRow.swift +++ b/Shared/Views/Stock/StockTableRow.swift @@ -8,7 +8,7 @@ import SwiftUI struct StockTableRow: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @AppStorage("localizationKey") var localizationKey: String = "en" diff --git a/Shared/Views/Stock/StockTableRowActionsView.swift b/Shared/Views/Stock/StockTableRowActionsView.swift index 3628780a..22e2dd25 100644 --- a/Shared/Views/Stock/StockTableRowActionsView.swift +++ b/Shared/Views/Stock/StockTableRowActionsView.swift @@ -8,7 +8,7 @@ import SwiftUI struct StockTableRowActionsView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared var stockElement: StockElement diff --git a/Shared/Views/Stock/StockView.swift b/Shared/Views/Stock/StockView.swift index a48b9ac5..4501d693 100644 --- a/Shared/Views/Stock/StockView.swift +++ b/Shared/Views/Stock/StockView.swift @@ -30,7 +30,7 @@ enum StockInteractionPopover: Identifiable { #endif struct StockView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @State private var firstAppear: Bool = true diff --git a/iOS/ActivitiesView.swift b/iOS/ActivitiesView.swift index 80000f1d..fafb0719 100644 --- a/iOS/ActivitiesView.swift +++ b/iOS/ActivitiesView.swift @@ -8,7 +8,7 @@ import SwiftUI struct ActivitiesView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @State var toastType: ToastType? @State var infoString: String? diff --git a/iOS/QuickScan/QuickScanModeInputView.swift b/iOS/QuickScan/QuickScanModeInputView.swift index ea28e58c..e2c09175 100644 --- a/iOS/QuickScan/QuickScanModeInputView.swift +++ b/iOS/QuickScan/QuickScanModeInputView.swift @@ -12,7 +12,7 @@ enum ConsumeAmountMode { } struct QuickScanModeInputView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @AppStorage("localizationKey") var localizationKey: String = "en" diff --git a/iOS/QuickScan/QuickScanModeSelectProductView.swift b/iOS/QuickScan/QuickScanModeSelectProductView.swift index ec4116fa..bf016131 100644 --- a/iOS/QuickScan/QuickScanModeSelectProductView.swift +++ b/iOS/QuickScan/QuickScanModeSelectProductView.swift @@ -8,7 +8,7 @@ import SwiftUI struct QuickScanModeSelectProductView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @AppStorage("devMode") private var devMode: Bool = false @AppStorage("quickScanActionAfterAdd") private var quickScanActionAfterAdd: Bool = false diff --git a/iOS/QuickScan/QuickScanModeView.swift b/iOS/QuickScan/QuickScanModeView.swift index b1d98694..2da7da0c 100644 --- a/iOS/QuickScan/QuickScanModeView.swift +++ b/iOS/QuickScan/QuickScanModeView.swift @@ -31,7 +31,7 @@ enum QSActiveSheet: Identifiable { } struct QuickScanModeView: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @AppStorage("devMode") private var devMode: Bool = false @AppStorage("quickScanActionAfterAdd") private var quickScanActionAfterAdd: Bool = false diff --git a/macOS/StockTable.swift b/macOS/StockTable.swift index 598bddba..ec2683ec 100644 --- a/macOS/StockTable.swift +++ b/macOS/StockTable.swift @@ -8,7 +8,7 @@ import SwiftUI struct StockTable: View { - @StateObject var grocyVM: GrocyViewModel = .shared + @ObservedObject var grocyVM: GrocyViewModel = .shared @Environment(\.colorScheme) var colorScheme From 704b1ad906fc70ee12106121abdeb7efd95168a3 Mon Sep 17 00:00:00 2001 From: FelixSFD Date: Sat, 27 May 2023 12:59:55 +0200 Subject: [PATCH 3/3] remove force-cast --- Shared/Model/GrocyAPI.swift | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Shared/Model/GrocyAPI.swift b/Shared/Model/GrocyAPI.swift index eb54b362..385cf2bc 100644 --- a/Shared/Model/GrocyAPI.swift +++ b/Shared/Model/GrocyAPI.swift @@ -262,19 +262,22 @@ public class GrocyApi: GrocyAPI { completion: @escaping (T?, Error?) -> Void ) throws { let dataTask = URLSession.shared.dataTask(with: urlRequest) { data, response, error in + guard let safeData = data else { + completion(nil, APIError.invalidResponse) + return + } + if let httpResponse = response as? HTTPURLResponse { if (200...299).contains(httpResponse.statusCode) { do { - // TODO: remove force cast - let responseDataDecoded = try JSONDecoder().decode(T.self, from: data!) + let responseDataDecoded = try JSONDecoder().decode(T.self, from: safeData) completion(responseDataDecoded, nil) } catch { completion(nil, APIError.decodingError(error: error)) } } else { do { - // TODO: remove force cast - let responseErrorDecoded = try JSONDecoder().decode(ErrorMessage.self, from: data!) + let responseErrorDecoded = try JSONDecoder().decode(ErrorMessage.self, from: safeData) completion(nil, APIError.errorString(description: responseErrorDecoded.errorMessage)) } catch { completion(nil, APIError.decodingError(error: error))