Sort the filter labels on iOS

This commit is contained in:
Jackson Harper 2023-05-29 14:32:56 +08:00
parent c8c27bae89
commit 27eb891acc

View file

@ -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<Models.LinkedItemLabel> = 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
}
}