70 lines
2.6 KiB
Swift
70 lines
2.6 KiB
Swift
//
|
||
// ScenicPromotionMetricsGridView.swift
|
||
// suixinkan
|
||
//
|
||
// Created by Codex on 2026/7/2.
|
||
//
|
||
|
||
import SwiftUI
|
||
|
||
/// 宣传页三个排队数据卡片:当前排队人数、预计等待时间、平均等待时长。
|
||
struct ScenicPromotionMetricsGridView: View {
|
||
let queue: ScenicPromotionQueueInfo?
|
||
|
||
var body: some View {
|
||
let metrics: [(String, String, String, Color)] = [
|
||
("当前排队人数", queue.map { "\($0.waitingPeople)" } ?? "--", "人", Color(hex: 0x1580FF)),
|
||
("预计等待时间", queue.map { "\($0.estimatedMinutes)" } ?? "--", "分钟", Color(hex: 0xF28C18)),
|
||
("平均等待时长", queue.map { "\($0.averageMinutes)" } ?? "--", "分钟", Color(hex: 0x2D8E43))
|
||
]
|
||
|
||
LazyVGrid(columns: Array(repeating: GridItem(.flexible(), spacing: 12), count: 3), spacing: 12) {
|
||
ForEach(metrics, id: \.0) { metric in
|
||
VStack(spacing: 8) {
|
||
Text(metric.0)
|
||
.font(.system(size: 12, weight: .semibold))
|
||
.foregroundStyle(Color(hex: 0x113B79))
|
||
.lineLimit(1)
|
||
.minimumScaleFactor(0.76)
|
||
HStack(alignment: .lastTextBaseline, spacing: 2) {
|
||
Text(metric.1)
|
||
.font(.system(size: 34, weight: .heavy))
|
||
.foregroundStyle(metric.3)
|
||
.minimumScaleFactor(0.55)
|
||
if metric.1 != "--" {
|
||
Text(metric.2)
|
||
.font(.system(size: 13, weight: .medium))
|
||
.foregroundStyle(metric.3)
|
||
}
|
||
}
|
||
if metric.1 == "--" {
|
||
Text("暂无数据")
|
||
.font(.system(size: 11))
|
||
.foregroundStyle(Color(hex: 0x5272A5))
|
||
}
|
||
}
|
||
.padding(.horizontal, 6)
|
||
.frame(maxWidth: .infinity)
|
||
.frame(height: 92)
|
||
.background(.white.opacity(0.84), in: RoundedRectangle(cornerRadius: 14))
|
||
.overlay(
|
||
RoundedRectangle(cornerRadius: 14)
|
||
.stroke(.white.opacity(0.85), lineWidth: 1)
|
||
)
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
#if DEBUG
|
||
#Preview("排队数据") {
|
||
ScenicPromotionMetricsGridView(queue: ScenicPromotionPreviewSupport.sampleQueue)
|
||
.padding(.horizontal, 20)
|
||
}
|
||
|
||
#Preview("排队数据-空") {
|
||
ScenicPromotionMetricsGridView(queue: nil)
|
||
.padding(.horizontal, 20)
|
||
}
|
||
#endif
|