111 lines
3.1 KiB
Swift
111 lines
3.1 KiB
Swift
//
|
|
// DiscoveryViews.swift
|
|
// WatchRunner Watch App
|
|
//
|
|
// Created by LittleSheep on 2025/10/29.
|
|
//
|
|
|
|
import SwiftUI
|
|
|
|
struct DiscoveryView: View {
|
|
let discoveryData: DiscoveryData
|
|
|
|
var body: some View {
|
|
NavigationLink(destination: DiscoveryDetailView(discoveryData: discoveryData)) {
|
|
VStack(alignment: .leading) {
|
|
Text("Discovery")
|
|
.font(.headline)
|
|
Text("\(discoveryData.items.count) new items to discover")
|
|
.font(.subheadline)
|
|
.foregroundColor(.secondary)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
struct DiscoveryDetailView: View {
|
|
let discoveryData: DiscoveryData
|
|
|
|
var body: some View {
|
|
List(discoveryData.items) { item in
|
|
NavigationLink(destination: destinationView(for: item)) {
|
|
itemView(for: item)
|
|
}
|
|
}
|
|
.navigationTitle("Discovery")
|
|
}
|
|
|
|
@ViewBuilder
|
|
private func itemView(for item: DiscoveryItem) -> some View {
|
|
VStack(alignment: .leading) {
|
|
switch item.data {
|
|
case .realm(let realm):
|
|
Text("Realm").font(.headline)
|
|
Text(realm.name).foregroundColor(.secondary)
|
|
case .publisher(let publisher):
|
|
Text("Publisher").font(.headline)
|
|
Text(publisher.name).foregroundColor(.secondary)
|
|
case .article(let article):
|
|
Text("Article").font(.headline)
|
|
Text(article.title).foregroundColor(.secondary)
|
|
case .unknown:
|
|
Text("Unknown item")
|
|
}
|
|
}
|
|
}
|
|
|
|
@ViewBuilder
|
|
private func destinationView(for item: DiscoveryItem) -> some View {
|
|
switch item.data {
|
|
case .realm(let realm):
|
|
RealmDetailView(realm: realm)
|
|
case .publisher(let publisher):
|
|
PublisherDetailView(publisher: publisher)
|
|
case .article(let article):
|
|
ArticleDetailView(article: article)
|
|
case .unknown:
|
|
Text("Detail view not available")
|
|
}
|
|
}
|
|
}
|
|
|
|
struct RealmDetailView: View {
|
|
let realm: SnRealm
|
|
|
|
var body: some View {
|
|
VStack(alignment: .leading, spacing: 8) {
|
|
Text(realm.name).font(.headline)
|
|
if let description = realm.description {
|
|
Text(description).font(.body)
|
|
}
|
|
}
|
|
.navigationTitle("Realm")
|
|
}
|
|
}
|
|
|
|
struct PublisherDetailView: View {
|
|
let publisher: SnPublisher
|
|
|
|
var body: some View {
|
|
VStack(alignment: .leading, spacing: 8) {
|
|
Text(publisher.name).font(.headline)
|
|
if let description = publisher.description {
|
|
Text(description).font(.body)
|
|
}
|
|
}
|
|
.navigationTitle("Publisher")
|
|
}
|
|
}
|
|
|
|
struct ArticleDetailView: View {
|
|
let article: SnWebArticle
|
|
|
|
var body: some View {
|
|
VStack(alignment: .leading, spacing: 8) {
|
|
Text(article.title).font(.headline)
|
|
Text(article.url).font(.caption).foregroundColor(.secondary)
|
|
}
|
|
.navigationTitle("Article")
|
|
}
|
|
}
|