import { useState } from "react"; import { Table, Button, Card, Typography, Modal, Form, Input, Select, InputNumber, Switch, Popconfirm, message, Tag, Empty, } from "antd"; import { PlusOutlined, DeleteOutlined } from "@ant-design/icons"; import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; import { stockService } from "@/services/stocks"; import type { Alert } from "@/types"; const { Title } = Typography; const ALERT_TYPES = [ { value: "price_above", label: "价格高于" }, { value: "price_below", label: "价格低于" }, { value: "change_pct_above", label: "涨幅超过" }, { value: "change_pct_below", label: "跌幅超过" }, ]; export default function AlertsPage() { const qc = useQueryClient(); const [modalOpen, setModalOpen] = useState(false); const [form] = Form.useForm(); const { data: alerts = [], isLoading } = useQuery({ queryKey: ["alerts"], queryFn: stockService.getAlerts, }); const createMutation = useMutation({ mutationFn: stockService.createAlert, onSuccess: () => { qc.invalidateQueries({ queryKey: ["alerts"] }); message.success("预警已创建"); setModalOpen(false); form.resetFields(); }, onError: () => message.error("创建失败"), }); const deleteMutation = useMutation({ mutationFn: stockService.deleteAlert, onSuccess: () => { qc.invalidateQueries({ queryKey: ["alerts"] }); message.success("已删除"); }, }); const toggleMutation = useMutation({ mutationFn: stockService.toggleAlert, onSuccess: () => qc.invalidateQueries({ queryKey: ["alerts"] }), }); const columns = [ { title: "股票", key: "stock", render: (_: unknown, record: Alert) => ( {record.name} {record.symbol} ), }, { title: "预警类型", dataIndex: "alert_type", key: "alert_type", render: (v: string) => { const t = ALERT_TYPES.find((t) => t.value === v); return {t?.label || v}; }, }, { title: "阈值", dataIndex: "threshold", key: "threshold", render: (v: number, record: Alert) => ( {v} {record.alert_type.includes("pct") ? "%" : "元"} ), }, { title: "状态", key: "status", render: (_: unknown, record: Alert) => { if (record.triggered) return 已触发; return record.is_active ? 监控中 : 已暂停; }, }, { title: "启用", key: "active", render: (_: unknown, record: Alert) => ( toggleMutation.mutate(record.id)} disabled={record.triggered} /> ), }, { title: "操作", key: "action", render: (_: unknown, record: Alert) => ( deleteMutation.mutate(record.id)} okText="删除" cancelText="取消" > } danger /> ), }, ]; return ( 价格预警 } onClick={() => setModalOpen(true)} > 新建预警 }} /> setModalOpen(false)} onOk={() => form.submit()} confirmLoading={createMutation.isPending} okText="创建" cancelText="取消" styles={{ content: { background: "#161b22" }, header: { background: "#161b22" } }} > createMutation.mutate(values)} > ); }