@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.
@@ -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 = (code: string, error?: CodeHelperError) => 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
  */
@@ -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); // websockets
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(error.errorCode, error);
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
 
@@ -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
  /**
@@ -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 = (code: string, error?: CodeHelperError) => 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 } 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); // websockets
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(error.errorCode, error);
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
 
@@ -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.230316.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.230316.0",
83
- "@elice/material-shared-utils": "1.230316.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": "afbe8701b9b8fc094459762caa92310c194929f1"
105
+ "gitHead": "c24abeffe609385031a77c725bf6e92e47e94b56"
106
106
  }