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)
 | |
|     }
 | |
| }
 |