| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- import SwiftUI
- struct GlucoseTrendView: View {
- let state: WatchState
- let rotationDegrees: Double
- private var is40mm: Bool {
- let size = WKInterfaceDevice.current().screenBounds.size
- return size.height < 225 && size.width < 185
- }
- /// Determines the status color based on the time elapsed since the last loop
- /// - Parameter timeString: The time string representing minutes since last loop (format: "X min")
- /// - Returns: A color indicating the status:
- /// - Green: <= 5 minutes
- /// - Yellow: 5-10 minutes
- /// - Red: > 10 minutes or invalid time
- private func statusColor(for timeString: String?) -> Color {
- guard let timeString = timeString,
- timeString != "--",
- let minutes = timeString.split(separator: " ").first.flatMap({ Int($0) })
- else {
- return .secondary
- }
- switch minutes {
- case ...5:
- return Color.loopGreen
- case 5 ... 10:
- return Color.loopYellow
- case 11...:
- return Color.loopRed
- default:
- return Color.secondary
- }
- }
- var body: some View {
- VStack {
- ZStack {
- Circle()
- .stroke(statusColor(for: state.lastLoopTime), lineWidth: is40mm ? 1 : 1.5)
- .frame(width: is40mm ? 86 : 105, height: is40mm ? 86 : 105)
- .background(Circle().fill(Color.bgDarkBlue))
- .shadow(color: statusColor(for: state.lastLoopTime), radius: is40mm ? 8 : 12)
- TrendShape(rotationDegrees: rotationDegrees, isSmallDevice: is40mm)
- .animation(.spring(response: 0.5, dampingFraction: 0.6), value: rotationDegrees)
- .shadow(color: Color.black.opacity(0.5), radius: 5)
- VStack(alignment: .center) {
- Text(state.currentGlucose)
- .fontWeight(.semibold)
- .font(.system(is40mm ? .title2 : .title))
- .foregroundStyle(state.currentGlucoseColorString.toColor())
- if let delta = state.delta {
- Text(delta)
- .fontWeight(.semibold)
- .font(.system(.caption))
- .foregroundStyle(.secondary)
- }
- }
- }
- Text(state.lastLoopTime ?? "--").font(.system(size: is40mm ? 9 : 10))
- Spacer()
- }.frame(maxWidth: .infinity, maxHeight: .infinity)
- }
- }
|