import { useEffect, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import type { StorePackagesResponse } from '@dukang/shared-types'; import { normalizeStorePackageImageUrls } from '@dukang/shared-types'; import PullToRefresh from '@dukang/shared-ui/PullToRefresh'; import ShopPackagesForm from '../components/ShopPackagesForm'; import { request } from '../lib/api'; import { useStorePageView } from '../lib/usePageView'; import { emptyPackage, normalizePackageFormItems, validatePackageFormItems, type PackageFormItem, } from '../lib/storePackages'; export default function PackagesPage() { useStorePageView('store_packages_view'); const navigate = useNavigate(); const [items, setItems] = useState([emptyPackage()]); const [pending, setPending] = useState(null); const [loading, setLoading] = useState(true); const [submitting, setSubmitting] = useState(false); const [msg, setMsg] = useState(''); async function load() { setLoading(true); try { const data = await request('SHOP_H5', '/shop/store/packages'); const base = data.pendingRequest?.packages?.length ? data.pendingRequest.packages : data.live?.length ? data.live : [emptyPackage()]; setItems( base.map((p, i) => { const imageUrls = normalizeStorePackageImageUrls(p); return { ...p, price: String(p.price), imageUrl: imageUrls[0] ?? '', imageUrls, sortOrder: i, }; }), ); setPending(data.pendingRequest ?? null); setMsg(''); } catch (e) { setMsg(e instanceof Error ? e.message : '加载失败'); } finally { setLoading(false); } } useEffect(() => { void load(); }, []); async function submitAudit() { const validationMsg = validatePackageFormItems(items); if (validationMsg) { setMsg(validationMsg); return; } if (pending?.status === 'PENDING') { setMsg('已有套餐变更审核中,请等待总部处理'); return; } setSubmitting(true); setMsg(''); try { const packages = normalizePackageFormItems(items).map((p) => ({ ...p, price: Number(p.price).toFixed(2), })); await request('SHOP_H5', '/shop/store/packages', { method: 'PUT', body: JSON.stringify({ packages }), }); setMsg('已提交审核,请等待总部处理'); await load(); } catch (e) { setMsg(e instanceof Error ? e.message : '提交失败'); } finally { setSubmitting(false); } } const disabled = pending?.status === 'PENDING' || submitting; return (

门店套餐

{loading ?

加载中…

: null} {!loading && pending?.status === 'PENDING' ? (
hourglass_top

套餐变更审核中,用户端仍展示上一版生效套餐。

) : null} {!loading && pending?.status === 'REJECTED' && pending.rejectReason ? (
error

上次驳回:{pending.rejectReason}

) : null} {!loading ? ( <>

维护门店可核销套餐信息,提交后由总部审核通过后在用户端展示。

) : null} {msg ?

{msg}

: null} {!loading ? ( ) : null}
); }