import { useEffect, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { deleteDiscount, fetchDiscounts, upsertDiscount } from '../api'; import type { Discount } from '../types'; import './Discounts.css'; export function Discounts() { const [list, setList] = useState([]); const [domain, setDomain] = useState(''); const [discount, setDiscount] = useState(''); const [note, setNote] = useState(''); const [editing, setEditing] = useState(null); const [error, setError] = useState(''); const navigate = useNavigate(); const load = () => fetchDiscounts().then(setList).catch(() => {}); useEffect(() => { load(); }, []); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(''); const d = parseFloat(discount); if (isNaN(d) || d <= 0 || d > 1) { setError('折扣系数需在 0~1 之间,如 0.8 表示八折'); return; } try { await upsertDiscount(domain.trim(), d, note.trim() || undefined); setDomain(''); setDiscount(''); setNote(''); setEditing(null); load(); } catch (err: any) { setError(err.message); } }; const startEdit = (item: Discount) => { setEditing(item); setDomain(item.domain); setDiscount(String(item.discount)); setNote(item.note ?? ''); }; const handleDelete = async (id: number) => { await deleteDiscount(id); load(); }; return (
折扣管理
setDomain(e.target.value)} required /> setDiscount(e.target.value)} required /> setNote(e.target.value)} /> {editing && ( )}
{error &&
{error}
}
{list.map(item => ( ))}
域名 折扣系数 折扣 备注 更新时间 操作
{item.discount} {Math.round(item.discount * 10)}折 {item.note ?? '—'} {new Date(item.updated_at).toLocaleString()}
{list.length === 0 &&
暂无折扣配置,所有域名按原价返回
}
); }