import PropTypes from 'prop-types'; import * as React from 'react'; import Box from '@mui/material/Box'; import Collapse from '@mui/material/Collapse'; import ListItem from '@mui/material/ListItem'; import Alert from '@mui/material/Alert'; import AlertTitle from '@mui/material/AlertTitle'; import LoadingButton from '@mui/lab/LoadingButton'; import { EditorContext } from 'contexts/Editor'; import useFormatMessage from 'hooks/useFormatMessage'; import useTestStep from 'hooks/useTestStep'; import JSONViewer from 'components/JSONViewer'; import WebhookUrlInfo from 'components/WebhookUrlInfo'; import FlowSubstepTitle from 'components/FlowSubstepTitle'; import { useQueryClient } from '@tanstack/react-query'; import { StepPropType, SubstepPropType } from 'propTypes/propTypes'; function TestSubstep(props) { const { substep, expanded = false, onExpand, onCollapse, onContinue, step, showWebhookUrl = false, flowId, } = props; const formatMessage = useFormatMessage(); const editorContext = React.useContext(EditorContext); const { mutateAsync: testStep, isPending: isTestStepPending, data, isSuccess: isCompleted, reset, } = useTestStep(step.id); const loading = isTestStepPending; const lastExecutionStep = data?.data.lastExecutionStep; const dataOut = lastExecutionStep?.dataOut; const errorDetails = lastExecutionStep?.errorDetails; const hasError = errorDetails && Object.values(errorDetails).length > 0; const hasNoOutput = !hasError && isCompleted && !dataOut; const hasOutput = !hasError && isCompleted && dataOut && Object.values(dataOut).length > 0; const { name } = substep; const queryClient = useQueryClient(); React.useEffect( function resetTestDataOnSubstepToggle() { if (!expanded && !loading) { reset(); } }, [expanded, reset, loading], ); const handleSubmit = React.useCallback(async () => { if (isCompleted) { onContinue?.(); return; } await testStep(); await queryClient.invalidateQueries({ queryKey: ['flows', flowId], }); }, [testStep, onContinue, isCompleted, queryClient, flowId]); const onToggle = expanded ? onCollapse : onExpand; return ( {hasError && (
                {JSON.stringify(errorDetails, null, 2)}
              
)} {step.webhookUrl && showWebhookUrl && ( )} {hasNoOutput && ( {formatMessage('flowEditor.noTestDataTitle')} {formatMessage('flowEditor.noTestDataMessage')} )} {hasOutput && ( )} {isCompleted && formatMessage('flowEditor.continue')} {!isCompleted && formatMessage('flowEditor.testAndContinue')}
); } TestSubstep.propTypes = { substep: SubstepPropType.isRequired, expanded: PropTypes.bool, showWebhookUrl: PropTypes.bool, onExpand: PropTypes.func.isRequired, onCollapse: PropTypes.func.isRequired, onChange: PropTypes.func, onSubmit: PropTypes.func, onContinue: PropTypes.func, step: StepPropType.isRequired, flowId: PropTypes.string.isRequired, }; export default TestSubstep;