import { Modal, ModalContent, ModalHeader } from '@heroui/modal'; import toast from 'react-hot-toast'; import useConfig from '@/hooks/use-config'; import useDialog from '@/hooks/use-dialog'; import HTTPClientForm from './http_client'; import HTTPServerForm from './http_server'; import HTTPServerSSEForm from './http_sse'; import WebsocketClientForm from './ws_client'; import WebsocketServerForm from './ws_server'; const modalTitle = { httpServers: 'HTTP Server', httpClients: 'HTTP Client', httpSseServers: 'HTTP SSE Server', websocketServers: 'Websocket Server', websocketClients: 'Websocket Client', }; export interface NetworkFormModalProps< T extends keyof OneBotConfig['network'] > { isOpen: boolean; field: T; data?: OneBotConfig['network'][T][0]; onOpenChange: (isOpen: boolean) => void; } const NetworkFormModal = ( props: NetworkFormModalProps ) => { const { isOpen, onOpenChange, field, data } = props; const { createNetworkConfig, updateNetworkConfig } = useConfig(); const dialog = useDialog(); const isCreate = !data; const onSubmit = async (data: OneBotConfig['network'][typeof field][0]) => { const saveData = async (dataToSave: OneBotConfig['network'][typeof field][0]) => { try { if (isCreate) { await createNetworkConfig(field, dataToSave); } else { await updateNetworkConfig(field, dataToSave); } toast.success('保存配置成功'); } catch (error) { const msg = (error as Error).message; toast.error(`保存配置失败: ${msg}`); throw error; } }; if (['httpServers', 'httpSseServers', 'websocketServers'].includes(field)) { const serverData = data as any; if (!serverData.token && serverData.host !== '127.0.0.1') { await new Promise((resolve, reject) => { dialog.confirm({ title: '安全警告', content: (

检测到未配置Token,这可能导致安全风险。确认要继续吗?

(未配置Token时,Host将被强制限制为 127.0.0.1)

), onConfirm: async () => { serverData.host = '127.0.0.1'; try { await saveData(serverData); resolve(); } catch (e) { reject(e); } }, onCancel: () => { reject(new Error('Cancelled')); }, }); }); return; } } await saveData(data); }; const renderFormComponent = (onClose: () => void) => { switch (field) { case 'httpServers': return ( ); case 'httpClients': return ( ); case 'websocketServers': return ( ); case 'websocketClients': return ( ); case 'httpSseServers': return ( ); default: return null; } }; return ( {(onClose) => ( <> {modalTitle[field]} {renderFormComponent(onClose)} )} ); }; export default NetworkFormModal;