diff --git a/apple/OmnivoreKit/Sources/App/Views/Labels/ApplyLabelsView.swift b/apple/OmnivoreKit/Sources/App/Views/Labels/ApplyLabelsView.swift index 2df3a9872..46d326e31 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Labels/ApplyLabelsView.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Labels/ApplyLabelsView.swift @@ -33,7 +33,6 @@ struct ApplyLabelsView: View { @EnvironmentObject var dataService: DataService @Environment(\.presentationMode) private var presentationMode @StateObject var viewModel = LabelsViewModel() - @State private var labelSearchFilter = "" var innerBody: some View { List { @@ -41,7 +40,7 @@ struct ApplyLabelsView: View { if viewModel.selectedLabels.isEmpty { Text("No labels are currently assigned.") } - ForEach(viewModel.selectedLabels.applySearchFilter(labelSearchFilter), id: \.self) { label in + ForEach(viewModel.selectedLabels.applySearchFilter(viewModel.labelSearchFilter), id: \.self) { label in HStack { TextChip(feedItemLabel: label) Spacer() @@ -57,7 +56,7 @@ struct ApplyLabelsView: View { } } Section(header: Text("Available Labels")) { - ForEach(viewModel.unselectedLabels.applySearchFilter(labelSearchFilter), id: \.self) { label in + ForEach(viewModel.unselectedLabels.applySearchFilter(viewModel.labelSearchFilter), id: \.self) { label in HStack { TextChip(feedItemLabel: label) Spacer() @@ -128,7 +127,7 @@ struct ApplyLabelsView: View { #if os(iOS) innerBody .searchable( - text: $labelSearchFilter, + text: $viewModel.labelSearchFilter, placement: .navigationBarDrawer(displayMode: .always) ) #else diff --git a/apple/OmnivoreKit/Sources/App/Views/Labels/LabelsViewModel.swift b/apple/OmnivoreKit/Sources/App/Views/Labels/LabelsViewModel.swift index 442c9453e..f2cd4ed4e 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Labels/LabelsViewModel.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Labels/LabelsViewModel.swift @@ -12,43 +12,38 @@ final class LabelsViewModel: ObservableObject { @Published var unselectedLabels = [LinkedItemLabel]() @Published var labels = [LinkedItemLabel]() @Published var showCreateEmailModal = false + @Published var labelSearchFilter = "" var subscriptions = Set() - /// Loads initial set of labels when a edit labels list is displayed - /// - Parameters: - /// - dataService: `DataService` reference - /// - item: Optional `FeedItem` for applying labels to a single item - /// - initiallySelectedLabels: Optional `[FeedItemLabel]` for filtering a list of items func loadLabels( - dataService _: DataService, - item _: LinkedItem? = nil, - initiallySelectedLabels _: [LinkedItemLabel]? = nil + dataService: DataService, + item: LinkedItem? = nil, + initiallySelectedLabels: [LinkedItemLabel]? = nil ) { guard !hasLoadedInitialLabels else { return } isLoading = true -// dataService.labelsPublisher().sink( -// receiveCompletion: { _ in }, -// receiveValue: { [weak self] allLabels in -// self?.isLoading = false -// self?.labels = allLabels -// self?.hasLoadedInitialLabels = true -// if let item = item { -// self?.selectedLabels = item.labels.asArray(of: LinkedItemLabel.self) -// self?.unselectedLabels = allLabels.filter { label in -// !item.labels.contains(where: { $0.id == label.id }) -// } -// } -// if let initiallySelectedLabels = initiallySelectedLabels { -// self?.selectedLabels = initiallySelectedLabels -// self?.unselectedLabels = allLabels.filter { label in -// !initiallySelectedLabels.contains(where: { $0.id == label.id }) -// } -// } -// } -// ) -// .store(in: &subscriptions) + dataService.labelsPublisher().sink( + receiveCompletion: { _ in }, + receiveValue: { [weak self] labelIDs in + guard let self = self else { return } + dataService.viewContext.performAndWait { + self.labels = labelIDs.compactMap { dataService.viewContext.object(with: $0) as? LinkedItemLabel } + } + let selLabels = initiallySelectedLabels ?? item?.labels.asArray(of: LinkedItemLabel.self) ?? [] + for label in self.labels { + if selLabels.contains(label) { + self.selectedLabels.append(label) + } else { + self.unselectedLabels.append(label) + } + } + self.hasLoadedInitialLabels = true + self.isLoading = false + } + ) + .store(in: &subscriptions) } func createLabel(dataService _: DataService, name _: String, color _: Color, description _: String?) {