sa2kit 1.6.80 → 1.6.83

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/showmasterpiece/ui/miniapp/components/PageHeader.tsx","../../../../src/showmasterpiece/ui/miniapp/components/CategoryTabs.tsx","../../../../src/showmasterpiece/types/index.ts","../../../../src/showmasterpiece/logic/shared/format.ts","../../../../src/showmasterpiece/logic/shared/category.ts","../../../../src/showmasterpiece/ui/miniapp/components/CollectionCard.tsx","../../../../src/showmasterpiece/ui/miniapp/components/BookingSteps.tsx","../../../../src/showmasterpiece/ui/miniapp/components/FormField.tsx","../../../../src/showmasterpiece/ui/miniapp/components/CartItemCard.tsx","../../../../src/showmasterpiece/ui/miniapp/components/HistoryRecordCard.tsx","../../../../src/showmasterpiece/ui/miniapp/components/DeadlinePopup.tsx","../../../../src/showmasterpiece/service/api/client.ts","../../../../src/showmasterpiece/service/miniapp/client.ts","../../../../src/showmasterpiece/logic/shared/useDeadlinePopupCore.ts","../../../../src/showmasterpiece/logic/hooks/useDeadlinePopupWechat.ts","../../../../src/showmasterpiece/logic/shared/storage.ts","../../../../src/showmasterpiece/logic/shared/cart.ts","../../../../src/showmasterpiece/ui/miniapp/pages/ShowMasterpiecePage.tsx","../../../../src/showmasterpiece/ui/miniapp/pages/CartPage.tsx","../../../../src/showmasterpiece/ui/miniapp/pages/HistoryPage.tsx"],"names":["View","React","Text","ScrollView","Image","Input","Textarea","useState","useEffect","useMemo","Button","categories","Taro","useCallback","error","useDidShow"],"mappings":"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","file":"index.js","sourcesContent":["import React from 'react';\nimport { Text, View } from '@tarojs/components';\n\ntype HeaderAction = {\n label: string;\n onClick: () => void;\n variant?: 'primary' | 'ghost';\n};\n\ntype HeaderCta = {\n label: string;\n onClick: () => void;\n};\n\ninterface PageHeaderProps {\n title: string;\n subtitle?: string;\n actions?: HeaderAction[];\n cta?: HeaderCta;\n}\n\nconst PageHeader: React.FC<PageHeaderProps> = ({ title, subtitle, actions, cta }) => {\n return (\n <View className=\"border-b border-prussian-blue-200 bg-white px-4 py-4\">\n <View className=\"flex items-start justify-between gap-3\">\n <View className=\"flex-1\">\n <Text className=\"text-xl font-bold text-rich-black\">{title}</Text>\n {subtitle && <Text className=\"mt-1 block text-sm text-prussian-blue-600\">{subtitle}</Text>}\n </View>\n {actions && actions.length > 0 && (\n <View className=\"flex items-center gap-2\">\n {actions.map(action => (\n <View\n key={action.label}\n className={\n action.variant === 'ghost'\n ? 'flex h-9 items-center justify-center rounded-full border border-prussian-blue-200 bg-white px-4'\n : 'flex h-9 items-center justify-center rounded-full bg-gradient-to-r from-moonstone to-cerulean px-4 shadow-lg'\n }\n onClick={action.onClick}\n >\n <Text\n className={\n action.variant === 'ghost'\n ? 'text-xs font-semibold text-prussian-blue-700'\n : 'text-xs font-semibold text-white'\n }\n >\n {action.label}\n </Text>\n </View>\n ))}\n </View>\n )}\n </View>\n {cta && (\n <View\n className=\"mt-4 flex h-10 items-center justify-center rounded-full bg-gradient-to-r from-moonstone to-cerulean px-4 shadow-lg\"\n onClick={cta.onClick}\n >\n <Text className=\"text-sm font-semibold text-white\">{cta.label}</Text>\n </View>\n )}\n </View>\n );\n};\n\nexport default PageHeader;\n","import React from 'react';\nimport { ScrollView, Text, View } from '@tarojs/components';\n\nexport type CategoryTabItem<T extends string = string> = {\n value: T;\n label: string;\n count?: number;\n};\n\ninterface CategoryTabsProps<T extends string = string> {\n items: CategoryTabItem<T>[];\n activeValue: T;\n onChange: (value: T) => void;\n}\n\nfunction CategoryTabs<T extends string = string>({\n items,\n activeValue,\n onChange\n}: CategoryTabsProps<T>) {\n return (\n <View className=\"mt-3\">\n <ScrollView scrollX showScrollbar>\n <View className=\"flex gap-3 pb-1\">\n {items.map(item => {\n const isActive = activeValue === item.value;\n return (\n <View\n key={item.value}\n className={`flex h-20 w-28 shrink-0 flex-col justify-between rounded-2xl border px-3 py-3 transition-all ${\n isActive\n ? 'border-sky-500 bg-sky-500 text-white shadow-lg'\n : 'border-prussian-blue-200 bg-white text-prussian-blue-700'\n }`}\n onClick={() => onChange(item.value)}\n >\n <Text className=\"text-xs font-semibold leading-4 whitespace-nowrap\">{item.label}</Text>\n {typeof item.count === 'number' && (\n <Text\n className={`self-start rounded-full px-2 py-1 text-xs ${\n isActive\n ? 'bg-white text-sky-600'\n : 'bg-prussian-blue-100 text-prussian-blue-700'\n }`}\n >\n {item.count} 个\n </Text>\n )}\n </View>\n );\n })}\n </View>\n </ScrollView>\n </View>\n );\n}\n\nexport default CategoryTabs;\n","/**\n * ShowMasterpiece 模块类型定义\n * \n * 包含画集、作品、配置等相关的TypeScript类型定义\n */\n\n// ===== 画集分类枚举 =====\n\n/**\n * 画集分类枚举\n * \n * 定义画集的各种分类:\n * - COLLECTION: 画集 - 用于展示艺术作品\n * - ACRYLIC: 立牌 - 立牌制品\n * - BADGE: 吧唧 - 徽章类商品\n * - COLOR_PAPER: 色纸 - 彩色纸张制品\n * - POSTCARD: 明信片 - 明信片类商品\n * - LASER_TICKET: 镭射票 - 镭射票类商品\n * - CANVAS_BAG: 帆布包 - 帆布包类商品\n * - SUPPORT_STICK: 应援棒 - 应援棒类商品\n * - OTHER: 挂件/钥匙扣 - 挂件/钥匙扣类商品\n */\nexport enum CollectionCategory {\n /** 画集 - 用于展示艺术作品 */\n COLLECTION = 'collection',\n /** 立牌 - 立牌制品 */\n ACRYLIC = 'acrylic',\n /** 吧唧 - 徽章类商品 */\n BADGE = 'badge',\n /** 色纸 - 彩色纸张制品 */\n COLOR_PAPER = 'color_paper',\n /** 透卡 - 透明卡片制品 */\n TRANSPARENT_CARD = 'transparent_card',\n /** 明信片 - 明信片类商品 */\n POSTCARD = 'postcard',\n /** 镭射票 - 镭射票类商品 */\n LASER_TICKET = 'laser_ticket',\n /** 帆布包 - 帆布包类商品 */\n CANVAS_BAG = 'canvas_bag',\n /** 线圈笔记本 - 线圈装订笔记本 */\n SPIRAL_NOTEBOOK = 'spiral_notebook',\n /** 鼠标垫 - 鼠标垫类商品 */\n MOUSE_PAD = 'mouse_pad',\n /** 应援棒 - 应援棒类商品 */\n SUPPORT_STICK = 'support_stick',\n /** 挂件/钥匙扣 - 挂件/钥匙扣类商品 */\n KEYCHAIN = 'keychain',\n /** 其它 */\n OTHER = 'other'\n}\n\n/**\n * 画集分类类型\n * 使用枚举值作为类型\n */\nexport type CollectionCategoryType = `${CollectionCategory}` | string;\n\n/**\n * 分类信息接口\n * 包含分类值和显示名称\n */\nexport interface CategoryInfo {\n /** 分类值 */\n value: CollectionCategoryType;\n /** 显示名称 */\n displayName: string;\n /** 描述信息 */\n description?: string;\n}\n\n// ===== 基础类型定义 =====\n\n/**\n * 艺术作品页面数据结构\n * \n * 表示画集中的单个作品页面,包含图片、标题、描述等信息。\n * 每个画集包含多个这样的作品页面。\n */\nexport interface ArtworkPage {\n /** 作品的唯一标识符 */\n id: number;\n \n /** 作品标题 */\n title: string;\n \n /** 编号 */\n number: string;\n \n /** 作品图片(支持URL或base64编码) */\n image: string;\n \n /** 通用文件服务的图片文件ID(新架构,可选) */\n fileId?: string;\n \n /** 作品描述 */\n description: string;\n \n /** 创作时间(可选) */\n createdTime?: string;\n \n /** 作品主题(可选) */\n theme?: string;\n \n /** 作品年份(可选) */\n year?: string;\n \n /** 创作媒介(可选) */\n medium?: string;\n \n /** 作品尺寸(可选) */\n dimensions?: string;\n \n /** 在画集中的显示顺序 */\n pageOrder: number;\n \n /** 是否激活(可选,默认true) */\n isActive?: boolean;\n \n /** 创建时间(可选) */\n createdAt?: string;\n \n /** 更新时间(可选) */\n updatedAt?: string;\n}\n\n/**\n * 艺术画集数据结构\n * \n * 表示一个完整的艺术画集,包含多个作品页面和相关元数据。\n * 这是系统中的核心数据模型之一。\n */\nexport interface ArtCollection {\n /** 画集的唯一标识符 */\n id: number;\n \n /** 画集标题 */\n title: string;\n \n /** 编号 */\n number: string;\n \n /** 画集封面图片路径 */\n coverImage: string;\n \n /** 通用文件服务的封面图片文件ID(新架构,可选) */\n coverImageFileId?: string;\n \n /** 画集描述 */\n description: string;\n \n /** 画集包含的所有作品页面 */\n pages: ArtworkPage[];\n \n /** 画集分类(使用枚举值) */\n category: CollectionCategoryType;\n \n /** 画集标签列表(可选) */\n tags?: string[];\n \n /** 是否已发布(可选,默认true) */\n isPublished?: boolean;\n \n /** 画集价格(单位:元,可选) */\n price?: number;\n \n /** 创建时间(可选) */\n createdAt?: string;\n \n /** 更新时间(可选) */\n updatedAt?: string;\n}\n\n// ===== 配置相关类型 =====\n\n/**\n * 系统配置数据结构\n * \n * 存储ShowMasterpiece模块的全局配置信息,\n * 包括网站设置、显示选项、功能开关等。\n */\nexport interface MasterpiecesConfig {\n /** 网站名称 */\n siteName: string;\n \n /** 网站描述 */\n siteDescription?: string;\n \n /** 首页主标题 */\n heroTitle: string;\n \n /** 首页副标题 */\n heroSubtitle?: string;\n \n /** 每页显示的最大画集数量 */\n maxCollectionsPerPage: number;\n \n /** 是否启用搜索功能 */\n enableSearch: boolean;\n \n /** 是否启用分类功能 */\n enableCategories: boolean;\n\n /** 首页分类Tab配置 */\n homeTabConfig: HomeTabConfigItem[];\n\n /** 小程序悬浮按钮显示配置 */\n miniappFloatingButtons: MiniappFloatingButtonsConfig;\n \n /** 默认分类 */\n defaultCategory: string;\n \n /** 主题模式:light(浅色)、dark(深色)、auto(自动) */\n theme: 'light' | 'dark' | 'auto';\n \n /** 界面语言:zh(中文)、en(英文) */\n language: 'zh' | 'en';\n}\n\nexport interface MiniappFloatingButtonsConfig {\n showCart: boolean;\n showHistory: boolean;\n}\n\nexport interface CategoryOption {\n name: string;\n description?: string | null;\n}\n\nexport interface HomeTabConfigItem {\n name?: string;\n description?: string | null;\n category: CollectionCategoryType;\n visible: boolean;\n order: number;\n}\n\nexport const defaultHomeTabCategoryOrder: CollectionCategoryType[] = [\n CollectionCategory.CANVAS_BAG,\n CollectionCategory.SPIRAL_NOTEBOOK,\n CollectionCategory.MOUSE_PAD,\n CollectionCategory.ACRYLIC,\n CollectionCategory.BADGE,\n CollectionCategory.COLOR_PAPER,\n CollectionCategory.KEYCHAIN,\n CollectionCategory.TRANSPARENT_CARD,\n CollectionCategory.LASER_TICKET,\n];\n\nexport function buildDefaultHomeTabConfig(): HomeTabConfigItem[] {\n return [];\n}\n\nexport function normalizeHomeTabConfig(\n input?: HomeTabConfigItem[] | null,\n): HomeTabConfigItem[] {\n if (!input || input.length === 0) {\n return [];\n }\n\n const filtered = input\n .filter((item) => {\n if (!item) {\n return false;\n }\n const rawName = typeof item.name === 'string' ? item.name : item.category;\n return typeof rawName === 'string' && rawName.trim().length > 0;\n })\n .map((item) => {\n const rawName = typeof item.name === 'string' ? item.name : item.category;\n const name = typeof rawName === 'string' ? rawName.trim() : '';\n const description = typeof item.description === 'string' ? item.description.trim() : item.description;\n\n return {\n name,\n description: description && description.length > 0 ? description : null,\n category: name as CollectionCategoryType,\n visible: item.visible ?? true,\n order: Number.isFinite(item.order) ? Number(item.order) : 0,\n };\n });\n\n if (filtered.length === 0) {\n return [];\n }\n\n filtered.sort((a, b) => a.order - b.order);\n const normalized = filtered.map((item, index) => ({ ...item, order: index }));\n\n if (!normalized.some((item) => item.visible)) {\n const firstItem = normalized[0];\n if (firstItem) {\n normalized[0] = { ...firstItem, visible: true };\n }\n }\n\n return normalized;\n}\n\nexport const defaultMiniappFloatingButtonsConfig: MiniappFloatingButtonsConfig = {\n showCart: true,\n showHistory: true,\n};\n\nexport function normalizeMiniappFloatingButtonsConfig(\n input?: Partial<MiniappFloatingButtonsConfig> | null,\n): MiniappFloatingButtonsConfig {\n return {\n showCart: input?.showCart ?? true,\n showHistory: input?.showHistory ?? true,\n };\n}\n\n// ===== 表单数据类型 =====\n\n/**\n * 画集表单数据结构\n * \n * 用于创建和编辑画集时的表单数据\n */\nexport interface CollectionFormData {\n /** 画集标题 */\n title: string;\n \n /** 编号 */\n number: string;\n \n /** 封面图片 */\n coverImage: string;\n \n /** 通用文件服务的封面图片文件ID */\n coverImageFileId?: string;\n \n /** 画集描述 */\n description: string;\n \n /** 画集分类(使用枚举值) */\n category: CollectionCategoryType;\n \n /** 画集标签列表 */\ntags: string[];\n \n /** 是否已发布 */\n isPublished: boolean;\n \n /** 画集价格(单位:元,可选) */\n price?: number;\n}\n\n/**\n * 作品表单数据结构\n * \n * 用于创建和编辑作品时的表单数据\n */\nexport interface ArtworkFormData {\n /** 作品标题 */\n title: string;\n \n /** 编号 */\n number: string;\n \n /** 作品图片 */\n image?: string;\n \n /** 通用文件服务的图片文件ID */\n fileId?: string;\n \n /** 作品描述 */\n description: string;\n \n /** 创作时间 */\n createdTime: string;\n \n /** 作品主题 */\n theme: string;\n}\n\n/**\n * 配置表单数据结构\n * \n * 用于编辑系统配置时的表单数据\n */\nexport interface ConfigFormData {\n /** 网站名称 */\n siteName: string;\n \n /** 网站描述 */\n siteDescription: string;\n \n /** 首页主标题 */\n heroTitle: string;\n \n /** 首页副标题 */\n heroSubtitle: string;\n \n /** 每页显示的最大画集数量 */\n maxCollectionsPerPage: number;\n \n /** 是否启用搜索功能 */\n enableSearch: boolean;\n \n /** 是否启用分类功能 */\n enableCategories: boolean;\n\n /** 首页分类Tab配置 */\n homeTabConfig: HomeTabConfigItem[];\n\n /** 小程序悬浮按钮显示配置 */\n miniappFloatingButtons: MiniappFloatingButtonsConfig;\n \n /** 默认分类 */\n defaultCategory: string;\n \n /** 主题模式 */\n theme: 'light' | 'dark' | 'auto';\n \n /** 界面语言 */\n language: 'zh' | 'en';\n}\n\n// ===== 工具函数 =====\n\n/**\n * 获取所有可用的画集分类\n * \n * @returns 分类枚举值数组\n */\nexport function getAvailableCategories(): CollectionCategoryType[] {\n return [];\n}\n\n/**\n * 验证分类是否为有效值\n * \n * @param category - 要验证的分类值\n * @returns 是否为有效分类\n */\nexport function isValidCategory(category: string): category is CollectionCategoryType {\n if (typeof category !== 'string') {\n return false;\n }\n return category.trim().length > 0;\n}\n\n/**\n * 分类信息映射\n * 为每个分类提供完整的信息对象\n */\nexport const categories = {\n [CollectionCategory.COLLECTION]: {\n value: CollectionCategory.COLLECTION,\n displayName: '画集',\n description: '用于展示艺术作品'\n },\n [CollectionCategory.ACRYLIC]: {\n value: CollectionCategory.ACRYLIC,\n displayName: '立牌',\n description: '立牌制品'\n },\n [CollectionCategory.BADGE]: {\n value: CollectionCategory.BADGE,\n displayName: '吧唧',\n description: '徽章类商品'\n },\n [CollectionCategory.COLOR_PAPER]: {\n value: CollectionCategory.COLOR_PAPER,\n displayName: '色纸',\n description: '彩色纸张制品'\n },\n [CollectionCategory.TRANSPARENT_CARD]: {\n value: CollectionCategory.TRANSPARENT_CARD,\n displayName: '透卡',\n description: '透明卡片制品'\n },\n [CollectionCategory.POSTCARD]: {\n value: CollectionCategory.POSTCARD,\n displayName: '明信片',\n description: '明信片类商品'\n },\n [CollectionCategory.LASER_TICKET]: {\n value: CollectionCategory.LASER_TICKET,\n displayName: '镭射票',\n description: '镭射票类商品'\n },\n [CollectionCategory.CANVAS_BAG]: {\n value: CollectionCategory.CANVAS_BAG,\n displayName: '帆布包',\n description: '帆布包类商品'\n },\n [CollectionCategory.SPIRAL_NOTEBOOK]: {\n value: CollectionCategory.SPIRAL_NOTEBOOK,\n displayName: '线圈笔记本',\n description: '线圈装订笔记本'\n },\n [CollectionCategory.MOUSE_PAD]: {\n value: CollectionCategory.MOUSE_PAD,\n displayName: '鼠标垫',\n description: '鼠标垫类商品'\n },\n [CollectionCategory.SUPPORT_STICK]: {\n value: CollectionCategory.SUPPORT_STICK,\n displayName: '应援棒',\n description: '应援棒类商品'\n },\n [CollectionCategory.KEYCHAIN]: {\n value: CollectionCategory.KEYCHAIN,\n displayName: '挂件/钥匙扣',\n description: '挂件/钥匙扣类商品'\n },\n [CollectionCategory.OTHER]: {\n value: CollectionCategory.OTHER,\n displayName: '其它',\n description: '其他类型商品'\n }\n} as const satisfies Record<CollectionCategory, CategoryInfo>;\n\n\n/**\n * 获取分类的显示名称\n * 支持 collection.category.displayName 的调用方式\n */\nexport function getCategoryDisplayName(category: CollectionCategoryType): string {\n return categories[category as CollectionCategory]?.displayName || category;\n}\n\n/**\n * 获取分类的完整信息\n * 支持 collection.category.displayName 的调用方式\n */\nexport function getCategoryInfo(category: CollectionCategoryType): CategoryInfo {\n return categories[category as CollectionCategory] || {\n value: category,\n displayName: category,\n description: ''\n };\n}\n\n/**\n * 扩展 CollectionCategoryType,使其支持 displayName 属性访问\n * 使用方式: collection.category.displayName\n */\ndeclare global {\n interface String {\n get displayName(): string;\n get categoryInfo(): CategoryInfo;\n }\n}\n\n// 为字符串类型添加 displayName getter(避免重复定义)\nif (!Object.getOwnPropertyDescriptor(String.prototype, 'displayName')) {\n Object.defineProperty(String.prototype, 'displayName', {\n get(this: string): string {\n return getCategoryDisplayName(this as CollectionCategoryType);\n }\n });\n}\n\n// 为字符串类型添加 categoryInfo getter(避免重复定义)\nif (!Object.getOwnPropertyDescriptor(String.prototype, 'categoryInfo')) {\n Object.defineProperty(String.prototype, 'categoryInfo', {\n get(this: string): CategoryInfo {\n return getCategoryInfo(this as CollectionCategoryType);\n }\n });\n}\n\n/**\n * 获取分类的描述信息 (枚举调用方式)\n */\nexport const CategoryDescription = {\n [CollectionCategory.COLLECTION]: '用于展示艺术作品,包含多个作品页面的画集',\n [CollectionCategory.ACRYLIC]: '立牌制品,如亚克力立牌、展示立牌等',\n [CollectionCategory.BADGE]: '徽章类商品,如徽章、钥匙扣等',\n [CollectionCategory.COLOR_PAPER]: '彩色纸张制品,如彩色卡纸、彩色打印纸等',\n [CollectionCategory.TRANSPARENT_CARD]: '透明卡片制品,如透明卡片、透明卡等',\n [CollectionCategory.POSTCARD]: '明信片类商品,如艺术明信片、纪念明信片等',\n [CollectionCategory.LASER_TICKET]: '镭射票类商品,如演唱会门票、电影票等',\n [CollectionCategory.CANVAS_BAG]: '帆布包类商品,如帆布袋、帆布背包等',\n [CollectionCategory.SPIRAL_NOTEBOOK]: '线圈装订笔记本,如线圈笔记本、线圈装订笔记本等',\n [CollectionCategory.MOUSE_PAD]: '鼠标垫类商品,如鼠标垫、鼠标垫等',\n [CollectionCategory.SUPPORT_STICK]: '应援棒类商品,如荧光棒、应援棒等',\n [CollectionCategory.KEYCHAIN]: '挂件/钥匙扣类商品,如装饰挂件、钥匙扣等',\n [CollectionCategory.OTHER]: '挂件/钥匙扣类商品,如装饰挂件、钥匙扣等'\n} as const;\n\n// ===== 弹窗配置类型导出 =====\nexport type { PopupConfig, NewPopupConfig } from './popup';\n\n// ===== 上下文类型导出 =====\nexport type { CartContextState } from './context'; \n","export const formatPrice = (price?: number | null): string => {\n if (!price) return '价格待定';\n return `¥${price}`;\n};\n","import type { CollectionCategoryType } from '../../types';\n\nexport const CATEGORY_LABELS: Record<string, string> = {\n collection: '画集',\n acrylic: '立牌',\n badge: '吧唧',\n color_paper: '色纸',\n transparent_card: '透卡',\n postcard: '明信片',\n laser_ticket: '镭射票',\n canvas_bag: '帆布包',\n spiral_notebook: '线圈本',\n mouse_pad: '鼠标垫',\n support_stick: '应援棒',\n keychain: '挂件/钥匙扣',\n other: '其它'\n};\n\nexport const getCategoryLabel = (category?: CollectionCategoryType): string => {\n if (!category) return '未分类';\n return CATEGORY_LABELS[String(category)] ?? String(category);\n};\n","import React from 'react';\nimport { Image, Text, View } from '@tarojs/components';\nimport type { ArtCollection, CollectionCategoryType } from '../../../types';\nimport { CollectionCategory } from '../../../types';\nimport { formatPrice } from '../../../logic/shared/format';\nimport { getCategoryLabel } from '../../../logic/shared/category';\n\ntype ActionButton = {\n label: string;\n onClick: () => void;\n variant?: 'primary' | 'ghost';\n};\n\ntype CollectionLike = Pick<\n ArtCollection,\n 'id' | 'title' | 'number' | 'coverImage' | 'price'\n> & {\n description?: string;\n category?: CollectionCategoryType;\n pages?: ArtCollection['pages'];\n};\n\ninterface CollectionCardProps {\n collection: CollectionLike;\n actions?: ActionButton[];\n showCategory?: boolean;\n showDescription?: boolean;\n variant?: 'default' | 'compact';\n}\n\nconst CollectionCard: React.FC<CollectionCardProps> = ({\n collection,\n actions,\n showCategory = true,\n showDescription = true,\n variant = 'default'\n}) => {\n const isCompact = variant === 'compact';\n const pageCount = collection.pages?.length ?? 0;\n const isCollection = collection.category === CollectionCategory.COLLECTION;\n const badgeText = isCollection ? (pageCount > 0 ? `${pageCount} 页` : '画集') : '商品';\n\n return (\n <View\n className={\n isCompact\n ? 'flex gap-3 rounded-2xl border border-prussian-blue-200 bg-white p-3 shadow-sm'\n : 'overflow-hidden rounded-3xl border border-prussian-blue-200 bg-white shadow-lg'\n }\n >\n <View\n className={\n isCompact\n ? 'relative h-24 w-20 flex-shrink-0 overflow-hidden rounded-xl bg-gradient-to-br from-prussian-blue-100 to-oxford-blue-100'\n : 'relative h-80 w-full overflow-hidden bg-gradient-to-br from-prussian-blue-100 to-oxford-blue-100'\n }\n >\n {collection.coverImage ? (\n <Image\n src={collection.coverImage}\n mode=\"aspectFill\"\n className={isCompact ? 'h-full w-full' : 'h-full w-full'}\n />\n ) : (\n <View className=\"flex h-full w-full items-center justify-center text-xs text-prussian-blue-500\">\n 暂无图片\n </View>\n )}\n {!isCompact && (\n <View className=\"absolute bottom-0 left-0 right-0 flex items-end justify-between bg-gradient-to-t from-rich-black to-transparent px-4 py-3\">\n <View className=\"rounded-full bg-moonstone-400 px-3 py-1 text-xs font-semibold text-white shadow-lg\">\n <Text>{badgeText}</Text>\n </View>\n <View className=\"rounded-full bg-white px-3 py-1 text-xs font-semibold text-prussian-blue-700\">\n <Text>{formatPrice(collection.price)}</Text>\n </View>\n </View>\n )}\n </View>\n\n <View className={isCompact ? 'flex-1' : 'p-4'}>\n <Text className={isCompact ? 'text-sm font-semibold text-rich-black' : 'text-lg font-bold text-rich-black'}>\n {collection.title}\n </Text>\n <Text className=\"mt-1 block text-xs text-prussian-blue-600\">编号:{collection.number}</Text>\n {showCategory && collection.category && (\n <Text className=\"mt-1 block text-xs text-prussian-blue-600\">\n 分类:{getCategoryLabel(collection.category)}\n </Text>\n )}\n {isCompact && (\n <Text className=\"mt-1 block text-xs font-medium text-prussian-blue-700\">\n 价格:{formatPrice(collection.price)}\n </Text>\n )}\n {showDescription && collection.description && !isCompact && (\n <Text className=\"mt-2 block text-xs text-prussian-blue-500\">{collection.description}</Text>\n )}\n {actions && actions.length > 0 && (\n <View className={isCompact ? 'mt-3 flex gap-2' : 'mt-4 flex gap-2'}>\n {actions.map(action => (\n <View\n key={action.label}\n className={\n action.variant === 'ghost'\n ? 'flex h-9 flex-1 items-center justify-center rounded-full border border-prussian-blue-200 bg-white px-4'\n : 'flex h-9 flex-1 items-center justify-center rounded-full px-4 shadow-lg'\n }\n style={action.variant === 'ghost' ? undefined : { backgroundColor: '#1e88e5' }}\n onClick={action.onClick}\n >\n <Text\n className={\n action.variant === 'ghost'\n ? 'text-xs font-semibold text-prussian-blue-700'\n : 'text-xs font-semibold text-white'\n }\n >\n {action.label}\n </Text>\n </View>\n ))}\n </View>\n )}\n </View>\n </View>\n );\n};\n\nexport default CollectionCard;\n","import React from 'react';\nimport { Text, View } from '@tarojs/components';\n\ninterface BookingStepsProps {\n step: 'select' | 'form';\n}\n\nconst BookingSteps: React.FC<BookingStepsProps> = ({ step }) => {\n return (\n <View className=\"mx-4 mt-4 rounded-3xl border border-prussian-blue-200 bg-white px-4 py-4 shadow-sm\">\n <View className=\"flex items-center\">\n <View\n className={`h-9 w-9 rounded-full flex items-center justify-center text-xs font-semibold ${\n step === 'select'\n ? 'bg-gradient-to-r from-moonstone to-cerulean text-white'\n : 'bg-emerald-500 text-white'\n }`}\n >\n <Text>{step === 'select' ? '1' : '✓'}</Text>\n </View>\n <Text\n className={`ml-2 text-sm font-medium ${\n step === 'select' ? 'text-moonstone' : 'text-emerald-600'\n }`}\n >\n 选择画集\n </Text>\n </View>\n <View className=\"mx-4 h-px w-10 bg-prussian-blue-200\" />\n <View className=\"flex items-center\">\n <View\n className={`h-9 w-9 rounded-full flex items-center justify-center text-xs font-semibold ${\n step === 'form'\n ? 'bg-gradient-to-r from-moonstone to-cerulean text-white'\n : 'bg-prussian-blue-100 text-prussian-blue-600'\n }`}\n >\n <Text>2</Text>\n </View>\n <Text\n className={`ml-2 text-sm font-medium ${\n step === 'form' ? 'text-moonstone' : 'text-prussian-blue-500'\n }`}\n >\n 填写信息\n </Text>\n </View>\n </View>\n );\n};\n\nexport default BookingSteps;\n","import React from 'react';\nimport { Input, Text, Textarea, View } from '@tarojs/components';\n\ninterface BaseFieldProps {\n label: string;\n value: string;\n placeholder?: string;\n disabled?: boolean;\n error?: string;\n type?: 'text' | 'number';\n}\n\ninterface FormInputProps extends BaseFieldProps {\n onChange: (value: string) => void;\n}\n\ninterface FormTextareaProps extends BaseFieldProps {\n onChange: (value: string) => void;\n}\n\nexport const FormInput: React.FC<FormInputProps> = ({\n label,\n value,\n placeholder,\n disabled,\n error,\n type = 'text',\n onChange\n}) => {\n return (\n <View className=\"mt-4\">\n <Text className=\"text-sm font-medium text-prussian-blue-700\">{label}</Text>\n <Input\n value={value}\n placeholder={placeholder}\n onInput={(event: { detail: { value: string } }) => onChange(event.detail.value)}\n className={`mt-2 h-11 w-full rounded-2xl border bg-white px-3 text-sm ${\n error ? 'border-rose-300' : 'border-prussian-blue-200'\n }`}\n disabled={disabled}\n type={type}\n />\n {error && <Text className=\"mt-1 block text-xs text-rose-600\">{error}</Text>}\n </View>\n );\n};\n\nexport const FormTextarea: React.FC<FormTextareaProps> = ({\n label,\n value,\n placeholder,\n disabled,\n error,\n onChange\n}) => {\n return (\n <View className=\"mt-4\">\n <Text className=\"text-sm font-medium text-prussian-blue-700\">{label}</Text>\n <Textarea\n value={value}\n placeholder={placeholder}\n onInput={(event: { detail: { value: string } }) => onChange(event.detail.value)}\n className={`mt-2 min-h-24 w-full rounded-2xl border bg-white px-3 py-2 text-sm ${\n error ? 'border-rose-300' : 'border-prussian-blue-200'\n }`}\n disabled={disabled}\n />\n {error && <Text className=\"mt-1 block text-xs text-rose-600\">{error}</Text>}\n </View>\n );\n};\n","import React from 'react';\nimport { Image, Text, View } from '@tarojs/components';\nimport type { CartItem } from '../../../types/cart';\nimport { formatPrice } from '../../../logic/shared/format';\n\ninterface CartItemCardProps {\n item: CartItem;\n onIncrease: () => void;\n onDecrease: () => void;\n onRemove: () => void;\n}\n\nconst CartItemCard: React.FC<CartItemCardProps> = ({ item, onIncrease, onDecrease, onRemove }) => {\n const subtotal = (item.collection.price || 0) * item.quantity;\n\n return (\n <View className=\"flex gap-3 rounded-2xl border border-prussian-blue-200 bg-white p-3 shadow-sm\">\n {item.collection.coverImage ? (\n <Image\n src={item.collection.coverImage}\n mode=\"aspectFill\"\n className=\"h-20 w-16 rounded-xl\"\n />\n ) : (\n <View className=\"flex h-20 w-16 items-center justify-center rounded-xl bg-prussian-blue-100 text-xs text-prussian-blue-500\">\n 暂无图片\n </View>\n )}\n <View className=\"flex-1\">\n <Text className=\"text-sm font-semibold text-rich-black\">{item.collection.title}</Text>\n <Text className=\"mt-1 block text-xs text-prussian-blue-600\">编号:{item.collection.number}</Text>\n <Text className=\"mt-1 block text-xs text-prussian-blue-600\">\n 价格:{formatPrice(item.collection.price)}\n </Text>\n <Text className=\"mt-1 block text-xs font-semibold text-prussian-blue-700\">\n 小计:{formatPrice(subtotal)}\n </Text>\n <View className=\"mt-3 flex items-center gap-2\">\n <View\n className=\"flex h-9 w-9 items-center justify-center rounded-full border border-prussian-blue-200 bg-white text-base text-prussian-blue-700\"\n onClick={onDecrease}\n >\n <Text>-</Text>\n </View>\n <Text className=\"w-8 text-center text-sm font-semibold\">{item.quantity}</Text>\n <View\n className=\"flex h-9 w-9 items-center justify-center rounded-full border border-prussian-blue-200 bg-white text-base text-prussian-blue-700\"\n onClick={onIncrease}\n >\n <Text>+</Text>\n </View>\n <View\n className=\"ml-auto flex h-9 items-center justify-center rounded-full border border-rose-200 bg-rose-50 px-3\"\n onClick={onRemove}\n >\n <Text className=\"text-xs font-semibold text-rose-600\">移除</Text>\n </View>\n </View>\n </View>\n </View>\n );\n};\n\nexport default CartItemCard;\n","import React from 'react';\nimport { Image, Text, View } from '@tarojs/components';\nimport type { Booking } from '../../../types/booking';\nimport { formatPrice } from '../../../logic/shared/format';\n\nconst statusLabelMap: Record<string, string> = {\n pending: '待确认',\n confirmed: '已确认',\n completed: '已完成',\n cancelled: '已取消'\n};\n\nconst statusStyleMap: Record<string, string> = {\n pending: 'bg-yellow-100 text-yellow-800',\n confirmed: 'bg-blue-100 text-blue-800',\n completed: 'bg-green-100 text-green-800',\n cancelled: 'bg-red-100 text-red-800'\n};\n\ninterface HistoryRecordCardProps {\n record: Booking;\n}\n\nconst HistoryRecordCard: React.FC<HistoryRecordCardProps> = ({ record }) => {\n const statusText = statusLabelMap[record.status] || record.status;\n const statusStyle = statusStyleMap[record.status] || 'bg-slate-100 text-slate-600';\n const totalPrice = (record.collection?.price || 0) * record.quantity;\n\n return (\n <View className=\"rounded-2xl border border-prussian-blue-200 bg-white p-4 shadow-sm\">\n <View className=\"flex gap-3\">\n {record.collection?.coverImage ? (\n <Image\n src={record.collection.coverImage}\n mode=\"aspectFill\"\n className=\"h-20 w-16 rounded-xl\"\n />\n ) : (\n <View className=\"flex h-20 w-16 items-center justify-center rounded-xl bg-prussian-blue-100 text-xs text-prussian-blue-500\">\n 暂无图片\n </View>\n )}\n <View className=\"flex-1\">\n <Text className=\"text-sm font-semibold text-rich-black\">\n {record.collection?.title || '画集'}\n </Text>\n <Text className=\"mt-1 block text-xs text-prussian-blue-600\">\n 编号:{record.collection?.number || '-'}\n </Text>\n <Text className=\"mt-1 block text-xs text-prussian-blue-600\">数量:{record.quantity}</Text>\n <Text className=\"mt-1 block text-xs text-prussian-blue-600\">\n 价格:{formatPrice(record.collection?.price)}\n </Text>\n <Text className=\"mt-1 block text-xs font-semibold text-prussian-blue-700\">\n 总价:{formatPrice(totalPrice)}\n </Text>\n <View className=\"mt-2 flex items-center justify-between\">\n <View className={`rounded-full px-2 py-1 text-xs font-medium ${statusStyle}`}>\n <Text>{statusText}</Text>\n </View>\n <Text className=\"text-xs text-prussian-blue-500\">{record.createdAt?.slice(0, 10)}</Text>\n </View>\n </View>\n </View>\n {(record.notes || record.adminNotes) && (\n <View className=\"mt-3 border-t border-prussian-blue-200 pt-3\">\n {record.notes && (\n <View className=\"rounded-xl bg-prussian-blue-100 p-2\">\n <Text className=\"text-xs text-prussian-blue-700\">备注:{record.notes}</Text>\n </View>\n )}\n {record.adminNotes && (\n <View className=\"mt-2 rounded-xl bg-moonstone-100 p-2\">\n <Text className=\"text-xs text-prussian-blue-700\">管理员备注:{record.adminNotes}</Text>\n </View>\n )}\n </View>\n )}\n </View>\n );\n};\n\nexport default HistoryRecordCard;\n","import React, { useEffect, useMemo, useState } from 'react';\nimport { Button, Text, View } from '@tarojs/components';\nimport type { PopupConfig } from '../../../types/popup';\n\ninterface DeadlinePopupManagerProps {\n configs: PopupConfig[];\n onClose: (configId: string) => void;\n onConfirm?: (configId: string) => void;\n onCancel?: (configId: string) => void;\n}\n\ntype PopupTheme = 'warning' | 'info' | 'error' | 'success';\ntype ThemeStyle = { title: string; body: string; panel: string; button: string };\n\nconst themeStyles: Record<PopupTheme, ThemeStyle> = {\n warning: {\n title: 'text-amber-800',\n body: 'text-amber-700',\n panel: 'bg-amber-50 border-amber-200',\n button: 'bg-amber-600',\n },\n info: {\n title: 'text-blue-800',\n body: 'text-blue-700',\n panel: 'bg-blue-50 border-blue-200',\n button: 'bg-blue-600',\n },\n error: {\n title: 'text-rose-800',\n body: 'text-rose-700',\n panel: 'bg-rose-50 border-rose-200',\n button: 'bg-rose-600',\n },\n success: {\n title: 'text-emerald-800',\n body: 'text-emerald-700',\n panel: 'bg-emerald-50 border-emerald-200',\n button: 'bg-emerald-600',\n },\n};\n\nconst DeadlinePopupManager: React.FC<DeadlinePopupManagerProps> = ({\n configs,\n onClose,\n onConfirm,\n onCancel,\n}) => {\n const [index, setIndex] = useState(0);\n const current = configs[index];\n const [countdown, setCountdown] = useState(0);\n\n useEffect(() => {\n if (!configs.length) setIndex(0);\n if (index >= configs.length) setIndex(0);\n }, [configs.length, index]);\n\n useEffect(() => {\n if (!current?.displayConfig?.autoCloseSeconds) {\n setCountdown(0);\n return;\n }\n\n setCountdown(current.displayConfig.autoCloseSeconds);\n const timer = setInterval(() => {\n setCountdown((prev) => {\n if (prev <= 1) {\n clearInterval(timer);\n onClose(current.id);\n return 0;\n }\n return prev - 1;\n });\n }, 1000);\n\n return () => clearInterval(timer);\n }, [current, onClose]);\n\n const styles = useMemo<ThemeStyle>(() => {\n const key = current?.contentConfig?.theme as PopupTheme | undefined;\n return key && themeStyles[key] ? themeStyles[key] : themeStyles.warning;\n }, [current]);\n\n if (!current) return null;\n\n const confirmText = current.contentConfig.confirmText || '确定';\n const cancelText = current.contentConfig.cancelText || '取消';\n const showCancel = current.contentConfig.showCancel !== false;\n\n const handleConfirm = () => {\n onConfirm?.(current.id);\n };\n\n const handleCancel = () => {\n onCancel?.(current.id);\n };\n\n return (\n <View className=\"fixed inset-0 flex items-center justify-center bg-black px-5\" style={{ zIndex: 1000 }}>\n <View className={`w-full max-w-md rounded-2xl border p-4 shadow-2xl ${styles.panel}`}>\n <Text className={`text-base font-semibold ${styles.title}`}>{current.contentConfig.title}</Text>\n {countdown > 0 && (\n <Text className=\"mt-2 block text-xs text-slate-500\">{countdown} 秒后自动关闭</Text>\n )}\n <Text className={`mt-3 block whitespace-pre-wrap text-sm ${styles.body}`}>\n {current.contentConfig.message}\n </Text>\n <View className=\"mt-4 flex justify-end gap-2\">\n {showCancel && (\n <Button\n className=\"h-8 rounded-full border border-slate-300 bg-white px-4 text-xs font-semibold text-slate-700\"\n onClick={handleCancel}\n >\n {cancelText}\n </Button>\n )}\n <Button\n className={`h-8 rounded-full px-4 text-xs font-semibold text-white ${styles.button}`}\n onClick={handleConfirm}\n >\n {confirmText}\n </Button>\n </View>\n </View>\n </View>\n );\n};\n\nexport default DeadlinePopupManager;\n","import type { ArtCollection } from '../../types';\nimport type { CategoryOption } from '../../types';\nimport type {\n Booking,\n BookingListParams,\n BookingListResponse,\n CollectionSummary,\n CreateBookingRequest,\n} from '../../types/booking';\nimport type { BatchBookingRequest, BatchBookingResponse } from '../../types/cart';\nimport type { PopupConfig } from '../../types/popup';\n\nexport type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n\nexport interface RequestOptions {\n url: string;\n method: HttpMethod;\n data?: unknown;\n headers?: Record<string, string>;\n}\n\nexport type RequestExecutor = <T = any>(options: RequestOptions) => Promise<T>;\n\nexport type CollectionOverview = Omit<ArtCollection, 'pages'> & { pages?: ArtCollection['pages'] };\n\nexport interface ShowmasterpieceClient {\n getCollectionsOverview: () => Promise<CollectionOverview[]>;\n getCategories: () => Promise<CategoryOption[]>;\n getBookableCollections: () => Promise<CollectionSummary[]>;\n createBooking: (payload: CreateBookingRequest) => Promise<Booking>;\n batchBooking: (payload: BatchBookingRequest) => Promise<BatchBookingResponse>;\n getBookings: (params: BookingListParams) => Promise<BookingListResponse>;\n checkPopupConfigs: (params: {\n businessModule: string;\n businessScene: string;\n currentTime?: string;\n }) => Promise<PopupConfig[]>;\n}\n\nconst joinUrl = (baseUrl: string, path: string): string => {\n if (!baseUrl) return path;\n return `${baseUrl.replace(/\\/$/, '')}${path}`;\n};\n\nconst toSearchParams = (params: BookingListParams): string => {\n const searchParams = new URLSearchParams();\n\n if (params.collectionId) searchParams.set('collectionId', String(params.collectionId));\n if (params.qqNumber) searchParams.set('qqNumber', params.qqNumber);\n if (params.phoneNumber) searchParams.set('phoneNumber', params.phoneNumber);\n if (params.status) searchParams.set('status', params.status);\n if (params.page) searchParams.set('page', String(params.page));\n if (params.limit) searchParams.set('limit', String(params.limit));\n\n return searchParams.toString();\n};\n\nconst extractArrayData = <T>(data: any): T[] => {\n if (Array.isArray(data?.data)) return data.data as T[];\n if (Array.isArray(data?.collections)) return data.collections as T[];\n if (Array.isArray(data?.configs)) return data.configs as T[];\n if (Array.isArray(data?.data?.configs)) return data.data.configs as T[];\n if (Array.isArray(data)) return data as T[];\n return [];\n};\n\nexport const createShowmasterpieceClient = (\n request: RequestExecutor,\n baseUrl: string,\n): ShowmasterpieceClient => {\n return {\n getCollectionsOverview: async () => {\n const url = joinUrl(baseUrl, '/api/showmasterpiece/collections?overview=true');\n const data = await request<any>({ url, method: 'GET' });\n const collections = extractArrayData<CollectionOverview>(data);\n if (!Array.isArray(collections)) {\n throw new Error('API响应格式错误');\n }\n return collections;\n },\n\n getCategories: async () => {\n const url = joinUrl(baseUrl, '/api/showmasterpiece/categories');\n const data = await request<any>({ url, method: 'GET' });\n const categories = extractArrayData<CategoryOption>(data);\n if (!Array.isArray(categories)) {\n throw new Error('API响应格式错误');\n }\n return categories;\n },\n\n getBookableCollections: async () => {\n const url = joinUrl(baseUrl, '/api/showmasterpiece/bookings/collections');\n const data = await request<any>({ url, method: 'GET' });\n const collections = extractArrayData<CollectionSummary>(data);\n if (!Array.isArray(collections)) {\n throw new Error('API响应格式错误');\n }\n return collections;\n },\n\n createBooking: async (payload) => {\n const url = joinUrl(baseUrl, '/api/showmasterpiece/bookings');\n return request<Booking>({\n url,\n method: 'POST',\n data: payload,\n });\n },\n\n batchBooking: async (payload) => {\n const url = joinUrl(baseUrl, '/api/showmasterpiece/bookings/batch');\n return request<BatchBookingResponse>({\n url,\n method: 'POST',\n data: payload,\n });\n },\n\n getBookings: async (params) => {\n const query = toSearchParams(params);\n const path = query\n ? `/api/showmasterpiece/bookings?${query}`\n : '/api/showmasterpiece/bookings';\n const url = joinUrl(baseUrl, path);\n return request<BookingListResponse>({\n url,\n method: 'GET',\n });\n },\n\n checkPopupConfigs: async (params) => {\n const url = joinUrl(baseUrl, '/api/showmasterpiece/popup-configs/check');\n const data = await request<any>({\n url,\n method: 'POST',\n data: {\n businessModule: params.businessModule,\n businessScene: params.businessScene,\n currentTime: params.currentTime || new Date().toISOString(),\n },\n });\n return extractArrayData<PopupConfig>(data);\n },\n };\n};\n","import Taro from '@tarojs/taro';\nimport type { CategoryOption } from '../../types';\nimport type {\n Booking,\n BookingListParams,\n BookingListResponse,\n CollectionSummary,\n CreateBookingRequest,\n} from '../../types/booking';\nimport type { BatchBookingRequest, BatchBookingResponse } from '../../types/cart';\nimport type { PopupConfig } from '../../types/popup';\nimport { createShowmasterpieceClient, type CollectionOverview } from '../api';\n\nexport const DEFAULT_BASE_URL = 'https://qhr062.top';\n\nconst extractErrorMessage = (data: any, fallback: string): string => {\n if (typeof data?.message === 'string' && data.message) return data.message;\n if (typeof data?.error === 'string' && data.error) return data.error;\n return fallback;\n};\n\nconst createTaroExecutor = () => {\n return async <T>({\n url,\n method,\n data,\n headers,\n }: {\n url: string;\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n data?: unknown;\n headers?: Record<string, string>;\n }): Promise<T> => {\n const response = await Taro.request({\n url,\n method,\n data,\n header: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n });\n\n if (response.statusCode >= 200 && response.statusCode < 300) {\n return response.data as T;\n }\n\n throw new Error(extractErrorMessage(response.data, `请求失败 (${response.statusCode})`));\n };\n};\n\nconst createClient = (baseUrl = DEFAULT_BASE_URL) =>\n createShowmasterpieceClient(createTaroExecutor(), baseUrl);\n\nexport const getCollectionsOverview = async (baseUrl = DEFAULT_BASE_URL): Promise<CollectionOverview[]> =>\n createClient(baseUrl).getCollectionsOverview();\n\nexport const getCategories = async (baseUrl = DEFAULT_BASE_URL): Promise<CategoryOption[]> =>\n createClient(baseUrl).getCategories();\n\nexport const getBookableCollections = async (baseUrl = DEFAULT_BASE_URL): Promise<CollectionSummary[]> =>\n createClient(baseUrl).getBookableCollections();\n\nexport const createBooking = async (\n payload: CreateBookingRequest,\n baseUrl = DEFAULT_BASE_URL,\n): Promise<Booking> => createClient(baseUrl).createBooking(payload);\n\nexport const batchBooking = async (\n payload: BatchBookingRequest,\n baseUrl = DEFAULT_BASE_URL,\n): Promise<BatchBookingResponse> => createClient(baseUrl).batchBooking(payload);\n\nexport const getBookings = async (\n params: BookingListParams,\n baseUrl = DEFAULT_BASE_URL,\n): Promise<BookingListResponse> => createClient(baseUrl).getBookings(params);\n\nexport const checkPopupConfigs = async (\n params: {\n businessModule: string;\n businessScene: string;\n currentTime?: string;\n },\n baseUrl = DEFAULT_BASE_URL,\n): Promise<PopupConfig[]> => createClient(baseUrl).checkPopupConfigs(params);\n\nexport type { CollectionOverview };\n","import { useCallback, useState } from 'react';\nimport type { PopupConfig } from '../../types/popup';\n\ninterface PopupDisplayState {\n configs: PopupConfig[];\n loading: boolean;\n error: string | null;\n hasPopup: boolean;\n}\n\ninterface CheckPopupParams {\n businessModule: string;\n businessScene: string;\n currentTime: string;\n}\n\ntype FetchPopupConfigs = (params: CheckPopupParams) => Promise<PopupConfig[]>;\n\ninterface UseDeadlinePopupCoreOptions {\n businessModule: string;\n businessScene: string;\n fetchPopupConfigs: FetchPopupConfigs;\n}\n\nexport function useDeadlinePopupCore(options: UseDeadlinePopupCoreOptions) {\n const { businessModule, businessScene, fetchPopupConfigs } = options;\n\n const [state, setState] = useState<PopupDisplayState>({\n configs: [],\n loading: false,\n error: null,\n hasPopup: false,\n });\n const [dismissedPopups, setDismissedPopups] = useState<Set<string>>(new Set());\n\n const runCheck = useCallback(\n async (ignoreDismissed: boolean, currentTime?: Date) => {\n setState((prev) => ({ ...prev, loading: true, error: null }));\n\n try {\n const configs = await fetchPopupConfigs({\n businessModule,\n businessScene,\n currentTime: (currentTime || new Date()).toISOString(),\n });\n\n const activeConfigs = configs.filter((config) => {\n if (ignoreDismissed && config.blockProcess) return true;\n return !dismissedPopups.has(config.id);\n });\n\n setState((prev) => ({\n ...prev,\n configs: activeConfigs,\n loading: false,\n hasPopup: activeConfigs.length > 0,\n }));\n\n return activeConfigs;\n } catch (error) {\n setState((prev) => ({\n ...prev,\n loading: false,\n error: error instanceof Error ? error.message : '检查弹窗失败',\n configs: [],\n hasPopup: false,\n }));\n return [];\n }\n },\n [businessModule, businessScene, dismissedPopups, fetchPopupConfigs],\n );\n\n const checkPopups = useCallback((currentTime?: Date) => runCheck(false, currentTime), [runCheck]);\n const triggerCheck = useCallback((currentTime?: Date) => runCheck(true, currentTime), [runCheck]);\n\n const closePopup = useCallback((configId: string) => {\n setDismissedPopups((prev) => new Set([...prev, configId]));\n setState((prev) => {\n const next = prev.configs.filter((config) => config.id !== configId);\n return {\n ...prev,\n configs: next,\n hasPopup: next.length > 0,\n };\n });\n }, []);\n\n const confirmPopup = useCallback((configId: string) => closePopup(configId), [closePopup]);\n const cancelPopup = useCallback((configId: string) => closePopup(configId), [closePopup]);\n\n const temporaryClosePopup = useCallback((configId: string) => {\n setState((prev) => {\n const next = prev.configs.filter((config) => config.id !== configId);\n return {\n ...prev,\n configs: next,\n hasPopup: next.length > 0,\n };\n });\n }, []);\n\n const resetDismissedPopups = useCallback(() => {\n setDismissedPopups(new Set());\n }, []);\n\n return {\n ...state,\n checkPopups,\n triggerCheck,\n closePopup,\n confirmPopup,\n cancelPopup,\n temporaryClosePopup,\n resetDismissedPopups,\n };\n}\n\n","import { useCallback } from 'react';\nimport { checkPopupConfigs } from '../../service/miniapp';\nimport { useDeadlinePopupCore } from '../shared/useDeadlinePopupCore';\n\nexport function useDeadlinePopup(\n businessModule: string,\n businessScene: string,\n baseUrl: string,\n) {\n const fetchPopupConfigs = useCallback(\n async ({\n businessModule: moduleName,\n businessScene: sceneName,\n currentTime,\n }: {\n businessModule: string;\n businessScene: string;\n currentTime: string;\n }) =>\n checkPopupConfigs(\n {\n businessModule: moduleName,\n businessScene: sceneName,\n currentTime,\n },\n baseUrl,\n ),\n [baseUrl],\n );\n\n return useDeadlinePopupCore({\n businessModule,\n businessScene,\n fetchPopupConfigs,\n });\n}\n\nexport default useDeadlinePopup;\n","declare const wx: any;\n\nconst hasWxStorage = (): boolean =>\n typeof wx !== 'undefined' && typeof (wx as any).getStorageSync === 'function';\n\nconst hasLocalStorage = (): boolean =>\n typeof localStorage !== 'undefined' && typeof localStorage.getItem === 'function';\n\nexport const getStorageSync = <T>(key: string): T | null => {\n try {\n if (hasWxStorage()) {\n return (wx as any).getStorageSync(key) as T;\n }\n if (hasLocalStorage()) {\n const value = localStorage.getItem(key);\n return value ? (JSON.parse(value) as T) : null;\n }\n } catch {\n return null;\n }\n return null;\n};\n\nexport const setStorageSync = (key: string, value: unknown): void => {\n try {\n if (hasWxStorage()) {\n (wx as any).setStorageSync(key, value);\n return;\n }\n if (hasLocalStorage()) {\n localStorage.setItem(key, JSON.stringify(value));\n }\n } catch {\n // ignore\n }\n};\n","import type { Cart } from '../../types/cart';\nimport type { ArtCollection } from '../../types';\nimport { getStorageSync, setStorageSync } from './storage';\n\nconst CART_STORAGE_KEY = 'showmasterpiece_cart';\n\nconst normalizeCart = (cart?: Cart): Cart => {\n const safeCart: Cart = cart ?? { items: [], totalPrice: 0, totalQuantity: 0 };\n const totals = safeCart.items.reduce(\n (acc, item) => {\n acc.totalQuantity += item.quantity;\n acc.totalPrice += (item.collection.price || 0) * item.quantity;\n return acc;\n },\n { totalQuantity: 0, totalPrice: 0 }\n );\n\n return {\n ...safeCart,\n totalQuantity: totals.totalQuantity,\n totalPrice: totals.totalPrice\n };\n};\n\nexport const getCart = (): Cart => {\n const stored = getStorageSync<Cart>(CART_STORAGE_KEY);\n if (stored && stored.items) {\n return normalizeCart(stored);\n }\n return normalizeCart();\n};\n\nconst saveCart = (cart: Cart) => {\n setStorageSync(CART_STORAGE_KEY, cart);\n};\n\nexport const addToCart = (collection: ArtCollection, quantity = 1): Cart => {\n const cart = getCart();\n const existing = cart.items.find(item => item.collectionId === collection.id);\n\n if (existing) {\n existing.quantity += quantity;\n } else {\n cart.items.push({\n collectionId: collection.id,\n collection,\n quantity,\n addedAt: new Date()\n });\n }\n\n const next = normalizeCart(cart);\n saveCart(next);\n return next;\n};\n\nexport const updateCartItem = (collectionId: number, quantity: number): Cart => {\n const cart = getCart();\n const target = cart.items.find(item => item.collectionId === collectionId);\n if (!target) return cart;\n\n if (quantity <= 0) {\n cart.items = cart.items.filter(item => item.collectionId !== collectionId);\n } else {\n target.quantity = quantity;\n }\n\n const next = normalizeCart(cart);\n saveCart(next);\n return next;\n};\n\nexport const removeCartItem = (collectionId: number): Cart => {\n const cart = getCart();\n cart.items = cart.items.filter(item => item.collectionId !== collectionId);\n const next = normalizeCart(cart);\n saveCart(next);\n return next;\n};\n\nexport const clearCart = (): Cart => {\n const empty = normalizeCart({ items: [], totalPrice: 0, totalQuantity: 0 });\n saveCart(empty);\n return empty;\n};\n","import React, { useEffect, useMemo, useState } from 'react';\nimport Taro, { useDidShow } from '@tarojs/taro';\nimport { Text, View } from '@tarojs/components';\nimport {\n getCategoryDisplayName,\n normalizeMiniappFloatingButtonsConfig,\n type ArtCollection,\n type CategoryOption,\n type CollectionCategoryType,\n type MiniappFloatingButtonsConfig,\n} from '../../../types';\nimport { addToCart, getCart } from '../../../logic/shared/cart';\nimport { CategoryTabs, MiniappCollectionCard, PageHeader } from '../index';\nimport {\n DEFAULT_BASE_URL,\n getCategories,\n type CollectionOverview,\n getCollectionsOverview,\n} from '../../../service/miniapp';\nimport useDeadlinePopup from '../../../logic/hooks/useDeadlinePopupWechat';\nimport DeadlinePopupManager from '../components/DeadlinePopup';\n\ntype CategoryFilter = {\n value: CollectionCategoryType;\n label: string;\n count?: number;\n};\n\nexport interface ShowMasterpieceMiniappPageProps {\n apiBaseUrl?: string;\n}\n\nconst ShowMasterpieceMiniappPage: React.FC<ShowMasterpieceMiniappPageProps> = ({\n apiBaseUrl = DEFAULT_BASE_URL,\n}) => {\n const [collections, setCollections] = useState<CollectionOverview[]>([]);\n const [categoryOptions, setCategoryOptions] = useState<CategoryOption[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [activeCategory, setActiveCategory] = useState<CollectionCategoryType>('' as CollectionCategoryType);\n const [cartCount, setCartCount] = useState(0);\n const [miniappFloatingButtons, setMiniappFloatingButtons] = useState<MiniappFloatingButtonsConfig>(\n () => normalizeMiniappFloatingButtonsConfig(undefined),\n );\n\n const {\n configs: popupConfigs,\n triggerCheck,\n closePopup,\n confirmPopup,\n cancelPopup,\n } = useDeadlinePopup('showmasterpiece', 'homepage_visit', apiBaseUrl);\n\n useEffect(() => {\n try {\n Taro.setStorageSync('__cy_mps_boot_ready__', true);\n Taro.setStorageSync('__cy_mps_boot_retry_once__', false);\n } catch (error) {\n console.error('[ShowMasterpieceMiniappPage] boot ready sync failed', error);\n }\n }, []);\n\n useEffect(() => {\n const withTimeout = async <T,>(\n task: Promise<T>,\n timeoutMs: number,\n fallbackMessage: string,\n ): Promise<T> => {\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race<T>([\n task,\n new Promise<T>((_, reject) => {\n timer = setTimeout(() => reject(new Error(fallbackMessage)), timeoutMs);\n }),\n ]);\n } finally {\n if (timer) {\n clearTimeout(timer);\n }\n }\n };\n\n const loadCollections = async () => {\n setLoading(true);\n setError(null);\n try {\n const [collectionsResult, categoriesResult] = await Promise.allSettled([\n withTimeout(getCollectionsOverview(apiBaseUrl), 12000, '商品数据加载超时'),\n withTimeout(getCategories(apiBaseUrl), 8000, '分类数据加载超时'),\n ]);\n\n if (collectionsResult.status === 'fulfilled') {\n setCollections(Array.isArray(collectionsResult.value) ? collectionsResult.value : []);\n } else {\n setCollections([]);\n setError(collectionsResult.reason instanceof Error ? collectionsResult.reason.message : '商品加载失败');\n }\n\n if (categoriesResult.status === 'fulfilled') {\n setCategoryOptions(Array.isArray(categoriesResult.value) ? categoriesResult.value : []);\n } else {\n setCategoryOptions([]);\n if (collectionsResult.status === 'fulfilled') {\n setError('分类加载失败,已使用默认分类展示');\n }\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : '加载商品失败');\n setCollections([]);\n setCategoryOptions([]);\n } finally {\n setLoading(false);\n }\n };\n\n loadCollections();\n }, [apiBaseUrl]);\n\n useEffect(() => {\n setCartCount(getCart().totalQuantity);\n }, []);\n\n useDidShow(() => {\n setCartCount(getCart().totalQuantity);\n });\n\n useEffect(() => {\n const timer = setTimeout(() => {\n triggerCheck();\n }, 600);\n return () => clearTimeout(timer);\n }, [triggerCheck]);\n\n useEffect(() => {\n const loadMiniappConfig = async () => {\n try {\n const response = await Taro.request({\n url: `${apiBaseUrl.replace(/\\/$/, '')}/api/showmasterpiece/config`,\n method: 'GET',\n header: {\n 'Content-Type': 'application/json',\n },\n });\n const buttons = normalizeMiniappFloatingButtonsConfig(\n (response.data as any)?.miniappFloatingButtons,\n );\n setMiniappFloatingButtons(buttons);\n } catch (err) {\n setMiniappFloatingButtons(normalizeMiniappFloatingButtonsConfig(undefined));\n }\n };\n\n loadMiniappConfig();\n }, [apiBaseUrl]);\n\n const categories = useMemo<CategoryFilter[]>(() => {\n const categoryCounter = new Map<CollectionCategoryType, number>();\n collections.forEach((item) => {\n if (!item.category) return;\n categoryCounter.set(item.category, (categoryCounter.get(item.category) ?? 0) + 1);\n });\n const options = Array.isArray(categoryOptions) ? categoryOptions : [];\n const fromServer = options\n .map((item) => {\n const value = item.name as CollectionCategoryType;\n return {\n value,\n label: (item.description || '').trim() || String(getCategoryDisplayName(value)),\n count: categoryCounter.get(value) ?? 0,\n };\n })\n .filter((item) => item.count > 0);\n\n const mappedValues = new Set(fromServer.map((item) => item.value));\n const fallbackValues = Array.from(new Set(collections.map((item) => item.category).filter(Boolean)));\n const fallback = fallbackValues\n .filter((value) => !mappedValues.has(value as CollectionCategoryType))\n .map((value) => ({\n value: value as CollectionCategoryType,\n label: String(getCategoryDisplayName(value as CollectionCategoryType)),\n count: categoryCounter.get(value as CollectionCategoryType) ?? 0,\n }));\n\n return [...fromServer, ...fallback];\n }, [collections, categoryOptions]);\n\n useEffect(() => {\n if (!categories.length) return;\n const exists = categories.some((item) => item.value === activeCategory);\n if (!exists) {\n const firstCategory = categories[0];\n if (firstCategory) {\n setActiveCategory(firstCategory.value);\n }\n }\n }, [categories, activeCategory]);\n\n const filteredCollections = useMemo(\n () => (activeCategory ? collections.filter((item) => item.category === activeCategory) : collections),\n [collections, activeCategory],\n );\n\n const goToCart = () => {\n Taro.navigateTo({ url: '/pages/cart/index' });\n };\n\n const goToHistory = () => {\n Taro.navigateTo({ url: '/pages/history/index' });\n };\n\n const goToTop = () => {\n Taro.pageScrollTo({ scrollTop: 0, duration: 300 });\n };\n\n const handleAddToCart = (collection: CollectionOverview) => {\n const normalizedCollection: ArtCollection = {\n ...collection,\n pages: collection.pages ?? [],\n };\n const next = addToCart(normalizedCollection, 1);\n setCartCount(next.totalQuantity);\n Taro.showToast({ title: '已加入购物车', icon: 'success' });\n };\n\n return (\n <View className=\"min-h-screen bg-gradient-to-br from-white to-prussian-blue-100 pb-12 text-rich-black\">\n <PageHeader\n title=\"葱韵魔法屋\"\n subtitle=\"葱韵环京的谷子网站,请大家尽情鉴赏老师们的作品吧!\"\n />\n\n <View className=\"mx-4 mt-4 rounded-3xl border border-teal-200 bg-teal-50 p-4 shadow-sm\">\n <Text className=\"text-base font-semibold text-rich-black\">分类浏览</Text>\n <Text className=\"mt-1 block text-xs text-teal-700\">按分类快速筛选商品内容</Text>\n <CategoryTabs\n items={categories}\n activeValue={activeCategory}\n onChange={(value) => setActiveCategory(value)}\n />\n </View>\n\n <View className=\"mx-4 mt-5\">\n <Text className=\"text-lg font-semibold text-rich-black\">精选</Text>\n {loading ? (\n <View className=\"py-10 text-center text-sm text-prussian-blue-600\">加载中...</View>\n ) : error ? (\n <View className=\"mt-4 rounded-2xl bg-rose-50 px-4 py-4 text-rose-700 shadow-md\">\n <Text className=\"text-sm font-semibold\">加载失败</Text>\n <Text className=\"mt-1 block text-xs\">{error}</Text>\n </View>\n ) : filteredCollections.length === 0 ? (\n <View className=\"rounded-2xl bg-white py-10 text-center text-sm text-prussian-blue-600 shadow-md\">\n 暂无匹配商品\n </View>\n ) : (\n <View className=\"mt-4 flex flex-col gap-5\">\n {filteredCollections.map((collection) => (\n <MiniappCollectionCard\n key={collection.id}\n collection={collection}\n actions={[\n {\n label: '加入购物车',\n onClick: () => handleAddToCart(collection),\n variant: 'primary',\n },\n ]}\n />\n ))}\n </View>\n )}\n </View>\n\n <DeadlinePopupManager\n configs={popupConfigs}\n onClose={closePopup}\n onConfirm={confirmPopup}\n onCancel={cancelPopup}\n />\n\n <View className=\"fixed bottom-6 right-4 flex flex-col gap-3\" style={{ zIndex: 80 }}>\n <View\n className=\"flex h-12 w-12 items-center justify-center rounded-full bg-teal-600 shadow-lg\"\n onClick={goToTop}\n >\n <Text className=\"text-lg text-white\">↑</Text>\n </View>\n {miniappFloatingButtons.showCart && (\n <View\n className=\"relative flex h-12 w-12 items-center justify-center rounded-full bg-cyan-500 shadow-lg\"\n onClick={goToCart}\n >\n <Text className=\"text-lg text-white\">🛒</Text>\n {cartCount > 0 && (\n <View className=\"absolute -right-1 -top-1 flex min-h-4 min-w-4 items-center justify-center rounded-full bg-rose-500 px-1\">\n <Text className=\"text-[10px] font-semibold text-white\">\n {cartCount > 99 ? '99+' : cartCount}\n </Text>\n </View>\n )}\n </View>\n )}\n {miniappFloatingButtons.showHistory && (\n <View\n className=\"flex h-12 w-12 items-center justify-center rounded-full bg-blue-700 shadow-lg\"\n onClick={goToHistory}\n >\n <Text className=\"text-lg text-white\">🕘</Text>\n </View>\n )}\n </View>\n </View>\n );\n};\n\nexport default ShowMasterpieceMiniappPage;\n","import React, { useEffect, useMemo, useState } from 'react';\nimport Taro, { useDidShow } from '@tarojs/taro';\nimport { Text, View } from '@tarojs/components';\nimport type { Cart } from '../../../types/cart';\nimport {\n clearMiniappCart as clearCart,\n formatPrice,\n getMiniappCart as getCart,\n removeMiniappCartItem as removeCartItem,\n updateMiniappCartItem as updateCartItem,\n} from '../../../logic/shared';\nimport { CartItemCard, FormInput, FormTextarea, PageHeader } from '../index';\nimport { batchBooking, DEFAULT_BASE_URL } from '../../../service/miniapp';\nimport useDeadlinePopup from '../../../logic/hooks/useDeadlinePopupWechat';\nimport DeadlinePopupManager from '../components/DeadlinePopup';\n\nexport interface CartMiniappPageProps {\n apiBaseUrl?: string;\n}\n\nconst CartMiniappPage: React.FC<CartMiniappPageProps> = ({ apiBaseUrl = DEFAULT_BASE_URL }) => {\n const [cart, setCart] = useState<Cart>(() => getCart());\n const [qqNumber, setQqNumber] = useState('');\n const [phoneNumber, setPhoneNumber] = useState('');\n const [notes, setNotes] = useState('');\n const [shippingInfo, setShippingInfo] = useState('');\n const [submitting, setSubmitting] = useState(false);\n const [pendingCheckout, setPendingCheckout] = useState(false);\n const [formErrors, setFormErrors] = useState<{\n qqNumber?: string;\n phoneNumber?: string;\n notes?: string;\n pickupMethod?: string;\n }>({});\n\n const {\n configs: popupConfigs,\n hasPopup,\n triggerCheck,\n closePopup,\n confirmPopup,\n cancelPopup,\n temporaryClosePopup,\n } = useDeadlinePopup('showmasterpiece', 'cart_checkout', apiBaseUrl);\n\n const cartItems = cart.items;\n\n const refreshCart = () => {\n setCart(getCart());\n };\n\n useEffect(() => {\n refreshCart();\n }, []);\n\n useDidShow(() => {\n refreshCart();\n });\n\n const handleUpdateQuantity = (collectionId: number, quantity: number) => {\n const next = updateCartItem(collectionId, quantity);\n setCart(next);\n };\n\n const handleRemove = (collectionId: number) => {\n const next = removeCartItem(collectionId);\n setCart(next);\n };\n\n const totalPriceLabel = useMemo(() => formatPrice(cart.totalPrice), [cart.totalPrice]);\n\n const validateForm = () => {\n const nextErrors: typeof formErrors = {};\n const qq = qqNumber.trim();\n const phone = phoneNumber.trim();\n const pickup = shippingInfo.trim();\n const noteText = notes.trim();\n\n if (!qq) {\n nextErrors.qqNumber = '请输入QQ号';\n } else if (!/^\\d{5,11}$/.test(qq)) {\n nextErrors.qqNumber = 'QQ号格式不正确';\n }\n\n if (!phone) {\n nextErrors.phoneNumber = '请输入联系方式';\n } else if (!/^1[3-9]\\d{9}$/.test(phone)) {\n nextErrors.phoneNumber = '联系方式格式不正确';\n }\n\n if (!pickup) {\n nextErrors.pickupMethod = '请填写领取方式';\n }\n\n if (!noteText) {\n nextErrors.notes = '请填写备注信息';\n }\n\n setFormErrors(nextErrors);\n return Object.keys(nextErrors).length === 0;\n };\n\n const performCheckout = async () => {\n if (!cartItems.length) {\n Taro.showToast({ title: '购物车为空', icon: 'none' });\n return;\n }\n\n if (!validateForm()) {\n Taro.showToast({ title: '请先修正表单错误', icon: 'none' });\n return;\n }\n\n setSubmitting(true);\n try {\n await batchBooking(\n {\n qqNumber: qqNumber.trim(),\n phoneNumber: phoneNumber.trim(),\n pickupMethod: shippingInfo.trim(),\n notes: notes.trim(),\n items: cartItems.map((item) => ({\n collectionId: item.collectionId,\n quantity: item.quantity,\n })),\n },\n apiBaseUrl,\n );\n\n clearCart();\n setCart(getCart());\n setNotes('');\n setShippingInfo('');\n setFormErrors({});\n Taro.showToast({ title: '预订提交成功', icon: 'success' });\n } catch (error) {\n Taro.showToast({\n title: error instanceof Error ? error.message : '提交失败',\n icon: 'none',\n });\n } finally {\n setPendingCheckout(false);\n setSubmitting(false);\n }\n };\n\n const handleCheckout = async () => {\n if (!validateForm()) {\n Taro.showToast({ title: '请先修正表单错误', icon: 'none' });\n return;\n }\n\n const activePopups = await triggerCheck();\n if (activePopups.length > 0) {\n setPendingCheckout(true);\n return;\n }\n\n await performCheckout();\n };\n\n const handlePopupConfirm = (configId: string) => {\n const popup = popupConfigs.find((item) => item.id === configId);\n\n if (popup?.blockProcess) {\n temporaryClosePopup(configId);\n setPendingCheckout(false);\n return;\n }\n\n confirmPopup(configId);\n };\n\n const handlePopupCancel = (configId: string) => {\n const popup = popupConfigs.find((item) => item.id === configId);\n\n if (popup?.blockProcess) {\n temporaryClosePopup(configId);\n setPendingCheckout(false);\n return;\n }\n\n cancelPopup(configId);\n };\n\n useEffect(() => {\n if (!pendingCheckout || hasPopup || submitting) return;\n performCheckout();\n }, [pendingCheckout, hasPopup, submitting]);\n\n const handleClearCart = () => {\n clearCart();\n setCart(getCart());\n Taro.showToast({ title: '购物车已清空', icon: 'success' });\n };\n\n return (\n <View className=\"min-h-screen bg-gradient-to-br from-white to-prussian-blue-100 pb-12 text-rich-black\">\n <PageHeader title=\"购物车\" subtitle=\"确认画集数量并提交预订\" />\n\n <View className=\"mx-4 mt-5 flex flex-col gap-4\">\n {cartItems.length === 0 ? (\n <View className=\"rounded-2xl bg-white px-4 py-8 text-center text-sm text-prussian-blue-600 shadow-md\">\n 购物车暂无画集\n </View>\n ) : (\n cartItems.map((item) => (\n <CartItemCard\n key={item.collectionId}\n item={item}\n onIncrease={() => handleUpdateQuantity(item.collectionId, item.quantity + 1)}\n onDecrease={() => handleUpdateQuantity(item.collectionId, item.quantity - 1)}\n onRemove={() => handleRemove(item.collectionId)}\n />\n ))\n )}\n </View>\n\n <View className=\"mx-4 mt-6 rounded-3xl border border-prussian-blue-200 bg-white px-5 py-5 shadow-sm\">\n <Text className=\"text-base font-semibold text-rich-black\">批量预订信息</Text>\n\n <FormInput\n label=\"QQ号 *\"\n value={qqNumber}\n placeholder=\"请输入您的QQ号\"\n onChange={setQqNumber}\n disabled={submitting}\n error={formErrors.qqNumber}\n />\n\n <FormInput\n label=\"联系方式 *\"\n value={phoneNumber}\n placeholder=\"请输入您的联系方式\"\n onChange={setPhoneNumber}\n disabled={submitting}\n error={formErrors.phoneNumber}\n />\n\n <FormTextarea\n label=\"备注信息 *\"\n value={notes}\n placeholder={'您在葱韵环京的哪个群(方便我们联系您)\\n(1)葱韵环京ComicUniverse\\n(2)葱韵环京外星开拓群\\n(3)葱韵环京比邻星\\n(4)葱韵环京华东群\\n(5)葱韵环京天津群\\n(6)葱韵环京·四维空间'}\n onChange={setNotes}\n disabled={submitting}\n error={formErrors.notes}\n />\n\n <FormTextarea\n label=\"收货信息 *\"\n value={shippingInfo}\n placeholder={'请填写2月10号以后能收到货的地址\\n(1)收件人\\n(2)收件地址\\n(3)收件联系方式'}\n onChange={setShippingInfo}\n disabled={submitting}\n error={formErrors.pickupMethod}\n />\n\n <View className=\"mt-5 flex items-center justify-between gap-3\">\n <View\n className=\"flex h-11 flex-1 items-center justify-center rounded-xl bg-prussian-blue-100\"\n onClick={submitting ? undefined : handleClearCart}\n >\n <Text className=\"text-sm font-semibold text-prussian-blue-700\">清空购物车</Text>\n </View>\n <View\n className={`flex h-11 flex-1 items-center justify-center rounded-xl ${\n submitting ? 'bg-teal-300' : 'bg-teal-600 shadow-lg'\n }`}\n onClick={submitting ? undefined : handleCheckout}\n >\n <Text className=\"text-sm font-semibold text-white\">{submitting ? '提交中...' : '提交申请'}</Text>\n </View>\n </View>\n <Text className=\"mt-3 block text-right text-sm font-semibold text-rich-black\">合计:{totalPriceLabel}</Text>\n </View>\n\n <DeadlinePopupManager\n configs={popupConfigs}\n onClose={closePopup}\n onConfirm={handlePopupConfirm}\n onCancel={handlePopupCancel}\n />\n </View>\n );\n};\n\nexport default CartMiniappPage;\n","import React, { useMemo, useState } from 'react';\nimport Taro from '@tarojs/taro';\nimport { Text, View } from '@tarojs/components';\nimport type { Booking } from '../../../types/booking';\nimport { FormInput, HistoryRecordCard, PageHeader } from '../index';\nimport { DEFAULT_BASE_URL, getBookings } from '../../../service/miniapp';\n\nexport interface HistoryMiniappPageProps {\n apiBaseUrl?: string;\n}\n\nconst HistoryMiniappPage: React.FC<HistoryMiniappPageProps> = ({ apiBaseUrl = DEFAULT_BASE_URL }) => {\n const [qqNumber, setQqNumber] = useState('');\n const [phoneNumber, setPhoneNumber] = useState('');\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [records, setRecords] = useState<Booking[]>([]);\n const [hasSearched, setHasSearched] = useState(false);\n\n const handleSearch = async () => {\n if (!qqNumber.trim() && !phoneNumber.trim()) {\n Taro.showToast({ title: '请输入QQ号或联系方式', icon: 'none' });\n return;\n }\n\n setLoading(true);\n setError(null);\n setHasSearched(true);\n\n try {\n const result = await getBookings(\n {\n qqNumber: qqNumber.trim() || undefined,\n phoneNumber: phoneNumber.trim() || undefined,\n page: 1,\n limit: 50,\n },\n apiBaseUrl,\n );\n\n setRecords(result.bookings || []);\n } catch (err) {\n setError(err instanceof Error ? err.message : '查询失败');\n setRecords([]);\n } finally {\n setLoading(false);\n }\n };\n\n const stats = useMemo(() => {\n const totalBookings = records.length;\n const totalQuantity = records.reduce((sum, item) => sum + (item.quantity || 0), 0);\n const totalAmount = records.reduce(\n (sum, item) => sum + (item.quantity || 0) * (item.collection?.price || 0),\n 0,\n );\n const completedCount = records.filter((item) => item.status === 'completed').length;\n\n return {\n totalBookings,\n totalQuantity,\n totalAmount,\n completedCount,\n };\n }, [records]);\n\n return (\n <View className=\"min-h-screen bg-gradient-to-br from-white to-prussian-blue-100 pb-12 text-rich-black\">\n <PageHeader title=\"历史记录查询\" subtitle=\"输入 QQ 或联系方式查询预订记录\" />\n\n <View className=\"mx-4 mt-5 rounded-3xl border border-prussian-blue-200 bg-white px-5 py-5 shadow-sm\">\n <FormInput\n label=\"QQ号\"\n value={qqNumber}\n placeholder=\"请输入QQ号\"\n onChange={setQqNumber}\n disabled={loading}\n />\n\n <FormInput\n label=\"联系方式\"\n value={phoneNumber}\n placeholder=\"请输入联系方式\"\n onChange={setPhoneNumber}\n disabled={loading}\n />\n\n <View\n className=\"mt-5 flex h-10 w-full items-center justify-center rounded-full\"\n style={{\n backgroundColor: loading ? '#93C5FD' : '#2563EB',\n boxShadow: loading ? 'none' : '0 8px 20px rgba(37, 99, 235, 0.28)',\n }}\n onClick={loading ? undefined : handleSearch}\n >\n <Text className=\"text-sm font-semibold text-white\">{loading ? '查询中...' : '查询记录'}</Text>\n </View>\n </View>\n\n {stats.totalBookings > 0 && (\n <View className=\"mx-4 mt-4 rounded-3xl border border-prussian-blue-200 bg-white px-4 py-4 shadow-sm\">\n <View className=\"grid grid-cols-2\">\n <View className=\"py-2\">\n <Text className=\"text-xl font-bold text-rich-black\">{stats.totalBookings}</Text>\n <Text className=\"block text-xs text-prussian-blue-600\">总预订次数</Text>\n </View>\n <View className=\"py-2\">\n <Text className=\"text-xl font-bold text-rich-black\">{stats.totalQuantity}</Text>\n <Text className=\"block text-xs text-prussian-blue-600\">总预订数量</Text>\n </View>\n <View className=\"py-2\">\n <Text className=\"text-xl font-bold text-rich-black\">¥{stats.totalAmount}</Text>\n <Text className=\"block text-xs text-prussian-blue-600\">总预订金额</Text>\n </View>\n <View className=\"py-2\">\n <Text className=\"text-xl font-bold text-rich-black\">{stats.completedCount}</Text>\n <Text className=\"block text-xs text-prussian-blue-600\">已完成</Text>\n </View>\n </View>\n </View>\n )}\n\n <View className=\"mx-4 mt-6 flex flex-col gap-4\">\n {error && (\n <View className=\"rounded-2xl bg-rose-50 px-4 py-3 text-rose-700\">\n <Text className=\"text-xs\">{error}</Text>\n </View>\n )}\n\n {hasSearched && !loading && !error && records.length === 0 && (\n <View className=\"rounded-2xl bg-white px-4 py-8 text-center text-sm text-prussian-blue-600 shadow-md\">\n 暂无记录\n </View>\n )}\n\n {records.map((record) => (\n <HistoryRecordCard key={record.id} record={record} />\n ))}\n </View>\n </View>\n );\n};\n\nexport default HistoryMiniappPage;\n"]}
1
+ {"version":3,"sources":["../../../../src/showmasterpiece/ui/miniapp/components/PageHeader.tsx","../../../../src/showmasterpiece/ui/miniapp/components/CategoryTabs.tsx","../../../../src/showmasterpiece/types/index.ts","../../../../src/showmasterpiece/logic/shared/format.ts","../../../../src/showmasterpiece/logic/shared/category.ts","../../../../src/showmasterpiece/ui/miniapp/components/CollectionCard.tsx","../../../../src/showmasterpiece/ui/miniapp/components/BookingSteps.tsx","../../../../src/showmasterpiece/ui/miniapp/components/FormField.tsx","../../../../src/showmasterpiece/ui/miniapp/components/CartItemCard.tsx","../../../../src/showmasterpiece/ui/miniapp/components/HistoryRecordCard.tsx","../../../../src/showmasterpiece/ui/miniapp/components/DeadlinePopup.tsx","../../../../src/showmasterpiece/service/api/client.ts","../../../../src/showmasterpiece/service/miniapp/client.ts","../../../../src/showmasterpiece/logic/shared/useDeadlinePopupCore.ts","../../../../src/showmasterpiece/logic/hooks/useDeadlinePopupWechat.ts","../../../../src/showmasterpiece/logic/shared/storage.ts","../../../../src/showmasterpiece/logic/shared/cart.ts","../../../../src/showmasterpiece/ui/miniapp/pages/ShowMasterpiecePage.tsx","../../../../src/showmasterpiece/ui/miniapp/components/privacyConsent.ts","../../../../src/showmasterpiece/ui/miniapp/pages/CartPage.tsx","../../../../src/showmasterpiece/ui/miniapp/pages/HistoryPage.tsx"],"names":["View","React","Text","ScrollView","Image","Input","Textarea","useState","useEffect","useMemo","Button","categories","Taro","useCallback","error","useDidShow"],"mappings":"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","file":"index.js","sourcesContent":["import React from 'react';\nimport { Text, View } from '@tarojs/components';\n\ntype HeaderAction = {\n label: string;\n onClick: () => void;\n variant?: 'primary' | 'ghost';\n};\n\ntype HeaderCta = {\n label: string;\n onClick: () => void;\n};\n\ninterface PageHeaderProps {\n title: string;\n subtitle?: string;\n actions?: HeaderAction[];\n cta?: HeaderCta;\n}\n\nconst PageHeader: React.FC<PageHeaderProps> = ({ title, subtitle, actions, cta }) => {\n return (\n <View className=\"border-b border-prussian-blue-200 bg-white px-4 py-4\">\n <View className=\"flex items-start justify-between gap-3\">\n <View className=\"flex-1\">\n <Text className=\"text-xl font-bold text-rich-black\">{title}</Text>\n {subtitle && <Text className=\"mt-1 block text-sm text-prussian-blue-600\">{subtitle}</Text>}\n </View>\n {actions && actions.length > 0 && (\n <View className=\"flex items-center gap-2\">\n {actions.map(action => (\n <View\n key={action.label}\n className={\n action.variant === 'ghost'\n ? 'flex h-9 items-center justify-center rounded-full border border-prussian-blue-200 bg-white px-4'\n : 'flex h-9 items-center justify-center rounded-full bg-gradient-to-r from-moonstone to-cerulean px-4 shadow-lg'\n }\n onClick={action.onClick}\n >\n <Text\n className={\n action.variant === 'ghost'\n ? 'text-xs font-semibold text-prussian-blue-700'\n : 'text-xs font-semibold text-white'\n }\n >\n {action.label}\n </Text>\n </View>\n ))}\n </View>\n )}\n </View>\n {cta && (\n <View\n className=\"mt-4 flex h-10 items-center justify-center rounded-full bg-gradient-to-r from-moonstone to-cerulean px-4 shadow-lg\"\n onClick={cta.onClick}\n >\n <Text className=\"text-sm font-semibold text-white\">{cta.label}</Text>\n </View>\n )}\n </View>\n );\n};\n\nexport default PageHeader;\n","import React from 'react';\nimport { ScrollView, Text, View } from '@tarojs/components';\n\nexport type CategoryTabItem<T extends string = string> = {\n value: T;\n label: string;\n count?: number;\n};\n\ninterface CategoryTabsProps<T extends string = string> {\n items: CategoryTabItem<T>[];\n activeValue: T;\n onChange: (value: T) => void;\n}\n\nfunction CategoryTabs<T extends string = string>({\n items,\n activeValue,\n onChange\n}: CategoryTabsProps<T>) {\n return (\n <View className=\"mt-3\">\n <ScrollView scrollX showScrollbar>\n <View className=\"flex gap-3 pb-1\">\n {items.map(item => {\n const isActive = activeValue === item.value;\n return (\n <View\n key={item.value}\n className={`flex h-20 w-28 shrink-0 flex-col justify-between rounded-2xl border px-3 py-3 transition-all ${\n isActive\n ? 'border-sky-500 bg-sky-500 text-white shadow-lg'\n : 'border-prussian-blue-200 bg-white text-prussian-blue-700'\n }`}\n onClick={() => onChange(item.value)}\n >\n <Text className=\"text-xs font-semibold leading-4 whitespace-nowrap\">{item.label}</Text>\n {typeof item.count === 'number' && (\n <Text\n className={`self-start rounded-full px-2 py-1 text-xs ${\n isActive\n ? 'bg-white text-sky-600'\n : 'bg-prussian-blue-100 text-prussian-blue-700'\n }`}\n >\n {item.count} 个\n </Text>\n )}\n </View>\n );\n })}\n </View>\n </ScrollView>\n </View>\n );\n}\n\nexport default CategoryTabs;\n","/**\n * ShowMasterpiece 模块类型定义\n * \n * 包含画集、作品、配置等相关的TypeScript类型定义\n */\n\n// ===== 画集分类枚举 =====\n\n/**\n * 画集分类枚举\n * \n * 定义画集的各种分类:\n * - COLLECTION: 画集 - 用于展示艺术作品\n * - ACRYLIC: 立牌 - 立牌制品\n * - BADGE: 吧唧 - 徽章类商品\n * - COLOR_PAPER: 色纸 - 彩色纸张制品\n * - POSTCARD: 明信片 - 明信片类商品\n * - LASER_TICKET: 镭射票 - 镭射票类商品\n * - CANVAS_BAG: 帆布包 - 帆布包类商品\n * - SUPPORT_STICK: 应援棒 - 应援棒类商品\n * - OTHER: 挂件/钥匙扣 - 挂件/钥匙扣类商品\n */\nexport enum CollectionCategory {\n /** 画集 - 用于展示艺术作品 */\n COLLECTION = 'collection',\n /** 立牌 - 立牌制品 */\n ACRYLIC = 'acrylic',\n /** 吧唧 - 徽章类商品 */\n BADGE = 'badge',\n /** 色纸 - 彩色纸张制品 */\n COLOR_PAPER = 'color_paper',\n /** 透卡 - 透明卡片制品 */\n TRANSPARENT_CARD = 'transparent_card',\n /** 明信片 - 明信片类商品 */\n POSTCARD = 'postcard',\n /** 镭射票 - 镭射票类商品 */\n LASER_TICKET = 'laser_ticket',\n /** 帆布包 - 帆布包类商品 */\n CANVAS_BAG = 'canvas_bag',\n /** 线圈笔记本 - 线圈装订笔记本 */\n SPIRAL_NOTEBOOK = 'spiral_notebook',\n /** 鼠标垫 - 鼠标垫类商品 */\n MOUSE_PAD = 'mouse_pad',\n /** 应援棒 - 应援棒类商品 */\n SUPPORT_STICK = 'support_stick',\n /** 挂件/钥匙扣 - 挂件/钥匙扣类商品 */\n KEYCHAIN = 'keychain',\n /** 其它 */\n OTHER = 'other'\n}\n\n/**\n * 画集分类类型\n * 使用枚举值作为类型\n */\nexport type CollectionCategoryType = `${CollectionCategory}` | string;\n\n/**\n * 分类信息接口\n * 包含分类值和显示名称\n */\nexport interface CategoryInfo {\n /** 分类值 */\n value: CollectionCategoryType;\n /** 显示名称 */\n displayName: string;\n /** 描述信息 */\n description?: string;\n}\n\n// ===== 基础类型定义 =====\n\n/**\n * 艺术作品页面数据结构\n * \n * 表示画集中的单个作品页面,包含图片、标题、描述等信息。\n * 每个画集包含多个这样的作品页面。\n */\nexport interface ArtworkPage {\n /** 作品的唯一标识符 */\n id: number;\n \n /** 作品标题 */\n title: string;\n \n /** 编号 */\n number: string;\n \n /** 作品图片(支持URL或base64编码) */\n image: string;\n \n /** 通用文件服务的图片文件ID(新架构,可选) */\n fileId?: string;\n \n /** 作品描述 */\n description: string;\n \n /** 创作时间(可选) */\n createdTime?: string;\n \n /** 作品主题(可选) */\n theme?: string;\n \n /** 作品年份(可选) */\n year?: string;\n \n /** 创作媒介(可选) */\n medium?: string;\n \n /** 作品尺寸(可选) */\n dimensions?: string;\n \n /** 在画集中的显示顺序 */\n pageOrder: number;\n \n /** 是否激活(可选,默认true) */\n isActive?: boolean;\n \n /** 创建时间(可选) */\n createdAt?: string;\n \n /** 更新时间(可选) */\n updatedAt?: string;\n}\n\n/**\n * 艺术画集数据结构\n * \n * 表示一个完整的艺术画集,包含多个作品页面和相关元数据。\n * 这是系统中的核心数据模型之一。\n */\nexport interface ArtCollection {\n /** 画集的唯一标识符 */\n id: number;\n \n /** 画集标题 */\n title: string;\n \n /** 编号 */\n number: string;\n \n /** 画集封面图片路径 */\n coverImage: string;\n \n /** 通用文件服务的封面图片文件ID(新架构,可选) */\n coverImageFileId?: string;\n \n /** 画集描述 */\n description: string;\n \n /** 画集包含的所有作品页面 */\n pages: ArtworkPage[];\n \n /** 画集分类(使用枚举值) */\n category: CollectionCategoryType;\n \n /** 画集标签列表(可选) */\n tags?: string[];\n \n /** 是否已发布(可选,默认true) */\n isPublished?: boolean;\n \n /** 画集价格(单位:元,可选) */\n price?: number;\n \n /** 创建时间(可选) */\n createdAt?: string;\n \n /** 更新时间(可选) */\n updatedAt?: string;\n}\n\n// ===== 配置相关类型 =====\n\n/**\n * 系统配置数据结构\n * \n * 存储ShowMasterpiece模块的全局配置信息,\n * 包括网站设置、显示选项、功能开关等。\n */\nexport interface MasterpiecesConfig {\n /** 网站名称 */\n siteName: string;\n \n /** 网站描述 */\n siteDescription?: string;\n \n /** 首页主标题 */\n heroTitle: string;\n \n /** 首页副标题 */\n heroSubtitle?: string;\n \n /** 每页显示的最大画集数量 */\n maxCollectionsPerPage: number;\n \n /** 是否启用搜索功能 */\n enableSearch: boolean;\n \n /** 是否启用分类功能 */\n enableCategories: boolean;\n\n /** 首页分类Tab配置 */\n homeTabConfig: HomeTabConfigItem[];\n\n /** 小程序悬浮按钮显示配置 */\n miniappFloatingButtons: MiniappFloatingButtonsConfig;\n \n /** 默认分类 */\n defaultCategory: string;\n \n /** 主题模式:light(浅色)、dark(深色)、auto(自动) */\n theme: 'light' | 'dark' | 'auto';\n \n /** 界面语言:zh(中文)、en(英文) */\n language: 'zh' | 'en';\n}\n\nexport interface MiniappFloatingButtonsConfig {\n showCart: boolean;\n showHistory: boolean;\n}\n\nexport interface CategoryOption {\n name: string;\n description?: string | null;\n}\n\nexport interface HomeTabConfigItem {\n name?: string;\n description?: string | null;\n category: CollectionCategoryType;\n visible: boolean;\n order: number;\n}\n\nexport const defaultHomeTabCategoryOrder: CollectionCategoryType[] = [\n CollectionCategory.CANVAS_BAG,\n CollectionCategory.SPIRAL_NOTEBOOK,\n CollectionCategory.MOUSE_PAD,\n CollectionCategory.ACRYLIC,\n CollectionCategory.BADGE,\n CollectionCategory.COLOR_PAPER,\n CollectionCategory.KEYCHAIN,\n CollectionCategory.TRANSPARENT_CARD,\n CollectionCategory.LASER_TICKET,\n];\n\nexport function buildDefaultHomeTabConfig(): HomeTabConfigItem[] {\n return [];\n}\n\nexport function normalizeHomeTabConfig(\n input?: HomeTabConfigItem[] | null,\n): HomeTabConfigItem[] {\n if (!input || input.length === 0) {\n return [];\n }\n\n const filtered = input\n .filter((item) => {\n if (!item) {\n return false;\n }\n const rawName = typeof item.name === 'string' ? item.name : item.category;\n return typeof rawName === 'string' && rawName.trim().length > 0;\n })\n .map((item) => {\n const rawName = typeof item.name === 'string' ? item.name : item.category;\n const name = typeof rawName === 'string' ? rawName.trim() : '';\n const description = typeof item.description === 'string' ? item.description.trim() : item.description;\n\n return {\n name,\n description: description && description.length > 0 ? description : null,\n category: name as CollectionCategoryType,\n visible: item.visible ?? true,\n order: Number.isFinite(item.order) ? Number(item.order) : 0,\n };\n });\n\n if (filtered.length === 0) {\n return [];\n }\n\n filtered.sort((a, b) => a.order - b.order);\n const normalized = filtered.map((item, index) => ({ ...item, order: index }));\n\n if (!normalized.some((item) => item.visible)) {\n const firstItem = normalized[0];\n if (firstItem) {\n normalized[0] = { ...firstItem, visible: true };\n }\n }\n\n return normalized;\n}\n\nexport const defaultMiniappFloatingButtonsConfig: MiniappFloatingButtonsConfig = {\n showCart: true,\n showHistory: true,\n};\n\nexport function normalizeMiniappFloatingButtonsConfig(\n input?: Partial<MiniappFloatingButtonsConfig> | null,\n): MiniappFloatingButtonsConfig {\n return {\n showCart: input?.showCart ?? true,\n showHistory: input?.showHistory ?? true,\n };\n}\n\n// ===== 表单数据类型 =====\n\n/**\n * 画集表单数据结构\n * \n * 用于创建和编辑画集时的表单数据\n */\nexport interface CollectionFormData {\n /** 画集标题 */\n title: string;\n \n /** 编号 */\n number: string;\n \n /** 封面图片 */\n coverImage: string;\n \n /** 通用文件服务的封面图片文件ID */\n coverImageFileId?: string;\n \n /** 画集描述 */\n description: string;\n \n /** 画集分类(使用枚举值) */\n category: CollectionCategoryType;\n \n /** 画集标签列表 */\ntags: string[];\n \n /** 是否已发布 */\n isPublished: boolean;\n \n /** 画集价格(单位:元,可选) */\n price?: number;\n}\n\n/**\n * 作品表单数据结构\n * \n * 用于创建和编辑作品时的表单数据\n */\nexport interface ArtworkFormData {\n /** 作品标题 */\n title: string;\n \n /** 编号 */\n number: string;\n \n /** 作品图片 */\n image?: string;\n \n /** 通用文件服务的图片文件ID */\n fileId?: string;\n \n /** 作品描述 */\n description: string;\n \n /** 创作时间 */\n createdTime: string;\n \n /** 作品主题 */\n theme: string;\n}\n\n/**\n * 配置表单数据结构\n * \n * 用于编辑系统配置时的表单数据\n */\nexport interface ConfigFormData {\n /** 网站名称 */\n siteName: string;\n \n /** 网站描述 */\n siteDescription: string;\n \n /** 首页主标题 */\n heroTitle: string;\n \n /** 首页副标题 */\n heroSubtitle: string;\n \n /** 每页显示的最大画集数量 */\n maxCollectionsPerPage: number;\n \n /** 是否启用搜索功能 */\n enableSearch: boolean;\n \n /** 是否启用分类功能 */\n enableCategories: boolean;\n\n /** 首页分类Tab配置 */\n homeTabConfig: HomeTabConfigItem[];\n\n /** 小程序悬浮按钮显示配置 */\n miniappFloatingButtons: MiniappFloatingButtonsConfig;\n \n /** 默认分类 */\n defaultCategory: string;\n \n /** 主题模式 */\n theme: 'light' | 'dark' | 'auto';\n \n /** 界面语言 */\n language: 'zh' | 'en';\n}\n\n// ===== 工具函数 =====\n\n/**\n * 获取所有可用的画集分类\n * \n * @returns 分类枚举值数组\n */\nexport function getAvailableCategories(): CollectionCategoryType[] {\n return [];\n}\n\n/**\n * 验证分类是否为有效值\n * \n * @param category - 要验证的分类值\n * @returns 是否为有效分类\n */\nexport function isValidCategory(category: string): category is CollectionCategoryType {\n if (typeof category !== 'string') {\n return false;\n }\n return category.trim().length > 0;\n}\n\n/**\n * 分类信息映射\n * 为每个分类提供完整的信息对象\n */\nexport const categories = {\n [CollectionCategory.COLLECTION]: {\n value: CollectionCategory.COLLECTION,\n displayName: '画集',\n description: '用于展示艺术作品'\n },\n [CollectionCategory.ACRYLIC]: {\n value: CollectionCategory.ACRYLIC,\n displayName: '立牌',\n description: '立牌制品'\n },\n [CollectionCategory.BADGE]: {\n value: CollectionCategory.BADGE,\n displayName: '吧唧',\n description: '徽章类商品'\n },\n [CollectionCategory.COLOR_PAPER]: {\n value: CollectionCategory.COLOR_PAPER,\n displayName: '色纸',\n description: '彩色纸张制品'\n },\n [CollectionCategory.TRANSPARENT_CARD]: {\n value: CollectionCategory.TRANSPARENT_CARD,\n displayName: '透卡',\n description: '透明卡片制品'\n },\n [CollectionCategory.POSTCARD]: {\n value: CollectionCategory.POSTCARD,\n displayName: '明信片',\n description: '明信片类商品'\n },\n [CollectionCategory.LASER_TICKET]: {\n value: CollectionCategory.LASER_TICKET,\n displayName: '镭射票',\n description: '镭射票类商品'\n },\n [CollectionCategory.CANVAS_BAG]: {\n value: CollectionCategory.CANVAS_BAG,\n displayName: '帆布包',\n description: '帆布包类商品'\n },\n [CollectionCategory.SPIRAL_NOTEBOOK]: {\n value: CollectionCategory.SPIRAL_NOTEBOOK,\n displayName: '线圈笔记本',\n description: '线圈装订笔记本'\n },\n [CollectionCategory.MOUSE_PAD]: {\n value: CollectionCategory.MOUSE_PAD,\n displayName: '鼠标垫',\n description: '鼠标垫类商品'\n },\n [CollectionCategory.SUPPORT_STICK]: {\n value: CollectionCategory.SUPPORT_STICK,\n displayName: '应援棒',\n description: '应援棒类商品'\n },\n [CollectionCategory.KEYCHAIN]: {\n value: CollectionCategory.KEYCHAIN,\n displayName: '挂件/钥匙扣',\n description: '挂件/钥匙扣类商品'\n },\n [CollectionCategory.OTHER]: {\n value: CollectionCategory.OTHER,\n displayName: '其它',\n description: '其他类型商品'\n }\n} as const satisfies Record<CollectionCategory, CategoryInfo>;\n\n\n/**\n * 获取分类的显示名称\n * 支持 collection.category.displayName 的调用方式\n */\nexport function getCategoryDisplayName(category: CollectionCategoryType): string {\n return categories[category as CollectionCategory]?.displayName || category;\n}\n\n/**\n * 获取分类的完整信息\n * 支持 collection.category.displayName 的调用方式\n */\nexport function getCategoryInfo(category: CollectionCategoryType): CategoryInfo {\n return categories[category as CollectionCategory] || {\n value: category,\n displayName: category,\n description: ''\n };\n}\n\n/**\n * 扩展 CollectionCategoryType,使其支持 displayName 属性访问\n * 使用方式: collection.category.displayName\n */\ndeclare global {\n interface String {\n get displayName(): string;\n get categoryInfo(): CategoryInfo;\n }\n}\n\n// 为字符串类型添加 displayName getter(避免重复定义)\nif (!Object.getOwnPropertyDescriptor(String.prototype, 'displayName')) {\n Object.defineProperty(String.prototype, 'displayName', {\n get(this: string): string {\n return getCategoryDisplayName(this as CollectionCategoryType);\n }\n });\n}\n\n// 为字符串类型添加 categoryInfo getter(避免重复定义)\nif (!Object.getOwnPropertyDescriptor(String.prototype, 'categoryInfo')) {\n Object.defineProperty(String.prototype, 'categoryInfo', {\n get(this: string): CategoryInfo {\n return getCategoryInfo(this as CollectionCategoryType);\n }\n });\n}\n\n/**\n * 获取分类的描述信息 (枚举调用方式)\n */\nexport const CategoryDescription = {\n [CollectionCategory.COLLECTION]: '用于展示艺术作品,包含多个作品页面的画集',\n [CollectionCategory.ACRYLIC]: '立牌制品,如亚克力立牌、展示立牌等',\n [CollectionCategory.BADGE]: '徽章类商品,如徽章、钥匙扣等',\n [CollectionCategory.COLOR_PAPER]: '彩色纸张制品,如彩色卡纸、彩色打印纸等',\n [CollectionCategory.TRANSPARENT_CARD]: '透明卡片制品,如透明卡片、透明卡等',\n [CollectionCategory.POSTCARD]: '明信片类商品,如艺术明信片、纪念明信片等',\n [CollectionCategory.LASER_TICKET]: '镭射票类商品,如演唱会门票、电影票等',\n [CollectionCategory.CANVAS_BAG]: '帆布包类商品,如帆布袋、帆布背包等',\n [CollectionCategory.SPIRAL_NOTEBOOK]: '线圈装订笔记本,如线圈笔记本、线圈装订笔记本等',\n [CollectionCategory.MOUSE_PAD]: '鼠标垫类商品,如鼠标垫、鼠标垫等',\n [CollectionCategory.SUPPORT_STICK]: '应援棒类商品,如荧光棒、应援棒等',\n [CollectionCategory.KEYCHAIN]: '挂件/钥匙扣类商品,如装饰挂件、钥匙扣等',\n [CollectionCategory.OTHER]: '挂件/钥匙扣类商品,如装饰挂件、钥匙扣等'\n} as const;\n\n// ===== 弹窗配置类型导出 =====\nexport type { PopupConfig, NewPopupConfig } from './popup';\n\n// ===== 上下文类型导出 =====\nexport type { CartContextState } from './context'; \n","export const formatPrice = (price?: number | null): string => {\n if (!price) return '价格待定';\n return `¥${price}`;\n};\n","import type { CollectionCategoryType } from '../../types';\n\nexport const CATEGORY_LABELS: Record<string, string> = {\n collection: '画集',\n acrylic: '立牌',\n badge: '吧唧',\n color_paper: '色纸',\n transparent_card: '透卡',\n postcard: '明信片',\n laser_ticket: '镭射票',\n canvas_bag: '帆布包',\n spiral_notebook: '线圈本',\n mouse_pad: '鼠标垫',\n support_stick: '应援棒',\n keychain: '挂件/钥匙扣',\n other: '其它'\n};\n\nexport const getCategoryLabel = (category?: CollectionCategoryType): string => {\n if (!category) return '未分类';\n return CATEGORY_LABELS[String(category)] ?? String(category);\n};\n","import React from 'react';\nimport { Image, Text, View } from '@tarojs/components';\nimport type { ArtCollection, CollectionCategoryType } from '../../../types';\nimport { CollectionCategory } from '../../../types';\nimport { formatPrice } from '../../../logic/shared/format';\nimport { getCategoryLabel } from '../../../logic/shared/category';\n\ntype ActionButton = {\n label: string;\n onClick: () => void;\n variant?: 'primary' | 'ghost';\n};\n\ntype CollectionLike = Pick<\n ArtCollection,\n 'id' | 'title' | 'number' | 'coverImage' | 'price'\n> & {\n description?: string;\n category?: CollectionCategoryType;\n pages?: ArtCollection['pages'];\n};\n\ninterface CollectionCardProps {\n collection: CollectionLike;\n actions?: ActionButton[];\n showCategory?: boolean;\n showDescription?: boolean;\n variant?: 'default' | 'compact';\n}\n\nconst CollectionCard: React.FC<CollectionCardProps> = ({\n collection,\n actions,\n showCategory = true,\n showDescription = true,\n variant = 'default'\n}) => {\n const isCompact = variant === 'compact';\n const pageCount = collection.pages?.length ?? 0;\n const isCollection = collection.category === CollectionCategory.COLLECTION;\n const badgeText = isCollection ? (pageCount > 0 ? `${pageCount} 页` : '画集') : '商品';\n\n return (\n <View\n className={\n isCompact\n ? 'flex gap-3 rounded-2xl border border-prussian-blue-200 bg-white p-3 shadow-sm'\n : 'overflow-hidden rounded-3xl border border-prussian-blue-200 bg-white shadow-lg'\n }\n >\n <View\n className={\n isCompact\n ? 'relative h-24 w-20 flex-shrink-0 overflow-hidden rounded-xl bg-gradient-to-br from-prussian-blue-100 to-oxford-blue-100'\n : 'relative h-80 w-full overflow-hidden bg-gradient-to-br from-prussian-blue-100 to-oxford-blue-100'\n }\n >\n {collection.coverImage ? (\n <Image\n src={collection.coverImage}\n mode=\"aspectFill\"\n className={isCompact ? 'h-full w-full' : 'h-full w-full'}\n />\n ) : (\n <View className=\"flex h-full w-full items-center justify-center text-xs text-prussian-blue-500\">\n 暂无图片\n </View>\n )}\n {!isCompact && (\n <View className=\"absolute bottom-0 left-0 right-0 flex items-end justify-between bg-gradient-to-t from-rich-black to-transparent px-4 py-3\">\n <View className=\"rounded-full bg-moonstone-400 px-3 py-1 text-xs font-semibold text-white shadow-lg\">\n <Text>{badgeText}</Text>\n </View>\n <View className=\"rounded-full bg-white px-3 py-1 text-xs font-semibold text-prussian-blue-700\">\n <Text>{formatPrice(collection.price)}</Text>\n </View>\n </View>\n )}\n </View>\n\n <View className={isCompact ? 'flex-1' : 'p-4'}>\n <Text className={isCompact ? 'text-sm font-semibold text-rich-black' : 'text-lg font-bold text-rich-black'}>\n {collection.title}\n </Text>\n <Text className=\"mt-1 block text-xs text-prussian-blue-600\">编号:{collection.number}</Text>\n {showCategory && collection.category && (\n <Text className=\"mt-1 block text-xs text-prussian-blue-600\">\n 分类:{getCategoryLabel(collection.category)}\n </Text>\n )}\n {isCompact && (\n <Text className=\"mt-1 block text-xs font-medium text-prussian-blue-700\">\n 价格:{formatPrice(collection.price)}\n </Text>\n )}\n {showDescription && collection.description && !isCompact && (\n <Text className=\"mt-2 block text-xs text-prussian-blue-500\">{collection.description}</Text>\n )}\n {actions && actions.length > 0 && (\n <View className={isCompact ? 'mt-3 flex gap-2' : 'mt-4 flex gap-2'}>\n {actions.map(action => (\n <View\n key={action.label}\n className={\n action.variant === 'ghost'\n ? 'flex h-9 flex-1 items-center justify-center rounded-full border border-prussian-blue-200 bg-white px-4'\n : 'flex h-9 flex-1 items-center justify-center rounded-full px-4 shadow-lg'\n }\n style={action.variant === 'ghost' ? undefined : { backgroundColor: '#1e88e5' }}\n onClick={action.onClick}\n >\n <Text\n className={\n action.variant === 'ghost'\n ? 'text-xs font-semibold text-prussian-blue-700'\n : 'text-xs font-semibold text-white'\n }\n >\n {action.label}\n </Text>\n </View>\n ))}\n </View>\n )}\n </View>\n </View>\n );\n};\n\nexport default CollectionCard;\n","import React from 'react';\nimport { Text, View } from '@tarojs/components';\n\ninterface BookingStepsProps {\n step: 'select' | 'form';\n}\n\nconst BookingSteps: React.FC<BookingStepsProps> = ({ step }) => {\n return (\n <View className=\"mx-4 mt-4 rounded-3xl border border-prussian-blue-200 bg-white px-4 py-4 shadow-sm\">\n <View className=\"flex items-center\">\n <View\n className={`h-9 w-9 rounded-full flex items-center justify-center text-xs font-semibold ${\n step === 'select'\n ? 'bg-gradient-to-r from-moonstone to-cerulean text-white'\n : 'bg-emerald-500 text-white'\n }`}\n >\n <Text>{step === 'select' ? '1' : '✓'}</Text>\n </View>\n <Text\n className={`ml-2 text-sm font-medium ${\n step === 'select' ? 'text-moonstone' : 'text-emerald-600'\n }`}\n >\n 选择画集\n </Text>\n </View>\n <View className=\"mx-4 h-px w-10 bg-prussian-blue-200\" />\n <View className=\"flex items-center\">\n <View\n className={`h-9 w-9 rounded-full flex items-center justify-center text-xs font-semibold ${\n step === 'form'\n ? 'bg-gradient-to-r from-moonstone to-cerulean text-white'\n : 'bg-prussian-blue-100 text-prussian-blue-600'\n }`}\n >\n <Text>2</Text>\n </View>\n <Text\n className={`ml-2 text-sm font-medium ${\n step === 'form' ? 'text-moonstone' : 'text-prussian-blue-500'\n }`}\n >\n 填写信息\n </Text>\n </View>\n </View>\n );\n};\n\nexport default BookingSteps;\n","import React from 'react';\nimport { Input, Text, Textarea, View } from '@tarojs/components';\n\ninterface BaseFieldProps {\n label: string;\n value: string;\n placeholder?: string;\n disabled?: boolean;\n error?: string;\n type?: 'text' | 'number';\n}\n\ninterface FormInputProps extends BaseFieldProps {\n onChange: (value: string) => void;\n}\n\ninterface FormTextareaProps extends BaseFieldProps {\n onChange: (value: string) => void;\n}\n\nexport const FormInput: React.FC<FormInputProps> = ({\n label,\n value,\n placeholder,\n disabled,\n error,\n type = 'text',\n onChange\n}) => {\n return (\n <View className=\"mt-4\">\n <Text className=\"text-sm font-medium text-prussian-blue-700\">{label}</Text>\n <Input\n value={value}\n placeholder={placeholder}\n onInput={(event: { detail: { value: string } }) => onChange(event.detail.value)}\n className={`mt-2 h-11 w-full rounded-2xl border bg-white px-3 text-sm ${\n error ? 'border-rose-300' : 'border-prussian-blue-200'\n }`}\n disabled={disabled}\n type={type}\n />\n {error && <Text className=\"mt-1 block text-xs text-rose-600\">{error}</Text>}\n </View>\n );\n};\n\nexport const FormTextarea: React.FC<FormTextareaProps> = ({\n label,\n value,\n placeholder,\n disabled,\n error,\n onChange\n}) => {\n return (\n <View className=\"mt-4\">\n <Text className=\"text-sm font-medium text-prussian-blue-700\">{label}</Text>\n <Textarea\n value={value}\n placeholder={placeholder}\n onInput={(event: { detail: { value: string } }) => onChange(event.detail.value)}\n className={`mt-2 min-h-24 w-full rounded-2xl border bg-white px-3 py-2 text-sm ${\n error ? 'border-rose-300' : 'border-prussian-blue-200'\n }`}\n disabled={disabled}\n />\n {error && <Text className=\"mt-1 block text-xs text-rose-600\">{error}</Text>}\n </View>\n );\n};\n","import React from 'react';\nimport { Image, Text, View } from '@tarojs/components';\nimport type { CartItem } from '../../../types/cart';\nimport { formatPrice } from '../../../logic/shared/format';\n\ninterface CartItemCardProps {\n item: CartItem;\n onIncrease: () => void;\n onDecrease: () => void;\n onRemove: () => void;\n}\n\nconst CartItemCard: React.FC<CartItemCardProps> = ({ item, onIncrease, onDecrease, onRemove }) => {\n const subtotal = (item.collection.price || 0) * item.quantity;\n\n return (\n <View className=\"flex gap-3 rounded-2xl border border-prussian-blue-200 bg-white p-3 shadow-sm\">\n {item.collection.coverImage ? (\n <Image\n src={item.collection.coverImage}\n mode=\"aspectFill\"\n className=\"h-20 w-16 rounded-xl\"\n />\n ) : (\n <View className=\"flex h-20 w-16 items-center justify-center rounded-xl bg-prussian-blue-100 text-xs text-prussian-blue-500\">\n 暂无图片\n </View>\n )}\n <View className=\"flex-1\">\n <Text className=\"text-sm font-semibold text-rich-black\">{item.collection.title}</Text>\n <Text className=\"mt-1 block text-xs text-prussian-blue-600\">编号:{item.collection.number}</Text>\n <Text className=\"mt-1 block text-xs text-prussian-blue-600\">\n 价格:{formatPrice(item.collection.price)}\n </Text>\n <Text className=\"mt-1 block text-xs font-semibold text-prussian-blue-700\">\n 小计:{formatPrice(subtotal)}\n </Text>\n <View className=\"mt-3 flex items-center gap-2\">\n <View\n className=\"flex h-9 w-9 items-center justify-center rounded-full border border-prussian-blue-200 bg-white text-base text-prussian-blue-700\"\n onClick={onDecrease}\n >\n <Text>-</Text>\n </View>\n <Text className=\"w-8 text-center text-sm font-semibold\">{item.quantity}</Text>\n <View\n className=\"flex h-9 w-9 items-center justify-center rounded-full border border-prussian-blue-200 bg-white text-base text-prussian-blue-700\"\n onClick={onIncrease}\n >\n <Text>+</Text>\n </View>\n <View\n className=\"ml-auto flex h-9 items-center justify-center rounded-full border border-rose-200 bg-rose-50 px-3\"\n onClick={onRemove}\n >\n <Text className=\"text-xs font-semibold text-rose-600\">移除</Text>\n </View>\n </View>\n </View>\n </View>\n );\n};\n\nexport default CartItemCard;\n","import React from 'react';\nimport { Image, Text, View } from '@tarojs/components';\nimport type { Booking } from '../../../types/booking';\nimport { formatPrice } from '../../../logic/shared/format';\n\nconst statusLabelMap: Record<string, string> = {\n pending: '待确认',\n confirmed: '已确认',\n completed: '已完成',\n cancelled: '已取消'\n};\n\nconst statusStyleMap: Record<string, string> = {\n pending: 'bg-yellow-100 text-yellow-800',\n confirmed: 'bg-blue-100 text-blue-800',\n completed: 'bg-green-100 text-green-800',\n cancelled: 'bg-red-100 text-red-800'\n};\n\ninterface HistoryRecordCardProps {\n record: Booking;\n}\n\nconst HistoryRecordCard: React.FC<HistoryRecordCardProps> = ({ record }) => {\n const statusText = statusLabelMap[record.status] || record.status;\n const statusStyle = statusStyleMap[record.status] || 'bg-slate-100 text-slate-600';\n const totalPrice = (record.collection?.price || 0) * record.quantity;\n\n return (\n <View className=\"rounded-2xl border border-prussian-blue-200 bg-white p-4 shadow-sm\">\n <View className=\"flex gap-3\">\n {record.collection?.coverImage ? (\n <Image\n src={record.collection.coverImage}\n mode=\"aspectFill\"\n className=\"h-20 w-16 rounded-xl\"\n />\n ) : (\n <View className=\"flex h-20 w-16 items-center justify-center rounded-xl bg-prussian-blue-100 text-xs text-prussian-blue-500\">\n 暂无图片\n </View>\n )}\n <View className=\"flex-1\">\n <Text className=\"text-sm font-semibold text-rich-black\">\n {record.collection?.title || '画集'}\n </Text>\n <Text className=\"mt-1 block text-xs text-prussian-blue-600\">\n 编号:{record.collection?.number || '-'}\n </Text>\n <Text className=\"mt-1 block text-xs text-prussian-blue-600\">数量:{record.quantity}</Text>\n <Text className=\"mt-1 block text-xs text-prussian-blue-600\">\n 价格:{formatPrice(record.collection?.price)}\n </Text>\n <Text className=\"mt-1 block text-xs font-semibold text-prussian-blue-700\">\n 总价:{formatPrice(totalPrice)}\n </Text>\n <View className=\"mt-2 flex items-center justify-between\">\n <View className={`rounded-full px-2 py-1 text-xs font-medium ${statusStyle}`}>\n <Text>{statusText}</Text>\n </View>\n <Text className=\"text-xs text-prussian-blue-500\">{record.createdAt?.slice(0, 10)}</Text>\n </View>\n </View>\n </View>\n {(record.notes || record.adminNotes) && (\n <View className=\"mt-3 border-t border-prussian-blue-200 pt-3\">\n {record.notes && (\n <View className=\"rounded-xl bg-prussian-blue-100 p-2\">\n <Text className=\"text-xs text-prussian-blue-700\">备注:{record.notes}</Text>\n </View>\n )}\n {record.adminNotes && (\n <View className=\"mt-2 rounded-xl bg-moonstone-100 p-2\">\n <Text className=\"text-xs text-prussian-blue-700\">管理员备注:{record.adminNotes}</Text>\n </View>\n )}\n </View>\n )}\n </View>\n );\n};\n\nexport default HistoryRecordCard;\n","import React, { useEffect, useMemo, useState } from 'react';\nimport { Button, Text, View } from '@tarojs/components';\nimport type { PopupConfig } from '../../../types/popup';\n\ninterface DeadlinePopupManagerProps {\n configs: PopupConfig[];\n onClose: (configId: string) => void;\n onConfirm?: (configId: string) => void;\n onCancel?: (configId: string) => void;\n}\n\ntype PopupTheme = 'warning' | 'info' | 'error' | 'success';\ntype ThemeStyle = { title: string; body: string; panel: string; button: string };\n\nconst themeStyles: Record<PopupTheme, ThemeStyle> = {\n warning: {\n title: 'text-amber-800',\n body: 'text-amber-700',\n panel: 'bg-amber-50 border-amber-200',\n button: 'bg-amber-600',\n },\n info: {\n title: 'text-blue-800',\n body: 'text-blue-700',\n panel: 'bg-blue-50 border-blue-200',\n button: 'bg-blue-600',\n },\n error: {\n title: 'text-rose-800',\n body: 'text-rose-700',\n panel: 'bg-rose-50 border-rose-200',\n button: 'bg-rose-600',\n },\n success: {\n title: 'text-emerald-800',\n body: 'text-emerald-700',\n panel: 'bg-emerald-50 border-emerald-200',\n button: 'bg-emerald-600',\n },\n};\n\nconst DeadlinePopupManager: React.FC<DeadlinePopupManagerProps> = ({\n configs,\n onClose,\n onConfirm,\n onCancel,\n}) => {\n const [index, setIndex] = useState(0);\n const current = configs[index];\n const [countdown, setCountdown] = useState(0);\n\n useEffect(() => {\n if (!configs.length) setIndex(0);\n if (index >= configs.length) setIndex(0);\n }, [configs.length, index]);\n\n useEffect(() => {\n if (!current?.displayConfig?.autoCloseSeconds) {\n setCountdown(0);\n return;\n }\n\n setCountdown(current.displayConfig.autoCloseSeconds);\n const timer = setInterval(() => {\n setCountdown((prev) => {\n if (prev <= 1) {\n clearInterval(timer);\n onClose(current.id);\n return 0;\n }\n return prev - 1;\n });\n }, 1000);\n\n return () => clearInterval(timer);\n }, [current, onClose]);\n\n const styles = useMemo<ThemeStyle>(() => {\n const key = current?.contentConfig?.theme as PopupTheme | undefined;\n return key && themeStyles[key] ? themeStyles[key] : themeStyles.warning;\n }, [current]);\n\n if (!current) return null;\n\n const confirmText = current.contentConfig.confirmText || '确定';\n const cancelText = current.contentConfig.cancelText || '取消';\n const showCancel = current.contentConfig.showCancel !== false;\n\n const handleConfirm = () => {\n onConfirm?.(current.id);\n };\n\n const handleCancel = () => {\n onCancel?.(current.id);\n };\n\n return (\n <View className=\"fixed inset-0 flex items-center justify-center bg-black px-5\" style={{ zIndex: 1000 }}>\n <View className={`w-full max-w-md rounded-2xl border p-4 shadow-2xl ${styles.panel}`}>\n <Text className={`text-base font-semibold ${styles.title}`}>{current.contentConfig.title}</Text>\n {countdown > 0 && (\n <Text className=\"mt-2 block text-xs text-slate-500\">{countdown} 秒后自动关闭</Text>\n )}\n <Text className={`mt-3 block whitespace-pre-wrap text-sm ${styles.body}`}>\n {current.contentConfig.message}\n </Text>\n <View className=\"mt-4 flex justify-end gap-2\">\n {showCancel && (\n <Button\n className=\"h-8 rounded-full border border-slate-300 bg-white px-4 text-xs font-semibold text-slate-700\"\n onClick={handleCancel}\n >\n {cancelText}\n </Button>\n )}\n <Button\n className={`h-8 rounded-full px-4 text-xs font-semibold text-white ${styles.button}`}\n onClick={handleConfirm}\n >\n {confirmText}\n </Button>\n </View>\n </View>\n </View>\n );\n};\n\nexport default DeadlinePopupManager;\n","import type { ArtCollection } from '../../types';\nimport type { CategoryOption } from '../../types';\nimport type {\n Booking,\n BookingListParams,\n BookingListResponse,\n CollectionSummary,\n CreateBookingRequest,\n} from '../../types/booking';\nimport type { BatchBookingRequest, BatchBookingResponse } from '../../types/cart';\nimport type { PopupConfig } from '../../types/popup';\n\nexport type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n\nexport interface RequestOptions {\n url: string;\n method: HttpMethod;\n data?: unknown;\n headers?: Record<string, string>;\n}\n\nexport type RequestExecutor = <T = any>(options: RequestOptions) => Promise<T>;\n\nexport type CollectionOverview = Omit<ArtCollection, 'pages'> & { pages?: ArtCollection['pages'] };\n\nexport interface ShowmasterpieceClient {\n getCollectionsOverview: () => Promise<CollectionOverview[]>;\n getCategories: () => Promise<CategoryOption[]>;\n getBookableCollections: () => Promise<CollectionSummary[]>;\n createBooking: (payload: CreateBookingRequest) => Promise<Booking>;\n batchBooking: (payload: BatchBookingRequest) => Promise<BatchBookingResponse>;\n getBookings: (params: BookingListParams) => Promise<BookingListResponse>;\n checkPopupConfigs: (params: {\n businessModule: string;\n businessScene: string;\n currentTime?: string;\n }) => Promise<PopupConfig[]>;\n}\n\nconst joinUrl = (baseUrl: string, path: string): string => {\n if (!baseUrl) return path;\n return `${baseUrl.replace(/\\/$/, '')}${path}`;\n};\n\nconst toSearchParams = (params: BookingListParams): string => {\n const searchParams = new URLSearchParams();\n\n if (params.collectionId) searchParams.set('collectionId', String(params.collectionId));\n if (params.qqNumber) searchParams.set('qqNumber', params.qqNumber);\n if (params.phoneNumber) searchParams.set('phoneNumber', params.phoneNumber);\n if (params.status) searchParams.set('status', params.status);\n if (params.page) searchParams.set('page', String(params.page));\n if (params.limit) searchParams.set('limit', String(params.limit));\n\n return searchParams.toString();\n};\n\nconst extractArrayData = <T>(data: any): T[] => {\n if (Array.isArray(data?.data)) return data.data as T[];\n if (Array.isArray(data?.collections)) return data.collections as T[];\n if (Array.isArray(data?.configs)) return data.configs as T[];\n if (Array.isArray(data?.data?.configs)) return data.data.configs as T[];\n if (Array.isArray(data)) return data as T[];\n return [];\n};\n\nexport const createShowmasterpieceClient = (\n request: RequestExecutor,\n baseUrl: string,\n): ShowmasterpieceClient => {\n return {\n getCollectionsOverview: async () => {\n const url = joinUrl(baseUrl, '/api/showmasterpiece/collections?overview=true');\n const data = await request<any>({ url, method: 'GET' });\n const collections = extractArrayData<CollectionOverview>(data);\n if (!Array.isArray(collections)) {\n throw new Error('API响应格式错误');\n }\n return collections;\n },\n\n getCategories: async () => {\n const url = joinUrl(baseUrl, '/api/showmasterpiece/categories');\n const data = await request<any>({ url, method: 'GET' });\n const categories = extractArrayData<CategoryOption>(data);\n if (!Array.isArray(categories)) {\n throw new Error('API响应格式错误');\n }\n return categories;\n },\n\n getBookableCollections: async () => {\n const url = joinUrl(baseUrl, '/api/showmasterpiece/bookings/collections');\n const data = await request<any>({ url, method: 'GET' });\n const collections = extractArrayData<CollectionSummary>(data);\n if (!Array.isArray(collections)) {\n throw new Error('API响应格式错误');\n }\n return collections;\n },\n\n createBooking: async (payload) => {\n const url = joinUrl(baseUrl, '/api/showmasterpiece/bookings');\n return request<Booking>({\n url,\n method: 'POST',\n data: payload,\n });\n },\n\n batchBooking: async (payload) => {\n const url = joinUrl(baseUrl, '/api/showmasterpiece/bookings/batch');\n return request<BatchBookingResponse>({\n url,\n method: 'POST',\n data: payload,\n });\n },\n\n getBookings: async (params) => {\n const query = toSearchParams(params);\n const path = query\n ? `/api/showmasterpiece/bookings?${query}`\n : '/api/showmasterpiece/bookings';\n const url = joinUrl(baseUrl, path);\n return request<BookingListResponse>({\n url,\n method: 'GET',\n });\n },\n\n checkPopupConfigs: async (params) => {\n const url = joinUrl(baseUrl, '/api/showmasterpiece/popup-configs/check');\n const data = await request<any>({\n url,\n method: 'POST',\n data: {\n businessModule: params.businessModule,\n businessScene: params.businessScene,\n currentTime: params.currentTime || new Date().toISOString(),\n },\n });\n return extractArrayData<PopupConfig>(data);\n },\n };\n};\n","import Taro from '@tarojs/taro';\nimport type { CategoryOption } from '../../types';\nimport type {\n Booking,\n BookingListParams,\n BookingListResponse,\n CollectionSummary,\n CreateBookingRequest,\n} from '../../types/booking';\nimport type { BatchBookingRequest, BatchBookingResponse } from '../../types/cart';\nimport type { PopupConfig } from '../../types/popup';\nimport { createShowmasterpieceClient, type CollectionOverview } from '../api';\n\nexport const DEFAULT_BASE_URL = 'https://qhr062.top';\n\nconst extractErrorMessage = (data: any, fallback: string): string => {\n if (typeof data?.message === 'string' && data.message) return data.message;\n if (typeof data?.error === 'string' && data.error) return data.error;\n return fallback;\n};\n\nconst createTaroExecutor = () => {\n return async <T>({\n url,\n method,\n data,\n headers,\n }: {\n url: string;\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n data?: unknown;\n headers?: Record<string, string>;\n }): Promise<T> => {\n const response = await Taro.request({\n url,\n method,\n data,\n header: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n });\n\n if (response.statusCode >= 200 && response.statusCode < 300) {\n return response.data as T;\n }\n\n throw new Error(extractErrorMessage(response.data, `请求失败 (${response.statusCode})`));\n };\n};\n\nconst createClient = (baseUrl = DEFAULT_BASE_URL) =>\n createShowmasterpieceClient(createTaroExecutor(), baseUrl);\n\nexport const getCollectionsOverview = async (baseUrl = DEFAULT_BASE_URL): Promise<CollectionOverview[]> =>\n createClient(baseUrl).getCollectionsOverview();\n\nexport const getCategories = async (baseUrl = DEFAULT_BASE_URL): Promise<CategoryOption[]> =>\n createClient(baseUrl).getCategories();\n\nexport const getBookableCollections = async (baseUrl = DEFAULT_BASE_URL): Promise<CollectionSummary[]> =>\n createClient(baseUrl).getBookableCollections();\n\nexport const createBooking = async (\n payload: CreateBookingRequest,\n baseUrl = DEFAULT_BASE_URL,\n): Promise<Booking> => createClient(baseUrl).createBooking(payload);\n\nexport const batchBooking = async (\n payload: BatchBookingRequest,\n baseUrl = DEFAULT_BASE_URL,\n): Promise<BatchBookingResponse> => createClient(baseUrl).batchBooking(payload);\n\nexport const getBookings = async (\n params: BookingListParams,\n baseUrl = DEFAULT_BASE_URL,\n): Promise<BookingListResponse> => createClient(baseUrl).getBookings(params);\n\nexport const checkPopupConfigs = async (\n params: {\n businessModule: string;\n businessScene: string;\n currentTime?: string;\n },\n baseUrl = DEFAULT_BASE_URL,\n): Promise<PopupConfig[]> => createClient(baseUrl).checkPopupConfigs(params);\n\nexport type { CollectionOverview };\n","import { useCallback, useState } from 'react';\nimport type { PopupConfig } from '../../types/popup';\n\ninterface PopupDisplayState {\n configs: PopupConfig[];\n loading: boolean;\n error: string | null;\n hasPopup: boolean;\n}\n\ninterface CheckPopupParams {\n businessModule: string;\n businessScene: string;\n currentTime: string;\n}\n\ntype FetchPopupConfigs = (params: CheckPopupParams) => Promise<PopupConfig[]>;\n\ninterface UseDeadlinePopupCoreOptions {\n businessModule: string;\n businessScene: string;\n fetchPopupConfigs: FetchPopupConfigs;\n}\n\nexport function useDeadlinePopupCore(options: UseDeadlinePopupCoreOptions) {\n const { businessModule, businessScene, fetchPopupConfigs } = options;\n\n const [state, setState] = useState<PopupDisplayState>({\n configs: [],\n loading: false,\n error: null,\n hasPopup: false,\n });\n const [dismissedPopups, setDismissedPopups] = useState<Set<string>>(new Set());\n\n const runCheck = useCallback(\n async (ignoreDismissed: boolean, currentTime?: Date) => {\n setState((prev) => ({ ...prev, loading: true, error: null }));\n\n try {\n const configs = await fetchPopupConfigs({\n businessModule,\n businessScene,\n currentTime: (currentTime || new Date()).toISOString(),\n });\n\n const activeConfigs = configs.filter((config) => {\n if (ignoreDismissed && config.blockProcess) return true;\n return !dismissedPopups.has(config.id);\n });\n\n setState((prev) => ({\n ...prev,\n configs: activeConfigs,\n loading: false,\n hasPopup: activeConfigs.length > 0,\n }));\n\n return activeConfigs;\n } catch (error) {\n setState((prev) => ({\n ...prev,\n loading: false,\n error: error instanceof Error ? error.message : '检查弹窗失败',\n configs: [],\n hasPopup: false,\n }));\n return [];\n }\n },\n [businessModule, businessScene, dismissedPopups, fetchPopupConfigs],\n );\n\n const checkPopups = useCallback((currentTime?: Date) => runCheck(false, currentTime), [runCheck]);\n const triggerCheck = useCallback((currentTime?: Date) => runCheck(true, currentTime), [runCheck]);\n\n const closePopup = useCallback((configId: string) => {\n setDismissedPopups((prev) => new Set([...prev, configId]));\n setState((prev) => {\n const next = prev.configs.filter((config) => config.id !== configId);\n return {\n ...prev,\n configs: next,\n hasPopup: next.length > 0,\n };\n });\n }, []);\n\n const confirmPopup = useCallback((configId: string) => closePopup(configId), [closePopup]);\n const cancelPopup = useCallback((configId: string) => closePopup(configId), [closePopup]);\n\n const temporaryClosePopup = useCallback((configId: string) => {\n setState((prev) => {\n const next = prev.configs.filter((config) => config.id !== configId);\n return {\n ...prev,\n configs: next,\n hasPopup: next.length > 0,\n };\n });\n }, []);\n\n const resetDismissedPopups = useCallback(() => {\n setDismissedPopups(new Set());\n }, []);\n\n return {\n ...state,\n checkPopups,\n triggerCheck,\n closePopup,\n confirmPopup,\n cancelPopup,\n temporaryClosePopup,\n resetDismissedPopups,\n };\n}\n\n","import { useCallback } from 'react';\nimport { checkPopupConfigs } from '../../service/miniapp';\nimport { useDeadlinePopupCore } from '../shared/useDeadlinePopupCore';\n\nexport function useDeadlinePopup(\n businessModule: string,\n businessScene: string,\n baseUrl: string,\n) {\n const fetchPopupConfigs = useCallback(\n async ({\n businessModule: moduleName,\n businessScene: sceneName,\n currentTime,\n }: {\n businessModule: string;\n businessScene: string;\n currentTime: string;\n }) =>\n checkPopupConfigs(\n {\n businessModule: moduleName,\n businessScene: sceneName,\n currentTime,\n },\n baseUrl,\n ),\n [baseUrl],\n );\n\n return useDeadlinePopupCore({\n businessModule,\n businessScene,\n fetchPopupConfigs,\n });\n}\n\nexport default useDeadlinePopup;\n","declare const wx: any;\n\nconst hasWxStorage = (): boolean =>\n typeof wx !== 'undefined' && typeof (wx as any).getStorageSync === 'function';\n\nconst hasLocalStorage = (): boolean =>\n typeof localStorage !== 'undefined' && typeof localStorage.getItem === 'function';\n\nexport const getStorageSync = <T>(key: string): T | null => {\n try {\n if (hasWxStorage()) {\n return (wx as any).getStorageSync(key) as T;\n }\n if (hasLocalStorage()) {\n const value = localStorage.getItem(key);\n return value ? (JSON.parse(value) as T) : null;\n }\n } catch {\n return null;\n }\n return null;\n};\n\nexport const setStorageSync = (key: string, value: unknown): void => {\n try {\n if (hasWxStorage()) {\n (wx as any).setStorageSync(key, value);\n return;\n }\n if (hasLocalStorage()) {\n localStorage.setItem(key, JSON.stringify(value));\n }\n } catch {\n // ignore\n }\n};\n","import type { Cart } from '../../types/cart';\nimport type { ArtCollection } from '../../types';\nimport { getStorageSync, setStorageSync } from './storage';\n\nconst CART_STORAGE_KEY = 'showmasterpiece_cart';\n\nconst normalizeCart = (cart?: Cart): Cart => {\n const safeCart: Cart = cart ?? { items: [], totalPrice: 0, totalQuantity: 0 };\n const totals = safeCart.items.reduce(\n (acc, item) => {\n acc.totalQuantity += item.quantity;\n acc.totalPrice += (item.collection.price || 0) * item.quantity;\n return acc;\n },\n { totalQuantity: 0, totalPrice: 0 }\n );\n\n return {\n ...safeCart,\n totalQuantity: totals.totalQuantity,\n totalPrice: totals.totalPrice\n };\n};\n\nexport const getCart = (): Cart => {\n const stored = getStorageSync<Cart>(CART_STORAGE_KEY);\n if (stored && stored.items) {\n return normalizeCart(stored);\n }\n return normalizeCart();\n};\n\nconst saveCart = (cart: Cart) => {\n setStorageSync(CART_STORAGE_KEY, cart);\n};\n\nexport const addToCart = (collection: ArtCollection, quantity = 1): Cart => {\n const cart = getCart();\n const existing = cart.items.find(item => item.collectionId === collection.id);\n\n if (existing) {\n existing.quantity += quantity;\n } else {\n cart.items.push({\n collectionId: collection.id,\n collection,\n quantity,\n addedAt: new Date()\n });\n }\n\n const next = normalizeCart(cart);\n saveCart(next);\n return next;\n};\n\nexport const updateCartItem = (collectionId: number, quantity: number): Cart => {\n const cart = getCart();\n const target = cart.items.find(item => item.collectionId === collectionId);\n if (!target) return cart;\n\n if (quantity <= 0) {\n cart.items = cart.items.filter(item => item.collectionId !== collectionId);\n } else {\n target.quantity = quantity;\n }\n\n const next = normalizeCart(cart);\n saveCart(next);\n return next;\n};\n\nexport const removeCartItem = (collectionId: number): Cart => {\n const cart = getCart();\n cart.items = cart.items.filter(item => item.collectionId !== collectionId);\n const next = normalizeCart(cart);\n saveCart(next);\n return next;\n};\n\nexport const clearCart = (): Cart => {\n const empty = normalizeCart({ items: [], totalPrice: 0, totalQuantity: 0 });\n saveCart(empty);\n return empty;\n};\n","import React, { useEffect, useMemo, useState } from 'react';\nimport Taro, { useDidShow } from '@tarojs/taro';\nimport { Text, View } from '@tarojs/components';\nimport {\n getCategoryDisplayName,\n normalizeMiniappFloatingButtonsConfig,\n type ArtCollection,\n type CategoryOption,\n type CollectionCategoryType,\n type MiniappFloatingButtonsConfig,\n} from '../../../types';\nimport { addToCart, getCart } from '../../../logic/shared/cart';\nimport { CategoryTabs, MiniappCollectionCard, PageHeader } from '../index';\nimport {\n DEFAULT_BASE_URL,\n getCategories,\n type CollectionOverview,\n getCollectionsOverview,\n} from '../../../service/miniapp';\nimport useDeadlinePopup from '../../../logic/hooks/useDeadlinePopupWechat';\nimport DeadlinePopupManager from '../components/DeadlinePopup';\n\ntype CategoryFilter = {\n value: CollectionCategoryType;\n label: string;\n count?: number;\n};\n\nexport interface ShowMasterpieceMiniappPageProps {\n apiBaseUrl?: string;\n}\n\nconst ShowMasterpieceMiniappPage: React.FC<ShowMasterpieceMiniappPageProps> = ({\n apiBaseUrl = DEFAULT_BASE_URL,\n}) => {\n const [collections, setCollections] = useState<CollectionOverview[]>([]);\n const [categoryOptions, setCategoryOptions] = useState<CategoryOption[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [activeCategory, setActiveCategory] = useState<CollectionCategoryType>('' as CollectionCategoryType);\n const [cartCount, setCartCount] = useState(0);\n const [miniappFloatingButtons, setMiniappFloatingButtons] = useState<MiniappFloatingButtonsConfig>(\n () => normalizeMiniappFloatingButtonsConfig(undefined),\n );\n\n const {\n configs: popupConfigs,\n triggerCheck,\n closePopup,\n confirmPopup,\n cancelPopup,\n } = useDeadlinePopup('showmasterpiece', 'homepage_visit', apiBaseUrl);\n\n useEffect(() => {\n try {\n Taro.setStorageSync('__cy_mps_boot_ready__', true);\n Taro.setStorageSync('__cy_mps_boot_retry_once__', false);\n } catch (error) {\n console.error('[ShowMasterpieceMiniappPage] boot ready sync failed', error);\n }\n }, []);\n\n useEffect(() => {\n const withTimeout = async <T,>(\n task: Promise<T>,\n timeoutMs: number,\n fallbackMessage: string,\n ): Promise<T> => {\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race<T>([\n task,\n new Promise<T>((_, reject) => {\n timer = setTimeout(() => reject(new Error(fallbackMessage)), timeoutMs);\n }),\n ]);\n } finally {\n if (timer) {\n clearTimeout(timer);\n }\n }\n };\n\n const loadCollections = async () => {\n setLoading(true);\n setError(null);\n try {\n const [collectionsResult, categoriesResult] = await Promise.allSettled([\n withTimeout(getCollectionsOverview(apiBaseUrl), 12000, '商品数据加载超时'),\n withTimeout(getCategories(apiBaseUrl), 8000, '分类数据加载超时'),\n ]);\n\n if (collectionsResult.status === 'fulfilled') {\n setCollections(Array.isArray(collectionsResult.value) ? collectionsResult.value : []);\n } else {\n setCollections([]);\n setError(collectionsResult.reason instanceof Error ? collectionsResult.reason.message : '商品加载失败');\n }\n\n if (categoriesResult.status === 'fulfilled') {\n setCategoryOptions(Array.isArray(categoriesResult.value) ? categoriesResult.value : []);\n } else {\n setCategoryOptions([]);\n if (collectionsResult.status === 'fulfilled') {\n setError('分类加载失败,已使用默认分类展示');\n }\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : '加载商品失败');\n setCollections([]);\n setCategoryOptions([]);\n } finally {\n setLoading(false);\n }\n };\n\n loadCollections();\n }, [apiBaseUrl]);\n\n useEffect(() => {\n setCartCount(getCart().totalQuantity);\n }, []);\n\n useDidShow(() => {\n setCartCount(getCart().totalQuantity);\n });\n\n useEffect(() => {\n const timer = setTimeout(() => {\n triggerCheck();\n }, 600);\n return () => clearTimeout(timer);\n }, [triggerCheck]);\n\n useEffect(() => {\n const loadMiniappConfig = async () => {\n try {\n const response = await Taro.request({\n url: `${apiBaseUrl.replace(/\\/$/, '')}/api/showmasterpiece/config`,\n method: 'GET',\n header: {\n 'Content-Type': 'application/json',\n },\n });\n const buttons = normalizeMiniappFloatingButtonsConfig(\n (response.data as any)?.miniappFloatingButtons,\n );\n setMiniappFloatingButtons(buttons);\n } catch (err) {\n setMiniappFloatingButtons(normalizeMiniappFloatingButtonsConfig(undefined));\n }\n };\n\n loadMiniappConfig();\n }, [apiBaseUrl]);\n\n const categories = useMemo<CategoryFilter[]>(() => {\n const categoryCounter = new Map<CollectionCategoryType, number>();\n collections.forEach((item) => {\n if (!item.category) return;\n categoryCounter.set(item.category, (categoryCounter.get(item.category) ?? 0) + 1);\n });\n const options = Array.isArray(categoryOptions) ? categoryOptions : [];\n const fromServer = options\n .map((item) => {\n const value = item.name as CollectionCategoryType;\n return {\n value,\n label: (item.description || '').trim() || String(getCategoryDisplayName(value)),\n count: categoryCounter.get(value) ?? 0,\n };\n })\n .filter((item) => item.count > 0);\n\n const mappedValues = new Set(fromServer.map((item) => item.value));\n const fallbackValues = Array.from(new Set(collections.map((item) => item.category).filter(Boolean)));\n const fallback = fallbackValues\n .filter((value) => !mappedValues.has(value as CollectionCategoryType))\n .map((value) => ({\n value: value as CollectionCategoryType,\n label: String(getCategoryDisplayName(value as CollectionCategoryType)),\n count: categoryCounter.get(value as CollectionCategoryType) ?? 0,\n }));\n\n return [...fromServer, ...fallback];\n }, [collections, categoryOptions]);\n\n useEffect(() => {\n if (!categories.length) return;\n const exists = categories.some((item) => item.value === activeCategory);\n if (!exists) {\n const firstCategory = categories[0];\n if (firstCategory) {\n setActiveCategory(firstCategory.value);\n }\n }\n }, [categories, activeCategory]);\n\n const filteredCollections = useMemo(\n () => (activeCategory ? collections.filter((item) => item.category === activeCategory) : collections),\n [collections, activeCategory],\n );\n\n const goToCart = () => {\n Taro.navigateTo({ url: '/pages/cart/index' });\n };\n\n const goToHistory = () => {\n Taro.navigateTo({ url: '/pages/history/index' });\n };\n\n const goToTop = () => {\n Taro.pageScrollTo({ scrollTop: 0, duration: 300 });\n };\n\n const handleAddToCart = (collection: CollectionOverview) => {\n const normalizedCollection: ArtCollection = {\n ...collection,\n pages: collection.pages ?? [],\n };\n const next = addToCart(normalizedCollection, 1);\n setCartCount(next.totalQuantity);\n Taro.showToast({ title: '已加入购物车', icon: 'success' });\n };\n\n return (\n <View className=\"min-h-screen bg-gradient-to-br from-white to-prussian-blue-100 pb-12 text-rich-black\">\n <PageHeader\n title=\"葱韵魔法屋\"\n subtitle=\"葱韵环京的谷子网站,请大家尽情鉴赏老师们的作品吧!\"\n />\n\n <View className=\"mx-4 mt-4 rounded-3xl border border-teal-200 bg-teal-50 p-4 shadow-sm\">\n <Text className=\"text-base font-semibold text-rich-black\">分类浏览</Text>\n <Text className=\"mt-1 block text-xs text-teal-700\">按分类快速筛选商品内容</Text>\n <CategoryTabs\n items={categories}\n activeValue={activeCategory}\n onChange={(value) => setActiveCategory(value)}\n />\n </View>\n\n <View className=\"mx-4 mt-5\">\n <Text className=\"text-lg font-semibold text-rich-black\">精选</Text>\n {loading ? (\n <View className=\"py-10 text-center text-sm text-prussian-blue-600\">加载中...</View>\n ) : error ? (\n <View className=\"mt-4 rounded-2xl bg-rose-50 px-4 py-4 text-rose-700 shadow-md\">\n <Text className=\"text-sm font-semibold\">加载失败</Text>\n <Text className=\"mt-1 block text-xs\">{error}</Text>\n </View>\n ) : filteredCollections.length === 0 ? (\n <View className=\"rounded-2xl bg-white py-10 text-center text-sm text-prussian-blue-600 shadow-md\">\n 暂无匹配商品\n </View>\n ) : (\n <View className=\"mt-4 flex flex-col gap-5\">\n {filteredCollections.map((collection) => (\n <MiniappCollectionCard\n key={collection.id}\n collection={collection}\n actions={[\n {\n label: '加入购物车',\n onClick: () => handleAddToCart(collection),\n variant: 'primary',\n },\n ]}\n />\n ))}\n </View>\n )}\n </View>\n\n <DeadlinePopupManager\n configs={popupConfigs}\n onClose={closePopup}\n onConfirm={confirmPopup}\n onCancel={cancelPopup}\n />\n\n <View className=\"fixed bottom-6 right-4 flex flex-col gap-3\" style={{ zIndex: 80 }}>\n <View\n className=\"flex h-12 w-12 items-center justify-center rounded-full bg-teal-600 shadow-lg\"\n onClick={goToTop}\n >\n <Text className=\"text-lg text-white\">↑</Text>\n </View>\n {miniappFloatingButtons.showCart && (\n <View\n className=\"relative flex h-12 w-12 items-center justify-center rounded-full bg-cyan-500 shadow-lg\"\n onClick={goToCart}\n >\n <Text className=\"text-lg text-white\">🛒</Text>\n {cartCount > 0 && (\n <View className=\"absolute -right-1 -top-1 flex min-h-4 min-w-4 items-center justify-center rounded-full bg-rose-500 px-1\">\n <Text className=\"text-xs font-semibold text-white\">\n {cartCount > 99 ? '99+' : cartCount}\n </Text>\n </View>\n )}\n </View>\n )}\n {miniappFloatingButtons.showHistory && (\n <View\n className=\"flex h-12 w-12 items-center justify-center rounded-full bg-blue-700 shadow-lg\"\n onClick={goToHistory}\n >\n <Text className=\"text-lg text-white\">🕘</Text>\n </View>\n )}\n </View>\n </View>\n );\n};\n\nexport default ShowMasterpieceMiniappPage;\n","import Taro from '@tarojs/taro';\n\nconst CONSENT_STORAGE_KEY = '__showmasterpiece_privacy_consent_v1__';\n\nconst SERVICE_TERMS_TEXT =\n '《用户服务协议》摘要:本服务用于画集浏览、购物车下单与历史查询;提交信息仅用于订单处理、发货及售后沟通。';\n\nconst PRIVACY_POLICY_TEXT =\n '《隐私政策》摘要:我们会收集您主动填写的QQ号、联系方式与收货信息,用于预订联系与履约;仅在必要期限内保存,不作无关用途。';\n\nexport const hasPrivacyConsent = (): boolean => {\n try {\n return Taro.getStorageSync(CONSENT_STORAGE_KEY) === true;\n } catch {\n return false;\n }\n};\n\nexport const markPrivacyConsent = () => {\n try {\n Taro.setStorageSync(CONSENT_STORAGE_KEY, true);\n } catch (error) {\n console.error('[privacy-consent] persist failed', error);\n }\n};\n\nexport const showAgreementDoc = async (type: 'service' | 'privacy') => {\n const title = type === 'service' ? '用户服务协议' : '隐私政策';\n const content = type === 'service' ? SERVICE_TERMS_TEXT : PRIVACY_POLICY_TEXT;\n await Taro.showModal({\n title,\n content,\n showCancel: false,\n confirmText: '我知道了',\n });\n};\n\nexport const ensurePrivacyConsent = async (): Promise<boolean> => {\n if (hasPrivacyConsent()) return true;\n\n try {\n const { tapIndex } = await Taro.showActionSheet({\n itemList: ['查看《用户服务协议》', '查看《隐私政策》', '同意并继续'],\n });\n\n if (tapIndex === 0) {\n await showAgreementDoc('service');\n return ensurePrivacyConsent();\n }\n\n if (tapIndex === 1) {\n await showAgreementDoc('privacy');\n return ensurePrivacyConsent();\n }\n\n markPrivacyConsent();\n return true;\n } catch {\n return false;\n }\n};\n\n","import React, { useEffect, useMemo, useState } from 'react';\nimport Taro, { useDidShow } from '@tarojs/taro';\nimport { Text, View } from '@tarojs/components';\nimport type { Cart } from '../../../types/cart';\nimport {\n clearMiniappCart as clearCart,\n formatPrice,\n getMiniappCart as getCart,\n removeMiniappCartItem as removeCartItem,\n updateMiniappCartItem as updateCartItem,\n} from '../../../logic/shared';\nimport { CartItemCard, FormInput, FormTextarea, PageHeader } from '../index';\nimport { batchBooking, DEFAULT_BASE_URL } from '../../../service/miniapp';\nimport useDeadlinePopup from '../../../logic/hooks/useDeadlinePopupWechat';\nimport DeadlinePopupManager from '../components/DeadlinePopup';\nimport { ensurePrivacyConsent, hasPrivacyConsent, showAgreementDoc } from '../components/privacyConsent';\n\nexport interface CartMiniappPageProps {\n apiBaseUrl?: string;\n}\n\nconst CartMiniappPage: React.FC<CartMiniappPageProps> = ({ apiBaseUrl = DEFAULT_BASE_URL }) => {\n const [cart, setCart] = useState<Cart>(() => getCart());\n const [qqNumber, setQqNumber] = useState('');\n const [phoneNumber, setPhoneNumber] = useState('');\n const [notes, setNotes] = useState('');\n const [shippingInfo, setShippingInfo] = useState('');\n const [submitting, setSubmitting] = useState(false);\n const [pendingCheckout, setPendingCheckout] = useState(false);\n const [privacyConsented, setPrivacyConsented] = useState<boolean>(() => hasPrivacyConsent());\n const [formErrors, setFormErrors] = useState<{\n qqNumber?: string;\n phoneNumber?: string;\n notes?: string;\n pickupMethod?: string;\n }>({});\n\n const {\n configs: popupConfigs,\n hasPopup,\n triggerCheck,\n closePopup,\n confirmPopup,\n cancelPopup,\n temporaryClosePopup,\n } = useDeadlinePopup('showmasterpiece', 'cart_checkout', apiBaseUrl);\n\n const cartItems = cart.items;\n\n const refreshCart = () => {\n setCart(getCart());\n };\n\n useEffect(() => {\n refreshCart();\n }, []);\n\n useDidShow(() => {\n refreshCart();\n setPrivacyConsented(hasPrivacyConsent());\n });\n\n const handleUpdateQuantity = (collectionId: number, quantity: number) => {\n const next = updateCartItem(collectionId, quantity);\n setCart(next);\n };\n\n const handleRemove = (collectionId: number) => {\n const next = removeCartItem(collectionId);\n setCart(next);\n };\n\n const totalPriceLabel = useMemo(() => formatPrice(cart.totalPrice), [cart.totalPrice]);\n\n const validateForm = () => {\n const nextErrors: typeof formErrors = {};\n const qq = qqNumber.trim();\n const phone = phoneNumber.trim();\n const pickup = shippingInfo.trim();\n const noteText = notes.trim();\n\n if (!qq) {\n nextErrors.qqNumber = '请输入QQ号';\n } else if (!/^\\d{5,11}$/.test(qq)) {\n nextErrors.qqNumber = 'QQ号格式不正确';\n }\n\n if (!phone) {\n nextErrors.phoneNumber = '请输入联系方式';\n } else if (!/^1[3-9]\\d{9}$/.test(phone)) {\n nextErrors.phoneNumber = '联系方式格式不正确';\n }\n\n if (!pickup) {\n nextErrors.pickupMethod = '请填写领取方式';\n }\n\n if (!noteText) {\n nextErrors.notes = '请填写备注信息';\n }\n\n setFormErrors(nextErrors);\n return Object.keys(nextErrors).length === 0;\n };\n\n const performCheckout = async () => {\n if (!cartItems.length) {\n Taro.showToast({ title: '购物车为空', icon: 'none' });\n return;\n }\n\n if (!validateForm()) {\n Taro.showToast({ title: '请先修正表单错误', icon: 'none' });\n return;\n }\n\n setSubmitting(true);\n try {\n await batchBooking(\n {\n qqNumber: qqNumber.trim(),\n phoneNumber: phoneNumber.trim(),\n pickupMethod: shippingInfo.trim(),\n notes: notes.trim(),\n items: cartItems.map((item) => ({\n collectionId: item.collectionId,\n quantity: item.quantity,\n })),\n },\n apiBaseUrl,\n );\n\n clearCart();\n setCart(getCart());\n setNotes('');\n setShippingInfo('');\n setFormErrors({});\n Taro.showToast({ title: '预订提交成功', icon: 'success' });\n } catch (error) {\n Taro.showToast({\n title: error instanceof Error ? error.message : '提交失败',\n icon: 'none',\n });\n } finally {\n setPendingCheckout(false);\n setSubmitting(false);\n }\n };\n\n const handleCheckout = async () => {\n const consented = await ensurePrivacyConsent();\n if (!consented) {\n Taro.showToast({ title: '请先阅读并同意协议', icon: 'none' });\n return;\n }\n setPrivacyConsented(true);\n\n if (!validateForm()) {\n Taro.showToast({ title: '请先修正表单错误', icon: 'none' });\n return;\n }\n\n const activePopups = await triggerCheck();\n if (activePopups.length > 0) {\n setPendingCheckout(true);\n return;\n }\n\n await performCheckout();\n };\n\n const handlePopupConfirm = (configId: string) => {\n const popup = popupConfigs.find((item) => item.id === configId);\n\n if (popup?.blockProcess) {\n temporaryClosePopup(configId);\n setPendingCheckout(false);\n return;\n }\n\n confirmPopup(configId);\n };\n\n const handlePopupCancel = (configId: string) => {\n const popup = popupConfigs.find((item) => item.id === configId);\n\n if (popup?.blockProcess) {\n temporaryClosePopup(configId);\n setPendingCheckout(false);\n return;\n }\n\n cancelPopup(configId);\n };\n\n useEffect(() => {\n if (!pendingCheckout || hasPopup || submitting) return;\n performCheckout();\n }, [pendingCheckout, hasPopup, submitting]);\n\n const handleClearCart = () => {\n clearCart();\n setCart(getCart());\n Taro.showToast({ title: '购物车已清空', icon: 'success' });\n };\n\n return (\n <View className=\"min-h-screen bg-gradient-to-br from-white to-prussian-blue-100 pb-12 text-rich-black\">\n <PageHeader title=\"购物车\" subtitle=\"确认画集数量并提交预订\" />\n\n <View className=\"mx-4 mt-5 flex flex-col gap-4\">\n {cartItems.length === 0 ? (\n <View className=\"rounded-2xl bg-white px-4 py-8 text-center text-sm text-prussian-blue-600 shadow-md\">\n 购物车暂无画集\n </View>\n ) : (\n cartItems.map((item) => (\n <CartItemCard\n key={item.collectionId}\n item={item}\n onIncrease={() => handleUpdateQuantity(item.collectionId, item.quantity + 1)}\n onDecrease={() => handleUpdateQuantity(item.collectionId, item.quantity - 1)}\n onRemove={() => handleRemove(item.collectionId)}\n />\n ))\n )}\n </View>\n\n <View className=\"mx-4 mt-6 rounded-3xl border border-prussian-blue-200 bg-white px-5 py-5 shadow-sm\">\n <Text className=\"text-base font-semibold text-rich-black\">批量预订信息</Text>\n\n <FormInput\n label=\"QQ号 *\"\n value={qqNumber}\n placeholder=\"请输入您的QQ号\"\n onChange={setQqNumber}\n disabled={submitting}\n error={formErrors.qqNumber}\n />\n\n <FormInput\n label=\"联系方式 *\"\n value={phoneNumber}\n placeholder=\"请输入您的联系方式\"\n onChange={setPhoneNumber}\n disabled={submitting}\n error={formErrors.phoneNumber}\n />\n\n <FormTextarea\n label=\"备注信息 *\"\n value={notes}\n placeholder={'您在葱韵环京的哪个群(方便我们联系您)\\n(1)葱韵环京ComicUniverse\\n(2)葱韵环京外星开拓群\\n(3)葱韵环京比邻星\\n(4)葱韵环京华东群\\n(5)葱韵环京天津群\\n(6)葱韵环京·四维空间'}\n onChange={setNotes}\n disabled={submitting}\n error={formErrors.notes}\n />\n\n <FormTextarea\n label=\"收货信息 *\"\n value={shippingInfo}\n placeholder={'请填写2月10号以后能收到货的地址\\n(1)收件人\\n(2)收件地址\\n(3)收件联系方式'}\n onChange={setShippingInfo}\n disabled={submitting}\n error={formErrors.pickupMethod}\n />\n\n <View className=\"mt-4 rounded-xl bg-prussian-blue-50 px-3 py-3\">\n <Text className=\"text-xs text-prussian-blue-700\">提交前请阅读并同意</Text>\n <Text\n className=\"ml-1 text-xs text-blue-600\"\n onClick={() => showAgreementDoc('service')}\n >\n 《用户服务协议》\n </Text>\n <Text className=\"text-xs text-prussian-blue-700\">与</Text>\n <Text\n className=\"ml-1 text-xs text-blue-600\"\n onClick={() => showAgreementDoc('privacy')}\n >\n 《隐私政策》\n </Text>\n <Text className=\"ml-1 text-xs text-prussian-blue-700\">\n {privacyConsented ? '(已同意)' : '(未同意)'}\n </Text>\n </View>\n\n <View className=\"mt-5 flex items-center justify-between gap-3\">\n <View\n className=\"flex h-11 flex-1 items-center justify-center rounded-xl bg-prussian-blue-100\"\n onClick={submitting ? undefined : handleClearCart}\n >\n <Text className=\"text-sm font-semibold text-prussian-blue-700\">清空购物车</Text>\n </View>\n <View\n className={`flex h-11 flex-1 items-center justify-center rounded-xl ${\n submitting ? 'bg-teal-300' : 'bg-teal-600 shadow-lg'\n }`}\n onClick={submitting ? undefined : handleCheckout}\n >\n <Text className=\"text-sm font-semibold text-white\">{submitting ? '提交中...' : '提交申请'}</Text>\n </View>\n </View>\n <Text className=\"mt-3 block text-right text-sm font-semibold text-rich-black\">合计:{totalPriceLabel}</Text>\n </View>\n\n <DeadlinePopupManager\n configs={popupConfigs}\n onClose={closePopup}\n onConfirm={handlePopupConfirm}\n onCancel={handlePopupCancel}\n />\n </View>\n );\n};\n\nexport default CartMiniappPage;\n","import React, { useMemo, useState } from 'react';\nimport Taro, { useDidShow } from '@tarojs/taro';\nimport { Text, View } from '@tarojs/components';\nimport type { Booking } from '../../../types/booking';\nimport { FormInput, HistoryRecordCard, PageHeader } from '../index';\nimport { DEFAULT_BASE_URL, getBookings } from '../../../service/miniapp';\nimport { ensurePrivacyConsent, hasPrivacyConsent, showAgreementDoc } from '../components/privacyConsent';\n\nexport interface HistoryMiniappPageProps {\n apiBaseUrl?: string;\n}\n\nconst HistoryMiniappPage: React.FC<HistoryMiniappPageProps> = ({ apiBaseUrl = DEFAULT_BASE_URL }) => {\n const [qqNumber, setQqNumber] = useState('');\n const [phoneNumber, setPhoneNumber] = useState('');\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [records, setRecords] = useState<Booking[]>([]);\n const [hasSearched, setHasSearched] = useState(false);\n const [privacyConsented, setPrivacyConsented] = useState<boolean>(() => hasPrivacyConsent());\n\n useDidShow(() => {\n setPrivacyConsented(hasPrivacyConsent());\n });\n\n const handleSearch = async () => {\n const consented = await ensurePrivacyConsent();\n if (!consented) {\n Taro.showToast({ title: '请先阅读并同意协议', icon: 'none' });\n return;\n }\n setPrivacyConsented(true);\n\n if (!qqNumber.trim() && !phoneNumber.trim()) {\n Taro.showToast({ title: '请输入QQ号或联系方式', icon: 'none' });\n return;\n }\n\n setLoading(true);\n setError(null);\n setHasSearched(true);\n\n try {\n const result = await getBookings(\n {\n qqNumber: qqNumber.trim() || undefined,\n phoneNumber: phoneNumber.trim() || undefined,\n page: 1,\n limit: 50,\n },\n apiBaseUrl,\n );\n\n setRecords(result.bookings || []);\n } catch (err) {\n setError(err instanceof Error ? err.message : '查询失败');\n setRecords([]);\n } finally {\n setLoading(false);\n }\n };\n\n const stats = useMemo(() => {\n const totalBookings = records.length;\n const totalQuantity = records.reduce((sum, item) => sum + (item.quantity || 0), 0);\n const totalAmount = records.reduce(\n (sum, item) => sum + (item.quantity || 0) * (item.collection?.price || 0),\n 0,\n );\n const completedCount = records.filter((item) => item.status === 'completed').length;\n\n return {\n totalBookings,\n totalQuantity,\n totalAmount,\n completedCount,\n };\n }, [records]);\n\n return (\n <View className=\"min-h-screen bg-gradient-to-br from-white to-prussian-blue-100 pb-12 text-rich-black\">\n <PageHeader title=\"历史记录查询\" subtitle=\"输入 QQ 或联系方式查询预订记录\" />\n\n <View className=\"mx-4 mt-5 rounded-3xl border border-prussian-blue-200 bg-white px-5 py-5 shadow-sm\">\n <FormInput\n label=\"QQ号\"\n value={qqNumber}\n placeholder=\"请输入QQ号\"\n onChange={setQqNumber}\n disabled={loading}\n />\n\n <FormInput\n label=\"联系方式\"\n value={phoneNumber}\n placeholder=\"请输入联系方式\"\n onChange={setPhoneNumber}\n disabled={loading}\n />\n\n <View className=\"mt-4 rounded-xl bg-prussian-blue-50 px-3 py-3\">\n <Text className=\"text-xs text-prussian-blue-700\">查询前请阅读并同意</Text>\n <Text\n className=\"ml-1 text-xs text-blue-600\"\n onClick={() => showAgreementDoc('service')}\n >\n 《用户服务协议》\n </Text>\n <Text className=\"text-xs text-prussian-blue-700\">与</Text>\n <Text\n className=\"ml-1 text-xs text-blue-600\"\n onClick={() => showAgreementDoc('privacy')}\n >\n 《隐私政策》\n </Text>\n <Text className=\"ml-1 text-xs text-prussian-blue-700\">\n {privacyConsented ? '(已同意)' : '(未同意)'}\n </Text>\n </View>\n\n <View\n className=\"mt-5 flex h-10 w-full items-center justify-center rounded-full\"\n style={{\n backgroundColor: loading ? '#93C5FD' : '#2563EB',\n boxShadow: loading ? 'none' : '0 8px 20px rgba(37, 99, 235, 0.28)',\n }}\n onClick={loading ? undefined : handleSearch}\n >\n <Text className=\"text-sm font-semibold text-white\">{loading ? '查询中...' : '查询记录'}</Text>\n </View>\n </View>\n\n {stats.totalBookings > 0 && (\n <View className=\"mx-4 mt-4 rounded-3xl border border-prussian-blue-200 bg-white px-4 py-4 shadow-sm\">\n <View className=\"grid grid-cols-2\">\n <View className=\"py-2\">\n <Text className=\"text-xl font-bold text-rich-black\">{stats.totalBookings}</Text>\n <Text className=\"block text-xs text-prussian-blue-600\">总预订次数</Text>\n </View>\n <View className=\"py-2\">\n <Text className=\"text-xl font-bold text-rich-black\">{stats.totalQuantity}</Text>\n <Text className=\"block text-xs text-prussian-blue-600\">总预订数量</Text>\n </View>\n <View className=\"py-2\">\n <Text className=\"text-xl font-bold text-rich-black\">¥{stats.totalAmount}</Text>\n <Text className=\"block text-xs text-prussian-blue-600\">总预订金额</Text>\n </View>\n <View className=\"py-2\">\n <Text className=\"text-xl font-bold text-rich-black\">{stats.completedCount}</Text>\n <Text className=\"block text-xs text-prussian-blue-600\">已完成</Text>\n </View>\n </View>\n </View>\n )}\n\n <View className=\"mx-4 mt-6 flex flex-col gap-4\">\n {error && (\n <View className=\"rounded-2xl bg-rose-50 px-4 py-3 text-rose-700\">\n <Text className=\"text-xs\">{error}</Text>\n </View>\n )}\n\n {hasSearched && !loading && !error && records.length === 0 && (\n <View className=\"rounded-2xl bg-white px-4 py-8 text-center text-sm text-prussian-blue-600 shadow-md\">\n 暂无记录\n </View>\n )}\n\n {records.map((record) => (\n <HistoryRecordCard key={record.id} record={record} />\n ))}\n </View>\n </View>\n );\n};\n\nexport default HistoryMiniappPage;\n"]}