import { useCallback, useEffect, useMemo, useState } from 'react'; import { View, Text, Image } from '@tarojs/components'; import Taro, { useDidShow, usePageScroll, useRouter, useShareAppMessage, useShareTimeline, } from '@tarojs/taro'; import type { ProductDetailContentDto } from '@dukang/shared-types'; import PageShell from '../../components/PageShell'; import PageNavBar from '../../components/PageNavBar'; import ProductCarousel from '../../components/ProductCarousel'; import ShareNavButton from '../../components/ShareNavButton'; import WechatShareReady from '../../components/WechatShareReady'; import { goLogin } from '../../lib/auth-nav'; import { ensurePayReady } from '../../lib/pay-ready'; import { isLoggedIn, request, toast } from '../../lib/api'; import { getProductCarouselImages, getProductDetailImages, getProductMainImage, type ProductImageSource, } from '../../lib/product-images'; import { canBuyOnline, canPickupOnSite, normalizeFulfillmentFlags, } from '../../lib/product-fulfillment'; import { DEFAULT_SHARE_DESC, DEFAULT_SHARE_TITLE, toWeappShareMessage, } from '../../lib/wechat-share'; import iconHome from '../../assets/tabbar/home.png'; import { usePageView } from '../../lib/usePageView'; type Product = ProductImageSource & { id: string; name: string; subtitle?: string | null; price: number; benefitAmount?: number; benefitDisplay?: number; detailContent?: ProductDetailContentDto | null; allowOnSitePickup?: boolean; allowOnlinePurchase?: boolean; allowCrossCityDelivery?: boolean; }; export default function ProductDetailPage() { const router = useRouter(); const productId = router.params.id ?? ''; usePageView( 'product_detail_view', productId ? { refType: 'PRODUCT', refId: productId, productId } : undefined, ); const [product, setProduct] = useState(null); const [headerSolid, setHeaderSolid] = useState(false); usePageScroll(({ scrollTop }) => { setHeaderSolid(scrollTop > 100); }); const loadProduct = useCallback(() => { if (!productId) return; request(`/catalog/products/${productId}`) .then((p) => { if (!p) { setProduct(null); toast('商品不存在或暂未开放'); return; } setProduct(normalizeFulfillmentFlags(p)); }) .catch((e) => { setProduct(null); toast(e instanceof Error ? e.message : '加载失败'); }); }, [productId]); useEffect(() => { loadProduct(); }, [loadProduct]); // 登录后返回详情须带 token 重拉,否则白名单商品会一直空白 useDidShow(() => { loadProduct(); }); const sharePayload = useMemo( () => ({ title: product?.name || DEFAULT_SHARE_TITLE, desc: product?.subtitle || DEFAULT_SHARE_DESC, path: `/pages/product-detail/index?id=${productId}`, imgUrl: (product ? getProductMainImage(product) : '') || undefined, }), [product, productId], ); useShareAppMessage(() => toWeappShareMessage(sharePayload)); useShareTimeline(() => ({ title: sharePayload.title || DEFAULT_SHARE_TITLE, query: productId ? `id=${productId}` : '', imageUrl: sharePayload.imgUrl, })); function goBack() { const pages = Taro.getCurrentPages(); if (pages.length > 1) { Taro.navigateBack(); return; } Taro.switchTab({ url: '/pages/home/index' }); } function goHome() { Taro.switchTab({ url: '/pages/home/index' }); } async function goBuy() { if (!productId) return; const returnPath = `/pages/order-confirm/index?productId=${productId}&qty=2`; if (!isLoggedIn()) { goLogin(returnPath); return; } const ready = await ensurePayReady(returnPath); if (!ready) return; Taro.navigateTo({ url: returnPath }); } async function goOnSitePickup() { if (!productId) return; const returnPath = `/pages/order-confirm-pickup/index?productId=${productId}&qty=1`; if (!isLoggedIn()) { goLogin(returnPath); return; } const ready = await ensurePayReady(returnPath); if (!ready) return; Taro.navigateTo({ url: returnPath }); } if (!product) { return ( 加载中… ); } const allowOnline = canBuyOnline(product); const allowOnSite = canPickupOnSite(product); const benefit = Number(product.benefitDisplay ?? product.benefitAmount ?? product.price); const carouselImages = getProductCarouselImages(product); const detailImages = getProductDetailImages(product); const detail = product.detailContent ?? {}; const features = detail.features ?? []; return ( } /> ¥ {Number(product.price).toFixed(2)} {product.name} {product.subtitle ? ( {product.subtitle} ) : null} 买杜康美酒 · 享全城好客礼遇 ¥{benefit} 购酒即享本城专属好客权益,为您安排一场地道饭局。权益金可直接用于本地签约门店消费,到店享用,醇香美酒配佳肴。 商品详情 {detailImages.map((src, index) => ( ))} {(detail.storyTitle || detail.storyText || features.length > 0) ? ( {(detail.storyTitle || detail.storyText) ? ( {detail.storyTitle ? ( {detail.storyTitle} ) : null} {detail.storyText ? ( {detail.storyText} ) : null} ) : null} {features.length > 0 ? ( {features.map((f) => ( {f.title} {f.desc} ))} ) : null} ) : null} 首页 {allowOnSite ? ( void goOnSitePickup()}> 现场取货 ) : null} {allowOnline ? ( void goBuy()}> 立即购买 ) : null} {!allowOnline && !allowOnSite ? ( 暂不可购 ) : null} ); }