From 27eb891acc6d3f679687f14d3549e2c0fc280644 Mon Sep 17 00:00:00 2001 From: Jackson Harper Date: Mon, 29 May 2023 14:32:56 +0800 Subject: [PATCH] Sort the filter labels on iOS --- .../Labels/FilterByLabelsViewModel.swift | 66 ++++++++++++++++--- 1 file changed, 56 insertions(+), 10 deletions(-) diff --git a/apple/OmnivoreKit/Sources/App/Views/Labels/FilterByLabelsViewModel.swift b/apple/OmnivoreKit/Sources/App/Views/Labels/FilterByLabelsViewModel.swift index 255a06920..70cbfcd6c 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Labels/FilterByLabelsViewModel.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Labels/FilterByLabelsViewModel.swift @@ -1,3 +1,4 @@ +import CoreData import Models import Services import SwiftUI @@ -11,6 +12,14 @@ import Views @Published var unselectedLabels = [LinkedItemLabel]() @Published var labelSearchFilter = "" + func setLabels(_ labels: [LinkedItemLabel]) { + self.labels = labels.sorted { left, right in + let aTrimmed = left.unwrappedName.trimmingCharacters(in: .whitespaces) + let bTrimmed = right.unwrappedName.trimmingCharacters(in: .whitespaces) + return aTrimmed.caseInsensitiveCompare(bTrimmed) == .orderedAscending + } + } + func loadLabels( dataService: DataService, initiallySelectedLabels: [LinkedItemLabel], @@ -18,22 +27,59 @@ import Views ) async { isLoading = true - if let labelIDs = try? await dataService.labels() { - dataService.viewContext.performAndWait { - self.labels = labelIDs.compactMap { dataService.viewContext.object(with: $0) as? LinkedItemLabel } + await loadLabelsFromStore(dataService: dataService) + for label in labels { + if initiallySelectedLabels.contains(label) { + selectedLabels.append(label) + } else if initiallyNegatedLabels.contains(label) { + negatedLabels.append(label) + } else { + unselectedLabels.append(label) } + } - for label in labels { - if initiallySelectedLabels.contains(label) { - selectedLabels.append(label) - } else if initiallyNegatedLabels.contains(label) { - negatedLabels.append(label) - } else { - unselectedLabels.append(label) + Task.detached(priority: .userInitiated) { + if let labelIDs = try? await dataService.labels() { + DispatchQueue.main.async { + dataService.viewContext.performAndWait { + self.setLabels(labelIDs.compactMap { dataService.viewContext.object(with: $0) as? LinkedItemLabel }) + } + for label in self.labels { + if initiallySelectedLabels.contains(label) { + self.selectedLabels.append(label) + } else if initiallyNegatedLabels.contains(label) { + self.negatedLabels.append(label) + } else { + self.unselectedLabels.append(label) + } + } } } } isLoading = false } + + func loadLabelsFromStore(dataService: DataService) async { + let fetchRequest: NSFetchRequest = LinkedItemLabel.fetchRequest() + + let fetchedLabels = await dataService.viewContext.perform { + try? fetchRequest.execute() + } + + setLabels(fetchedLabels ?? []) + unselectedLabels = fetchedLabels ?? [] + } + + func fetchLabelsFromNetwork(dataService: DataService) async { + let labelIDs = try? await dataService.labels() + guard let labelIDs = labelIDs else { return } + + let fetchedLabels = await dataService.viewContext.perform { + labelIDs.compactMap { dataService.viewContext.object(with: $0) as? LinkedItemLabel } + } + + setLabels(fetchedLabels) + unselectedLabels = fetchedLabels + } }