import { addFlow, apiInterceptors, updateFlowById } from '@/client/api'; import { IFlowData, IFlowUpdateParam } from '@/types/flow'; import { mapHumpToUnderline } from '@/utils/flow'; import { Button, Checkbox, Form, Input, Modal, Space, message } from 'antd'; import { useSearchParams } from 'next/navigation'; import { useState } from 'react'; import { useTranslation } from 'react-i18next'; import { ReactFlowInstance } from 'reactflow'; const { TextArea } = Input; type Props = { reactFlow: ReactFlowInstance; flowInfo?: IFlowUpdateParam; isSaveFlowModalOpen: boolean; setIsSaveFlowModalOpen: (value: boolean) => void; }; export const SaveFlowModal: React.FC = ({ reactFlow, isSaveFlowModalOpen, flowInfo, setIsSaveFlowModalOpen, }) => { const [deploy, setDeploy] = useState(true); const { t } = useTranslation(); const searchParams = useSearchParams(); const id = searchParams?.get('id') || ''; const [form] = Form.useForm(); const [messageApi, contextHolder] = message.useMessage(); function onLabelChange(e: React.ChangeEvent) { const label = e.target.value; // replace spaces with underscores, convert uppercase letters to lowercase, remove characters other than digits, letters, _, and -. const result = label .replace(/\s+/g, '_') .replace(/[^a-z0-9_-]/g, '') .toLowerCase(); form.setFieldsValue({ name: result }); } async function onSaveFlow() { const { name, label, description = '', editable = false, state = 'deployed' } = form.getFieldsValue(); const reactFlowObject = mapHumpToUnderline(reactFlow.toObject() as IFlowData); if (id) { const [, , res] = await apiInterceptors( updateFlowById(id, { name, label, description, editable, uid: id, flow_data: reactFlowObject, state, }), ); if (res?.success) { messageApi.success(t('save_flow_success')); } else if (res?.err_msg) { messageApi.error(res?.err_msg); } } else { const [_, res] = await apiInterceptors( addFlow({ name, label, description, editable, flow_data: reactFlowObject, state, }), ); if (res?.uid) { messageApi.success(t('save_flow_success')); const history = window.history; history.pushState(null, '', `/flow/canvas?id=${res.uid}`); } } setIsSaveFlowModalOpen(false); } return ( <> { setIsSaveFlowModalOpen(false); }} cancelButtonProps={{ className: 'hidden' }} okButtonProps={{ className: 'hidden' }} >
({ validator(_, value) { // eslint-disable-next-line no-useless-escape const regex = /^[a-zA-Z0-9_\-]+$/; if (!regex.test(value)) { return Promise.reject('Can only contain numbers, letters, underscores, and dashes'); } return Promise.resolve(); }, }), ]} >