From 10ea10cefb61eb3e4c40e48bf83d0320c55a139a Mon Sep 17 00:00:00 2001 From: Oliver Eyton-Williams Date: Wed, 4 Oct 2023 02:13:09 +0200 Subject: [PATCH] fix(client): keep logs while executing challenge (#51671) --- client/src/templates/Challenges/redux/action-types.js | 4 ++-- client/src/templates/Challenges/redux/actions.js | 3 +++ .../templates/Challenges/redux/execute-challenge-saga.js | 8 +++++++- client/src/templates/Challenges/redux/index.js | 8 +++++++- client/src/templates/Challenges/redux/selectors.js | 1 + 5 files changed, 20 insertions(+), 4 deletions(-) diff --git a/client/src/templates/Challenges/redux/action-types.js b/client/src/templates/Challenges/redux/action-types.js index 81509aba9af..67ff03d14ac 100644 --- a/client/src/templates/Challenges/redux/action-types.js +++ b/client/src/templates/Challenges/redux/action-types.js @@ -40,13 +40,13 @@ export const actionTypes = createTypes( 'challengeMounted', 'sendRenderTime', 'checkChallenge', - 'executeChallenge', 'resetChallenge', 'stopResetting', 'resetAttempts', 'setEditorFocusability', 'toggleVisibleEditor', - ...createAsyncTypes('submitChallenge') + ...createAsyncTypes('submitChallenge'), + ...createAsyncTypes('executeChallenge') ], ns ); diff --git a/client/src/templates/Challenges/redux/actions.js b/client/src/templates/Challenges/redux/actions.js index e2b3093651f..22c3bad958f 100644 --- a/client/src/templates/Challenges/redux/actions.js +++ b/client/src/templates/Challenges/redux/actions.js @@ -70,6 +70,9 @@ export const challengeMounted = createAction(actionTypes.challengeMounted); export const sendRenderTime = createAction(actionTypes.sendRenderTime); export const checkChallenge = createAction(actionTypes.checkChallenge); export const executeChallenge = createAction(actionTypes.executeChallenge); +export const executeChallengeComplete = createAction( + actionTypes.executeChallengeComplete +); export const resetChallenge = createAction(actionTypes.resetChallenge); export const stopResetting = createAction(actionTypes.stopResetting); export const submitChallenge = createAction(actionTypes.submitChallenge); diff --git a/client/src/templates/Challenges/redux/execute-challenge-saga.js b/client/src/templates/Challenges/redux/execute-challenge-saga.js index 92c3e2f68f4..0edb8291d0b 100644 --- a/client/src/templates/Challenges/redux/execute-challenge-saga.js +++ b/client/src/templates/Challenges/redux/execute-challenge-saga.js @@ -38,6 +38,7 @@ import { executeGA } from '../../../redux/actions'; import { actionTypes } from './action-types'; import { disableBuildOnError, + executeChallengeComplete, initConsole, initLogs, logsToConsole, @@ -51,6 +52,7 @@ import { challengeMetaSelector, challengeTestsSelector, isBuildEnabledSelector, + isExecutingSelector, portalDocumentSelector } from './selectors'; @@ -147,6 +149,7 @@ function* executeChallengeSaga({ payload }) { } catch (e) { yield put(updateConsole(e)); } finally { + yield put(executeChallengeComplete()); consoleProxy.close(); } } @@ -230,7 +233,10 @@ function* previewChallengeSaga({ flushLogs = true } = {}) { const proxyLogger = args => logProxy.put(args); try { - if (flushLogs) { + const isExecuting = yield select(isExecutingSelector); + // executeChallengeSaga flushes the logs, so there's no need to if that's + // just happened. + if (flushLogs && !isExecuting) { yield put(initLogs()); yield put(initConsole('')); } diff --git a/client/src/templates/Challenges/redux/index.js b/client/src/templates/Challenges/redux/index.js index 160cc806987..cc6e1c7ec6c 100644 --- a/client/src/templates/Challenges/redux/index.js +++ b/client/src/templates/Challenges/redux/index.js @@ -32,6 +32,7 @@ const initialState = { userCompletedExam: null, hasCompletedBlock: false, isBuildEnabled: true, + isExecuting: false, isResetting: false, logsOut: [], modal: { @@ -234,7 +235,12 @@ export const reducer = handleActions( [actionTypes.executeChallenge]: state => ({ ...state, currentTab: 3, - attempts: state.attempts + 1 + attempts: state.attempts + 1, + isExecuting: true + }), + [actionTypes.executeChallengeComplete]: state => ({ + ...state, + isExecuting: false }), [actionTypes.setEditorFocusability]: (state, { payload }) => ({ ...state, diff --git a/client/src/templates/Challenges/redux/selectors.js b/client/src/templates/Challenges/redux/selectors.js index 45785181ebb..70901ef968a 100644 --- a/client/src/templates/Challenges/redux/selectors.js +++ b/client/src/templates/Challenges/redux/selectors.js @@ -40,6 +40,7 @@ export const isSubmittingSelector = state => state[ns].isSubmitting; export const isResettingSelector = state => state[ns].isResetting; export const isBuildEnabledSelector = state => state[ns].isBuildEnabled; +export const isExecutingSelector = state => state[ns].isExecuting; export const successMessageSelector = state => state[ns].successMessage; export const projectFormValuesSelector = state =>