67 lines
2.3 KiB
Swift
67 lines
2.3 KiB
Swift
//
|
|
// ActivityListView.swift
|
|
// WatchRunner Watch App
|
|
//
|
|
// Created by LittleSheep on 2025/10/29.
|
|
//
|
|
|
|
import SwiftUI
|
|
|
|
// MARK: - Views
|
|
|
|
struct ActivityListView: View {
|
|
@StateObject private var viewModel: ActivityViewModel
|
|
@EnvironmentObject var appState: AppState
|
|
|
|
init(filter: String, mockActivities: [SnActivity]? = nil) {
|
|
_viewModel = StateObject(wrappedValue: ActivityViewModel(filter: filter, mockActivities: mockActivities))
|
|
}
|
|
|
|
var body: some View {
|
|
Group {
|
|
if viewModel.isLoading {
|
|
ProgressView()
|
|
} else if let errorMessage = viewModel.errorMessage {
|
|
VStack {
|
|
Text("Error fetching data")
|
|
.font(.headline)
|
|
Text(errorMessage)
|
|
.font(.caption)
|
|
.lineLimit(nil)
|
|
}
|
|
.padding()
|
|
} else if viewModel.activities.isEmpty {
|
|
Text("No activities found.")
|
|
} else {
|
|
List(viewModel.activities) { activity in
|
|
switch activity.type {
|
|
case "posts.new", "posts.new.replies":
|
|
if case .post(let post) = activity.data {
|
|
NavigationLink(
|
|
destination: PostDetailView(post: post).environmentObject(appState)
|
|
) {
|
|
PostRowView(post: post)
|
|
}
|
|
}
|
|
case "discovery":
|
|
if case .discovery(let discoveryData) = activity.data {
|
|
DiscoveryView(discoveryData: discoveryData)
|
|
}
|
|
default:
|
|
Text("Unknown activity type: \(activity.type)")
|
|
}
|
|
}
|
|
}
|
|
}
|
|
.onAppear {
|
|
if appState.isReady, let token = appState.token, let serverUrl = appState.serverUrl {
|
|
Task.detached {
|
|
await viewModel.fetchActivities(token: token, serverUrl: serverUrl)
|
|
}
|
|
}
|
|
}
|
|
.navigationTitle(viewModel.filter)
|
|
.navigationBarTitleDisplayMode(.inline)
|
|
}
|
|
}
|