Add album management and trailer upload to Assets module.

Wire home routing for album_list and album_trailer, add a DEBUG home menu preview in Profile, and expand Assets tests.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-24 09:43:46 +08:00
parent a48eb76ba4
commit 607130ade0
17 changed files with 2018 additions and 26 deletions

View File

@ -0,0 +1,148 @@
//
// DebugHomeMenuPreviewView.swift
// suixinkan
//
// Created by Codex on 2026/6/24.
//
#if DEBUG
import SwiftUI
///
struct DebugHomeMenuPreviewView: View {
@Environment(AppRouter.self) private var appRouter
@Environment(RouterPath.self) private var router
@Environment(ToastCenter.self) private var toastCenter
private let items = HomeMenuRouter.debugAllMenuItems()
var body: some View {
List {
Section {
ForEach(items) { item in
Button {
open(item)
} label: {
DebugHomeMenuRow(item: item, route: HomeMenuRouter.resolve(uri: item.uri, title: item.title))
}
.buttonStyle(.plain)
}
} header: {
Text("全部首页菜单")
} footer: {
Text("DEBUG 调试入口不读取角色权限,仅用于预览页面迁移状态。")
}
}
.listStyle(.insetGrouped)
.navigationTitle("首页菜单调试")
.navigationBarTitleDisplayMode(.inline)
}
///
private func open(_ item: HomeMenuItem) {
let route = HomeMenuRouter.resolve(uri: item.uri, title: item.title)
switch route {
case .tab(let tab):
appRouter.select(tab)
case .orders(let entry):
appRouter.selectOrders(entry: entry)
case .destination(let homeRoute):
router.navigate(to: .home(homeRoute))
case .unsupported(_, let title, let reason):
toastCenter.show(reason)
router.navigate(to: .home(.modulePlaceholder(uri: item.uri, title: title)))
case .placeholder(let uri, let title):
HomeRouteDiagnostics.recordUnknown(uri: uri, title: title)
router.navigate(to: .home(.modulePlaceholder(uri: uri, title: title)))
}
}
}
/// URI
private struct DebugHomeMenuRow: View {
let item: HomeMenuItem
let route: HomeMenuResolvedRoute
var body: some View {
HStack(spacing: AppMetrics.Spacing.small) {
Image(systemName: iconName)
.font(.system(size: 18, weight: .semibold))
.foregroundStyle(iconColor)
.frame(width: 30, height: 30)
.background(iconColor.opacity(0.12), in: Circle())
VStack(alignment: .leading, spacing: 4) {
Text(item.title)
.font(.system(size: AppMetrics.FontSize.body, weight: .semibold))
.foregroundStyle(AppDesign.textPrimary)
Text(item.uri)
.font(.system(size: AppMetrics.FontSize.caption))
.foregroundStyle(AppDesign.textSecondary)
.lineLimit(1)
}
Spacer()
Text(routeLabel)
.font(.system(size: AppMetrics.FontSize.caption, weight: .semibold))
.foregroundStyle(iconColor)
Image(systemName: "chevron.right")
.font(.system(size: AppMetrics.FontSize.caption, weight: .semibold))
.foregroundStyle(AppDesign.placeholder)
}
.contentShape(Rectangle())
.padding(.vertical, AppMetrics.Spacing.xSmall)
}
///
private var routeLabel: String {
switch route {
case .tab:
return "Tab"
case .orders:
return "订单"
case .destination(let homeRoute):
if case .modulePlaceholder = homeRoute {
return "占位"
}
return "页面"
case .unsupported:
return "不支持"
case .placeholder:
return "未知"
}
}
///
private var iconName: String {
switch route {
case .tab:
return "rectangle.grid.1x2"
case .orders:
return "doc.text"
case .destination(let homeRoute):
if case .modulePlaceholder = homeRoute {
return "square.dashed"
}
return "arrowshape.turn.up.right"
case .unsupported:
return "nosign"
case .placeholder:
return "questionmark.circle"
}
}
///
private var iconColor: Color {
switch route {
case .tab, .orders, .destination:
AppDesign.primary
case .unsupported:
.red
case .placeholder:
AppDesign.warning
}
}
}
#endif

View File

@ -322,6 +322,20 @@ struct ProfileView: View {
}
}
.buttonStyle(.plain)
#if DEBUG
divider
Button {
router.navigate(to: .profile(.debugHomeMenus))
} label: {
infoRow(title: "首页调试") {
statusBadge(text: "DEBUG", icon: "hammer.fill", foreground: AppDesign.primary, background: AppDesign.primarySoft)
rowChevron
}
}
.buttonStyle(.plain)
#endif
}
.padding(.horizontal, 24)
.padding(.vertical, 4)