diff options
Diffstat (limited to 'Solverv/ContentView.swift')
| -rw-r--r-- | Solverv/ContentView.swift | 169 |
1 files changed, 153 insertions, 16 deletions
diff --git a/Solverv/ContentView.swift b/Solverv/ContentView.swift index 38c6153..dff6e23 100644 --- a/Solverv/ContentView.swift +++ b/Solverv/ContentView.swift @@ -1,32 +1,169 @@ // -// ContentView.swift +// InfoScreenView.swift // Solverv // -// Created by Ivar Løvlie on 15/12/2025. +// Created by Ivar Løvlie on 23/03/2026. // import SwiftUI +import Combine struct ContentView: View { + @State private var upcomingEvents: [SolsticeEvent] = [] + @State private var nextEvent: SolsticeEvent? + @State private var currentEvent: SolsticeEvent? + @State private var progressData: (elapsed: Int, total: Int)? = nil + @State private var sunriseTime: Date? + @State private var sunsetTime: Date? + var body: some View { - NavigationStack { - VStack { - Text("Solstice Countdown") - .font(.title) + ScrollView { + VStack(spacing: 24) { + VStack(spacing: 16) { + if let next = nextEvent, let current = currentEvent { + Image(current.season.assetName) + .resizable() + .scaledToFit() + .frame(height: 200) + .clipped() + + VStack(spacing: 8) { + Text(current.name) + .font(.title3) + + Text("\(next.daysUntil())") + .font(.system(.title, design: .default).weight(.bold)) + .foregroundColor(next.season.colorLight) + + Text("dager til \(next.shortName.lowercased())") + .font(.caption) + .foregroundColor(.secondary) + } + + if let progress = progressData { + ProgressView(value: Double(progress.elapsed) / Double(progress.total)) + .tint(next.season.colorLight) + } + } + } + .padding() + .background(Color(.systemGray6)) + .cornerRadius(12) + + VStack(spacing: 16) { + VStack(alignment: .leading, spacing: 12) { + Text("Solgang idag") + .font(.headline) - NavigationLink(destination: InfoScreenView()) { - Label("View Details", systemImage: "info.circle") - .padding() - .background(Color.blue) - .foregroundColor(.white) - .cornerRadius(8) + HStack { + Label("Oppgang", systemImage: "sunrise.fill") + Spacer() + if let sunrise = sunriseTime { + Text(sunrise, style: .time) + } else { + Text("—").foregroundColor(.secondary) + } + } + + HStack { + Label("Nedgang", systemImage: "sunset.fill") + Spacer() + if let sunset = sunsetTime { + Text(sunset, style: .time) + } else { + Text("—").foregroundColor(.secondary) + } + } + } } + .padding() + .background(Color(.systemGray6)) + .cornerRadius(12) + + eventsListSection } - .navigationTitle("Home") + .padding() + } + .navigationTitle("Solverv og jevndøgn") + .onAppear(perform: loadData) + .onReceive(Timer.publish(every: 60, on: .main, in: .common).autoconnect()) { _ in + loadData() } } -} -#Preview { - ContentView() + private var eventsListSection: some View { + VStack(alignment: .leading, spacing: 12) { + Text("Fremtiden") + .font(.headline) + + if upcomingEvents.isEmpty { + Text("Er her") + .foregroundColor(.secondary) + .font(.caption) + } else { + VStack(spacing: 0) { + ForEach(Array(upcomingEvents.enumerated()), id: \.element.id) { index, event in + VStack(spacing: 0) { + HStack { + VStack(alignment: .leading, spacing: 2) { + Text(event.name) + .font(.subheadline) + .lineLimit(1) + + Text(formatEventDate(event.localDateTime())) + .font(.caption) + .foregroundColor(.secondary) + } + + Spacer() + + VStack(alignment: .trailing, spacing: 2) { + Text("\(event.daysUntil())d") + .font(.subheadline) + + Circle() + .fill(event.season.colorLight) + .frame(width: 12, height: 12) + } + } + .padding(.vertical, 8) + + if index < upcomingEvents.count - 1 { + Divider() + } + } + } + } + } + } + .padding() + .background(Color(.systemGray6)) + .cornerRadius(12) + } + + private func loadData() { + nextEvent = SolsticeData.shared.nextEvent() + currentEvent = SolsticeData.shared.currentEvent() + upcomingEvents = SolsticeData.shared.upcomingEvents(count: 12) + progressData = SolsticeData.shared.progressToNextEvent() + + // Load sunrise/sunset from location if available + if let location = AppGroupManager.shared.getLocation() { + let sunTimes = SunTimes( + latitude: location.latitude, + longitude: location.longitude, + date: Date() + ) + sunriseTime = sunTimes.sunrise() + sunsetTime = sunTimes.sunset() + } + } + + private func formatEventDate(_ date: Date) -> String { + let formatter = DateFormatter() + formatter.dateStyle = .short + formatter.timeStyle = .short + formatter.timeZone = .current + return formatter.string(from: date) + } } |
