@elice/material-exercise 1.230325.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 +2 -1
- package/cjs/components/material-exercise/context/recoil.js +5 -4
- package/cjs/components/material-exercise/context/types.d.ts +8 -1
- package/cjs/components/material-exercise/exercise-file-editor/ExerciseFileEditor.js +8 -6
- package/cjs/components/material-exercise/exercise-runner/ExerciseRunner.js +6 -4
- package/cjs/components/material-exercise/exercise-runner/ExerciseRunnerControllerButtonGroup.js +15 -6
- package/es/components/material-exercise/context/recoil.d.ts +2 -1
- package/es/components/material-exercise/context/recoil.js +5 -4
- package/es/components/material-exercise/context/types.d.ts +8 -1
- package/es/components/material-exercise/exercise-file-editor/ExerciseFileEditor.js +9 -7
- package/es/components/material-exercise/exercise-runner/ExerciseRunner.js +7 -5
- 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
|
/**
|
|
@@ -149,4 +150,4 @@ export declare const exerciseFileEditorCursorSelectionValueState: import("recoil
|
|
|
149
150
|
/**
|
|
150
151
|
*
|
|
151
152
|
*/
|
|
152
|
-
export declare const
|
|
153
|
+
export declare const exerciseMonacoEditorApisState: import("recoil").RecoilState<MonacoEditorApis | null>;
|
|
@@ -626,9 +626,10 @@ const exerciseFileEditorCursorSelectionValueState = recoil.atom({
|
|
|
626
626
|
*
|
|
627
627
|
*/
|
|
628
628
|
|
|
629
|
-
const
|
|
630
|
-
key: `${KEY_PREFIX}/
|
|
631
|
-
default:
|
|
629
|
+
const exerciseMonacoEditorApisState = recoil.atom({
|
|
630
|
+
key: `${KEY_PREFIX}/MonacoEditorApisState`,
|
|
631
|
+
default: null,
|
|
632
|
+
dangerouslyAllowMutability: true
|
|
632
633
|
});
|
|
633
634
|
|
|
634
635
|
exports.exerciseActiveFilenameState = exerciseActiveFilenameState;
|
|
@@ -646,7 +647,7 @@ exports.exerciseFileEditorCursorState = exerciseFileEditorCursorState;
|
|
|
646
647
|
exports.exerciseFileTabsOpenedState = exerciseFileTabsOpenedState;
|
|
647
648
|
exports.exerciseFileTreeOpenedState = exerciseFileTreeOpenedState;
|
|
648
649
|
exports.exerciseLectureState = exerciseLectureState;
|
|
649
|
-
exports.
|
|
650
|
+
exports.exerciseMonacoEditorApisState = exerciseMonacoEditorApisState;
|
|
650
651
|
exports.exerciseMultilangEnvironmentState = exerciseMultilangEnvironmentState;
|
|
651
652
|
exports.exerciseMultilangLanguagesState = exerciseMultilangLanguagesState;
|
|
652
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
|
*/
|
|
@@ -59,8 +59,7 @@ const ExerciseFileEditor = () => {
|
|
|
59
59
|
const readOnly = readOnlyEditor || readOnlyActiveFile;
|
|
60
60
|
const setUsercodeWebSocketState = recoil.useSetRecoilState(recoil$1.exerciseWebsocketQuery('usercodeEdit'));
|
|
61
61
|
const setFileEditorCursorState = recoil.useSetRecoilState(recoil$1.exerciseFileEditorCursorState);
|
|
62
|
-
const setFileEditorCursorSelectionValueState = recoil.useSetRecoilState(recoil$1.exerciseFileEditorCursorSelectionValueState);
|
|
63
|
-
const setExerciseMonacoEditorValueState = recoil.useSetRecoilState(recoil$1.exerciseMonacoEditorValueState); // editor
|
|
62
|
+
const setFileEditorCursorSelectionValueState = recoil.useSetRecoilState(recoil$1.exerciseFileEditorCursorSelectionValueState); // editor
|
|
64
63
|
|
|
65
64
|
const editorApis = React__default["default"].useRef(null);
|
|
66
65
|
const editorDocHistories = React__default["default"].useRef({});
|
|
@@ -73,6 +72,13 @@ const ExerciseFileEditor = () => {
|
|
|
73
72
|
exercise,
|
|
74
73
|
exerciseRoom
|
|
75
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]);
|
|
76
82
|
/**
|
|
77
83
|
* Set value of current file.
|
|
78
84
|
*/
|
|
@@ -91,7 +97,6 @@ const ExerciseFileEditor = () => {
|
|
|
91
97
|
}
|
|
92
98
|
|
|
93
99
|
if (content) {
|
|
94
|
-
setExerciseMonacoEditorValueState(content);
|
|
95
100
|
(_a = editorApis.current) === null || _a === void 0 ? void 0 : _a.setValue(content);
|
|
96
101
|
} // reset as initial value on `null` received.
|
|
97
102
|
else if (content === null) {
|
|
@@ -108,7 +113,6 @@ const ExerciseFileEditor = () => {
|
|
|
108
113
|
var _a;
|
|
109
114
|
|
|
110
115
|
if (typeof content === 'string') {
|
|
111
|
-
setExerciseMonacoEditorValueState(content);
|
|
112
116
|
(_a = editorApis.current) === null || _a === void 0 ? void 0 : _a.setValue(content);
|
|
113
117
|
} else {
|
|
114
118
|
setFileResettable(false);
|
|
@@ -263,8 +267,6 @@ const ExerciseFileEditor = () => {
|
|
|
263
267
|
return;
|
|
264
268
|
}
|
|
265
269
|
|
|
266
|
-
setExerciseMonacoEditorValueState(wsUsercode.doc);
|
|
267
|
-
|
|
268
270
|
_editorApis.setValue(wsUsercode.doc);
|
|
269
271
|
|
|
270
272
|
pushEditorDocHistories();
|
|
@@ -80,21 +80,23 @@ const ExerciseRunner = ({
|
|
|
80
80
|
const exercisePreviewType = recoil.useRecoilValue(recoil$1.exercisePreviewTypeState(materialExerciseId));
|
|
81
81
|
const exercisePreviewDisplayMode = recoil.useRecoilValue(recoil$1.exercisePreviewDisplayModeState); // monaco editor value
|
|
82
82
|
|
|
83
|
-
const
|
|
83
|
+
const exerciseMonacoEditorApis = recoil.useRecoilValue(recoil$1.exerciseMonacoEditorApisState); // websockets
|
|
84
84
|
|
|
85
85
|
const setRunnerRoomWebSocketState = recoil.useSetRecoilState(recoil$1.exerciseWebsocketQuery('runnerRoom'));
|
|
86
86
|
const setStdioWebSocketState = recoil.useSetRecoilState(recoil$1.exerciseWebsocketQuery('stdio'));
|
|
87
87
|
|
|
88
88
|
const handleAiHelpibotError = text => {
|
|
89
|
-
var _a, _b;
|
|
89
|
+
var _a, _b, _c;
|
|
90
90
|
|
|
91
91
|
const error = runner.getProgrammingErrorResult(text);
|
|
92
92
|
|
|
93
93
|
if (!!error && typeof onCodeHelpRequest === 'function') {
|
|
94
|
-
onCodeHelpRequest(
|
|
94
|
+
onCodeHelpRequest({
|
|
95
|
+
code: error.errorCode,
|
|
96
|
+
error: error,
|
|
95
97
|
readme: (_a = exercise === null || exercise === void 0 ? void 0 : exercise.description) !== null && _a !== void 0 ? _a : '',
|
|
96
98
|
instruction: (_b = exercise === null || exercise === void 0 ? void 0 : exercise.instructionContent) !== null && _b !== void 0 ? _b : '',
|
|
97
|
-
openFileContent:
|
|
99
|
+
openFileContent: (_c = exerciseMonacoEditorApis === null || exerciseMonacoEditorApis === void 0 ? void 0 : exerciseMonacoEditorApis.getValue()) !== null && _c !== void 0 ? _c : ''
|
|
98
100
|
});
|
|
99
101
|
}
|
|
100
102
|
};
|
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
|
/**
|
|
@@ -149,4 +150,4 @@ export declare const exerciseFileEditorCursorSelectionValueState: import("recoil
|
|
|
149
150
|
/**
|
|
150
151
|
*
|
|
151
152
|
*/
|
|
152
|
-
export declare const
|
|
153
|
+
export declare const exerciseMonacoEditorApisState: import("recoil").RecoilState<MonacoEditorApis | null>;
|
|
@@ -618,9 +618,10 @@ const exerciseFileEditorCursorSelectionValueState = atom({
|
|
|
618
618
|
*
|
|
619
619
|
*/
|
|
620
620
|
|
|
621
|
-
const
|
|
622
|
-
key: `${KEY_PREFIX}/
|
|
623
|
-
default:
|
|
621
|
+
const exerciseMonacoEditorApisState = atom({
|
|
622
|
+
key: `${KEY_PREFIX}/MonacoEditorApisState`,
|
|
623
|
+
default: null,
|
|
624
|
+
dangerouslyAllowMutability: true
|
|
624
625
|
});
|
|
625
626
|
|
|
626
|
-
export { exerciseActiveFilenameState, exerciseArduinoAgentConnectionState, exerciseArduinoAgentModalState, exerciseArduinoOnSelectPortState, exerciseArduinoOpenedPortNameState, exerciseArduinoPortsState, exerciseArduinoPreferenceState, exerciseArduinoUploadProgressState, exerciseContainerSizeState, exerciseEditorPreferenceState, exerciseFileEditorCursorSelectionValueState, exerciseFileEditorCursorState, exerciseFileTabsOpenedState, exerciseFileTreeOpenedState, exerciseLectureState,
|
|
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,
|
|
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';
|
|
@@ -53,8 +53,7 @@ const ExerciseFileEditor = () => {
|
|
|
53
53
|
const readOnly = readOnlyEditor || readOnlyActiveFile;
|
|
54
54
|
const setUsercodeWebSocketState = useSetRecoilState(exerciseWebsocketQuery('usercodeEdit'));
|
|
55
55
|
const setFileEditorCursorState = useSetRecoilState(exerciseFileEditorCursorState);
|
|
56
|
-
const setFileEditorCursorSelectionValueState = useSetRecoilState(exerciseFileEditorCursorSelectionValueState);
|
|
57
|
-
const setExerciseMonacoEditorValueState = useSetRecoilState(exerciseMonacoEditorValueState); // editor
|
|
56
|
+
const setFileEditorCursorSelectionValueState = useSetRecoilState(exerciseFileEditorCursorSelectionValueState); // editor
|
|
58
57
|
|
|
59
58
|
const editorApis = React.useRef(null);
|
|
60
59
|
const editorDocHistories = React.useRef({});
|
|
@@ -67,6 +66,13 @@ const ExerciseFileEditor = () => {
|
|
|
67
66
|
exercise,
|
|
68
67
|
exerciseRoom
|
|
69
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]);
|
|
70
76
|
/**
|
|
71
77
|
* Set value of current file.
|
|
72
78
|
*/
|
|
@@ -85,7 +91,6 @@ const ExerciseFileEditor = () => {
|
|
|
85
91
|
}
|
|
86
92
|
|
|
87
93
|
if (content) {
|
|
88
|
-
setExerciseMonacoEditorValueState(content);
|
|
89
94
|
(_a = editorApis.current) === null || _a === void 0 ? void 0 : _a.setValue(content);
|
|
90
95
|
} // reset as initial value on `null` received.
|
|
91
96
|
else if (content === null) {
|
|
@@ -102,7 +107,6 @@ const ExerciseFileEditor = () => {
|
|
|
102
107
|
var _a;
|
|
103
108
|
|
|
104
109
|
if (typeof content === 'string') {
|
|
105
|
-
setExerciseMonacoEditorValueState(content);
|
|
106
110
|
(_a = editorApis.current) === null || _a === void 0 ? void 0 : _a.setValue(content);
|
|
107
111
|
} else {
|
|
108
112
|
setFileResettable(false);
|
|
@@ -257,8 +261,6 @@ const ExerciseFileEditor = () => {
|
|
|
257
261
|
return;
|
|
258
262
|
}
|
|
259
263
|
|
|
260
|
-
setExerciseMonacoEditorValueState(wsUsercode.doc);
|
|
261
|
-
|
|
262
264
|
_editorApis.setValue(wsUsercode.doc);
|
|
263
265
|
|
|
264
266
|
pushEditorDocHistories();
|
|
@@ -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,
|
|
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';
|
|
@@ -73,21 +73,23 @@ const ExerciseRunner = ({
|
|
|
73
73
|
const exercisePreviewType = useRecoilValue(exercisePreviewTypeState(materialExerciseId));
|
|
74
74
|
const exercisePreviewDisplayMode = useRecoilValue(exercisePreviewDisplayModeState); // monaco editor value
|
|
75
75
|
|
|
76
|
-
const
|
|
76
|
+
const exerciseMonacoEditorApis = useRecoilValue(exerciseMonacoEditorApisState); // websockets
|
|
77
77
|
|
|
78
78
|
const setRunnerRoomWebSocketState = useSetRecoilState(exerciseWebsocketQuery('runnerRoom'));
|
|
79
79
|
const setStdioWebSocketState = useSetRecoilState(exerciseWebsocketQuery('stdio'));
|
|
80
80
|
|
|
81
81
|
const handleAiHelpibotError = text => {
|
|
82
|
-
var _a, _b;
|
|
82
|
+
var _a, _b, _c;
|
|
83
83
|
|
|
84
84
|
const error = getProgrammingErrorResult(text);
|
|
85
85
|
|
|
86
86
|
if (!!error && typeof onCodeHelpRequest === 'function') {
|
|
87
|
-
onCodeHelpRequest(
|
|
87
|
+
onCodeHelpRequest({
|
|
88
|
+
code: error.errorCode,
|
|
89
|
+
error: error,
|
|
88
90
|
readme: (_a = exercise === null || exercise === void 0 ? void 0 : exercise.description) !== null && _a !== void 0 ? _a : '',
|
|
89
91
|
instruction: (_b = exercise === null || exercise === void 0 ? void 0 : exercise.instructionContent) !== null && _b !== void 0 ? _b : '',
|
|
90
|
-
openFileContent:
|
|
92
|
+
openFileContent: (_c = exerciseMonacoEditorApis === null || exerciseMonacoEditorApis === void 0 ? void 0 : exerciseMonacoEditorApis.getValue()) !== null && _c !== void 0 ? _c : ''
|
|
91
93
|
});
|
|
92
94
|
}
|
|
93
95
|
};
|
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
|
}
|