fix(curriculum): stop tests running after navigating away (#38146)

This commit is contained in:
vanya829
2020-02-03 15:22:49 +02:00
committed by GitHub
parent 093f3f8a04
commit d626e898ee
3 changed files with 22 additions and 6 deletions

View File

@ -34,7 +34,8 @@ import {
updateChallengeMeta, updateChallengeMeta,
challengeMounted, challengeMounted,
consoleOutputSelector, consoleOutputSelector,
executeChallenge executeChallenge,
cancelTests
} from '../redux'; } from '../redux';
import './classic.css'; import './classic.css';
@ -54,12 +55,14 @@ const mapDispatchToProps = dispatch =>
initTests, initTests,
updateChallengeMeta, updateChallengeMeta,
challengeMounted, challengeMounted,
executeChallenge executeChallenge,
cancelTests
}, },
dispatch dispatch
); );
const propTypes = { const propTypes = {
cancelTests: PropTypes.func.isRequired,
challengeMounted: PropTypes.func.isRequired, challengeMounted: PropTypes.func.isRequired,
createFiles: PropTypes.func.isRequired, createFiles: PropTypes.func.isRequired,
data: PropTypes.shape({ data: PropTypes.shape({
@ -164,8 +167,9 @@ class ShowClassic extends Component {
} }
componentWillUnmount() { componentWillUnmount() {
const { createFiles } = this.props; const { createFiles, cancelTests } = this.props;
createFiles({}); createFiles({});
cancelTests();
} }
getChallenge = () => this.props.data.challengeNode; getChallenge = () => this.props.data.challengeNode;

View File

@ -6,7 +6,9 @@ import {
takeLatest, takeLatest,
takeEvery, takeEvery,
fork, fork,
getContext getContext,
take,
cancel
} from 'redux-saga/effects'; } from 'redux-saga/effects';
import { channel } from 'redux-saga'; import { channel } from 'redux-saga';
import escape from 'lodash/escape'; import escape from 'lodash/escape';
@ -21,7 +23,8 @@ import {
logsToConsole, logsToConsole,
updateTests, updateTests,
isBuildEnabledSelector, isBuildEnabledSelector,
disableBuildOnError disableBuildOnError,
types
} from './'; } from './';
import { import {
@ -36,6 +39,13 @@ import {
// How long before bailing out of a preview. // How long before bailing out of a preview.
const previewTimeout = 2500; const previewTimeout = 2500;
export function* executeCancellableChallengeSaga() {
const task = yield fork(executeChallengeSaga);
yield take(types.cancelTests);
yield cancel(task);
}
export function* executeChallengeSaga() { export function* executeChallengeSaga() {
const isBuildEnabled = yield select(isBuildEnabledSelector); const isBuildEnabled = yield select(isBuildEnabledSelector);
if (!isBuildEnabled) { if (!isBuildEnabled) {
@ -181,7 +191,7 @@ function* previewChallengeSaga() {
export function createExecuteChallengeSaga(types) { export function createExecuteChallengeSaga(types) {
return [ return [
takeLatest(types.executeChallenge, executeChallengeSaga), takeLatest(types.executeChallenge, executeCancellableChallengeSaga),
takeLatest( takeLatest(
[ [
types.updateFile, types.updateFile,

View File

@ -60,6 +60,7 @@ export const types = createTypes(
'updateSuccessMessage', 'updateSuccessMessage',
'updateTests', 'updateTests',
'updateLogs', 'updateLogs',
'cancelTests',
'logsToConsole', 'logsToConsole',
@ -121,6 +122,7 @@ export const createFiles = createAction(types.createFiles, challengeFiles =>
export const createQuestion = createAction(types.createQuestion); export const createQuestion = createAction(types.createQuestion);
export const initTests = createAction(types.initTests); export const initTests = createAction(types.initTests);
export const updateTests = createAction(types.updateTests); export const updateTests = createAction(types.updateTests);
export const cancelTests = createAction(types.cancelTests);
export const initConsole = createAction(types.initConsole); export const initConsole = createAction(types.initConsole);
export const initLogs = createAction(types.initLogs); export const initLogs = createAction(types.initLogs);