import React, { useEffect, useMemo, useState } from 'react'; import { Alert, Checkbox, Form, Input, Modal, Select, Space, Typography, message } from 'antd'; import { DBQuery } from '../../wailsjs/go/app/App'; import type { SavedConnection } from '../types'; import { buildRpcConnectionConfig } from '../utils/connectionRpcConfig'; import { buildMessagePublishCommand, createDefaultMessagePublishDraft, getMessagePublishPresentation, type MessagePublishDraft, } from '../utils/messagePublish'; const { Text } = Typography; const { TextArea } = Input; export type MessagePublishModalProps = { open: boolean; connection: SavedConnection | null; executionDbName?: string; defaultDestination?: string; onCancel: () => void; onSuccess?: (result: { destination: string; affectedRows: number; commandText: string }) => void; }; const MessagePublishModal: React.FC = ({ open, connection, executionDbName = '', defaultDestination = '', onCancel, onSuccess, }) => { const [form] = Form.useForm(); const [submitting, setSubmitting] = useState(false); const presentation = useMemo( () => getMessagePublishPresentation(connection?.config), [connection], ); useEffect(() => { if (!open || !connection) return; form.setFieldsValue( createDefaultMessagePublishDraft( connection.config, defaultDestination, ), ); }, [connection, defaultDestination, form, open]); useEffect(() => { if (open) return; form.resetFields(); setSubmitting(false); }, [form, open]); const handleSubmit = async () => { if (!connection) return; let values: MessagePublishDraft; try { values = await form.validateFields(); } catch { return; } let command; try { command = buildMessagePublishCommand(connection.config, values); } catch (error: any) { void message.error(error?.message || '构造发送命令失败'); return; } setSubmitting(true); try { const res = await DBQuery( buildRpcConnectionConfig(connection.config) as any, executionDbName, command.commandText, ); if (!res?.success) { void message.error(`发送失败: ${res?.message || '未知错误'}`); return; } const affectedRows = Number((res.data as any)?.affectedRows); onSuccess?.({ destination: command.destinationLabel, affectedRows: Number.isFinite(affectedRows) ? affectedRows : 0, commandText: command.commandText, }); } catch (error: any) { void message.error(`发送失败: ${error?.message || String(error)}`); } finally { setSubmitting(false); } }; return ( { void handleSubmit(); }} okText="发送" confirmLoading={submitting} width={720} destroyOnHidden maskClosable={!submitting} > form={form} layout="vertical" initialValues={createDefaultMessagePublishDraft(connection?.config, defaultDestination)} > {presentation.showExchange && ( )} {presentation.showRoutingKey && ( )} {presentation.showQos && ( )}