import { useEffect, useState } from 'react'; import { Button, Space } from 'antd'; import { ArrowDownOutlined, ArrowUpOutlined, DeleteOutlined, PlusOutlined } from '@ant-design/icons'; import { parseMiniHomeBanners, serializeMiniHomeBanners, } from '@dukang/shared-types'; import OssUpload from './OssUpload'; const MAX_BANNERS = 8; /** 编辑态保留空位;下发/入库仍用 parseMiniHomeBanners 过滤空串 */ function parseBannersForEdit(raw?: string | null): string[] { if (!raw?.trim()) return []; try { const parsed = JSON.parse(raw.trim()) as unknown; if (!Array.isArray(parsed)) return parseMiniHomeBanners(raw); return parsed .filter((u): u is string => typeof u === 'string') .map((u) => u.trim()) .slice(0, MAX_BANNERS); } catch { return parseMiniHomeBanners(raw); } } /** Ant Form 控件:单图 URL 字符串(默认 OSS 路径 footer) */ export function ConfigImageField({ value, onChange, bizType = 'footer', }: { value?: string; onChange?: (url: string) => void; bizType?: string; }) { return ( onChange?.(url ?? '')} placeholder="上传或粘贴图片 URL" /> ); } /** Ant Form 控件:多图 JSON 字符串(默认 OSS 路径 swiper) */ export function ConfigImageListField({ value, onChange, bizType = 'swiper', }: { value?: string; onChange?: (json: string) => void; bizType?: string; }) { const [urls, setUrls] = useState(() => parseBannersForEdit(value)); useEffect(() => { setUrls(parseBannersForEdit(value)); }, [value]); /** 本地可含空位;写入 Form 时去掉空串 */ function commit(next: string[]) { const clipped = next.slice(0, MAX_BANNERS); setUrls(clipped); onChange?.(serializeMiniHomeBanners(clipped)); } function updateAt(index: number, url: string) { const next = [...urls]; next[index] = url; commit(next); } function removeAt(index: number) { commit(urls.filter((_, i) => i !== index)); } function move(index: number, delta: number) { const target = index + delta; if (target < 0 || target >= urls.length) return; const next = [...urls]; const tmp = next[index]; next[index] = next[target]; next[target] = tmp; commit(next); } function add() { if (urls.length >= MAX_BANNERS) return; // 只加本地空位,避免 serialize 过滤空串导致「点击无反应」 setUrls((prev) => [...prev, '']); } return ( {urls.map((url, index) => (
updateAt(index, u)} placeholder="上传或粘贴图片 URL" />
); }