@@ -1,4 +1,6 @@
|
||||
export default definePageConfig({
|
||||
navigationStyle: 'custom',
|
||||
navigationBarTitleText: '套餐详情',
|
||||
});
|
||||
enableShareAppMessage: true,
|
||||
enableShareTimeline: true,
|
||||
});
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { useCallback, useState } from 'react';
|
||||
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
||||
import { View, Text } from '@tarojs/components';
|
||||
import '../../styles/store-detail.css';
|
||||
import '../../styles/product-detail.css';
|
||||
@@ -7,7 +7,13 @@ import { normalizeStorePackageImageUrls } from '@dukang/shared-types';
|
||||
import PageShell from '../../components/PageShell';
|
||||
import PageNavBar from '../../components/PageNavBar';
|
||||
import ProductCarousel from '../../components/ProductCarousel';
|
||||
import WechatShareReady from '../../components/WechatShareReady';
|
||||
import { request, toast } from '../../lib/api';
|
||||
import {
|
||||
buildSceneSharePayload,
|
||||
toWeappShareMessage,
|
||||
toWeappShareTimeline,
|
||||
} from '../../lib/wechat-share';
|
||||
|
||||
type StorePackage = {
|
||||
name: string;
|
||||
@@ -46,6 +52,7 @@ function formatPriceYuan(price: string | number) {
|
||||
export default function StorePackageDetailPage() {
|
||||
const router = useRouter();
|
||||
const [storeId, setStoreId] = useState(() => pickStoreId(router.params.storeId));
|
||||
const [packageIndex, setPackageIndex] = useState(() => parsePackageIndex(router.params.index));
|
||||
const [storeName, setStoreName] = useState('');
|
||||
const [pkg, setPkg] = useState<StorePackage | null>(null);
|
||||
const [loading, setLoading] = useState(true);
|
||||
@@ -89,10 +96,34 @@ export default function StorePackageDetailPage() {
|
||||
const sid = pickStoreId(options?.storeId || router.params.storeId);
|
||||
const index = parsePackageIndex(options?.index ?? router.params.index);
|
||||
setStoreId(sid);
|
||||
setPackageIndex(index);
|
||||
void loadPackage(sid, index);
|
||||
});
|
||||
|
||||
function goBack() {
|
||||
const imageUrls = useMemo(
|
||||
() => (pkg ? normalizeStorePackageImageUrls(pkg) : []),
|
||||
[pkg],
|
||||
);
|
||||
|
||||
const sharePayload = useMemo(
|
||||
() =>
|
||||
buildSceneSharePayload('storeDetail', {
|
||||
path: `/pages/store-package-detail/index?storeId=${storeId}&index=${packageIndex}`,
|
||||
dynamicTitle: pkg
|
||||
? storeName
|
||||
? `${pkg.name} · ${storeName}`
|
||||
: pkg.name
|
||||
: undefined,
|
||||
dynamicDesc: pkg?.dishes?.trim() || undefined,
|
||||
dynamicImageUrl: imageUrls[0] || undefined,
|
||||
}),
|
||||
[imageUrls, pkg, packageIndex, storeId, storeName],
|
||||
);
|
||||
const sharePayloadRef = useRef(sharePayload);
|
||||
sharePayloadRef.current = sharePayload;
|
||||
const shareQuery = storeId ? `storeId=${storeId}&index=${packageIndex}` : '';
|
||||
|
||||
const goBack = useCallback(() => {
|
||||
const pages = Taro.getCurrentPages();
|
||||
if (pages.length > 1) Taro.navigateBack();
|
||||
else if (storeId) {
|
||||
@@ -100,30 +131,36 @@ export default function StorePackageDetailPage() {
|
||||
} else {
|
||||
Taro.switchTab({ url: '/pages/stores/index' });
|
||||
}
|
||||
}
|
||||
}, [storeId]);
|
||||
|
||||
if (loading) {
|
||||
return (
|
||||
<PageShell variant="scroll" className="store-package-detail-page">
|
||||
<PageNavBar title="套餐详情" solid onBack={goBack} />
|
||||
<View className="page-with-nav-bar u-empty">加载中…</View>
|
||||
</PageShell>
|
||||
);
|
||||
}
|
||||
// 不用 useShare* Hook:Taro 编译会把它们折进 return,触发 React #310
|
||||
useEffect(() => {
|
||||
const page = Taro.getCurrentInstance().page as
|
||||
| {
|
||||
onShareAppMessage?: () => ReturnType<typeof toWeappShareMessage>;
|
||||
onShareTimeline?: () => ReturnType<typeof toWeappShareTimeline>;
|
||||
}
|
||||
| undefined;
|
||||
if (!page) return;
|
||||
page.onShareAppMessage = () => toWeappShareMessage(sharePayloadRef.current);
|
||||
page.onShareTimeline = () => toWeappShareTimeline(sharePayloadRef.current, shareQuery);
|
||||
}, [shareQuery]);
|
||||
|
||||
if (!pkg) {
|
||||
return (
|
||||
<PageShell variant="scroll" className="store-package-detail-page">
|
||||
<WechatShareReady payload={sharePayload} />
|
||||
<PageNavBar title="套餐详情" solid onBack={goBack} />
|
||||
<View className="page-with-nav-bar u-empty">{loadError || '套餐不存在'}</View>
|
||||
<View className="page-with-nav-bar u-empty">
|
||||
{loading ? '加载中…' : loadError || '套餐不存在'}
|
||||
</View>
|
||||
</PageShell>
|
||||
);
|
||||
}
|
||||
|
||||
const imageUrls = normalizeStorePackageImageUrls(pkg);
|
||||
|
||||
return (
|
||||
<PageShell variant="scroll" className="store-package-detail-page">
|
||||
<WechatShareReady payload={sharePayload} />
|
||||
<PageNavBar title={pkg.name} solid titleVisible onBack={goBack} />
|
||||
|
||||
<View className="store-package-detail-body">
|
||||
|
||||
Reference in New Issue
Block a user