import { Form, Input, Message, Modal, Select } from '@arco-design/web-react'; import { useCallback, useEffect, useState } from 'react'; import { formatDateTime } from '../../../../utils/time'; import type { Branch, Commit, Pipeline, Project } from '../../types'; import { detailService } from '../service'; interface EnvPreset { key: string; label: string; type: 'select' | 'multiselect' | 'input'; required?: boolean; options?: Array<{ label: string; value: string }>; } interface DeployModalProps { visible: boolean; onCancel: () => void; onOk: () => void; pipelines: Pipeline[]; projectId: number; project?: Project | null; } function DeployModal({ visible, onCancel, onOk, pipelines, projectId, project, }: DeployModalProps) { const [form] = Form.useForm(); const [branches, setBranches] = useState([]); const [commits, setCommits] = useState([]); const [loading, setLoading] = useState(false); const [branchLoading, setBranchLoading] = useState(false); const [envPresets, setEnvPresets] = useState([]); // 解析项目环境预设 useEffect(() => { if (project?.envPresets) { try { const presets = JSON.parse(project.envPresets); setEnvPresets(presets); } catch (error) { console.error('解析环境预设失败:', error); setEnvPresets([]); } } else { setEnvPresets([]); } }, [project]); const fetchCommits = useCallback( async (branch: string) => { try { setLoading(true); const data = await detailService.getCommits(projectId, branch); setCommits(data); if (data.length > 0) { form.setFieldValue('commitHash', data[0].sha); } } catch (error) { console.error('获取提交记录失败:', error); Message.error('获取提交记录失败'); } finally { setLoading(false); } }, [projectId, form], ); const fetchBranches = useCallback(async () => { try { setBranchLoading(true); const data = await detailService.getBranches(projectId); setBranches(data); // 默认选中 master 或 main const defaultBranch = data.find( (b) => b.name === 'master' || b.name === 'main', ); if (defaultBranch) { form.setFieldValue('branch', defaultBranch.name); fetchCommits(defaultBranch.name); } else if (data.length > 0) { form.setFieldValue('branch', data[0].name); fetchCommits(data[0].name); } } catch (error) { console.error('获取分支列表失败:', error); Message.error('获取分支列表失败'); } finally { setBranchLoading(false); } }, [projectId, form, fetchCommits]); useEffect(() => { if (visible && projectId) { fetchBranches(); } }, [visible, projectId, fetchBranches]); const handleBranchChange = (value: string) => { fetchCommits(value); form.setFieldValue('commitHash', undefined); }; const handleSubmit = async () => { try { const values = await form.validate(); const selectedCommit = commits.find((c) => c.sha === values.commitHash); const selectedPipeline = pipelines.find( (p) => p.id === values.pipelineId, ); if (!selectedCommit || !selectedPipeline) { return; } // 收集所有环境变量(从预设项中提取) const envVars: Record = {}; for (const preset of envPresets) { const value = values[preset.key]; if (value !== undefined && value !== null) { // 对于 multiselect,将数组转为逗号分隔的字符串 if (preset.type === 'multiselect' && Array.isArray(value)) { envVars[preset.key] = value.join(','); } else { envVars[preset.key] = String(value); } } } await detailService.createDeployment({ projectId, pipelineId: values.pipelineId, branch: values.branch, commitHash: selectedCommit.sha, commitMessage: selectedCommit.commit.message, envVars, // 提交所有环境变量 }); Message.success('部署任务已创建'); onOk(); } catch (error) { console.error('创建部署失败:', error); Message.error('创建部署失败'); } }; return (
{/* 基本参数 */}
基本参数
{/* 环境变量预设 */} {envPresets.length > 0 && (
环境变量
{envPresets.map((preset) => { if (preset.type === 'select' && preset.options) { return ( ); } if (preset.type === 'multiselect' && preset.options) { return ( ); } if (preset.type === 'input') { return ( ); } return null; })}
)}
); } export default DeployModal;