import { useState } from 'react'; import type { PackageFormItem } from '../lib/storePackages'; import { STORE_PACKAGE_IMAGE_MAX_COUNT, STORE_PACKAGE_MAX_COUNT } from '@dukang/shared-types'; import { emptyPackage } from '../lib/storePackages'; import MultiOssUploadField from './MultiOssUploadField'; type Props = { items: PackageFormItem[]; onChange: (items: PackageFormItem[]) => void; disabled?: boolean; /** 嵌入拓店流程时不重复外层卡片边距 */ embedded?: boolean; }; export default function StorePackagesForm({ items, onChange, disabled, embedded }: Props) { const [collapsed, setCollapsed] = useState>({}); function updateAt(index: number, patch: Partial) { const next = items.map((item, i) => (i === index ? { ...item, ...patch } : item)); onChange(next); } function addItem() { if (items.length >= STORE_PACKAGE_MAX_COUNT) return; onChange([...items, emptyPackage(items.length)]); } function removeAt(index: number) { onChange(items.filter((_, i) => i !== index).map((item, i) => ({ ...item, sortOrder: i }))); setCollapsed((prev) => { const next: Record = {}; Object.entries(prev).forEach(([k, v]) => { const i = Number(k); if (i < index) next[i] = v; else if (i > index) next[i - 1] = v; }); return next; }); } function toggleCollapse(index: number) { setCollapsed((prev) => ({ ...prev, [index]: !prev[index] })); } const list = items.length ? items : [emptyPackage(0)]; return (
{list.map((item, index) => { const isCollapsed = !!collapsed[index]; const displayName = item.name.trim() || `套餐 ${index + 1}`; return (
{!disabled && list.length > 1 ? ( ) : null}
{!isCollapsed ? ( <>
restaurant updateAt(index, { name: e.target.value })} />
payments updateAt(index, { price: e.target.value })} />