import { useCallback, useState } from 'react'; import { View, Text, Image } from '@tarojs/components'; import Taro, { useLoad, useRouter } from '@tarojs/taro'; import PageShell from '../../components/PageShell'; import PageNavBar from '../../components/PageNavBar'; import { request, toast } from '../../lib/api'; type StorePackage = { name: string; price: string | number; dishes: string; usableTime?: string | null; otherNotes?: string | null; imageUrl?: string | null; }; type Store = { id: string; name: string; packages?: StorePackage[] | null; }; function pickStoreId(raw?: string | null) { return String(raw || '') .trim() .replace(/[^\d]/g, ''); } function parsePackageIndex(raw?: string | null) { const n = Number.parseInt(String(raw ?? ''), 10); return Number.isFinite(n) && n >= 0 ? n : -1; } function formatPriceYuan(price: string | number) { const n = typeof price === 'number' ? price : Number(price); if (!Number.isFinite(n)) return '0'; if (Math.abs(n - Math.round(n)) < 1e-9) return String(Math.round(n)); return n.toFixed(2).replace(/\.?0+$/, ''); } export default function StorePackageDetailPage() { const router = useRouter(); const [storeId, setStoreId] = useState(() => pickStoreId(router.params.storeId)); const [storeName, setStoreName] = useState(''); const [pkg, setPkg] = useState(null); const [loading, setLoading] = useState(true); const [loadError, setLoadError] = useState(''); const loadPackage = useCallback(async (sid: string, index: number) => { if (!sid) { setLoading(false); setLoadError('缺少门店参数'); return; } if (index < 0) { setLoading(false); setLoadError('套餐不存在'); return; } setLoadError(''); setLoading(true); try { const data = await request(`/stores/${sid}`); const packages = data?.packages ?? []; const item = packages[index]; if (!data?.id || !item) { setPkg(null); setLoadError('套餐不存在或已下架'); toast('套餐不存在或已下架'); return; } setStoreName(data.name); setPkg(item); } catch (e) { const msg = e instanceof Error ? e.message : '加载失败'; setLoadError(msg); toast(msg); } finally { setLoading(false); } }, []); useLoad((options) => { const sid = pickStoreId(options?.storeId || router.params.storeId); const index = parsePackageIndex(options?.index ?? router.params.index); setStoreId(sid); void loadPackage(sid, index); }); function goBack() { const pages = Taro.getCurrentPages(); if (pages.length > 1) Taro.navigateBack(); else if (storeId) { Taro.redirectTo({ url: `/pages/store-detail/index?id=${storeId}` }); } else { Taro.switchTab({ url: '/pages/stores/index' }); } } function previewImage(url: string) { Taro.previewImage({ urls: [url], current: url }).catch(() => toast('无法预览图片')); } if (loading) { return ( 加载中… ); } if (!pkg) { return ( {loadError || '套餐不存在'} ); } const imageUrl = (pkg.imageUrl || '').trim(); return ( {pkg.name} ¥{formatPriceYuan(pkg.price)} {storeName ? ( {storeName} ) : null} {imageUrl ? ( previewImage(imageUrl)} > ) : null} 菜品 {pkg.dishes || '—'} {pkg.usableTime ? ( 使用时间 {pkg.usableTime} ) : null} {pkg.otherNotes ? ( 其他说明 {pkg.otherNotes} ) : null} ); }