拆分宣传页视图并扩充 Mock 数据,合作订单支持获客员备注名并修复线索图片网格尺寸。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-02 17:43:04 +08:00
parent 1b1e93b9ca
commit 328c4321f4
41 changed files with 2529 additions and 1436 deletions

View File

@ -0,0 +1,89 @@
//
// ScenicPromotionMaterialPreviewView.swift
// suixinkan
//
// Created by Codex on 2026/7/2.
//
import SwiftUI
///
struct ScenicPromotionMaterialPreviewView: View {
let material: ScenicPromotionManagedMaterial
var body: some View {
ScrollView {
VStack(alignment: .leading, spacing: 16) {
ZStack {
Image(material.assetName)
.resizable()
.scaledToFill()
.frame(height: 280)
.frame(maxWidth: .infinity)
.clipped()
if material.kind == .video {
Image(systemName: "play.fill")
.font(.system(size: 34, weight: .bold))
.foregroundStyle(.white)
.frame(width: 76, height: 76)
.background(.black.opacity(0.36), in: Circle())
.overlay(Circle().stroke(.white, lineWidth: 3))
}
}
.clipShape(RoundedRectangle(cornerRadius: 18))
VStack(alignment: .leading, spacing: 10) {
Text(material.title)
.font(.system(size: 22, weight: .bold))
.foregroundStyle(AppDesign.textPrimary)
Text(material.subtitle)
.font(.system(size: 14, weight: .medium))
.foregroundStyle(AppDesign.textSecondary)
Divider()
ScenicPromotionMaterialPreviewInfoRow(title: "素材类型", value: material.kind.shortTitle)
ScenicPromotionMaterialPreviewInfoRow(title: "上传时间", value: material.createdAt)
if let duration = material.duration {
ScenicPromotionMaterialPreviewInfoRow(title: "视频时长", value: duration)
}
}
.padding(16)
.background(.white, in: RoundedRectangle(cornerRadius: 16))
}
.padding(16)
}
.background(AppDesign.background.ignoresSafeArea())
.navigationTitle(material.kind == .video ? "视频预览" : "图片预览")
.navigationBarTitleDisplayMode(.inline)
}
}
///
struct ScenicPromotionMaterialPreviewInfoRow: View {
let title: String
let value: String
var body: some View {
HStack {
Text(title)
.font(.system(size: 14, weight: .medium))
.foregroundStyle(AppDesign.textSecondary)
Spacer()
Text(value)
.font(.system(size: 14, weight: .bold))
.foregroundStyle(AppDesign.textPrimary)
}
}
}
#if DEBUG
#Preview("视频预览") {
NavigationStack {
ScenicPromotionMaterialPreviewView(
material: ScenicPromotionPreviewSupport.sampleManagedMaterial
)
}
}
#endif