DFSingleStressFaceView.swift 2.33 KB
//
//  DFSingleStressFaceView.swift
//  hippo-watch-extension
//

import SwiftUI

struct DFSingleStressFaceView: View {
    let entry: DFWatchFaceEntry

    var body: some View {
        GeometryReader { proxy in
            let scale = min(proxy.size.width / 172, proxy.size.height / 74)
            let content = entry.theme?.faceContent(for: entry.data.myStatus)
            HStack(spacing: 10 * scale) {
                DFStatusOrb(
                    status: entry.data.myStatus,
                    value: entry.data.hasData ? "\(entry.data.hrvValue)" : "--",
                    themeImage: content?.image
                )
                    .frame(width: 54 * scale, height: 54 * scale)

                VStack(alignment: .leading, spacing: 5 * scale) {
                    HStack {
                        Text("HRV")
                            .font(.system(size: 10 * scale, weight: .medium))
                            .foregroundStyle(.white.opacity(0.62))
                        Spacer()
                        Text(entry.date, style: .time)
                            .font(.system(size: 10 * scale, weight: .medium))
                            .foregroundStyle(.white)
                    }
                    Text(entry.data.hasData ? "\(content?.title ?? entry.data.myStatus.title) · \(entry.data.hrvValue)ms" : "等待数据")
                        .font(.system(size: 14 * scale, weight: .semibold))
                        .foregroundStyle(entry.data.hasData ? entry.data.myStatus.color : DFWatchFaceColor.grayText)
                        .lineLimit(1)
                        .minimumScaleFactor(0.7)
                    DFSegmentBar(selected: entry.data.hasData ? entry.data.myStatus : nil)
                        .frame(height: 9 * scale)
                    Text(entry.data.hasData ? entry.data.hrvTime : "--:--")
                        .font(.system(size: 10 * scale, weight: .medium))
                        .foregroundStyle(.white.opacity(0.82))
                }
            }
            .padding(.horizontal, 8)
            .frame(maxWidth: .infinity, maxHeight: .infinity)
            .background(
                LinearGradient(
                    colors: [entry.data.myStatus.color.opacity(0.28), .clear],
                    startPoint: .leading,
                    endPoint: .trailing
                )
            )
        }
    }
}