拆分宣传页视图并扩充 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,71 @@
//
// ScenicPromotionContentView.swift
// suixinkan
//
// Created by Codex on 2026/7/2.
//
import SwiftUI
///
struct ScenicPromotionContentView: View {
@ObservedObject var viewModel: ScenicPromotionViewModel
let onQRCodeTap: () -> Void
let onQRCodeLongPress: () -> Void
let onVideoTap: () -> Void
var body: some View {
VStack(spacing: ScenicPromotionLayout.moduleVerticalSpacing) {
if let board = viewModel.board {
ScenicPromotionHeaderView(
board: board,
onQRCodeTap: onQRCodeTap,
onQRCodeLongPress: onQRCodeLongPress
)
ScenicPromotionSpotTabsView(
spots: board.spots,
selectedSpotID: viewModel.selectedSpot?.id,
onSelectSpot: viewModel.selectSpot
)
ScenicPromotionMetricsGridView(queue: viewModel.queue)
ScenicPromotionQueuePanelView(queue: viewModel.queue)
ScenicPromotionMediaToolbarView(
selectedMode: viewModel.selectedMode,
onSelectMode: viewModel.selectMode
)
ScenicPromotionMediaStripView(
mediaItems: viewModel.mediaItems,
selectedMediaID: viewModel.selectedMedia?.id,
emptyMode: viewModel.selectedMode,
onSelectMedia: viewModel.selectMedia,
onMoveMedia: viewModel.moveMedia
)
ScenicPromotionHeroMediaView(
selectedMedia: viewModel.selectedMedia,
emptyMode: viewModel.selectedMode,
onVideoTap: onVideoTap
)
}
}
.border(.blue)
.padding(.top, 28)
.padding(.bottom, 24)
.border(.red)
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top)
.padding(.horizontal, ScenicPromotionLayout.screenEdgePadding)
}
}
#if DEBUG
#Preview("宣传页内容") {
ZStack {
ScenicPromotionSkyBackground().ignoresSafeArea()
ScenicPromotionContentView(
viewModel: ScenicPromotionPreviewSupport.mainViewModel(),
onQRCodeTap: {},
onQRCodeLongPress: {},
onVideoTap: {}
)
}
}
#endif