mirror of
https://github.com/metabolist/metatext.git
synced 2024-11-29 03:21:02 +00:00
Refactoring
This commit is contained in:
parent
35de31553e
commit
18d1b61101
7 changed files with 27 additions and 18 deletions
|
@ -8,14 +8,14 @@ import MastodonAPI
|
||||||
|
|
||||||
public struct AccountListService {
|
public struct AccountListService {
|
||||||
public let sections: AnyPublisher<[[CollectionItem]], Error>
|
public let sections: AnyPublisher<[[CollectionItem]], Error>
|
||||||
public let nextPageMaxIDs: AnyPublisher<String?, Never>
|
public let nextPageMaxIDs: AnyPublisher<String, Never>
|
||||||
public let navigationService: NavigationService
|
public let navigationService: NavigationService
|
||||||
|
|
||||||
private let list: AccountList
|
private let list: AccountList
|
||||||
private let endpoint: AccountsEndpoint
|
private let endpoint: AccountsEndpoint
|
||||||
private let mastodonAPIClient: MastodonAPIClient
|
private let mastodonAPIClient: MastodonAPIClient
|
||||||
private let contentDatabase: ContentDatabase
|
private let contentDatabase: ContentDatabase
|
||||||
private let nextPageMaxIDsSubject = PassthroughSubject<String?, Never>()
|
private let nextPageMaxIDsSubject = PassthroughSubject<String, Never>()
|
||||||
|
|
||||||
init(endpoint: AccountsEndpoint, mastodonAPIClient: MastodonAPIClient, contentDatabase: ContentDatabase) {
|
init(endpoint: AccountsEndpoint, mastodonAPIClient: MastodonAPIClient, contentDatabase: ContentDatabase) {
|
||||||
list = AccountList()
|
list = AccountList()
|
||||||
|
@ -33,7 +33,11 @@ public struct AccountListService {
|
||||||
extension AccountListService: CollectionService {
|
extension AccountListService: CollectionService {
|
||||||
public func request(maxID: String?, minID: String?) -> AnyPublisher<Never, Error> {
|
public func request(maxID: String?, minID: String?) -> AnyPublisher<Never, Error> {
|
||||||
mastodonAPIClient.pagedRequest(endpoint, maxID: maxID, minID: minID)
|
mastodonAPIClient.pagedRequest(endpoint, maxID: maxID, minID: minID)
|
||||||
.handleEvents(receiveOutput: { nextPageMaxIDsSubject.send($0.info.maxID) })
|
.handleEvents(receiveOutput: {
|
||||||
|
guard let maxID = $0.info.maxID else { return }
|
||||||
|
|
||||||
|
nextPageMaxIDsSubject.send(maxID)
|
||||||
|
})
|
||||||
.flatMap { contentDatabase.append(accounts: $0.result, toList: list) }
|
.flatMap { contentDatabase.append(accounts: $0.result, toList: list) }
|
||||||
.eraseToAnyPublisher()
|
.eraseToAnyPublisher()
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,14 +4,17 @@ import Combine
|
||||||
|
|
||||||
public protocol CollectionService {
|
public protocol CollectionService {
|
||||||
var sections: AnyPublisher<[[CollectionItem]], Error> { get }
|
var sections: AnyPublisher<[[CollectionItem]], Error> { get }
|
||||||
var nextPageMaxIDs: AnyPublisher<String?, Never> { get }
|
var nextPageMaxIDs: AnyPublisher<String, Never> { get }
|
||||||
|
var title: AnyPublisher<String, Never> { get }
|
||||||
var navigationService: NavigationService { get }
|
var navigationService: NavigationService { get }
|
||||||
var title: String? { get }
|
|
||||||
var contextParentID: String? { get }
|
var contextParentID: String? { get }
|
||||||
func request(maxID: String?, minID: String?) -> AnyPublisher<Never, Error>
|
func request(maxID: String?, minID: String?) -> AnyPublisher<Never, Error>
|
||||||
}
|
}
|
||||||
|
|
||||||
extension CollectionService {
|
extension CollectionService {
|
||||||
public var title: String? { nil }
|
public var nextPageMaxIDs: AnyPublisher<String, Never> { Empty().eraseToAnyPublisher() }
|
||||||
|
|
||||||
|
public var title: AnyPublisher<String, Never> { Empty().eraseToAnyPublisher() }
|
||||||
|
|
||||||
public var contextParentID: String? { nil }
|
public var contextParentID: String? { nil }
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,8 +9,6 @@ import MastodonAPI
|
||||||
public struct ContextService {
|
public struct ContextService {
|
||||||
public let sections: AnyPublisher<[[CollectionItem]], Error>
|
public let sections: AnyPublisher<[[CollectionItem]], Error>
|
||||||
public let navigationService: NavigationService
|
public let navigationService: NavigationService
|
||||||
public let nextPageMaxIDs: AnyPublisher<String?, Never> = Empty().eraseToAnyPublisher()
|
|
||||||
public let title: String? = nil
|
|
||||||
public var contextParentID: String? { statusID }
|
public var contextParentID: String? { statusID }
|
||||||
|
|
||||||
private let statusID: String
|
private let statusID: String
|
||||||
|
|
|
@ -9,14 +9,14 @@ import MastodonAPI
|
||||||
public struct TimelineService {
|
public struct TimelineService {
|
||||||
public let sections: AnyPublisher<[[CollectionItem]], Error>
|
public let sections: AnyPublisher<[[CollectionItem]], Error>
|
||||||
public let navigationService: NavigationService
|
public let navigationService: NavigationService
|
||||||
public let nextPageMaxIDs: AnyPublisher<String?, Never>
|
public let nextPageMaxIDs: AnyPublisher<String, Never>
|
||||||
public let title: String?
|
public let title: AnyPublisher<String, Never>
|
||||||
public let contextParentID: String? = nil
|
public let contextParentID: String? = nil
|
||||||
|
|
||||||
private let timeline: Timeline
|
private let timeline: Timeline
|
||||||
private let mastodonAPIClient: MastodonAPIClient
|
private let mastodonAPIClient: MastodonAPIClient
|
||||||
private let contentDatabase: ContentDatabase
|
private let contentDatabase: ContentDatabase
|
||||||
private let nextPageMaxIDsSubject = PassthroughSubject<String?, Never>()
|
private let nextPageMaxIDsSubject = PassthroughSubject<String, Never>()
|
||||||
|
|
||||||
init(timeline: Timeline, mastodonAPIClient: MastodonAPIClient, contentDatabase: ContentDatabase) {
|
init(timeline: Timeline, mastodonAPIClient: MastodonAPIClient, contentDatabase: ContentDatabase) {
|
||||||
self.timeline = timeline
|
self.timeline = timeline
|
||||||
|
@ -27,9 +27,9 @@ public struct TimelineService {
|
||||||
nextPageMaxIDs = nextPageMaxIDsSubject.eraseToAnyPublisher()
|
nextPageMaxIDs = nextPageMaxIDsSubject.eraseToAnyPublisher()
|
||||||
|
|
||||||
if case let .tag(tag) = timeline {
|
if case let .tag(tag) = timeline {
|
||||||
title = "#".appending(tag)
|
title = Just("#".appending(tag)).eraseToAnyPublisher()
|
||||||
} else {
|
} else {
|
||||||
title = nil
|
title = Empty().eraseToAnyPublisher()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -37,7 +37,11 @@ public struct TimelineService {
|
||||||
extension TimelineService: CollectionService {
|
extension TimelineService: CollectionService {
|
||||||
public func request(maxID: String?, minID: String?) -> AnyPublisher<Never, Error> {
|
public func request(maxID: String?, minID: String?) -> AnyPublisher<Never, Error> {
|
||||||
mastodonAPIClient.pagedRequest(timeline.endpoint, maxID: maxID, minID: minID)
|
mastodonAPIClient.pagedRequest(timeline.endpoint, maxID: maxID, minID: minID)
|
||||||
.handleEvents(receiveOutput: { nextPageMaxIDsSubject.send($0.info.maxID) })
|
.handleEvents(receiveOutput: {
|
||||||
|
guard let maxID = $0.info.maxID else { return }
|
||||||
|
|
||||||
|
nextPageMaxIDsSubject.send(maxID)
|
||||||
|
})
|
||||||
.flatMap { contentDatabase.insert(statuses: $0.result, timeline: timeline) }
|
.flatMap { contentDatabase.insert(statuses: $0.result, timeline: timeline) }
|
||||||
.eraseToAnyPublisher()
|
.eraseToAnyPublisher()
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,7 +38,7 @@ extension CollectionItemsViewModel: CollectionViewModel {
|
||||||
items.map { $0.map { $0.map(CollectionItemIdentifier.init(item:)) } }.eraseToAnyPublisher()
|
items.map { $0.map { $0.map(CollectionItemIdentifier.init(item:)) } }.eraseToAnyPublisher()
|
||||||
}
|
}
|
||||||
|
|
||||||
public var title: AnyPublisher<String?, Never> { Just(collectionService.title).eraseToAnyPublisher() }
|
public var title: AnyPublisher<String, Never> { collectionService.title }
|
||||||
|
|
||||||
public var alertItems: AnyPublisher<AlertItem, Never> { $alertItem.compactMap { $0 }.eraseToAnyPublisher() }
|
public var alertItems: AnyPublisher<AlertItem, Never> { $alertItem.compactMap { $0 }.eraseToAnyPublisher() }
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@ import Foundation
|
||||||
|
|
||||||
public protocol CollectionViewModel {
|
public protocol CollectionViewModel {
|
||||||
var sections: AnyPublisher<[[CollectionItemIdentifier]], Never> { get }
|
var sections: AnyPublisher<[[CollectionItemIdentifier]], Never> { get }
|
||||||
var title: AnyPublisher<String?, Never> { get }
|
var title: AnyPublisher<String, Never> { get }
|
||||||
var alertItems: AnyPublisher<AlertItem, Never> { get }
|
var alertItems: AnyPublisher<AlertItem, Never> { get }
|
||||||
var loading: AnyPublisher<Bool, Never> { get }
|
var loading: AnyPublisher<Bool, Never> { get }
|
||||||
var navigationEvents: AnyPublisher<NavigationEvent, Never> { get }
|
var navigationEvents: AnyPublisher<NavigationEvent, Never> { get }
|
||||||
|
|
|
@ -43,8 +43,8 @@ extension ProfileViewModel: CollectionViewModel {
|
||||||
collectionViewModel.flatMap(\.sections).eraseToAnyPublisher()
|
collectionViewModel.flatMap(\.sections).eraseToAnyPublisher()
|
||||||
}
|
}
|
||||||
|
|
||||||
public var title: AnyPublisher<String?, Never> {
|
public var title: AnyPublisher<String, Never> {
|
||||||
$accountViewModel.map { $0?.accountName }.eraseToAnyPublisher()
|
$accountViewModel.compactMap { $0?.accountName }.eraseToAnyPublisher()
|
||||||
}
|
}
|
||||||
|
|
||||||
public var alertItems: AnyPublisher<AlertItem, Never> {
|
public var alertItems: AnyPublisher<AlertItem, Never> {
|
||||||
|
|
Loading…
Reference in a new issue