import PropTypes from 'prop-types'; import * as React from 'react'; import { DateTime } from 'luxon'; import Stack from '@mui/material/Stack'; import ErrorIcon from '@mui/icons-material/Error'; import CheckCircleIcon from '@mui/icons-material/CheckCircle'; import Tabs from '@mui/material/Tabs'; import Tab from '@mui/material/Tab'; import Typography from '@mui/material/Typography'; import Tooltip from '@mui/material/Tooltip'; import Box from '@mui/material/Box'; import TabPanel from 'components/TabPanel'; import SearchableJSONViewer from 'components/SearchableJSONViewer'; import AppIcon from 'components/AppIcon'; import useFormatMessage from 'hooks/useFormatMessage'; import useApps from 'hooks/useApps'; import { AppIconWrapper, AppIconStatusIconWrapper, Content, Header, Metadata, Wrapper, } from './style'; import { ExecutionStepPropType, StepPropType } from 'propTypes/propTypes'; function ExecutionStepId(props) { const formatMessage = useFormatMessage(); const id = ( {props.id} ); return ( {formatMessage('executionStep.id', { id })} ); } ExecutionStepId.propTypes = { id: PropTypes.string.isRequired, }; function ExecutionStepDate(props) { const formatMessage = useFormatMessage(); const createdAt = DateTime.fromMillis(parseInt(props.createdAt, 10)); const relativeCreatedAt = createdAt.toRelative(); return ( {formatMessage('executionStep.executedAt', { datetime: relativeCreatedAt, })} ); } ExecutionStepDate.propTypes = { createdAt: PropTypes.number.isRequired, }; const validIcon = ; const errorIcon = ; function ExecutionStep(props) { const { executionStep } = props; const [activeTabIndex, setActiveTabIndex] = React.useState(0); const step = executionStep.step; const isTrigger = step.type === 'trigger'; const isAction = step.type === 'action'; const formatMessage = useFormatMessage(); const useAppsOptions = {}; if (isTrigger) { useAppsOptions.onlyWithTriggers = true; } if (isAction) { useAppsOptions.onlyWithActions = true; } const { data: apps } = useApps(useAppsOptions); const app = apps?.data?.find((currentApp) => currentApp.key === step.appKey); if (!apps?.data) return null; const validationStatusIcon = executionStep.status === 'success' ? validIcon : errorIcon; const hasError = !!executionStep.errorDetails; return (
{validationStatusIcon} {isTrigger && formatMessage('flowStep.triggerType')} {isAction && formatMessage('flowStep.actionType')} {step.position}. {app?.name}
setActiveTabIndex(tabIndex)} > {hasError && } {hasError && ( )}
); } ExecutionStep.propTypes = { collapsed: PropTypes.bool, step: StepPropType.isRequired, index: PropTypes.number, executionStep: ExecutionStepPropType.isRequired, }; export default ExecutionStep;