1
0
mirror of https://github.com/yattee/yattee.git synced 2024-12-13 13:50:32 +05:30
yattee/Model/CommentsModel.swift

117 lines
2.8 KiB
Swift
Raw Normal View History

2021-12-05 01:05:41 +05:30
import Defaults
import Foundation
import SwiftyJSON
final class CommentsModel: ObservableObject {
@Published var all = [Comment]()
@Published var nextPage: String?
@Published var firstPage = true
2021-12-18 01:16:49 +05:30
@Published var loading = false
@Published var loaded = false
@Published var disabled = false
@Published var replies = [Comment]()
@Published var repliesPageID: String?
@Published var repliesLoaded = false
2021-12-05 01:05:41 +05:30
var accounts: AccountsModel!
var player: PlayerModel!
2021-12-18 01:16:49 +05:30
static var instance: Instance? {
InstancesModel.find(Defaults[.commentsInstanceID])
}
var api: VideosAPI? {
2021-12-18 01:16:49 +05:30
Self.instance.isNil ? nil : PipedAPI(account: Self.instance!.anonymousAccount)
}
2021-12-05 01:05:41 +05:30
static var enabled: Bool {
2021-12-18 01:16:49 +05:30
!instance.isNil
2021-12-05 01:05:41 +05:30
}
#if !os(tvOS)
static var placement: CommentsPlacement {
Defaults[.commentsPlacement]
}
#endif
2021-12-05 01:05:41 +05:30
var nextPageAvailable: Bool {
!(nextPage?.isEmpty ?? true)
}
func load(page: String? = nil) {
2021-12-18 01:16:49 +05:30
guard Self.enabled, !loading else {
2021-12-05 01:05:41 +05:30
return
}
reset()
2021-12-05 01:05:41 +05:30
2021-12-18 01:16:49 +05:30
loading = true
guard !Self.instance.isNil,
!(player?.currentVideo.isNil ?? true)
2021-12-05 01:05:41 +05:30
else {
return
}
firstPage = page.isNil || page!.isEmpty
api?.comments(player.currentVideo!.videoID, page: page)?
2021-12-05 01:05:41 +05:30
.load()
.onSuccess { [weak self] response in
if let page: CommentsPage = response.typedContent() {
self?.all = page.comments
self?.nextPage = page.nextPage
self?.disabled = page.disabled
2021-12-05 01:05:41 +05:30
}
}
.onCompletion { [weak self] _ in
2021-12-18 01:16:49 +05:30
self?.loading = false
2021-12-05 01:05:41 +05:30
self?.loaded = true
}
}
func loadNextPage() {
load(page: nextPage)
}
func loadReplies(page: String) {
guard !player.currentVideo.isNil else {
return
}
if page == repliesPageID {
return
}
2021-12-05 01:05:41 +05:30
replies = []
repliesPageID = page
repliesLoaded = false
2021-12-05 01:05:41 +05:30
api?.comments(player.currentVideo!.videoID, page: page)?
.load()
.onSuccess { [weak self] response in
if let page: CommentsPage = response.typedContent() {
self?.replies = page.comments
2021-12-18 01:16:49 +05:30
self?.repliesLoaded = true
}
}
2021-12-18 01:16:49 +05:30
.onFailure { [weak self] _ in
self?.repliesLoaded = true
2021-12-05 01:05:41 +05:30
}
}
func reset() {
2021-12-05 01:05:41 +05:30
all = []
disabled = false
2021-12-05 01:05:41 +05:30
firstPage = true
nextPage = nil
loaded = false
2021-12-18 01:16:49 +05:30
loading = false
replies = []
repliesLoaded = false
2021-12-05 01:05:41 +05:30
}
}