fix network

This commit is contained in:
JinJiangHuang
2026-03-10 21:37:51 +08:00
parent 76ed32ccf3
commit fac70d7496
7 changed files with 383 additions and 37 deletions
+41 -2
View File
@@ -1,5 +1,6 @@
import SwiftUI
import SwiftData
import Combine
///
/// SwiftData `AppState`
@@ -7,6 +8,8 @@ import SwiftData
struct tvboxApp: App {
///
@StateObject private var appState = AppState()
///
@StateObject private var networkMonitor = NetworkMonitor.shared
/// SwiftData
/// Schema//使
@@ -29,6 +32,7 @@ struct tvboxApp: App {
WindowGroup {
ContentView()
.environmentObject(appState)
.environmentObject(networkMonitor)
}
.modelContainer(sharedModelContainer)
#if os(macOS)
@@ -47,6 +51,11 @@ class AppState: ObservableObject {
@Published var isConfigLoaded = false
/// key
@Published var currentSourceKey: String = ""
/// UI
@Published var configLoadError: String?
///
@Published var isRetryingConfig = false
#if os(macOS)
/// macOS //
@Published var splitViewVisibility: NavigationSplitViewVisibility = .all
@@ -54,6 +63,15 @@ class AppState: ObservableObject {
private var splitViewVisibilityBeforePlayerFullScreen: NavigationSplitViewVisibility?
#endif
///
private var lastVodUrl: String = ""
private var lastLiveUrl: String = ""
private var networkRestoredCancellable: AnyCancellable?
init() {
setupNetworkRestoredAutoRetry()
}
///
func loadConfig(url: String) async {
await loadConfig(vodUrl: url, liveUrl: nil)
@@ -69,21 +87,42 @@ class AppState: ObservableObject {
guard !trimmedVod.isEmpty else { return }
let resolvedLive = trimmedLive.isEmpty ? trimmedVod : trimmedLive
lastVodUrl = trimmedVod
lastLiveUrl = resolvedLive
configLoadError = nil
do {
try await ApiConfig.shared.loadConfigs(vodApiUrl: trimmedVod, liveApiUrl: resolvedLive)
applyLoadedConfigState()
} catch {
print("Failed to load config: \(error)")
if !(error is CancellationError) {
configLoadError = error.localizedDescription
}
}
}
///
/// ""
///
func applyLoadedConfigState() {
isConfigLoaded = true
configLoadError = nil
currentSourceKey = ApiConfig.shared.homeSourceBean?.key ?? ""
}
///
private func setupNetworkRestoredAutoRetry() {
networkRestoredCancellable = NetworkMonitor.shared.networkRestoredPublisher
.sink { [weak self] in
guard let self else { return }
Task { @MainActor [weak self] in
guard let self, !self.isConfigLoaded, !self.lastVodUrl.isEmpty else { return }
self.isRetryingConfig = true
await self.loadConfig(vodUrl: self.lastVodUrl, liveUrl: self.lastLiveUrl)
self.isRetryingConfig = false
}
}
}
#if os(macOS)
///
func enterPlayerFullScreen() {