Add MainView logging for server loading debug

This commit is contained in:
Micha
2025-11-15 20:01:24 +01:00
parent 7593a781f2
commit ba2b1f32eb
2 changed files with 52 additions and 24 deletions

View File

@@ -4,3 +4,4 @@
- Flattened the project structure so sources live at the repository root instead of the nested `iKeyMon/` folder and updated the Xcode project accordingly.
- Fixed build settings (entitlements, preview assets) and placeholder previews to work with the new layout.
- Migrated the updated API layer and unified `ServerInfo` model from the previous branch.
- Added verbose logging in `MainView` to trace server loading, selection, and fetch/ping activity when the list appears empty.

View File

@@ -9,6 +9,9 @@ import SwiftUI
struct MainView: View {
private static let serverOrderKeyStatic = "serverOrder"
private static let storedServersKeyStatic = "storedServers"
@State var showAddServerSheet: Bool = false
@State private var serverBeingEdited: Server?
@State private var serverToDelete: Server?
@@ -18,27 +21,10 @@ struct MainView: View {
@State private var progress: Double = 0
@State private var lastRefresh = Date()
@State private var pingTimer: Timer?
private let serverOrderKey = "serverOrder"
private let serverOrderKey = MainView.serverOrderKeyStatic
private let storedServersKey = MainView.storedServersKeyStatic
@State private var servers: [Server] = {
if let data = UserDefaults.standard.data(forKey: "storedServers"),
let saved = try? JSONDecoder().decode([Server].self, from: data) {
if let idStrings = UserDefaults.standard.stringArray(forKey: "serverOrder") {
let idMap = idStrings.compactMap(UUID.init)
return saved.sorted { a, b in
guard
let i1 = idMap.firstIndex(of: a.id),
let i2 = idMap.firstIndex(of: b.id)
else { return false }
return i1 < i2
}
}
return saved
}
return []
}()
@State private var servers: [Server] = MainView.loadStoredServers()
// @State private var selectedServer: Server?
@State private var selectedServerID: UUID?
@@ -112,21 +98,28 @@ struct MainView: View {
Button("Cancel", role: .cancel) {}
}
.onReceive(refreshTimer) { _ in
print("⏰ [MainView] Refresh timer fired with \(servers.count) servers")
for server in servers {
print("fetching server: \(server.hostname)")
print("⏰ [MainView] Triggering fetchServerInfo for: \(server.hostname)")
fetchServerInfo(for: server.id)
}
}
.onAppear {
print("👀 [MainView] onAppear - servers in memory: \(servers.count)")
if let storedID = UserDefaults.standard.string(forKey: "selectedServerID"),
let uuid = UUID(uuidString: storedID),
servers.contains(where: { $0.id == uuid }) {
print("✅ [MainView] Restored selected server \(uuid)")
selectedServerID = uuid
} else if selectedServerID == nil, let first = servers.first {
print("✅ [MainView] Selecting first server \(first.hostname)")
selectedServerID = first.id
} else {
print(" [MainView] No stored selection")
}
pingAllServers()
pingTimer = Timer.scheduledTimer(withTimeInterval: 10.0, repeats: true) { _ in
print("📡 [MainView] Ping timer firing")
pingAllServers()
}
}
@@ -135,8 +128,12 @@ struct MainView: View {
}
private func fetchServerInfo(for id: UUID) {
guard let server = servers.first(where: { $0.id == id }),
let api = ServerAPI(server: server) else {
guard let server = servers.first(where: { $0.id == id }) else {
print("❌ [MainView] fetchServerInfo: server not found for id \(id)")
return
}
guard let api = ServerAPI(server: server) else {
print("❌ [MainView] fetchServerInfo: could not create API for \(server.hostname)")
return
}
@@ -148,8 +145,9 @@ struct MainView: View {
let info = try await api.fetchServerInfo()
if let index = servers.firstIndex(where: { $0.id == id }) {
var updated = servers[index]
updated.info = try ServerInfo(from: info as! Decoder)
updated.info = info
servers[index] = updated
print("✅ [MainView] Updated server info for \(updated.hostname)")
}
} catch {
print("❌ Failed to fetch server data: \(error)")
@@ -165,6 +163,7 @@ struct MainView: View {
private func saveServerOrder() {
let ids = servers.map { $0.id.uuidString }
UserDefaults.standard.set(ids, forKey: serverOrderKey)
print("💾 [MainView] Saved server order with \(ids.count) entries")
}
private struct PingResponse: Codable {
@@ -218,11 +217,39 @@ struct MainView: View {
let pingable = await api.ping()
servers[index].pingable = pingable
print("📶 [MainView] Ping \(server.hostname): \(pingable ? "online" : "offline")")
}
}
}
}
private static func loadStoredServers() -> [Server] {
let defaults = UserDefaults.standard
guard let data = defaults.data(forKey: storedServersKeyStatic) else {
print(" [MainView] No storedServers data found")
return []
}
do {
let saved = try JSONDecoder().decode([Server].self, from: data)
print("📦 [MainView] Loaded \(saved.count) servers from UserDefaults")
if let order = defaults.stringArray(forKey: serverOrderKeyStatic) {
let idMap = order.compactMap(UUID.init)
let sorted = saved.sorted { a, b in
guard
let i1 = idMap.firstIndex(of: a.id),
let i2 = idMap.firstIndex(of: b.id)
else { return false }
return i1 < i2
}
return sorted
}
return saved
} catch {
print("❌ [MainView] Failed to decode stored servers: \(error)")
return []
}
}
#Preview {
MainView()