import { useEffect, useState } from 'react'; import { Button, Checkbox, Empty, Input, InputNumber, Modal, Popconfirm, Space, Switch, Table, Tag, Tooltip, Typography, } from 'antd'; import type { TableProps } from 'antd'; import { DeleteOutlined, EditOutlined, PlusOutlined } from '@ant-design/icons'; import { huyaApi, type HuyaCollabShop } from '../api/modules'; import { message } from '../utils/antdMessage'; import { getErrorMessage } from '../utils/error'; const { Text } = Typography; /** * 店铺管理:维护「新建协作单」下拉里的店铺。 * * - 加 / 排序 / 备注 / 停用(停用=不再出现在新建下拉,历史订单照旧); * - **重命名**会级联更新已有订单里的店铺名(弹窗里可取消勾选), * 否则筛选里会同时出现新旧两个名字; * - 删除只删字典行、不动订单(需要 `huya:collab:manage`)。 */ export default function HuyaCollabShopModal({ open, shops, canEdit, canManage, onClose, onChanged, }: { open: boolean; shops: HuyaCollabShop[]; canEdit: boolean; canManage: boolean; onClose: () => void; onChanged: () => void; }) { const [newName, setNewName] = useState(''); const [busy, setBusy] = useState(false); const [renameTarget, setRenameTarget] = useState(null); const [renameValue, setRenameValue] = useState(''); const [renameOrders, setRenameOrders] = useState(true); useEffect(() => { if (!open) { setNewName(''); setRenameTarget(null); } }, [open]); const create = async () => { const name = newName.trim(); if (!name) { message.warning('请先输入店铺名'); return; } setBusy(true); try { await huyaApi.createCollabShop({ name }); message.success(`已添加店铺「${name}」`); setNewName(''); onChanged(); } catch (e: unknown) { message.error(getErrorMessage(e)); } finally { setBusy(false); } }; const patch = async (shop: HuyaCollabShop, payload: { sort_order?: number; is_active?: boolean; remark?: string }) => { setBusy(true); try { await huyaApi.updateCollabShop(shop.id, payload); onChanged(); } catch (e: unknown) { message.error(getErrorMessage(e)); onChanged(); } finally { setBusy(false); } }; const submitRename = async () => { if (!renameTarget) return; const name = renameValue.trim(); if (!name || name === renameTarget.name) { setRenameTarget(null); return; } setBusy(true); try { await huyaApi.updateCollabShop(renameTarget.id, { name, rename_orders: renameOrders }); message.success(renameOrders ? `已重命名为「${name}」,已有订单里的旧名字也同步了` : `已重命名为「${name}」`); setRenameTarget(null); onChanged(); } catch (e: unknown) { message.error(getErrorMessage(e)); } finally { setBusy(false); } }; const remove = async (shop: HuyaCollabShop) => { setBusy(true); try { await huyaApi.deleteCollabShop(shop.id); message.success(`已从字典删除「${shop.name}」`); onChanged(); } catch (e: unknown) { message.error(getErrorMessage(e)); } finally { setBusy(false); } }; const columns: TableProps['columns'] = [ { title: '店铺名', dataIndex: 'name', width: 180, render: (value: string, row) => ( {value} {!row.is_active && 已停用} {canEdit && ( } width={860} destroyOnHidden > 这里的店铺就是新建协作单时下拉里能点选的那些。停用只是不再出现在新建下拉里, 历史订单不受影响;重命名可以选择是否同步已有订单。 {canEdit && ( setNewName(event.target.value)} onPressEnter={() => void create()} /> )} rowKey="id" size="small" columns={columns} dataSource={shops} pagination={false} scroll={{ y: 320 }} locale={{ emptyText: , }} /> setRenameTarget(null)} onOk={() => void submitRename()} confirmLoading={busy} okText="保存" destroyOnHidden > setRenameValue(event.target.value)} onPressEnter={() => void submitRename()} /> setRenameOrders(event.target.checked)}> 同时更新已有订单里的店铺名(不勾选的话,筛选里会同时出现新旧两个名字) ); }