// // InfoScreenView.swift // Solverv // // 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 { 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) 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 } .padding() } .navigationTitle("Solverv og jevndøgn") .onAppear(perform: loadData) .onReceive(Timer.publish(every: 60, on: .main, in: .common).autoconnect()) { _ in loadData() } } 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) } }