import { View, Text, ScrollView, Image } from '@tarojs/components' import Taro from '@tarojs/taro' import { useState, useEffect, useCallback } from 'react' import './index.scss' import { getDesignList, removeDesigns, type DesignItem } from '../../utils/store' import { PRODUCT_ICON_MAP } from '../../utils/productConfig' import { assetUrl } from '../../utils/asset' import { useThemeContext } from '../../context/ThemeContext' import { useSafeArea } from '../../hooks/useSafeArea' import { useStatusBar } from '../../hooks/useStatusBar' import LoginGuard from '../../components/LoginGuard' import ThemedPageMeta from '../../components/ThemedPageMeta' const STATUS_TABS = [ { code: 'all', label: '全部' }, { code: 'toDesign', label: '待设计' }, { code: 'undesigned', label: '未设计' }, { code: 'designing', label: '设计中' }, { code: 'ordered', label: '已下单' } ] const VISIBLE_STATUS_TABS = STATUS_TABS.filter(tab => tab.code !== 'undesigned') const STATUS_STYLE: Record = { undesigned: { label: '未设计', cls: 'badge-pink' }, designing: { label: '设计中', cls: 'badge-blue' }, ordered: { label: '已下单', cls: 'badge-green' } } export default function DesignListPage() { const { resolvedTheme } = useThemeContext() const safe = useSafeArea() useStatusBar(resolvedTheme) const [activeTab, setActiveTab] = useState('all') const [list, setList] = useState([]) const [managing, setManaging] = useState(false) const [selected, setSelected] = useState>(new Set()) const load = useCallback(() => { setList(getDesignList()) }, []) const init = useCallback(() => { const filter = Taro.getStorageSync('designList:filter') if (filter && STATUS_TABS.some(t => t.code === filter)) { setActiveTab(filter) Taro.removeStorageSync('designList:filter') } load() }, [load]) useEffect(() => { const page = Taro.getCurrentInstance().page if (page) { const orig = page.onShow page.onShow = function () { init() if (orig) orig.apply(this) } } init() }, [init]) const filtered = activeTab === 'all' ? list : activeTab === 'toDesign' ? list.filter(d => d.status === 'undesigned' || d.status === 'designing') : list.filter(d => d.status === activeTab) const goDesign = (item: DesignItem) => { if (item.status === 'ordered') { Taro.showToast({ title: '该商品已下单,请查看订单', icon: 'none' }) return } Taro.navigateTo({ url: `/pages/diy/index?source=designList&designId=${item.id}` }) } const toggleSelect = (id: string) => { const next = new Set(selected) if (next.has(id)) next.delete(id) else next.add(id) setSelected(next) } const toggleSelectAll = () => { if (selected.size === filtered.length) { setSelected(new Set()) } else { setSelected(new Set(filtered.map(i => i.id))) } } const handleDelete = () => { if (selected.size === 0) return Taro.showModal({ title: '确认删除', content: `确定删除选中的 ${selected.size} 个条目吗?`, success: (res) => { if (res.confirm) { removeDesigns(Array.from(selected)) setSelected(new Set()) setManaging(false) load() } } }) } const handleManage = () => { if (managing) { setManaging(false) setSelected(new Set()) } else { setManaging(true) } } return ( 我的设计清单 {managing ? '完成' : '管理'} {/* 状态筛选 */} {VISIBLE_STATUS_TABS.map(tab => ( setActiveTab(tab.code)} > {tab.label} ))} {/* 批量管理工具栏 */} {managing && ( 0 ? 'checked' : ''}`} /> 全选 ({selected.size}/{filtered.length}) 0 ? 'active' : ''}`} onTap={handleDelete}> 删除 )} {/* 列表 */} {filtered.map(item => { const style = STATUS_STYLE[item.status] const rawIcon = (item.productIcon || '').startsWith('/icon/') || /^https?:/i.test(item.productIcon || '') ? item.productIcon : PRODUCT_ICON_MAP[item.productId] || '/icon/四角星.svg' const iconSrc = assetUrl(rawIcon) const isSelected = selected.has(item.id) return ( managing ? toggleSelect(item.id) : undefined} > {managing && ( )} {item.productName} {style.label} 数量: {item.count} 件 | 单价: ¥{item.unitPrice} 小计: ¥{(item.unitPrice * item.count).toFixed(2)} {!managing && ( {item.status !== 'ordered' && ( goDesign(item)}> {item.status === 'undesigned' ? '开始设计' : '继续设计'} )} {item.status === 'ordered' && ( Taro.switchTab({ url: '/pages/orders/index' })}> 查看订单 )} )} ) })} {filtered.length === 0 && ( 还没有设计清单 去首页逛逛,找到喜欢的定制品 Taro.switchTab({ url: '/pages/index/index' })}> 去逛逛 )} ) }