v4.0.17 小程序版本优化
CI / verify (pull_request) Has been cancelled

This commit is contained in:
2026-09-03 23:28:37 +08:00
parent 8a196c377e
commit 0e711be6c6
18 changed files with 254 additions and 84 deletions
@@ -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">