import { useEffect, useState } from 'react' import type { Connection, ConnectionCreateRequest, ConnectionModalSubmitPayload, SessionTreeFolderOption, } from '../types' import Modal from './Modal' const emptyForm: ConnectionCreateRequest = { name: '', host: '', port: 22, username: 'root', authType: 'PASSWORD', password: '', privateKey: '', passphrase: '', setupMode: 'NONE', bootstrapPassword: '', } export default function ConnectionModal({ open, connection, folderOptions, initialTargetFolderId, onClose, onSubmit, }: { open: boolean connection?: Connection | null folderOptions: SessionTreeFolderOption[] initialTargetFolderId: string | null onClose: () => void onSubmit: (payload: ConnectionModalSubmitPayload) => Promise }) { const [form, setForm] = useState(emptyForm) const [targetFolderId, setTargetFolderId] = useState(null) const [submitting, setSubmitting] = useState(false) const [error, setError] = useState(null) useEffect(() => { if (!open) return if (connection) { setForm({ name: connection.name, host: connection.host, port: connection.port, username: connection.username, authType: connection.authType, password: '', privateKey: '', passphrase: '', setupMode: 'NONE', bootstrapPassword: '', }) } else { setForm(emptyForm) } setTargetFolderId(initialTargetFolderId) setError(null) }, [connection, initialTargetFolderId, open]) if (!open) return null const useBootstrap = form.setupMode === 'PASSWORD_BOOTSTRAP' const isPassword = form.authType === 'PASSWORD' async function handleSave() { setSubmitting(true) setError(null) try { await onSubmit({ ...form, port: Number(form.port || 22), targetFolderId, }) } catch (err) { const message = (err as { response?: { data?: { message?: string; error?: string } } }).response?.data?.message || '保存连接失败' setError(message) } finally { setSubmitting(false) } } return ( } >
认证方式
保留现有密码、私钥和一键免密部署能力。
{form.authType === 'PASSWORD' ? ( ) : (