in src/hooks/useSyntheticsTest.ts [33:108]
export function useSyntheticsTest(steps: Steps): ITestContext {
const [result, dispatch] = useReducer(resultReducer, undefined);
const [isResultFlyoutVisible, setIsResultFlyoutVisible] = useState(false);
const [codeBlocks, setCodeBlocks] = useState('');
const [isTestInProgress, setIsTestInProgress] = useState(false);
const { electronAPI } = useContext(CommunicationContext);
const setResult = useCallback((data: Result | undefined) => {
dispatch({
event: 'override',
data,
});
}, []);
/**
* The absence of steps with a truthy result indicates the result value
* is stale, and should be destroyed.
*/
useEffect(() => {
if (steps.length === 0 && result) {
setResult(undefined);
}
}, [steps.length, result, setResult]);
const onTest = useCallback(
async function () {
const code = await getCodeFromActions(electronAPI, steps, 'inline');
if (!isTestInProgress) {
// destroy stale state
dispatch({ data: undefined, event: 'override' });
const onTestEventListener: TestEventListener = (_event, data) => {
dispatch(data);
};
try {
const promise = electronAPI.runTest(
{
steps,
code,
isProject: false,
},
onTestEventListener
);
setIsTestInProgress(true);
setIsResultFlyoutVisible(true);
await promise;
} catch (e: unknown) {
// eslint-disable-next-line no-console
console.error(e);
} finally {
electronAPI.removeOnTestListener();
setIsTestInProgress(false);
}
}
},
[electronAPI, isTestInProgress, steps]
);
useEffect(() => {
if (result?.journey.status === 'failed') {
getCodeForFailedResult(electronAPI, steps, result?.journey).then(code => setCodeBlocks(code));
}
}, [electronAPI, result?.journey, steps]);
return {
codeBlocks,
isResultFlyoutVisible,
isTestInProgress,
result,
onTest,
setCodeBlocks,
setIsResultFlyoutVisible,
setIsTestInProgress,
setResult,
};
}