// // ScenicPromotionQueuePanelView.swift // suixinkan // // Created by Codex on 2026/7/2. // import SwiftUI /// 宣传页当前叫号模块,有排队数据时展示叫号,无排队时展示空状态。 struct ScenicPromotionQueuePanelView: View { let queue: ScenicPromotionQueueInfo? var body: some View { Group { if let queue { HStack(spacing: 10) { ScenicPromotionQueueSideView( icon: "camera.aperture", title: "下一位", value: queue.nextNumber, tint: Color(hex: 0x197BFF) ) Divider() .frame(height: 52) VStack(spacing: 0) { Text("当前叫号") .font(.system(size: 15, weight: .bold)) .foregroundStyle(Color(hex: 0x123F86)) Text(queue.currentNumber) .font(.system(size: 38, weight: .heavy)) .foregroundStyle(Color(hex: 0x197BFF)) .minimumScaleFactor(0.55) } .frame(maxWidth: .infinity) Divider() .frame(height: 52) ScenicPromotionQueueSideView( icon: "person.2.fill", title: "拍摄用时", value: queue.shootingDuration, tint: Color(hex: 0x7A4DFF) ) } .padding(.horizontal, 14) .padding(.vertical, 7) } else { HStack(spacing: 18) { Image(systemName: "list.clipboard") .font(.system(size: 46, weight: .semibold)) .foregroundStyle(Color(hex: 0x2F80ED)) .frame(width: 92, height: 92) .background(Color(hex: 0xEAF4FF), in: RoundedRectangle(cornerRadius: 18)) VStack(alignment: .leading, spacing: 8) { Text("当前暂无排队信息") .font(.system(size: 22, weight: .heavy)) .foregroundStyle(Color(hex: 0x123F86)) Text("可先浏览景点样片,稍后再查看排队动态") .font(.system(size: 14, weight: .medium)) .foregroundStyle(Color(hex: 0x5272A5)) } Spacer(minLength: 0) } .padding(18) } } .frame(maxWidth: .infinity) .background(.white.opacity(0.86), in: RoundedRectangle(cornerRadius: 18)) .overlay( RoundedRectangle(cornerRadius: 18) .stroke(.white.opacity(0.9), lineWidth: 1) ) .shadow(color: Color(hex: 0x0D47A1, alpha: 0.10), radius: 14, y: 6) } } /// 叫号模块左右两侧的小信息块。 struct ScenicPromotionQueueSideView: View { let icon: String let title: String let value: String let tint: Color var body: some View { HStack(spacing: 7) { Image(systemName: icon) .font(.system(size: 18, weight: .semibold)) .foregroundStyle(tint) .frame(width: 34, height: 34) .background(tint.opacity(0.13), in: Circle()) VStack(alignment: .leading, spacing: 3) { Text(title) .font(.system(size: 11, weight: .medium)) .foregroundStyle(Color(hex: 0x113B79)) Text(value) .font(.system(size: 13, weight: .heavy)) .foregroundStyle(tint) .lineLimit(2) .fixedSize(horizontal: false, vertical: true) .minimumScaleFactor(0.76) } } .frame(maxWidth: .infinity, alignment: .leading) } } #if DEBUG #Preview("叫号面板") { ScenicPromotionQueuePanelView(queue: ScenicPromotionPreviewSupport.sampleQueue) .padding(.horizontal, 20) } #Preview("叫号面板-空") { ScenicPromotionQueuePanelView(queue: nil) .padding(.horizontal, 20) } #endif