2022-11-25 11:00:01 +00:00
|
|
|
import SwiftUI
|
|
|
|
import Network
|
|
|
|
|
|
|
|
@MainActor
|
|
|
|
class TimelineViewModel: ObservableObject {
|
|
|
|
enum State {
|
|
|
|
enum PadingState {
|
|
|
|
case hasNextPage, loadingNextPage
|
|
|
|
}
|
|
|
|
case loading
|
|
|
|
case display(statuses: [Status], nextPageState: State.PadingState)
|
2022-11-25 11:01:55 +00:00
|
|
|
case error(error: Error)
|
2022-11-25 11:00:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
private let client: Client
|
|
|
|
private var statuses: [Status] = []
|
|
|
|
|
|
|
|
@Published var state: State = .loading
|
|
|
|
|
|
|
|
var serverName: String {
|
|
|
|
client.server
|
|
|
|
}
|
|
|
|
|
|
|
|
init(client: Client) {
|
|
|
|
self.client = client
|
|
|
|
}
|
|
|
|
|
|
|
|
func refreshTimeline() async {
|
|
|
|
do {
|
|
|
|
statuses = try await client.fetchArray(endpoint: Timeline.pub(sinceId: nil))
|
|
|
|
state = .display(statuses: statuses, nextPageState: .hasNextPage)
|
|
|
|
} catch {
|
2022-11-25 11:01:55 +00:00
|
|
|
state = .error(error: error)
|
2022-11-25 11:00:01 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func loadNextPage() async {
|
|
|
|
do {
|
|
|
|
guard let lastId = statuses.last?.id else { return }
|
|
|
|
state = .display(statuses: statuses, nextPageState: .loadingNextPage)
|
|
|
|
let newStatuses: [Status] = try await client.fetch(endpoint: Timeline.pub(sinceId: lastId))
|
|
|
|
statuses.append(contentsOf: newStatuses)
|
|
|
|
state = .display(statuses: statuses, nextPageState: .hasNextPage)
|
|
|
|
} catch {
|
2022-11-25 11:01:55 +00:00
|
|
|
state = .error(error: error)
|
2022-11-25 11:00:01 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|