import { useRef, useState } from 'react'; import { STORE_PACKAGE_MAX_COUNT } from '@dukang/shared-types'; import { emptyPackage, type PackageFormItem } from '../lib/storePackages'; import { uploadFileToOss } from '../lib/upload'; type Props = { items: PackageFormItem[]; onChange: (items: PackageFormItem[]) => void; disabled?: boolean; }; export default function ShopPackagesForm({ items, onChange, disabled }: Props) { const [collapsed, setCollapsed] = useState>({}); const [uploadingIndex, setUploadingIndex] = useState(null); const fileRefs = useRef>({}); async function pickPackageImage(index: number, file?: File | null) { if (!file || disabled) return; setUploadingIndex(index); try { const result = await uploadFileToOss(file, 'STORE_PACKAGE'); updateAt(index, { imageUrl: result.url }); } finally { setUploadingIndex(null); } } function updateAt(index: number, patch: Partial) { onChange(items.map((item, i) => (i === index ? { ...item, ...patch } : item))); } 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 ? ( <>