mirror of
https://github.com/yattee/yattee.git
synced 2024-12-22 21:43:41 +00:00
47 lines
1.4 KiB
Swift
47 lines
1.4 KiB
Swift
import Foundation
|
|
import Siesta
|
|
import SwiftUI
|
|
|
|
final class Subscriptions: ObservableObject {
|
|
@Published var channels = [Channel]()
|
|
|
|
var resource: Resource {
|
|
InvidiousAPI.shared.subscriptions
|
|
}
|
|
|
|
init() {
|
|
load()
|
|
}
|
|
|
|
var all: [Channel] {
|
|
channels.sorted { $0.name.lowercased() < $1.name.lowercased() }
|
|
}
|
|
|
|
func subscribe(_ channelID: String, onSuccess: @escaping () -> Void = {}) {
|
|
performChannelSubscriptionRequest(channelID, method: .post, onSuccess: onSuccess)
|
|
}
|
|
|
|
func unsubscribe(_ channelID: String, onSuccess: @escaping () -> Void = {}) {
|
|
performChannelSubscriptionRequest(channelID, method: .delete, onSuccess: onSuccess)
|
|
}
|
|
|
|
func isSubscribing(_ channelID: String) -> Bool {
|
|
channels.contains { $0.id == channelID }
|
|
}
|
|
|
|
fileprivate func load(onSuccess: @escaping () -> Void = {}) {
|
|
resource.load().onSuccess { resource in
|
|
if let channels: [Channel] = resource.typedContent() {
|
|
self.channels = channels
|
|
onSuccess()
|
|
}
|
|
}
|
|
}
|
|
|
|
fileprivate func performChannelSubscriptionRequest(_ channelID: String, method: RequestMethod, onSuccess: @escaping () -> Void = {}) {
|
|
InvidiousAPI.shared.channelSubscription(channelID).request(method).onCompletion { _ in
|
|
self.load(onSuccess: onSuccess)
|
|
}
|
|
}
|
|
}
|