DFDefaultHomeFaceView.swift 2.64 KB
//
//  DFDefaultHomeFaceView.swift
//  hippo-watch-extension
//

import SwiftUI

struct DFDefaultHomeFaceView: View {
    let entry: DFWatchFaceEntry

    var body: some View {
        GeometryReader { proxy in
            let scale = min(proxy.size.width / 172, proxy.size.height / 74)
            HStack(spacing: 8 * scale) {
                VStack(alignment: .leading, spacing: 2 * scale) {
                    HStack(spacing: 4 * scale) {
                        Text(entry.date, format: .dateTime.weekday(.abbreviated))
                            .foregroundStyle(DFWatchFaceColor.purple)
                        Text(entry.date, format: .dateTime.day())
                            .foregroundStyle(.white)
                    }
                    .font(.system(size: 11 * scale, weight: .semibold))

                    Text(entry.date, style: .time)
                        .font(.system(size: 25 * scale, weight: .medium, design: .rounded))
                        .foregroundStyle(.white)
                        .lineLimit(1)
                        .minimumScaleFactor(0.7)

                    DFSegmentBar(selected: entry.data.hasData ? entry.data.myStatus : nil)
                        .frame(height: 7 * scale)
                }

                VStack(alignment: .trailing, spacing: 5 * scale) {
                    HStack(spacing: 5 * scale) {
                        DFMiniMetric(value: entry.data.hasData ? "\(entry.data.heartRate)" : "0", icon: "heart.fill", tint: DFWatchFaceColor.red)
                        DFMiniMetric(value: "\(entry.data.closePercent)", icon: "sparkles", tint: DFWatchFaceColor.purple)
                        DFMiniMetric(value: entry.data.hasData ? shortSteps(entry.data.steps) : "0", icon: "shoeprints.fill", tint: DFWatchFaceColor.green)
                    }
                    Text(entry.data.hasData ? "\(entry.data.myStatus.title) · \(entry.data.hrvValue)ms" : "暂无数据 · --ms")
                        .font(.system(size: 10 * scale, weight: .semibold))
                        .foregroundStyle(entry.data.hasData ? entry.data.myStatus.color : DFWatchFaceColor.grayText)
                        .lineLimit(1)
                        .minimumScaleFactor(0.7)
                    Text(entry.data.hasData ? entry.data.hrvTime : "--:--")
                        .font(.system(size: 9 * scale, weight: .medium))
                        .foregroundStyle(.white.opacity(0.78))
                }
            }
            .frame(maxWidth: .infinity, maxHeight: .infinity)
            .padding(.horizontal, 6)
        }
    }

    private func shortSteps(_ steps: Int) -> String {
        steps >= 1000 ? "\(steps / 1000)k" : "\(steps)"
    }
}