@elice/material-exercise 1.230316.0 → 1.230328.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/components/material-exercise/context/recoil.d.ts +5 -0
- package/cjs/components/material-exercise/context/recoil.js +10 -0
- package/cjs/components/material-exercise/context/types.d.ts +8 -1
- package/cjs/components/material-exercise/exercise-file-editor/ExerciseFileEditor.js +7 -0
- package/cjs/components/material-exercise/exercise-runner/ExerciseRunner.js +12 -2
- package/cjs/components/material-exercise/exercise-runner/ExerciseRunnerControllerButtonGroup.js +15 -6
- package/es/components/material-exercise/context/recoil.d.ts +5 -0
- package/es/components/material-exercise/context/recoil.js +10 -1
- package/es/components/material-exercise/context/types.d.ts +8 -1
- package/es/components/material-exercise/exercise-file-editor/ExerciseFileEditor.js +8 -1
- package/es/components/material-exercise/exercise-runner/ExerciseRunner.js +13 -3
- package/es/components/material-exercise/exercise-runner/ExerciseRunnerControllerButtonGroup.js +16 -7
- package/package.json +4 -4
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ExercisePreviewDisplayMode, ExercisePreviewType } from './recoilTypes';
|
|
2
|
+
import type { MonacoEditorApis } from "../../shared/monaco-editor";
|
|
2
3
|
import type { ArduinoAgentConnectionStatus, ArduinoUploadProgressStatus } from "../../../typings/arduino";
|
|
3
4
|
import type { AtomContainerSizeState, AtomExerciseRoomState, AtomExerciseState, AtomFileEditorCursorState, AtomLectureState, AtomMultilangEnvironmentJson, AtomMultilangEnvironmentState, AtomRunnerRoomConnectionInfoState, AtomRunnerRunTypeState, AtomRunnerStdioFilesState, AtomUserState, AtomVisibilityState, AtomWebSocketStateKey, AtomWebSocketStates } from './recoilTypes';
|
|
4
5
|
/**
|
|
@@ -146,3 +147,7 @@ export declare const exerciseFileEditorCursorState: import("recoil").RecoilState
|
|
|
146
147
|
*
|
|
147
148
|
*/
|
|
148
149
|
export declare const exerciseFileEditorCursorSelectionValueState: import("recoil").RecoilState<string | null>;
|
|
150
|
+
/**
|
|
151
|
+
*
|
|
152
|
+
*/
|
|
153
|
+
export declare const exerciseMonacoEditorApisState: import("recoil").RecoilState<MonacoEditorApis | null>;
|
|
@@ -622,6 +622,15 @@ const exerciseFileEditorCursorSelectionValueState = recoil.atom({
|
|
|
622
622
|
key: `${KEY_PREFIX}/FileEditorCursorSelectionValue`,
|
|
623
623
|
default: null
|
|
624
624
|
});
|
|
625
|
+
/**
|
|
626
|
+
*
|
|
627
|
+
*/
|
|
628
|
+
|
|
629
|
+
const exerciseMonacoEditorApisState = recoil.atom({
|
|
630
|
+
key: `${KEY_PREFIX}/MonacoEditorApisState`,
|
|
631
|
+
default: null,
|
|
632
|
+
dangerouslyAllowMutability: true
|
|
633
|
+
});
|
|
625
634
|
|
|
626
635
|
exports.exerciseActiveFilenameState = exerciseActiveFilenameState;
|
|
627
636
|
exports.exerciseArduinoAgentConnectionState = exerciseArduinoAgentConnectionState;
|
|
@@ -638,6 +647,7 @@ exports.exerciseFileEditorCursorState = exerciseFileEditorCursorState;
|
|
|
638
647
|
exports.exerciseFileTabsOpenedState = exerciseFileTabsOpenedState;
|
|
639
648
|
exports.exerciseFileTreeOpenedState = exerciseFileTreeOpenedState;
|
|
640
649
|
exports.exerciseLectureState = exerciseLectureState;
|
|
650
|
+
exports.exerciseMonacoEditorApisState = exerciseMonacoEditorApisState;
|
|
641
651
|
exports.exerciseMultilangEnvironmentState = exerciseMultilangEnvironmentState;
|
|
642
652
|
exports.exerciseMultilangLanguagesState = exerciseMultilangLanguagesState;
|
|
643
653
|
exports.exercisePreviewDisplayModeState = exercisePreviewDisplayModeState;
|
|
@@ -64,7 +64,14 @@ export declare type MaterialExerciseCommonPropExerciseImageEmptyOptions = Exerci
|
|
|
64
64
|
/**
|
|
65
65
|
* On code help button click.
|
|
66
66
|
*/
|
|
67
|
-
export declare type MaterialExerciseCommonPropOnCodeHelpRequest = (
|
|
67
|
+
export declare type MaterialExerciseCommonPropOnCodeHelpRequest = (params: {
|
|
68
|
+
code: string;
|
|
69
|
+
error?: CodeHelperError;
|
|
70
|
+
payload?: any;
|
|
71
|
+
readme?: string;
|
|
72
|
+
instruction?: string;
|
|
73
|
+
openFileContent?: string;
|
|
74
|
+
}) => void;
|
|
68
75
|
/**
|
|
69
76
|
* On default exercise room ID set.
|
|
70
77
|
*/
|
|
@@ -72,6 +72,13 @@ const ExerciseFileEditor = () => {
|
|
|
72
72
|
exercise,
|
|
73
73
|
exerciseRoom
|
|
74
74
|
}));
|
|
75
|
+
const setExerciseMonacoEditorApisState = recoil.useSetRecoilState(recoil$1.exerciseMonacoEditorApisState);
|
|
76
|
+
React__default["default"].useEffect(() => {
|
|
77
|
+
if (editorApis.current) {
|
|
78
|
+
setExerciseMonacoEditorApisState(editorApis.current);
|
|
79
|
+
} // eslint-disable-next-line react-hooks/exhaustive-deps
|
|
80
|
+
|
|
81
|
+
}, [editorApis.current]);
|
|
75
82
|
/**
|
|
76
83
|
* Set value of current file.
|
|
77
84
|
*/
|
|
@@ -78,16 +78,26 @@ const ExerciseRunner = ({
|
|
|
78
78
|
const setRunnerStdioFilesState = recoil.useSetRecoilState(recoil$1.exerciseRunnerStdioFilesState); // preview states
|
|
79
79
|
|
|
80
80
|
const exercisePreviewType = recoil.useRecoilValue(recoil$1.exercisePreviewTypeState(materialExerciseId));
|
|
81
|
-
const exercisePreviewDisplayMode = recoil.useRecoilValue(recoil$1.exercisePreviewDisplayModeState); //
|
|
81
|
+
const exercisePreviewDisplayMode = recoil.useRecoilValue(recoil$1.exercisePreviewDisplayModeState); // monaco editor value
|
|
82
|
+
|
|
83
|
+
const exerciseMonacoEditorApis = recoil.useRecoilValue(recoil$1.exerciseMonacoEditorApisState); // websockets
|
|
82
84
|
|
|
83
85
|
const setRunnerRoomWebSocketState = recoil.useSetRecoilState(recoil$1.exerciseWebsocketQuery('runnerRoom'));
|
|
84
86
|
const setStdioWebSocketState = recoil.useSetRecoilState(recoil$1.exerciseWebsocketQuery('stdio'));
|
|
85
87
|
|
|
86
88
|
const handleAiHelpibotError = text => {
|
|
89
|
+
var _a, _b, _c;
|
|
90
|
+
|
|
87
91
|
const error = runner.getProgrammingErrorResult(text);
|
|
88
92
|
|
|
89
93
|
if (!!error && typeof onCodeHelpRequest === 'function') {
|
|
90
|
-
onCodeHelpRequest(
|
|
94
|
+
onCodeHelpRequest({
|
|
95
|
+
code: error.errorCode,
|
|
96
|
+
error: error,
|
|
97
|
+
readme: (_a = exercise === null || exercise === void 0 ? void 0 : exercise.description) !== null && _a !== void 0 ? _a : '',
|
|
98
|
+
instruction: (_b = exercise === null || exercise === void 0 ? void 0 : exercise.instructionContent) !== null && _b !== void 0 ? _b : '',
|
|
99
|
+
openFileContent: (_c = exerciseMonacoEditorApis === null || exerciseMonacoEditorApis === void 0 ? void 0 : exerciseMonacoEditorApis.getValue()) !== null && _c !== void 0 ? _c : ''
|
|
100
|
+
});
|
|
91
101
|
}
|
|
92
102
|
};
|
|
93
103
|
|
package/cjs/components/material-exercise/exercise-runner/ExerciseRunnerControllerButtonGroup.js
CHANGED
|
@@ -70,7 +70,9 @@ const ExerciseRunnerControllerButtonGroup = () => {
|
|
|
70
70
|
|
|
71
71
|
const isArduinoExercise = (exercise === null || exercise === void 0 ? void 0 : exercise.envType) === types.enums.ExerciseEnvType.Arduino;
|
|
72
72
|
const arduinoUploadProgress = recoil.useRecoilValue(recoil$1.exerciseArduinoUploadProgressState);
|
|
73
|
-
const arduinoOpenedPortName = recoil.useRecoilValue(recoil$1.exerciseArduinoOpenedPortNameState); //
|
|
73
|
+
const arduinoOpenedPortName = recoil.useRecoilValue(recoil$1.exerciseArduinoOpenedPortNameState); // monaco editor apis
|
|
74
|
+
|
|
75
|
+
const exerciseMonacoEditorApis = recoil.useRecoilValue(recoil$1.exerciseMonacoEditorApisState); //
|
|
74
76
|
// ========= ui states =========
|
|
75
77
|
//
|
|
76
78
|
// submit run
|
|
@@ -86,9 +88,7 @@ const ExerciseRunnerControllerButtonGroup = () => {
|
|
|
86
88
|
const isCancelDisabled = isCancelHidden || isNotReady || isConnecting; // sync request
|
|
87
89
|
|
|
88
90
|
const isSyncRequestHidden = !isRunning || !((_a = exercise === null || exercise === void 0 ? void 0 : exercise.readyExerciseImage) === null || _a === void 0 ? void 0 : _a.httpPort);
|
|
89
|
-
const isSyncRequestDisabled = isSyncRequestHidden || isNotReady || isConnecting; //
|
|
90
|
-
|
|
91
|
-
const isCodeHelpHidden = isRunning || isTestLecture && !isTestLectureCompleted; //
|
|
91
|
+
const isSyncRequestDisabled = isSyncRequestHidden || isNotReady || isConnecting; //
|
|
92
92
|
//
|
|
93
93
|
//
|
|
94
94
|
|
|
@@ -241,12 +241,21 @@ const ExerciseRunnerControllerButtonGroup = () => {
|
|
|
241
241
|
|
|
242
242
|
|
|
243
243
|
const renderCodeHelpRequestButton = () => {
|
|
244
|
-
if (
|
|
244
|
+
if (isRunning || !editorCursorSelectionValue || typeof onCodeHelpRequest !== 'function') {
|
|
245
245
|
return null;
|
|
246
246
|
}
|
|
247
247
|
|
|
248
248
|
return React__default["default"].createElement(ExerciseRunnerControllerCodeHelpRequestButton, {
|
|
249
|
-
onClick: () =>
|
|
249
|
+
onClick: () => {
|
|
250
|
+
var _a, _b, _c;
|
|
251
|
+
|
|
252
|
+
onCodeHelpRequest({
|
|
253
|
+
code: editorCursorSelectionValue,
|
|
254
|
+
readme: (_a = exercise === null || exercise === void 0 ? void 0 : exercise.description) !== null && _a !== void 0 ? _a : '',
|
|
255
|
+
instruction: (_b = exercise === null || exercise === void 0 ? void 0 : exercise.instructionContent) !== null && _b !== void 0 ? _b : '',
|
|
256
|
+
openFileContent: (_c = exerciseMonacoEditorApis === null || exerciseMonacoEditorApis === void 0 ? void 0 : exerciseMonacoEditorApis.getValue()) !== null && _c !== void 0 ? _c : ''
|
|
257
|
+
});
|
|
258
|
+
}
|
|
250
259
|
});
|
|
251
260
|
}; //
|
|
252
261
|
//
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ExercisePreviewDisplayMode, ExercisePreviewType } from './recoilTypes';
|
|
2
|
+
import type { MonacoEditorApis } from "../../shared/monaco-editor";
|
|
2
3
|
import type { ArduinoAgentConnectionStatus, ArduinoUploadProgressStatus } from "../../../typings/arduino";
|
|
3
4
|
import type { AtomContainerSizeState, AtomExerciseRoomState, AtomExerciseState, AtomFileEditorCursorState, AtomLectureState, AtomMultilangEnvironmentJson, AtomMultilangEnvironmentState, AtomRunnerRoomConnectionInfoState, AtomRunnerRunTypeState, AtomRunnerStdioFilesState, AtomUserState, AtomVisibilityState, AtomWebSocketStateKey, AtomWebSocketStates } from './recoilTypes';
|
|
4
5
|
/**
|
|
@@ -146,3 +147,7 @@ export declare const exerciseFileEditorCursorState: import("recoil").RecoilState
|
|
|
146
147
|
*
|
|
147
148
|
*/
|
|
148
149
|
export declare const exerciseFileEditorCursorSelectionValueState: import("recoil").RecoilState<string | null>;
|
|
150
|
+
/**
|
|
151
|
+
*
|
|
152
|
+
*/
|
|
153
|
+
export declare const exerciseMonacoEditorApisState: import("recoil").RecoilState<MonacoEditorApis | null>;
|
|
@@ -614,5 +614,14 @@ const exerciseFileEditorCursorSelectionValueState = atom({
|
|
|
614
614
|
key: `${KEY_PREFIX}/FileEditorCursorSelectionValue`,
|
|
615
615
|
default: null
|
|
616
616
|
});
|
|
617
|
+
/**
|
|
618
|
+
*
|
|
619
|
+
*/
|
|
620
|
+
|
|
621
|
+
const exerciseMonacoEditorApisState = atom({
|
|
622
|
+
key: `${KEY_PREFIX}/MonacoEditorApisState`,
|
|
623
|
+
default: null,
|
|
624
|
+
dangerouslyAllowMutability: true
|
|
625
|
+
});
|
|
617
626
|
|
|
618
|
-
export { exerciseActiveFilenameState, exerciseArduinoAgentConnectionState, exerciseArduinoAgentModalState, exerciseArduinoOnSelectPortState, exerciseArduinoOpenedPortNameState, exerciseArduinoPortsState, exerciseArduinoPreferenceState, exerciseArduinoUploadProgressState, exerciseContainerSizeState, exerciseEditorPreferenceState, exerciseFileEditorCursorSelectionValueState, exerciseFileEditorCursorState, exerciseFileTabsOpenedState, exerciseFileTreeOpenedState, exerciseLectureState, exerciseMultilangEnvironmentState, exerciseMultilangLanguagesState, exercisePreviewDisplayModeState, exercisePreviewTypeState, exerciseRightpaneActiveState, exerciseRoomState, exerciseRunnerRoomConnectionInfoState, exerciseRunnerRunTypeState, exerciseRunnerRunningState, exerciseRunnerStdioFilesState, exerciseRunnerSubmittingState, exerciseRunnerWebSocketStatusQuery, exerciseState, exerciseUserState, exerciseWebsocketQuery, exerciseWebsocketStates };
|
|
627
|
+
export { exerciseActiveFilenameState, exerciseArduinoAgentConnectionState, exerciseArduinoAgentModalState, exerciseArduinoOnSelectPortState, exerciseArduinoOpenedPortNameState, exerciseArduinoPortsState, exerciseArduinoPreferenceState, exerciseArduinoUploadProgressState, exerciseContainerSizeState, exerciseEditorPreferenceState, exerciseFileEditorCursorSelectionValueState, exerciseFileEditorCursorState, exerciseFileTabsOpenedState, exerciseFileTreeOpenedState, exerciseLectureState, exerciseMonacoEditorApisState, exerciseMultilangEnvironmentState, exerciseMultilangLanguagesState, exercisePreviewDisplayModeState, exercisePreviewTypeState, exerciseRightpaneActiveState, exerciseRoomState, exerciseRunnerRoomConnectionInfoState, exerciseRunnerRunTypeState, exerciseRunnerRunningState, exerciseRunnerStdioFilesState, exerciseRunnerSubmittingState, exerciseRunnerWebSocketStatusQuery, exerciseState, exerciseUserState, exerciseWebsocketQuery, exerciseWebsocketStates };
|
|
@@ -64,7 +64,14 @@ export declare type MaterialExerciseCommonPropExerciseImageEmptyOptions = Exerci
|
|
|
64
64
|
/**
|
|
65
65
|
* On code help button click.
|
|
66
66
|
*/
|
|
67
|
-
export declare type MaterialExerciseCommonPropOnCodeHelpRequest = (
|
|
67
|
+
export declare type MaterialExerciseCommonPropOnCodeHelpRequest = (params: {
|
|
68
|
+
code: string;
|
|
69
|
+
error?: CodeHelperError;
|
|
70
|
+
payload?: any;
|
|
71
|
+
readme?: string;
|
|
72
|
+
instruction?: string;
|
|
73
|
+
openFileContent?: string;
|
|
74
|
+
}) => void;
|
|
68
75
|
/**
|
|
69
76
|
* On default exercise room ID set.
|
|
70
77
|
*/
|
|
@@ -16,7 +16,7 @@ import 'monaco-editor/esm/vs/editor/editor.api';
|
|
|
16
16
|
import '../../shared/monaco-editor/constants/monaco/preferences.js';
|
|
17
17
|
import 'react-use';
|
|
18
18
|
import 'socket.io-client';
|
|
19
|
-
import { exerciseState, exerciseRoomState, exerciseLectureState, exerciseEditorPreferenceState, exerciseActiveFilenameState, exerciseWebsocketQuery, exerciseFileEditorCursorState, exerciseFileEditorCursorSelectionValueState } from '../context/recoil.js';
|
|
19
|
+
import { exerciseState, exerciseRoomState, exerciseLectureState, exerciseEditorPreferenceState, exerciseActiveFilenameState, exerciseWebsocketQuery, exerciseFileEditorCursorState, exerciseFileEditorCursorSelectionValueState, exerciseMonacoEditorApisState } from '../context/recoil.js';
|
|
20
20
|
import { ExerciseContext } from '../context/context.js';
|
|
21
21
|
import '../context/recoilTypes.js';
|
|
22
22
|
import { exerciseFileEditorContentChange$, exerciseFileEditorSaveAction$ } from '../context/subjects.js';
|
|
@@ -66,6 +66,13 @@ const ExerciseFileEditor = () => {
|
|
|
66
66
|
exercise,
|
|
67
67
|
exerciseRoom
|
|
68
68
|
}));
|
|
69
|
+
const setExerciseMonacoEditorApisState = useSetRecoilState(exerciseMonacoEditorApisState);
|
|
70
|
+
React.useEffect(() => {
|
|
71
|
+
if (editorApis.current) {
|
|
72
|
+
setExerciseMonacoEditorApisState(editorApis.current);
|
|
73
|
+
} // eslint-disable-next-line react-hooks/exhaustive-deps
|
|
74
|
+
|
|
75
|
+
}, [editorApis.current]);
|
|
69
76
|
/**
|
|
70
77
|
* Set value of current file.
|
|
71
78
|
*/
|
|
@@ -10,7 +10,7 @@ import styled from 'styled-components';
|
|
|
10
10
|
import XtermLazy from '../../shared/xterm/XtermLazy.js';
|
|
11
11
|
import { MATERIAL_RESIZABLE_COMMON_PROPS } from '../../../constants/stylesheets.js';
|
|
12
12
|
import { useArduino } from '../../../hooks/useArduino.js';
|
|
13
|
-
import { exerciseState, exerciseEditorPreferenceState, exerciseRunnerSubmittingState, exerciseRunnerRunningState, exerciseRunnerRunTypeState, exerciseRunnerRoomConnectionInfoState, exerciseRunnerStdioFilesState, exercisePreviewTypeState, exercisePreviewDisplayModeState, exerciseWebsocketQuery, exerciseContainerSizeState } from '../context/recoil.js';
|
|
13
|
+
import { exerciseState, exerciseEditorPreferenceState, exerciseRunnerSubmittingState, exerciseRunnerRunningState, exerciseRunnerRunTypeState, exerciseRunnerRoomConnectionInfoState, exerciseRunnerStdioFilesState, exercisePreviewTypeState, exercisePreviewDisplayModeState, exerciseMonacoEditorApisState, exerciseWebsocketQuery, exerciseContainerSizeState } from '../context/recoil.js';
|
|
14
14
|
import { ExerciseContext } from '../context/context.js';
|
|
15
15
|
import { ExercisePreviewType, ExercisePreviewDisplayMode } from '../context/recoilTypes.js';
|
|
16
16
|
import { exerciseRunnerTextSend$ } from '../context/subjects.js';
|
|
@@ -71,16 +71,26 @@ const ExerciseRunner = ({
|
|
|
71
71
|
const setRunnerStdioFilesState = useSetRecoilState(exerciseRunnerStdioFilesState); // preview states
|
|
72
72
|
|
|
73
73
|
const exercisePreviewType = useRecoilValue(exercisePreviewTypeState(materialExerciseId));
|
|
74
|
-
const exercisePreviewDisplayMode = useRecoilValue(exercisePreviewDisplayModeState); //
|
|
74
|
+
const exercisePreviewDisplayMode = useRecoilValue(exercisePreviewDisplayModeState); // monaco editor value
|
|
75
|
+
|
|
76
|
+
const exerciseMonacoEditorApis = useRecoilValue(exerciseMonacoEditorApisState); // websockets
|
|
75
77
|
|
|
76
78
|
const setRunnerRoomWebSocketState = useSetRecoilState(exerciseWebsocketQuery('runnerRoom'));
|
|
77
79
|
const setStdioWebSocketState = useSetRecoilState(exerciseWebsocketQuery('stdio'));
|
|
78
80
|
|
|
79
81
|
const handleAiHelpibotError = text => {
|
|
82
|
+
var _a, _b, _c;
|
|
83
|
+
|
|
80
84
|
const error = getProgrammingErrorResult(text);
|
|
81
85
|
|
|
82
86
|
if (!!error && typeof onCodeHelpRequest === 'function') {
|
|
83
|
-
onCodeHelpRequest(
|
|
87
|
+
onCodeHelpRequest({
|
|
88
|
+
code: error.errorCode,
|
|
89
|
+
error: error,
|
|
90
|
+
readme: (_a = exercise === null || exercise === void 0 ? void 0 : exercise.description) !== null && _a !== void 0 ? _a : '',
|
|
91
|
+
instruction: (_b = exercise === null || exercise === void 0 ? void 0 : exercise.instructionContent) !== null && _b !== void 0 ? _b : '',
|
|
92
|
+
openFileContent: (_c = exerciseMonacoEditorApis === null || exerciseMonacoEditorApis === void 0 ? void 0 : exerciseMonacoEditorApis.getValue()) !== null && _c !== void 0 ? _c : ''
|
|
93
|
+
});
|
|
84
94
|
}
|
|
85
95
|
};
|
|
86
96
|
|
package/es/components/material-exercise/exercise-runner/ExerciseRunnerControllerButtonGroup.js
CHANGED
|
@@ -7,7 +7,7 @@ import { useRecoilValue } from 'recoil';
|
|
|
7
7
|
import styled from 'styled-components';
|
|
8
8
|
import 'react-use';
|
|
9
9
|
import 'socket.io-client';
|
|
10
|
-
import { exerciseRunnerWebSocketStatusQuery, exerciseFileEditorCursorSelectionValueState, exerciseState, exerciseRunnerRunTypeState, exerciseLectureState, exerciseRunnerSubmittingState, exerciseRunnerRunningState, exerciseArduinoUploadProgressState, exerciseArduinoOpenedPortNameState } from '../context/recoil.js';
|
|
10
|
+
import { exerciseRunnerWebSocketStatusQuery, exerciseFileEditorCursorSelectionValueState, exerciseState, exerciseRunnerRunTypeState, exerciseLectureState, exerciseRunnerSubmittingState, exerciseRunnerRunningState, exerciseArduinoUploadProgressState, exerciseArduinoOpenedPortNameState, exerciseMonacoEditorApisState } from '../context/recoil.js';
|
|
11
11
|
import { ExerciseContext } from '../context/context.js';
|
|
12
12
|
import '../context/recoilTypes.js';
|
|
13
13
|
import { exerciseFileEditorSaveAction$ } from '../context/subjects.js';
|
|
@@ -63,7 +63,9 @@ const ExerciseRunnerControllerButtonGroup = () => {
|
|
|
63
63
|
|
|
64
64
|
const isArduinoExercise = (exercise === null || exercise === void 0 ? void 0 : exercise.envType) === enums.ExerciseEnvType.Arduino;
|
|
65
65
|
const arduinoUploadProgress = useRecoilValue(exerciseArduinoUploadProgressState);
|
|
66
|
-
const arduinoOpenedPortName = useRecoilValue(exerciseArduinoOpenedPortNameState); //
|
|
66
|
+
const arduinoOpenedPortName = useRecoilValue(exerciseArduinoOpenedPortNameState); // monaco editor apis
|
|
67
|
+
|
|
68
|
+
const exerciseMonacoEditorApis = useRecoilValue(exerciseMonacoEditorApisState); //
|
|
67
69
|
// ========= ui states =========
|
|
68
70
|
//
|
|
69
71
|
// submit run
|
|
@@ -79,9 +81,7 @@ const ExerciseRunnerControllerButtonGroup = () => {
|
|
|
79
81
|
const isCancelDisabled = isCancelHidden || isNotReady || isConnecting; // sync request
|
|
80
82
|
|
|
81
83
|
const isSyncRequestHidden = !isRunning || !((_a = exercise === null || exercise === void 0 ? void 0 : exercise.readyExerciseImage) === null || _a === void 0 ? void 0 : _a.httpPort);
|
|
82
|
-
const isSyncRequestDisabled = isSyncRequestHidden || isNotReady || isConnecting; //
|
|
83
|
-
|
|
84
|
-
const isCodeHelpHidden = isRunning || isTestLecture && !isTestLectureCompleted; //
|
|
84
|
+
const isSyncRequestDisabled = isSyncRequestHidden || isNotReady || isConnecting; //
|
|
85
85
|
//
|
|
86
86
|
//
|
|
87
87
|
|
|
@@ -234,12 +234,21 @@ const ExerciseRunnerControllerButtonGroup = () => {
|
|
|
234
234
|
|
|
235
235
|
|
|
236
236
|
const renderCodeHelpRequestButton = () => {
|
|
237
|
-
if (
|
|
237
|
+
if (isRunning || !editorCursorSelectionValue || typeof onCodeHelpRequest !== 'function') {
|
|
238
238
|
return null;
|
|
239
239
|
}
|
|
240
240
|
|
|
241
241
|
return React.createElement(ExerciseRunnerControllerCodeHelpRequestButton, {
|
|
242
|
-
onClick: () =>
|
|
242
|
+
onClick: () => {
|
|
243
|
+
var _a, _b, _c;
|
|
244
|
+
|
|
245
|
+
onCodeHelpRequest({
|
|
246
|
+
code: editorCursorSelectionValue,
|
|
247
|
+
readme: (_a = exercise === null || exercise === void 0 ? void 0 : exercise.description) !== null && _a !== void 0 ? _a : '',
|
|
248
|
+
instruction: (_b = exercise === null || exercise === void 0 ? void 0 : exercise.instructionContent) !== null && _b !== void 0 ? _b : '',
|
|
249
|
+
openFileContent: (_c = exerciseMonacoEditorApis === null || exerciseMonacoEditorApis === void 0 ? void 0 : exerciseMonacoEditorApis.getValue()) !== null && _c !== void 0 ? _c : ''
|
|
250
|
+
});
|
|
251
|
+
}
|
|
243
252
|
});
|
|
244
253
|
}; //
|
|
245
254
|
//
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elice/material-exercise",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.230328.0",
|
|
4
4
|
"description": "User view and editing components of Elice material exercise",
|
|
5
5
|
"repository": "https://git.elicer.io/elice/frontend/library/elice-material",
|
|
6
6
|
"license": "UNLICENSED",
|
|
@@ -79,8 +79,8 @@
|
|
|
79
79
|
"@elice/design-tokens": "^1.220803.0",
|
|
80
80
|
"@elice/icons": "^1.220803.0",
|
|
81
81
|
"@elice/markdown": "^1.220803.0",
|
|
82
|
-
"@elice/material-shared-types": "1.
|
|
83
|
-
"@elice/material-shared-utils": "1.
|
|
82
|
+
"@elice/material-shared-types": "1.230328.0",
|
|
83
|
+
"@elice/material-shared-utils": "1.230328.0",
|
|
84
84
|
"@elice/types": "^1.230306.0",
|
|
85
85
|
"@elice/websocket": "^1.220803.0",
|
|
86
86
|
"@types/classnames": "^2.3.1",
|
|
@@ -102,5 +102,5 @@
|
|
|
102
102
|
"recoil": "^0.6.1",
|
|
103
103
|
"styled-components": "^5.2.0"
|
|
104
104
|
},
|
|
105
|
-
"gitHead": "
|
|
105
|
+
"gitHead": "c24abeffe609385031a77c725bf6e92e47e94b56"
|
|
106
106
|
}
|