import { useEffect, useState } from 'react'; import { useNavigate, useParams } from 'react-router-dom'; import type { StorePackagesResponse } from '@dukang/shared-types'; import { normalizeStorePackageImageUrls } from '@dukang/shared-types'; import StorePackagesForm from '../components/StorePackagesForm'; import { request } from '../lib/api'; import { toastError, toastSuccess } from '../lib/toast'; import { emptyPackage, normalizePackageFormItems, validatePackageFormItems, type PackageFormItem, } from '../lib/storePackages'; export default function StorePackagesPage() { const { id } = useParams(); const navigate = useNavigate(); const [items, setItems] = useState([emptyPackage()]); const [pending, setPending] = useState(null); const [loading, setLoading] = useState(true); const [submitting, setSubmitting] = useState(false); const [error, setError] = useState(''); useEffect(() => { if (!id) return; setLoading(true); request('PARTNER_H5', `/partner/stores/${id}/packages`) .then((data) => { 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); }) .catch((e) => setError(e instanceof Error ? e.message : '加载失败')) .finally(() => setLoading(false)); }, [id]); async function submitAudit() { if (!id) return; const msg = validatePackageFormItems(items); if (msg) { toastError(msg); return; } if (pending?.status === 'PENDING') { toastError('已有套餐变更审核中,请等待总部处理'); return; } setSubmitting(true); try { const packages = normalizePackageFormItems(items).map((p) => ({ ...p, price: Number(p.price).toFixed(2), })); await request('PARTNER_H5', `/partner/stores/${id}/packages`, { method: 'PUT', body: JSON.stringify({ packages }), }); toastSuccess('已提交审核'); navigate(`/stores/${id}`); } catch (e) { toastError(e instanceof Error ? e.message : '提交失败'); } finally { setSubmitting(false); } } if (loading) { return (

加载中…

); } return (

门店套餐

{error ?

{error}

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

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

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

上次驳回:{pending.rejectReason}

) : null}

套餐信息

提交后将由总部审核,通过后 C 端展示生效套餐。

); }