diff --git a/ios/WatchRunner Watch App/Assets.xcassets/Logo.imageset/Contents.json b/ios/WatchRunner Watch App/Assets.xcassets/Logo.imageset/Contents.json new file mode 100644 index 00000000..2945b36b --- /dev/null +++ b/ios/WatchRunner Watch App/Assets.xcassets/Logo.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "icon.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ios/WatchRunner Watch App/Assets.xcassets/Logo.imageset/icon.png b/ios/WatchRunner Watch App/Assets.xcassets/Logo.imageset/icon.png new file mode 100644 index 00000000..0eeb8c11 Binary files /dev/null and b/ios/WatchRunner Watch App/Assets.xcassets/Logo.imageset/icon.png differ diff --git a/ios/WatchRunner Watch App/ContentView.swift b/ios/WatchRunner Watch App/ContentView.swift index 472da0a2..d09b4428 100644 --- a/ios/WatchRunner Watch App/ContentView.swift +++ b/ios/WatchRunner Watch App/ContentView.swift @@ -11,37 +11,35 @@ import SwiftUI struct ContentView: View { @StateObject private var appState = AppState() @State private var selection: Panel? = .explore - + enum Panel: Hashable { case explore case chat case notifications case account } - + var body: some View { NavigationSplitView { List(selection: $selection) { - Label("Explore", systemImage: "globe").tag(Panel.explore) - Label("Chat", systemImage: "message").tag(Panel.chat) - Label("Notifications", systemImage: "bell").tag(Panel.notifications) - Label("Account", systemImage: "person.circle").tag(Panel.account) + AppInfoHeaderView().listRowBackground(Color.clear) + + Label("Explore", systemImage: "globe.fill").tag(Panel.explore) + Label("Chat", systemImage: "message.fill").tag(Panel.chat) + Label("Notifications", systemImage: "bell.fill").tag(Panel.notifications) + Label("Account", systemImage: "person.circle.fill").tag(Panel.account) } .listStyle(.automatic) } detail: { switch selection { case .explore: - ExploreView() - .environmentObject(appState) + ExploreView().environmentObject(appState) case .chat: - ChatView() - .environmentObject(appState) + ChatView().environmentObject(appState) case .notifications: - NotificationView() - .environmentObject(appState) + NotificationView().environmentObject(appState) case .account: - AccountView() - .environmentObject(appState) + AccountView().environmentObject(appState) case .none: Text("Select a panel") } diff --git a/ios/WatchRunner Watch App/Services/ImageLoader.swift b/ios/WatchRunner Watch App/Services/ImageLoader.swift index 5edd7be0..5297bdb5 100644 --- a/ios/WatchRunner Watch App/Services/ImageLoader.swift +++ b/ios/WatchRunner Watch App/Services/ImageLoader.swift @@ -58,9 +58,8 @@ class ImageLoader: ObservableObject { switch result { case .success(let value): self.image = Image(uiImage: value.image) - print("[watchOS] Image loaded successfully from \(value.cacheType == .none ? "network" : "cache (\(value.cacheType))").") self.isLoading = false - case .failure(let error): + case .failure(_): // If WebP processor fails (likely due to format), try with default processor let defaultProcessor = DefaultImageProcessor.default self.currentTask = KingfisherManager.shared.retrieveImage( @@ -78,7 +77,6 @@ class ImageLoader: ObservableObject { switch fallbackResult { case .success(let value): self.image = Image(uiImage: value.image) - print("[watchOS] Image loaded successfully from \(value.cacheType == .none ? "network" : "cache (\(value.cacheType))") using fallback processor.") case .failure(let fallbackError): self.errorMessage = fallbackError.localizedDescription print("[watchOS] Image loading failed: \(fallbackError.localizedDescription)") diff --git a/ios/WatchRunner Watch App/Services/NetworkService.swift b/ios/WatchRunner Watch App/Services/NetworkService.swift index 188deb6a..04a9a3df 100644 --- a/ios/WatchRunner Watch App/Services/NetworkService.swift +++ b/ios/WatchRunner Watch App/Services/NetworkService.swift @@ -380,16 +380,16 @@ class NetworkService { print(context) return [] } catch DecodingError.keyNotFound(let key, let context) { - print("Key '\(key)' not found:", context.debugDescription) - print("codingPath:", context.codingPath) + print("[watchOS] Message decode failed: Key '\(key)' not found:", context.debugDescription) + print("[watchOS] Message decode failed: codingPath:", context.codingPath) return [] } catch DecodingError.valueNotFound(let value, let context) { - print("Value '\(value)' not found:", context.debugDescription) - print("codingPath:", context.codingPath) + print("[watchOS] Message decode failed: Value '\(value)' not found:", context.debugDescription) + print("[watchOS] Message decode failed: codingPath:", context.codingPath) return [] } catch DecodingError.typeMismatch(let type, let context) { - print("Type '\(type)' mismatch:", context.debugDescription) - print("codingPath:", context.codingPath) + print("[watchOS] Message decode failed: Type '\(type)' mismatch:", context.debugDescription) + print("[watchOS] Message decode failed: codingPath:", context.codingPath) return [] } catch { print("error: ", error) diff --git a/ios/WatchRunner Watch App/Views/AppInfoHeaderView.swift b/ios/WatchRunner Watch App/Views/AppInfoHeaderView.swift new file mode 100644 index 00000000..93719238 --- /dev/null +++ b/ios/WatchRunner Watch App/Views/AppInfoHeaderView.swift @@ -0,0 +1,25 @@ +// +// AppInfoHeader.swift +// Runner +// +// Created by LittleSheep on 2025/10/30. +// + +import SwiftUI + +struct AppInfoHeaderView : View { + var body: some View { + VStack(alignment: .leading) { + HStack(spacing: 12) { + Image("Logo") + .resizable() + .frame(width: 40, height: 40) + + VStack(alignment: .leading) { + Text("Solian").font(.headline) + Text("for Apple Watch").font(.system(size: 11)) + } + } + } + } +}