@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.
@@ -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 exerciseMonacoEditorValueState: import("recoil").RecoilState<string>;
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 exerciseMonacoEditorValueState = recoil.atom({
630
- key: `${KEY_PREFIX}/MonacoEditorValueState`,
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.exerciseMonacoEditorValueState = exerciseMonacoEditorValueState;
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 = (code: string, error?: CodeHelperError, payload?: any) => void;
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 getExerciseMonacoEditorValueState = recoil.useRecoilValue(recoil$1.exerciseMonacoEditorValueState); // websockets
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(error.errorCode, error, {
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: getExerciseMonacoEditorValueState
99
+ openFileContent: (_c = exerciseMonacoEditorApis === null || exerciseMonacoEditorApis === void 0 ? void 0 : exerciseMonacoEditorApis.getValue()) !== null && _c !== void 0 ? _c : ''
98
100
  });
99
101
  }
100
102
  };
@@ -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; // code help
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 (isCodeHelpHidden || !editorCursorSelectionValue || typeof onCodeHelpRequest !== 'function') {
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: () => onCodeHelpRequest(editorCursorSelectionValue)
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 exerciseMonacoEditorValueState: import("recoil").RecoilState<string>;
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 exerciseMonacoEditorValueState = atom({
622
- key: `${KEY_PREFIX}/MonacoEditorValueState`,
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, exerciseMonacoEditorValueState, 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 = (code: string, error?: CodeHelperError, payload?: any) => void;
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, exerciseMonacoEditorValueState } 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';
@@ -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, exerciseMonacoEditorValueState, 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';
@@ -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 getExerciseMonacoEditorValueState = useRecoilValue(exerciseMonacoEditorValueState); // websockets
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(error.errorCode, error, {
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: getExerciseMonacoEditorValueState
92
+ openFileContent: (_c = exerciseMonacoEditorApis === null || exerciseMonacoEditorApis === void 0 ? void 0 : exerciseMonacoEditorApis.getValue()) !== null && _c !== void 0 ? _c : ''
91
93
  });
92
94
  }
93
95
  };
@@ -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; // code help
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 (isCodeHelpHidden || !editorCursorSelectionValue || typeof onCodeHelpRequest !== 'function') {
237
+ if (isRunning || !editorCursorSelectionValue || typeof onCodeHelpRequest !== 'function') {
238
238
  return null;
239
239
  }
240
240
 
241
241
  return React.createElement(ExerciseRunnerControllerCodeHelpRequestButton, {
242
- onClick: () => onCodeHelpRequest(editorCursorSelectionValue)
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.230325.0",
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.230325.0",
83
- "@elice/material-shared-utils": "1.230325.0",
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": "8895c0015d03f16997ce78d5f25e22258ce609f8"
105
+ "gitHead": "c24abeffe609385031a77c725bf6e92e47e94b56"
106
106
  }