summaryrefslogtreecommitdiffstats
path: root/Solverv/ContentView.swift
diff options
context:
space:
mode:
authorivar <i@oiee.no>2026-05-07 01:24:28 +0200
committerivar <i@oiee.no>2026-05-07 01:24:28 +0200
commit6eb17a18e901e2d7faa219d7e5a79083a5891dc9 (patch)
tree3d0796e1e567864dfdf7c675f7e8a5a40fb51a95 /Solverv/ContentView.swift
parent4fb690150b77afced6453e6bdb14cc4cf00d5305 (diff)
downloadsolverv-6eb17a18e901e2d7faa219d7e5a79083a5891dc9.tar.xz
solverv-6eb17a18e901e2d7faa219d7e5a79083a5891dc9.zip
RefactorsHEADmaster
Diffstat (limited to 'Solverv/ContentView.swift')
-rw-r--r--Solverv/ContentView.swift169
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)
+ }
}