import { useEffect, useState } from 'react'; import { Button, Col, Empty, Input, InputNumber, Modal, Popconfirm, Row, Space, Switch, Table, Tag, Tooltip, Typography, } from 'antd'; import type { TableProps } from 'antd'; import { DeleteOutlined, EditOutlined, PlusOutlined } from '@ant-design/icons'; import { huyaApi, type HuyaCollabGiftCatalog } from '../api/modules'; import { message } from '../utils/antdMessage'; import { getErrorMessage } from '../utils/error'; const { Text } = Typography; /** * 虎牙协作礼包字典:管理员维护标准名称和所需积分,客服只能选择。 * * - 停用后不再出现在新建下拉里,历史订单继续显示原值; * - 改名会同步所有历史订单上的礼包名; * - 改积分只影响之后新建 / 换礼包时的默认值,不回填历史积分快照; * - 删除只删字典行,仍有订单使用时会拒绝。 */ export default function HuyaCollabGiftModal({ open, gifts, canManage, onClose, onChanged, }: { open: boolean; gifts: HuyaCollabGiftCatalog[]; canManage: boolean; onClose: () => void; onChanged: () => void; }) { const [newName, setNewName] = useState(''); const [newPoints, setNewPoints] = useState(null); const [busy, setBusy] = useState(false); const [editTarget, setEditTarget] = useState(null); const [editName, setEditName] = useState(''); const [editPoints, setEditPoints] = useState(null); const [editRemark, setEditRemark] = useState(''); useEffect(() => { if (!open) { setNewName(''); setNewPoints(null); setEditTarget(null); } }, [open]); const create = async () => { const name = newName.trim(); if (!name) { message.warning('请先输入礼包名'); return; } if (newPoints === null) { message.warning('请填写礼包所需积分'); return; } setBusy(true); try { await huyaApi.createCollabGift({ name, points: newPoints }); message.success(`已添加礼包「${name}」`); setNewName(''); setNewPoints(null); onChanged(); } catch (error) { message.error(getErrorMessage(error)); } finally { setBusy(false); } }; const patch = async ( gift: HuyaCollabGiftCatalog, payload: { sort_order?: number; is_active?: boolean; remark?: string }, ) => { setBusy(true); try { await huyaApi.updateCollabGift(gift.id, payload); onChanged(); } catch (error) { message.error(getErrorMessage(error)); onChanged(); } finally { setBusy(false); } }; const openEdit = (gift: HuyaCollabGiftCatalog) => { setEditTarget(gift); setEditName(gift.name); setEditPoints(gift.points); setEditRemark(gift.remark || ''); }; const submitEdit = async () => { if (!editTarget) return; const name = editName.trim(); if (!name) { message.warning('礼包名不能为空'); return; } if (editPoints === null) { message.warning('请填写礼包所需积分'); return; } setBusy(true); try { await huyaApi.updateCollabGift(editTarget.id, { name, points: editPoints, remark: editRemark.trim(), }); message.success( name === editTarget.name ? `已保存礼包「${name}」` : `已改名为「${name}」,历史协作单里的礼包名也已同步`, ); setEditTarget(null); onChanged(); } catch (error) { message.error(getErrorMessage(error)); } finally { setBusy(false); } }; const remove = async (gift: HuyaCollabGiftCatalog) => { setBusy(true); try { await huyaApi.deleteCollabGift(gift.id); message.success(`已删除礼包「${gift.name}」`); onChanged(); } catch (error) { message.error(getErrorMessage(error)); } finally { setBusy(false); } }; const columns: TableProps['columns'] = [ { title: '礼包名', dataIndex: 'name', width: 280, render: (value: string, row) => ( {value} {!row.is_active && 已停用} {canManage && ( } width={940} destroyOnHidden > 先在这里维护标准礼包名和所需积分,新建 / 补资料时可以直接选择。礼包名请按兑换记录里的名称填写; 停用只是不再出现在可选列表里,历史订单不受影响;改名会同步已有订单,改积分只影响之后新建或换礼包的单。 {canManage && ( setNewName(event.target.value)} onPressEnter={() => void create()} /> setNewPoints(value ?? null)} /> )} rowKey="id" size="small" columns={columns} dataSource={gifts} pagination={false} scroll={{ y: 340 }} locale={{ emptyText: ( ), }} /> setEditTarget(null)} onOk={() => void submitEdit()} confirmLoading={busy} okText="保存" destroyOnHidden > setEditName(event.target.value)} onPressEnter={() => void submitEdit()} /> setEditPoints(value ?? null)} /> setEditRemark(event.target.value)} /> 改名会同步所有已有协作单上的礼包名;修改积分只影响之后新建或换礼包的单,不会改变历史订单。 ); }