74 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Swift
		
	
	
	
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Swift
		
	
	
	
	
	
//
 | 
						|
//  ActivityViewModel.swift
 | 
						|
//  WatchRunner Watch App
 | 
						|
//
 | 
						|
//  Created by LittleSheep on 2025/10/29.
 | 
						|
//
 | 
						|
 | 
						|
import Foundation
 | 
						|
import Combine
 | 
						|
 | 
						|
// MARK: - View Models
 | 
						|
 | 
						|
@MainActor
 | 
						|
class ActivityViewModel: ObservableObject {
 | 
						|
    @Published var activities: [SnActivity] = []
 | 
						|
    @Published var isLoading = false
 | 
						|
    @Published var isLoadingMore = false
 | 
						|
    @Published var errorMessage: String?
 | 
						|
    @Published var hasMore = false
 | 
						|
 | 
						|
    private let networkService = NetworkService()
 | 
						|
    let filter: String
 | 
						|
    private var isMock = false
 | 
						|
    private var hasFetched = false
 | 
						|
    private var nextCursor: String?
 | 
						|
 | 
						|
    init(filter: String, mockActivities: [SnActivity]? = nil) {
 | 
						|
        self.filter = filter
 | 
						|
        if let mockActivities = mockActivities {
 | 
						|
            self.activities = mockActivities
 | 
						|
            self.isMock = true
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    func fetchActivities(token: String, serverUrl: String) async {
 | 
						|
        if isMock || hasFetched { return }
 | 
						|
        guard !isLoading else { return }
 | 
						|
        isLoading = true
 | 
						|
        errorMessage = nil
 | 
						|
        hasFetched = true
 | 
						|
        nextCursor = nil
 | 
						|
 | 
						|
        do {
 | 
						|
            let response = try await networkService.fetchActivities(filter: filter, cursor: nil, token: token, serverUrl: serverUrl)
 | 
						|
            self.activities = response.activities
 | 
						|
            self.hasMore = response.hasMore
 | 
						|
            self.nextCursor = response.nextCursor
 | 
						|
        } catch {
 | 
						|
            self.errorMessage = error.localizedDescription
 | 
						|
            print("[watchOS] fetchActivities failed with error: \(error)")
 | 
						|
            hasFetched = false
 | 
						|
        }
 | 
						|
 | 
						|
        isLoading = false
 | 
						|
    }
 | 
						|
 | 
						|
    func loadMoreActivities(token: String, serverUrl: String) async {
 | 
						|
        guard !isLoadingMore && hasMore && nextCursor != nil else { return }
 | 
						|
        isLoadingMore = true
 | 
						|
 | 
						|
        do {
 | 
						|
            let response = try await networkService.fetchActivities(filter: filter, cursor: nextCursor, token: token, serverUrl: serverUrl)
 | 
						|
            self.activities.append(contentsOf: response.activities)
 | 
						|
            self.hasMore = response.hasMore
 | 
						|
            self.nextCursor = response.nextCursor
 | 
						|
        } catch {
 | 
						|
            self.errorMessage = error.localizedDescription
 | 
						|
            print("[watchOS] loadMoreActivities failed with error: \(error)")
 | 
						|
        }
 | 
						|
 | 
						|
        isLoadingMore = false
 | 
						|
    }
 | 
						|
}
 |