diff --git a/CHANGELOG.md b/CHANGELOG.md index 8958191..cbd0826 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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. diff --git a/Views/MainView.swift b/Views/MainView.swift index 5d8d208..fc9b478 100644 --- a/Views/MainView.swift +++ b/Views/MainView.swift @@ -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()