From dcc79245313c9914ad1a88e5b7db174561ab4a2f Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Thu, 31 Mar 2022 23:03:51 -0700 Subject: [PATCH] create labelsPublisher to fetch existing labels --- .../App/Views/Profile/LabelsView.swift | 20 ++++---- .../DataService/Queries/LabelsPublisher.swift | 49 +++++++++++++++++++ 2 files changed, 59 insertions(+), 10 deletions(-) create mode 100644 apple/OmnivoreKit/Sources/Services/DataService/Queries/LabelsPublisher.swift diff --git a/apple/OmnivoreKit/Sources/App/Views/Profile/LabelsView.swift b/apple/OmnivoreKit/Sources/App/Views/Profile/LabelsView.swift index 830389bb3..054fb2b11 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Profile/LabelsView.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Profile/LabelsView.swift @@ -11,18 +11,18 @@ final class LabelsViewModel: ObservableObject { var subscriptions = Set() - func loadLabels(dataService _: DataService) { + func loadLabels(dataService: DataService) { isLoading = true -// dataService.newsletterEmailsPublisher().sink( -// receiveCompletion: { _ in }, -// receiveValue: { [weak self] result in -// self?.isLoading = false -// self?.emails = result -// self?.hasLoadedInitialLabels = true -// } -// ) -// .store(in: &subscriptions) + dataService.labelsPublisher().sink( + receiveCompletion: { _ in }, + receiveValue: { [weak self] result in + self?.isLoading = false + self?.labels = result + self?.hasLoadedInitialLabels = true + } + ) + .store(in: &subscriptions) } func createLabel(dataService _: DataService) { diff --git a/apple/OmnivoreKit/Sources/Services/DataService/Queries/LabelsPublisher.swift b/apple/OmnivoreKit/Sources/Services/DataService/Queries/LabelsPublisher.swift new file mode 100644 index 000000000..5cce49647 --- /dev/null +++ b/apple/OmnivoreKit/Sources/Services/DataService/Queries/LabelsPublisher.swift @@ -0,0 +1,49 @@ +import Combine +import Foundation +import Models +import SwiftGraphQL + +public extension DataService { + func labelsPublisher() -> AnyPublisher<[FeedItemLabel], ServerError> { + enum QueryResult { + case success(result: [FeedItemLabel]) + case error(error: String) + } + + let selection = Selection { + try $0.on(labelsSuccess: .init { + QueryResult.success(result: try $0.labels(selection: feedItemLabelSelection.list)) + }, + labelsError: .init { + QueryResult.error(error: try $0.errorCodes().description) + }) + } + + let query = Selection.Query { + try $0.labels(selection: selection) + } + + let path = appEnvironment.graphqlPath + let headers = networker.defaultHeaders + + return Deferred { + Future { promise in + send(query, to: path, headers: headers) { result in + switch result { + case let .success(payload): + switch payload.data { + case let .success(result: result): + promise(.success(result)) + case .error: + promise(.failure(.unknown)) + } + case .failure: + promise(.failure(.unknown)) + } + } + } + } + .receive(on: DispatchQueue.main) + .eraseToAnyPublisher() + } +}