IceCubesApp/Packages/Timeline/Sources/Timeline/TimelineViewModel.swift
2022-11-29 09:28:17 +01:00

50 lines
1.2 KiB
Swift

import SwiftUI
import Network
import Models
@MainActor
class TimelineViewModel: ObservableObject {
enum State {
enum PadingState {
case hasNextPage, loadingNextPage
}
case loading
case display(statuses: [Status], nextPageState: State.PadingState)
case error(error: Error)
}
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.fetch(endpoint: Timeline.pub(sinceId: nil))
state = .display(statuses: statuses, nextPageState: .hasNextPage)
} catch {
state = .error(error: error)
}
}
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 {
state = .error(error: error)
}
}
}