import { Button, Divider, Form, Modal } from 'antd'; import React, { useCallback, useEffect, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { useSelector } from 'react-redux'; import { AppState } from 'store/reducers'; import { ActionMode, ActionType, PipelineData } from 'types/api/pipeline/def'; import AppReducer from 'types/reducer/app'; import { v4 } from 'uuid'; import { ModalButtonWrapper, ModalTitle } from '../styles'; import { getEditedDataSource, getRecordIndex } from '../utils'; import { renderPipelineForm } from './utils'; function AddNewPipeline({ isActionType, setActionType, selectedPipelineData, setShowSaveButton, setCurrPipelineData, currPipelineData, }: AddNewPipelineProps): JSX.Element { const [form] = Form.useForm(); const { t } = useTranslation('pipeline'); const { user } = useSelector((state) => state.app); const isEdit = isActionType === 'edit-pipeline'; const isAdd = isActionType === 'add-pipeline'; useEffect(() => { if (isEdit) { form.setFieldsValue(selectedPipelineData); } if (isAdd) { form.resetFields(); } }, [form, isEdit, isAdd, selectedPipelineData]); const onFinish = (values: PipelineData): void => { const newPipeLineData: PipelineData = { id: v4(), orderId: (currPipelineData?.length || 0) + 1, createdAt: new Date().toISOString(), createdBy: user?.name || '', name: values.name, alias: values.name.replace(/\s/g, ''), description: values.description, filter: values.filter, config: [], enabled: true, }; if (isEdit && selectedPipelineData) { const findRecordIndex = getRecordIndex( currPipelineData, selectedPipelineData, 'id', ); const updatedPipelineData: PipelineData = { ...currPipelineData[findRecordIndex], ...values, }; const editedPipelineData = getEditedDataSource( currPipelineData, selectedPipelineData, 'id', updatedPipelineData, ); setCurrPipelineData(editedPipelineData); } if (isAdd) { setCurrPipelineData((prevState) => { if (prevState) return [...prevState, newPipeLineData]; return [newPipeLineData]; }); } setActionType(undefined); }; const onCancelModalHandler = (): void => { setActionType(undefined); }; const modalTitle = useMemo( (): string => isEdit ? `${t('edit_pipeline')} : ${selectedPipelineData?.name}` : t('create_pipeline'), [isEdit, selectedPipelineData?.name, t], ); const onOkModalHandler = useCallback( () => setShowSaveButton(ActionMode.Editing), [setShowSaveButton], ); const isOpen = useMemo(() => isEdit || isAdd, [isAdd, isEdit]); return ( {modalTitle}} centered open={isOpen} width={800} footer={null} onCancel={onCancelModalHandler} >
{renderPipelineForm()}
); } interface AddNewPipelineProps { isActionType: string; setActionType: (actionType?: ActionType) => void; selectedPipelineData: PipelineData | undefined; setShowSaveButton: (actionMode: ActionMode) => void; setCurrPipelineData: ( value: React.SetStateAction>, ) => void; currPipelineData: Array; } export default AddNewPipeline;