2022-11-21 08:31:32 +00:00
|
|
|
import SwiftUI
|
|
|
|
import Network
|
|
|
|
|
|
|
|
public struct TimelineView: View {
|
2022-11-25 11:00:01 +00:00
|
|
|
@StateObject private var viewModel: TimelineViewModel
|
2022-11-21 08:31:32 +00:00
|
|
|
|
2022-11-25 11:00:01 +00:00
|
|
|
public init(client: Client) {
|
|
|
|
_viewModel = StateObject(wrappedValue: TimelineViewModel(client: client))
|
2022-11-21 08:31:32 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
public var body: some View {
|
2022-11-25 11:00:01 +00:00
|
|
|
List {
|
|
|
|
switch viewModel.state {
|
|
|
|
case .loading:
|
|
|
|
loadingRow
|
2022-11-25 11:01:55 +00:00
|
|
|
case let .error(error):
|
|
|
|
Text(error.localizedDescription)
|
2022-11-25 11:00:01 +00:00
|
|
|
case let .display(statuses, nextPageState):
|
|
|
|
ForEach(statuses) { status in
|
|
|
|
StatusRowView(status: status)
|
|
|
|
}
|
|
|
|
switch nextPageState {
|
|
|
|
case .hasNextPage:
|
|
|
|
loadingRow
|
|
|
|
.onAppear {
|
|
|
|
Task {
|
|
|
|
await viewModel.loadNextPage()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
case .loadingNextPage:
|
|
|
|
loadingRow
|
|
|
|
}
|
|
|
|
}
|
2022-11-21 08:31:32 +00:00
|
|
|
}
|
2022-11-21 12:52:13 +00:00
|
|
|
.listStyle(.plain)
|
2022-11-25 11:00:01 +00:00
|
|
|
.navigationTitle("Public Timeline: \(viewModel.serverName)")
|
2022-11-21 12:52:13 +00:00
|
|
|
.navigationBarTitleDisplayMode(.inline)
|
2022-11-21 08:31:32 +00:00
|
|
|
.task {
|
2022-11-25 11:00:01 +00:00
|
|
|
await viewModel.refreshTimeline()
|
2022-11-21 12:52:13 +00:00
|
|
|
}
|
|
|
|
.refreshable {
|
2022-11-25 11:00:01 +00:00
|
|
|
await viewModel.refreshTimeline()
|
2022-11-21 12:52:13 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-11-25 11:00:01 +00:00
|
|
|
private var loadingRow: some View {
|
|
|
|
HStack {
|
|
|
|
Spacer()
|
|
|
|
ProgressView()
|
|
|
|
Spacer()
|
2022-11-21 08:31:32 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|