@elice/material-exercise 1.250521.0 → 1.250529.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/index.js +2 -1
- package/cjs/components/material-exercise/context/recoil.d.ts +4 -4
- package/cjs/components/material-exercise/context/recoil.js +32 -30
- package/cjs/components/material-exercise/context/subjects.d.ts +5 -0
- package/cjs/components/material-exercise/context/subjects.js +5 -0
- package/cjs/components/material-exercise/context/types.d.ts +5 -1
- package/cjs/components/material-exercise/exercise-file-editor/ExerciseFileEditor.js +32 -1
- package/cjs/components/material-exercise/exercise-runner/ExerciseRunner.js +36 -4
- package/cjs/components/material-exercise/exercise-runner/ExerciseRunnerControllerButtonGroup.js +1 -1
- package/cjs/components/material-exercise/exercise-runner/ExerciseRunnerControllerStatusMessage.js +30 -11
- package/cjs/components/material-exercise/exercise-runner/locales/en.json.js +1 -1
- package/cjs/components/material-exercise/exercise-runner/locales/ja.json.js +1 -1
- package/cjs/components/material-exercise/exercise-runner/locales/ko.json.js +1 -1
- package/cjs/components/material-exercise/exercise-runner/locales/th.json.js +1 -1
- package/cjs/hooks/useRunnerRoomWebSocket.js +2 -1
- package/cjs/hooks/useStdioWebSocket.js +2 -1
- package/cjs/hooks/useUsercodeEditWebSocket.d.ts +9 -1
- package/cjs/hooks/useUsercodeEditWebSocket.js +10 -2
- package/cjs/utils/async.d.ts +4 -0
- package/cjs/utils/async.js +15 -0
- package/cjs/utils/index.d.ts +1 -0
- package/cjs/utils/index.js +2 -0
- package/es/components/material-exercise/context/index.js +2 -2
- package/es/components/material-exercise/context/recoil.d.ts +4 -4
- package/es/components/material-exercise/context/recoil.js +32 -30
- package/es/components/material-exercise/context/subjects.d.ts +5 -0
- package/es/components/material-exercise/context/subjects.js +5 -1
- package/es/components/material-exercise/context/types.d.ts +5 -1
- package/es/components/material-exercise/exercise-file-editor/ExerciseFileEditor.js +33 -2
- package/es/components/material-exercise/exercise-runner/ExerciseRunner.js +37 -5
- package/es/components/material-exercise/exercise-runner/ExerciseRunnerControllerButtonGroup.js +2 -2
- package/es/components/material-exercise/exercise-runner/ExerciseRunnerControllerStatusMessage.js +33 -14
- package/es/components/material-exercise/exercise-runner/locales/en.json.js +1 -1
- package/es/components/material-exercise/exercise-runner/locales/ja.json.js +1 -1
- package/es/components/material-exercise/exercise-runner/locales/ko.json.js +1 -1
- package/es/components/material-exercise/exercise-runner/locales/th.json.js +1 -1
- package/es/hooks/useRunnerRoomWebSocket.js +2 -1
- package/es/hooks/useStdioWebSocket.js +2 -1
- package/es/hooks/useUsercodeEditWebSocket.d.ts +9 -1
- package/es/hooks/useUsercodeEditWebSocket.js +10 -2
- package/es/utils/async.d.ts +4 -0
- package/es/utils/async.js +13 -0
- package/es/utils/index.d.ts +1 -0
- package/es/utils/index.js +1 -0
- package/package.json +3 -3
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file Collection of utils for async. logics.
|
|
5
|
+
*/
|
|
6
|
+
function withTimeout(promise, timeout, timeoutMessage) {
|
|
7
|
+
var timeoutPromise = new Promise(function (_, reject) {
|
|
8
|
+
setTimeout(function () {
|
|
9
|
+
reject(new Error(timeoutMessage !== null && timeoutMessage !== void 0 ? timeoutMessage : "Operation timeout (".concat(timeout, "ms)")));
|
|
10
|
+
}, timeout);
|
|
11
|
+
});
|
|
12
|
+
return Promise.race([promise, timeoutPromise]);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
exports.withTimeout = withTimeout;
|
package/cjs/utils/index.d.ts
CHANGED
package/cjs/utils/index.js
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var async = require('./async.js');
|
|
3
4
|
var exerciseFile = require('./exerciseFile.js');
|
|
4
5
|
var runner = require('./runner.js');
|
|
5
6
|
|
|
6
7
|
|
|
7
8
|
|
|
9
|
+
exports.withTimeout = async.withTimeout;
|
|
8
10
|
exports.checkExerciseFileEditable = exerciseFile.checkExerciseFileEditable;
|
|
9
11
|
exports.checkExerciseFileResettable = exerciseFile.checkExerciseFileResettable;
|
|
10
12
|
exports.getProgrammingErrorResult = runner.getProgrammingErrorResult;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { exerciseActiveFilenameState, exerciseAibotInfoEnableState, 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,
|
|
1
|
+
export { exerciseActiveFilenameState, exerciseAibotInfoEnableState, 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, exerciseState, exerciseUserState, exerciseWebSocketTotalStatusQuery, exerciseWebsocketQuery, exerciseWebsocketStates } from './recoil.js';
|
|
2
2
|
export { ExerciseContext } from './context.js';
|
|
3
3
|
export { ExercisePreviewDisplayMode, ExercisePreviewType } from './recoilTypes.js';
|
|
4
|
-
export { exerciseFileEditorContentChange$, exerciseFileEditorSaveAction$, exerciseRunnerRoomsOpen$, exerciseRunnerTextSend$ } from './subjects.js';
|
|
4
|
+
export { exerciseFileEditorContentChange$, exerciseFileEditorSaveAction$, exerciseFileEditorSyncRequestAction$, exerciseRunnerRoomsOpen$, exerciseRunnerTextSend$ } from './subjects.js';
|
|
5
5
|
export { default as ExerciseProvider } from './ExerciseProvider.js';
|
|
@@ -61,10 +61,6 @@ export declare const exerciseRunnerRoomConnectionInfoState: import("recoil").Rec
|
|
|
61
61
|
*
|
|
62
62
|
*/
|
|
63
63
|
export declare const exerciseRunnerStdioFilesState: import("recoil").RecoilState<AtomRunnerStdioFilesState>;
|
|
64
|
-
/**
|
|
65
|
-
*
|
|
66
|
-
*/
|
|
67
|
-
export declare const exerciseRunnerWebSocketStatusQuery: import("recoil").RecoilValueReadOnly<number>;
|
|
68
64
|
/**
|
|
69
65
|
*
|
|
70
66
|
*/
|
|
@@ -73,6 +69,10 @@ export declare const exerciseWebsocketStates: import("recoil").RecoilState<AtomW
|
|
|
73
69
|
*
|
|
74
70
|
*/
|
|
75
71
|
export declare const exerciseWebsocketQuery: (param: AtomWebSocketStateKey) => import("recoil").RecoilState<number>;
|
|
72
|
+
/**
|
|
73
|
+
* Check all necessary websockets and return the status.
|
|
74
|
+
*/
|
|
75
|
+
export declare const exerciseWebSocketTotalStatusQuery: import("recoil").RecoilValueReadOnly<number>;
|
|
76
76
|
/**
|
|
77
77
|
*
|
|
78
78
|
*/
|
|
@@ -449,30 +449,6 @@ var exerciseRunnerStdioFilesState = atom({
|
|
|
449
449
|
key: "".concat(KEY_PREFIX, "/Runner/StdioFiles"),
|
|
450
450
|
default: []
|
|
451
451
|
});
|
|
452
|
-
/**
|
|
453
|
-
*
|
|
454
|
-
*/
|
|
455
|
-
var exerciseRunnerWebSocketStatusQuery = selector({
|
|
456
|
-
key: "".concat(KEY_PREFIX, "/Runner/WebsocketState"),
|
|
457
|
-
get: function get(_ref19) {
|
|
458
|
-
var _get = _ref19.get;
|
|
459
|
-
var states = Object.freeze([_get(exerciseWebsocketStates).runnerRoom, _get(exerciseWebsocketStates).stdio]);
|
|
460
|
-
// connecting
|
|
461
|
-
if (states.includes(EliceWebSocket.CLOSED) || states.includes(EliceWebSocket.CONNECTING)) {
|
|
462
|
-
return EliceWebSocket.CONNECTING;
|
|
463
|
-
}
|
|
464
|
-
// connected
|
|
465
|
-
else if (states.every(function (state) {
|
|
466
|
-
return state === WebSocket.OPEN;
|
|
467
|
-
})) {
|
|
468
|
-
return EliceWebSocket.OPEN;
|
|
469
|
-
}
|
|
470
|
-
// reconnecting
|
|
471
|
-
else {
|
|
472
|
-
return EliceWebSocket.CONNECTING;
|
|
473
|
-
}
|
|
474
|
-
}
|
|
475
|
-
});
|
|
476
452
|
//
|
|
477
453
|
// =============== websocket ===============
|
|
478
454
|
//
|
|
@@ -493,19 +469,45 @@ var exerciseWebsocketStates = atom({
|
|
|
493
469
|
var exerciseWebsocketQuery = selectorFamily({
|
|
494
470
|
key: "".concat(KEY_PREFIX, "/Websocket/State"),
|
|
495
471
|
get: function get(key) {
|
|
496
|
-
return function (
|
|
497
|
-
var get =
|
|
472
|
+
return function (_ref19) {
|
|
473
|
+
var get = _ref19.get;
|
|
498
474
|
return get(exerciseWebsocketStates)[key];
|
|
499
475
|
};
|
|
500
476
|
},
|
|
501
477
|
set: function set(key) {
|
|
502
|
-
return function (
|
|
503
|
-
var get =
|
|
504
|
-
set =
|
|
478
|
+
return function (_ref20, newWebSocketState) {
|
|
479
|
+
var get = _ref20.get,
|
|
480
|
+
set = _ref20.set;
|
|
505
481
|
set(exerciseWebsocketStates, Object.assign(Object.assign({}, get(exerciseWebsocketStates)), _defineProperty({}, key, newWebSocketState)));
|
|
506
482
|
};
|
|
507
483
|
}
|
|
508
484
|
});
|
|
485
|
+
/**
|
|
486
|
+
* Check all necessary websockets and return the status.
|
|
487
|
+
*/
|
|
488
|
+
var exerciseWebSocketTotalStatusQuery = selector({
|
|
489
|
+
key: "".concat(KEY_PREFIX, "/Websocket/TotalStatus"),
|
|
490
|
+
get: function get(_ref21) {
|
|
491
|
+
var _get = _ref21.get;
|
|
492
|
+
var states = Object.freeze([_get(exerciseWebsocketStates).usercodeEdit, _get(exerciseWebsocketStates).runnerRoom, _get(exerciseWebsocketStates).stdio]);
|
|
493
|
+
switch (true) {
|
|
494
|
+
case states.every(function (state) {
|
|
495
|
+
return state === EliceWebSocket.OPEN;
|
|
496
|
+
}):
|
|
497
|
+
return EliceWebSocket.OPEN;
|
|
498
|
+
case states.every(function (state) {
|
|
499
|
+
return state === EliceWebSocket.CLOSED;
|
|
500
|
+
}):
|
|
501
|
+
return EliceWebSocket.CLOSED;
|
|
502
|
+
case states.every(function (state) {
|
|
503
|
+
return state === EliceWebSocket.CLOSING;
|
|
504
|
+
}):
|
|
505
|
+
return EliceWebSocket.CLOSING;
|
|
506
|
+
default:
|
|
507
|
+
return EliceWebSocket.CONNECTING;
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
});
|
|
509
511
|
//
|
|
510
512
|
// =============== multi language ===============
|
|
511
513
|
//
|
|
@@ -819,4 +821,4 @@ var exerciseMonacoEditorApisState = atom({
|
|
|
819
821
|
dangerouslyAllowMutability: true
|
|
820
822
|
});
|
|
821
823
|
|
|
822
|
-
export { exerciseActiveFilenameState, exerciseAibotInfoEnableState, 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,
|
|
824
|
+
export { exerciseActiveFilenameState, exerciseAibotInfoEnableState, 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, exerciseState, exerciseUserState, exerciseWebSocketTotalStatusQuery, exerciseWebsocketQuery, exerciseWebsocketStates };
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Subject } from 'rxjs';
|
|
2
|
+
import type { MaterialExerciseCodeEditorSyncRequest } from "./types";
|
|
2
3
|
/**
|
|
3
4
|
* Content change request to code editor.
|
|
4
5
|
*/
|
|
@@ -7,6 +8,10 @@ export declare const exerciseFileEditorContentChange$: Subject<string | null>;
|
|
|
7
8
|
* Save action emitted by file editor.
|
|
8
9
|
*/
|
|
9
10
|
export declare const exerciseFileEditorSaveAction$: Subject<void>;
|
|
11
|
+
/**
|
|
12
|
+
* Request file editor to sync full code.
|
|
13
|
+
*/
|
|
14
|
+
export declare const exerciseFileEditorSyncRequestAction$: Subject<MaterialExerciseCodeEditorSyncRequest>;
|
|
10
15
|
/**
|
|
11
16
|
* Send text request to runner stdio.
|
|
12
17
|
*/
|
|
@@ -8,6 +8,10 @@ var exerciseFileEditorContentChange$ = new Subject();
|
|
|
8
8
|
* Save action emitted by file editor.
|
|
9
9
|
*/
|
|
10
10
|
var exerciseFileEditorSaveAction$ = new Subject();
|
|
11
|
+
/**
|
|
12
|
+
* Request file editor to sync full code.
|
|
13
|
+
*/
|
|
14
|
+
var exerciseFileEditorSyncRequestAction$ = new Subject();
|
|
11
15
|
/**
|
|
12
16
|
* Send text request to runner stdio.
|
|
13
17
|
*/
|
|
@@ -17,4 +21,4 @@ var exerciseRunnerTextSend$ = new Subject();
|
|
|
17
21
|
*/
|
|
18
22
|
var exerciseRunnerRoomsOpen$ = new Subject();
|
|
19
23
|
|
|
20
|
-
export { exerciseFileEditorContentChange$, exerciseFileEditorSaveAction$, exerciseRunnerRoomsOpen$, exerciseRunnerTextSend$ };
|
|
24
|
+
export { exerciseFileEditorContentChange$, exerciseFileEditorSaveAction$, exerciseFileEditorSyncRequestAction$, exerciseRunnerRoomsOpen$, exerciseRunnerTextSend$ };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
|
-
import type { GetOrgMaterialExerciseExerciseRunningListResponses, PostOrgMaterialExerciseExerciseRunningSubmitResponses } from '@elice/types';
|
|
2
|
+
import type { GetOrgMaterialExerciseExerciseRunningListResponses, PostOrgMaterialExerciseExerciseRunningSubmitResponses, WebsocketUsercodeMessageWriteFailed, WebsocketUsercodeMessageWriteSucceed } from '@elice/types';
|
|
3
3
|
import type { MonacoEditorApis } from "../../shared/monaco-editor";
|
|
4
4
|
import type { CodeHelperError } from "../../../utils";
|
|
5
5
|
import type { ExerciseProviderNoImageProps } from './ExerciseProviderNoImage';
|
|
@@ -133,3 +133,7 @@ export interface ExerciseProviderDedicatedProps {
|
|
|
133
133
|
*/
|
|
134
134
|
readOnlyActiveFile: boolean;
|
|
135
135
|
}
|
|
136
|
+
export interface MaterialExerciseCodeEditorSyncRequest {
|
|
137
|
+
onSucceed: (msg: WebsocketUsercodeMessageWriteSucceed) => void;
|
|
138
|
+
onFailed: (msg: WebsocketUsercodeMessageWriteFailed) => void;
|
|
139
|
+
}
|
|
@@ -21,7 +21,7 @@ import 'socket.io-client';
|
|
|
21
21
|
import { exerciseState, exerciseRoomState, exerciseLectureState, exerciseEditorPreferenceState, exerciseActiveFilenameState, exerciseWebsocketQuery, exerciseFileEditorCursorState, exerciseFileEditorCursorSelectionValueState, exerciseMonacoEditorApisState } from '../context/recoil.js';
|
|
22
22
|
import { ExerciseContext } from '../context/context.js';
|
|
23
23
|
import '../context/recoilTypes.js';
|
|
24
|
-
import { exerciseFileEditorContentChange$, exerciseFileEditorSaveAction$ } from '../context/subjects.js';
|
|
24
|
+
import { exerciseFileEditorContentChange$, exerciseFileEditorSyncRequestAction$, exerciseFileEditorSaveAction$ } from '../context/subjects.js';
|
|
25
25
|
import '../context/ExerciseProvider.js';
|
|
26
26
|
import '../../../constants/arduino.js';
|
|
27
27
|
import { checkExerciseFileResettable } from '../../../utils/exerciseFile.js';
|
|
@@ -83,6 +83,8 @@ var ExerciseFileEditor = function ExerciseFileEditor() {
|
|
|
83
83
|
_React$useState8 = _slicedToArray(_React$useState7, 2),
|
|
84
84
|
isFileResettable = _React$useState8[0],
|
|
85
85
|
setFileResettable = _React$useState8[1];
|
|
86
|
+
// requests to editor
|
|
87
|
+
var usercodeSyncRequestsRef = React.useRef(new Map());
|
|
86
88
|
var setExerciseMonacoEditorApisState = useSetRecoilState(exerciseMonacoEditorApisState);
|
|
87
89
|
React.useEffect(function () {
|
|
88
90
|
if (editorApis.current) {
|
|
@@ -214,6 +216,13 @@ var ExerciseFileEditor = function ExerciseFileEditor() {
|
|
|
214
216
|
_iterator.f();
|
|
215
217
|
}
|
|
216
218
|
};
|
|
219
|
+
var handleWebsocketUsercodeWriteSucceed = function handleWebsocketUsercodeWriteSucceed(msg, requestId) {
|
|
220
|
+
var request = usercodeSyncRequestsRef.current.get(requestId);
|
|
221
|
+
if (request) {
|
|
222
|
+
usercodeSyncRequestsRef.current.delete(requestId);
|
|
223
|
+
request.onSucceed(msg);
|
|
224
|
+
}
|
|
225
|
+
};
|
|
217
226
|
/**
|
|
218
227
|
* Usercode edit web socket.
|
|
219
228
|
*/
|
|
@@ -223,7 +232,8 @@ var ExerciseFileEditor = function ExerciseFileEditor() {
|
|
|
223
232
|
onInit: function onInit() {
|
|
224
233
|
return setWebSocketReady(true);
|
|
225
234
|
},
|
|
226
|
-
onWriteNoti: handleWebsocketUsercodeWriteNoti
|
|
235
|
+
onWriteNoti: handleWebsocketUsercodeWriteNoti,
|
|
236
|
+
onWriteSucceed: handleWebsocketUsercodeWriteSucceed
|
|
227
237
|
});
|
|
228
238
|
/**
|
|
229
239
|
*
|
|
@@ -346,6 +356,27 @@ var ExerciseFileEditor = function ExerciseFileEditor() {
|
|
|
346
356
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
347
357
|
[]);
|
|
348
358
|
//
|
|
359
|
+
// Sync full usercode before submitting/running the code.
|
|
360
|
+
//
|
|
361
|
+
React.useEffect(function () {
|
|
362
|
+
var syncRequestSub = exerciseFileEditorSyncRequestAction$.subscribe(function (request) {
|
|
363
|
+
var _a;
|
|
364
|
+
var model = (_a = editorApis === null || editorApis === void 0 ? void 0 : editorApis.current) === null || _a === void 0 ? void 0 : _a.getMonacoModel();
|
|
365
|
+
if (!model) {
|
|
366
|
+
return;
|
|
367
|
+
}
|
|
368
|
+
var content = model.getValue();
|
|
369
|
+
var _wsUsercode$sendOTs = wsUsercode.sendOTs([{
|
|
370
|
+
d: content
|
|
371
|
+
}, content]),
|
|
372
|
+
requestId = _wsUsercode$sendOTs.requestId;
|
|
373
|
+
usercodeSyncRequestsRef.current.set(requestId, request);
|
|
374
|
+
});
|
|
375
|
+
return function () {
|
|
376
|
+
syncRequestSub.unsubscribe();
|
|
377
|
+
};
|
|
378
|
+
}, [wsUsercode]);
|
|
379
|
+
//
|
|
349
380
|
// Emit editor change event to parent component.
|
|
350
381
|
//
|
|
351
382
|
useDebounce(function () {
|
|
@@ -15,8 +15,9 @@ import { useArduino } from '../../../hooks/useArduino.js';
|
|
|
15
15
|
import { exerciseState, exerciseEditorPreferenceState, exerciseRunnerSubmittingState, exerciseRunnerRunningState, exerciseRunnerRunTypeState, exerciseRunnerRoomConnectionInfoState, exerciseRunnerStdioFilesState, exercisePreviewTypeState, exercisePreviewDisplayModeState, exerciseMonacoEditorApisState, exerciseWebsocketQuery, exerciseContainerSizeState } from '../context/recoil.js';
|
|
16
16
|
import { ExerciseContext } from '../context/context.js';
|
|
17
17
|
import { ExercisePreviewType, ExercisePreviewDisplayMode } from '../context/recoilTypes.js';
|
|
18
|
-
import { exerciseRunnerTextSend$ } from '../context/subjects.js';
|
|
18
|
+
import { exerciseRunnerTextSend$, exerciseFileEditorSyncRequestAction$ } from '../context/subjects.js';
|
|
19
19
|
import '../context/ExerciseProvider.js';
|
|
20
|
+
import { withTimeout } from '../../../utils/async.js';
|
|
20
21
|
import { getProgrammingErrorResult } from '../../../utils/runner.js';
|
|
21
22
|
import { useRunnerRoomWebSocket } from '../../../hooks/useRunnerRoomWebSocket.js';
|
|
22
23
|
import { useStdioWebSocket } from '../../../hooks/useStdioWebSocket.js';
|
|
@@ -287,6 +288,14 @@ var ExerciseRunner = function ExerciseRunner(_ref) {
|
|
|
287
288
|
break;
|
|
288
289
|
}
|
|
289
290
|
};
|
|
291
|
+
var requestUsercodeSync = function requestUsercodeSync() {
|
|
292
|
+
return new Promise(function (resolve, reject) {
|
|
293
|
+
exerciseFileEditorSyncRequestAction$.next({
|
|
294
|
+
onSucceed: resolve,
|
|
295
|
+
onFailed: reject
|
|
296
|
+
});
|
|
297
|
+
});
|
|
298
|
+
};
|
|
290
299
|
/**
|
|
291
300
|
* Handle submit code to runner and run / grade.
|
|
292
301
|
*/
|
|
@@ -296,14 +305,37 @@ var ExerciseRunner = function ExerciseRunner(_ref) {
|
|
|
296
305
|
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
297
306
|
while (1) switch (_context.prev = _context.next) {
|
|
298
307
|
case 0:
|
|
308
|
+
_context.prev = 0;
|
|
309
|
+
_context.next = 3;
|
|
310
|
+
return withTimeout(requestUsercodeSync(), 2000);
|
|
311
|
+
case 3:
|
|
312
|
+
_context.next = 9;
|
|
313
|
+
break;
|
|
314
|
+
case 5:
|
|
315
|
+
_context.prev = 5;
|
|
316
|
+
_context.t0 = _context["catch"](0);
|
|
317
|
+
setRunnerSubmitErrorDialog({
|
|
318
|
+
code: 'try_again',
|
|
319
|
+
message: __intl.formatMessage({
|
|
320
|
+
id: 'exerciseRunner.submitErrorDialog.body.networkError'
|
|
321
|
+
}),
|
|
322
|
+
action: __intl.formatMessage({
|
|
323
|
+
id: 'exerciseRunner.submitErrorDialog.action.reload'
|
|
324
|
+
}),
|
|
325
|
+
onAction: function onAction() {
|
|
326
|
+
return window.location.reload();
|
|
327
|
+
}
|
|
328
|
+
});
|
|
329
|
+
return _context.abrupt("return");
|
|
330
|
+
case 9:
|
|
299
331
|
readyExerciseImage = exercise === null || exercise === void 0 ? void 0 : exercise.readyExerciseImage;
|
|
300
332
|
roomToken = (_a = wsRunnerRoom.roomConnectionInfo) === null || _a === void 0 ? void 0 : _a.roomToken;
|
|
301
333
|
if (!(!readyExerciseImage || !roomToken)) {
|
|
302
|
-
_context.next =
|
|
334
|
+
_context.next = 13;
|
|
303
335
|
break;
|
|
304
336
|
}
|
|
305
337
|
return _context.abrupt("return");
|
|
306
|
-
case
|
|
338
|
+
case 13:
|
|
307
339
|
setRunnerStdioFilesState([]);
|
|
308
340
|
setRunnerRunTypeState(runType);
|
|
309
341
|
setRunnerSubmitting(true);
|
|
@@ -324,11 +356,11 @@ var ExerciseRunner = function ExerciseRunner(_ref) {
|
|
|
324
356
|
onError(err);
|
|
325
357
|
}
|
|
326
358
|
}));
|
|
327
|
-
case
|
|
359
|
+
case 17:
|
|
328
360
|
case "end":
|
|
329
361
|
return _context.stop();
|
|
330
362
|
}
|
|
331
|
-
}, _callee);
|
|
363
|
+
}, _callee, null, [[0, 5]]);
|
|
332
364
|
}));
|
|
333
365
|
return function handleRunnerSubmit(_x) {
|
|
334
366
|
return _ref2.apply(this, arguments);
|
package/es/components/material-exercise/exercise-runner/ExerciseRunnerControllerButtonGroup.js
CHANGED
|
@@ -9,7 +9,7 @@ import { useRecoilValue } from 'recoil';
|
|
|
9
9
|
import styled from 'styled-components';
|
|
10
10
|
import 'react-use';
|
|
11
11
|
import 'socket.io-client';
|
|
12
|
-
import {
|
|
12
|
+
import { exerciseWebSocketTotalStatusQuery, exerciseState, exerciseRunnerRunTypeState, exerciseLectureState, exerciseRunnerSubmittingState, exerciseRunnerRunningState, exerciseArduinoUploadProgressState, exerciseArduinoOpenedPortNameState } from '../context/recoil.js';
|
|
13
13
|
import { ExerciseContext } from '../context/context.js';
|
|
14
14
|
import '../context/recoilTypes.js';
|
|
15
15
|
import { exerciseFileEditorSaveAction$ } from '../context/subjects.js';
|
|
@@ -43,7 +43,7 @@ var ExerciseRunnerControllerButtonGroup = function ExerciseRunnerControllerButto
|
|
|
43
43
|
onSubmit = _React$useContext2.onSubmit,
|
|
44
44
|
onSyncRequest = _React$useContext2.onSyncRequest,
|
|
45
45
|
onCancel = _React$useContext2.onCancel;
|
|
46
|
-
var runnerWebsocketStatus = useRecoilValue(
|
|
46
|
+
var runnerWebsocketStatus = useRecoilValue(exerciseWebSocketTotalStatusQuery);
|
|
47
47
|
var exercise = useRecoilValue(exerciseState(materialExerciseId));
|
|
48
48
|
var exerciseRunType = useRecoilValue(exerciseRunnerRunTypeState);
|
|
49
49
|
var exerciseWithNoGrade = Boolean(exercise === null || exercise === void 0 ? void 0 : exercise.isNoSubmitGrade);
|
package/es/components/material-exercise/exercise-runner/ExerciseRunnerControllerStatusMessage.js
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { slicedToArray as _slicedToArray } from '../../../_virtual/_rollupPluginBabelHelpers.js';
|
|
2
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
3
|
+
import { useState, useEffect } from 'react';
|
|
4
|
+
import { Flex, Tooltip, Text } from '@elice/blocks';
|
|
3
5
|
import { useRawEliceIntl } from '@elice/intl';
|
|
4
6
|
import { EliceWebSocket } from '@elice/websocket';
|
|
5
7
|
import { useRecoilValue } from 'recoil';
|
|
6
8
|
import styled from 'styled-components';
|
|
7
|
-
import {
|
|
9
|
+
import { exerciseWebSocketTotalStatusQuery } from '../context/recoil.js';
|
|
8
10
|
import '../context/context.js';
|
|
9
11
|
import '../context/recoilTypes.js';
|
|
10
12
|
import '../context/subjects.js';
|
|
@@ -16,7 +18,16 @@ var StyledMessageWrapper = styled(Flex).withConfig({
|
|
|
16
18
|
})(["height:1rem;"]);
|
|
17
19
|
var ExerciseRunnerControllerStatusMessage = function ExerciseRunnerControllerStatusMessage() {
|
|
18
20
|
var intl = useRawEliceIntl();
|
|
19
|
-
var websocketStatus = useRecoilValue(
|
|
21
|
+
var websocketStatus = useRecoilValue(exerciseWebSocketTotalStatusQuery);
|
|
22
|
+
var _useState = useState(false),
|
|
23
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
24
|
+
isOpenedOnce = _useState2[0],
|
|
25
|
+
setIsOpenedOnce = _useState2[1];
|
|
26
|
+
useEffect(function () {
|
|
27
|
+
if (websocketStatus === EliceWebSocket.OPEN) {
|
|
28
|
+
setIsOpenedOnce(true);
|
|
29
|
+
}
|
|
30
|
+
}, [websocketStatus]);
|
|
20
31
|
/**
|
|
21
32
|
* Websocket state message.
|
|
22
33
|
*/
|
|
@@ -40,16 +51,24 @@ var ExerciseRunnerControllerStatusMessage = function ExerciseRunnerControllerSta
|
|
|
40
51
|
//
|
|
41
52
|
//
|
|
42
53
|
//
|
|
43
|
-
return
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
54
|
+
return jsx(Tooltip, {
|
|
55
|
+
visible: isOpenedOnce && websocketStatus !== EliceWebSocket.OPEN,
|
|
56
|
+
placement: "top-end",
|
|
57
|
+
dark: false,
|
|
58
|
+
title: intl.formatMessage({
|
|
59
|
+
id: 'exerciseRunner.controller.tooltip.closed'
|
|
60
|
+
}),
|
|
61
|
+
children: jsxs(StyledMessageWrapper, {
|
|
62
|
+
align: "center",
|
|
63
|
+
children: [jsx(ExerciseRunnerControllerStatusIndicator, {
|
|
64
|
+
status: websocketStatus === EliceWebSocket.OPEN ? 'success' : websocketStatus === EliceWebSocket.CLOSED ? 'error' : 'warning'
|
|
65
|
+
}), jsx(Text, {
|
|
66
|
+
role: "gray3",
|
|
67
|
+
size: "tiny",
|
|
68
|
+
bold: true,
|
|
69
|
+
children: getWebsocketStateMessage()
|
|
70
|
+
})]
|
|
71
|
+
})
|
|
53
72
|
});
|
|
54
73
|
};
|
|
55
74
|
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var messageEn = {"exerciseRunner.controller.arduino.connectionStatus.connected":"Connected to Arduino","exerciseRunner.controller.arduino.connectionStatus.connectedDevice":"Connected to {device}","exerciseRunner.controller.arduino.connectionStatus.connecting":"Connecting to Elice Arduino Agent","exerciseRunner.controller.arduino.connectionStatus.disconnected":"Disconnected from Elice Arduino Agent","exerciseRunner.controller.arduino.connectionStatus.noDevice":"No connected device","exerciseRunner.controller.arduino.connectionStatus.reconnecting":"Connecting to Elice Arduino Agent","exerciseRunner.controller.arduino.connectionStatus.uploading":"Uploading...","exerciseRunner.controller.arduino.agent.title":"Connect to Agent","exerciseRunner.controller.arduino.agent.instruction.install":"1. Install Elice arduino agent","exerciseRunner.controller.arduino.agent.instruction.install.detail":"Install 'elice-arduino-agent' program to connect to arduino.","exerciseRunner.controller.arduino.agent.instruction.install.window":"Download for Windows","exerciseRunner.controller.arduino.agent.instruction.install.mac":"Download for MacOS","exerciseRunner.controller.arduino.agent.instruction.connect":"2. Connect to arduino","exerciseRunner.controller.arduino.agent.instruction.connect.detail":"After the download is completed, it should be connected to exercise environment. If connection is unavailable, please follow the manual.\nClick the button below to read the manual.","exerciseRunner.controller.arduino.agent.instruction.connect.button":"Go to Manual","exerciseRunner.controller.arduino.agent.instruction.close":"Close","exerciseRunner.controller.buttonGroup.button.compile":"Compile","exerciseRunner.controller.buttonGroup.button.helpRequest":"Ask about the dragged code","exerciseRunner.controller.buttonGroup.button.run":"Run","exerciseRunner.controller.buttonGroup.button.stop":"Stop","exerciseRunner.controller.buttonGroup.button.submit":"Submit","exerciseRunner.controller.buttonGroup.button.submit.tooltip.noSubmit":"Exercise without submission","exerciseRunner.controller.buttonGroup.button.syncRequest":"Sync code","exerciseRunner.controller.buttonGroup.button.tooltip.aiHelp":"Ask any questions you may have.","exerciseRunner.controller.runningInfo.error.fetch":"An error occurred while fetching running info","exerciseRunner.controller.runningInfo.lastRunningDatetime":"Last running datetime","exerciseRunner.controller.runningInfo.lastSubmitDatetime":"Last submit datetime","exerciseRunner.controller.runningInfo.lastSubmitScore":"Last submit score","exerciseRunner.controller.runningInfo.score":"{score}","exerciseRunner.controller.statusMessage.closed":"Editor disconnected","exerciseRunner.controller.statusMessage.connecting":"Connecting to editor...","exerciseRunner.controller.statusMessage.open":"Editor connected","exerciseRunner.controller.timer.runningRemainingTime":"Remaining: {remainingTime}","exerciseRunner.submitErrorDialog.action.confirm":"OK","exerciseRunner.submitErrorDialog.action.reload":"Reload page","exerciseRunner.submitErrorDialog.body.commonError":"An error occurred while running the code.\nPlease refresh and try again.","exerciseRunner.submitErrorDialog.body.exceedSubmitGradeLimit":"You have exceeded the allowed number of lab submissions.","exerciseRunner.submitErrorDialog.body.expiredExerciseImage":"The exercise image has been updated.\nPlease refresh and try again.","exerciseRunner.submitErrorDialog.body.networkError":"An error occurred while running the code.\nPlease refresh and try again.\nIf the problem persists, please check the network status.","exerciseRunner.submitErrorDialog.body.notForSubmitGrade":"This exercise is not allowed to be submitted.","exerciseRunner.submitErrorDialog.body.notPreparedRoom":"The exercise room is being prepared.\nPlease try again later.","exerciseRunner.submitErrorDialog.body.roomIsBusy":"The exercise room is running.\nPlease wait a moment.","exerciseRunner.submitErrorDialog.body.unknown":"An error occurred while running the code.\nPlease try again later.","exerciseRunner.submitErrorDialog.title":"Unable to run the code"};
|
|
1
|
+
var messageEn = {"exerciseRunner.controller.arduino.connectionStatus.connected":"Connected to Arduino","exerciseRunner.controller.arduino.connectionStatus.connectedDevice":"Connected to {device}","exerciseRunner.controller.arduino.connectionStatus.connecting":"Connecting to Elice Arduino Agent","exerciseRunner.controller.arduino.connectionStatus.disconnected":"Disconnected from Elice Arduino Agent","exerciseRunner.controller.arduino.connectionStatus.noDevice":"No connected device","exerciseRunner.controller.arduino.connectionStatus.reconnecting":"Connecting to Elice Arduino Agent","exerciseRunner.controller.arduino.connectionStatus.uploading":"Uploading...","exerciseRunner.controller.arduino.agent.title":"Connect to Agent","exerciseRunner.controller.arduino.agent.instruction.install":"1. Install Elice arduino agent","exerciseRunner.controller.arduino.agent.instruction.install.detail":"Install 'elice-arduino-agent' program to connect to arduino.","exerciseRunner.controller.arduino.agent.instruction.install.window":"Download for Windows","exerciseRunner.controller.arduino.agent.instruction.install.mac":"Download for MacOS","exerciseRunner.controller.arduino.agent.instruction.connect":"2. Connect to arduino","exerciseRunner.controller.arduino.agent.instruction.connect.detail":"After the download is completed, it should be connected to exercise environment. If connection is unavailable, please follow the manual.\nClick the button below to read the manual.","exerciseRunner.controller.arduino.agent.instruction.connect.button":"Go to Manual","exerciseRunner.controller.arduino.agent.instruction.close":"Close","exerciseRunner.controller.buttonGroup.button.compile":"Compile","exerciseRunner.controller.buttonGroup.button.helpRequest":"Ask about the dragged code","exerciseRunner.controller.buttonGroup.button.run":"Run","exerciseRunner.controller.buttonGroup.button.stop":"Stop","exerciseRunner.controller.buttonGroup.button.submit":"Submit","exerciseRunner.controller.buttonGroup.button.submit.tooltip.noSubmit":"Exercise without submission","exerciseRunner.controller.buttonGroup.button.syncRequest":"Sync code","exerciseRunner.controller.buttonGroup.button.tooltip.aiHelp":"Ask any questions you may have.","exerciseRunner.controller.runningInfo.error.fetch":"An error occurred while fetching running info","exerciseRunner.controller.runningInfo.lastRunningDatetime":"Last running datetime","exerciseRunner.controller.runningInfo.lastSubmitDatetime":"Last submit datetime","exerciseRunner.controller.runningInfo.lastSubmitScore":"Last submit score","exerciseRunner.controller.runningInfo.score":"{score}","exerciseRunner.controller.statusMessage.closed":"Editor disconnected","exerciseRunner.controller.statusMessage.connecting":"Connecting to editor...","exerciseRunner.controller.statusMessage.open":"Editor connected","exerciseRunner.controller.tooltip.closed":"The connection to the code server is currently unstable, so your edits may not be saved.\nPlease check your network and try again.","exerciseRunner.controller.timer.runningRemainingTime":"Remaining: {remainingTime}","exerciseRunner.submitErrorDialog.action.confirm":"OK","exerciseRunner.submitErrorDialog.action.reload":"Reload page","exerciseRunner.submitErrorDialog.body.commonError":"An error occurred while running the code.\nPlease refresh and try again.","exerciseRunner.submitErrorDialog.body.exceedSubmitGradeLimit":"You have exceeded the allowed number of lab submissions.","exerciseRunner.submitErrorDialog.body.expiredExerciseImage":"The exercise image has been updated.\nPlease refresh and try again.","exerciseRunner.submitErrorDialog.body.networkError":"An error occurred while running the code.\nPlease refresh and try again.\nIf the problem persists, please check the network status.","exerciseRunner.submitErrorDialog.body.notForSubmitGrade":"This exercise is not allowed to be submitted.","exerciseRunner.submitErrorDialog.body.notPreparedRoom":"The exercise room is being prepared.\nPlease try again later.","exerciseRunner.submitErrorDialog.body.roomIsBusy":"The exercise room is running.\nPlease wait a moment.","exerciseRunner.submitErrorDialog.body.unknown":"An error occurred while running the code.\nPlease try again later.","exerciseRunner.submitErrorDialog.title":"Unable to run the code"};
|
|
2
2
|
|
|
3
3
|
export { messageEn as default };
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var ja = {"exerciseRunner.controller.arduino.connectionStatus.connected":"Arduinoに接続されました","exerciseRunner.controller.arduino.connectionStatus.connectedDevice":"{device}に接続されました","exerciseRunner.controller.arduino.connectionStatus.connecting":"Elice Arduino エージェントに接続中","exerciseRunner.controller.arduino.connectionStatus.disconnected":"Elice Arduino エージェントから切断されました","exerciseRunner.controller.arduino.connectionStatus.noDevice":"接続されたデバイスはありません。","exerciseRunner.controller.arduino.connectionStatus.reconnecting":"Elice Arduino エージェントに接続中","exerciseRunner.controller.arduino.connectionStatus.uploading":"アップロード中...","exerciseRunner.controller.arduino.agent.title":"エージェントに接続します","exerciseRunner.controller.arduino.agent.instruction.install":"1. Elice Arduino エージェントをインストールします。","exerciseRunner.controller.arduino.agent.instruction.install.detail":"'elice-arduino-agent' プログラムをインストールして Arduino に接続してください。","exerciseRunner.controller.arduino.agent.instruction.install.window":"Windows用のダウンロード","exerciseRunner.controller.arduino.agent.instruction.install.mac":"MacOS用のダウンロード","exerciseRunner.controller.arduino.agent.instruction.connect":"2. Arduinoに接続します。","exerciseRunner.controller.arduino.agent.instruction.connect.detail":"ダウンロードが完了したら、運動環境に接続する必要があります。接続できない場合は、マニュアルに従ってください。\nマニュアルを読むために下のボタンをクリックしてください。","exerciseRunner.controller.arduino.agent.instruction.connect.button":"マニュアルを参照してください。","exerciseRunner.controller.arduino.agent.instruction.close":"閉じる","exerciseRunner.controller.buttonGroup.button.compile":"コンパイル","exerciseRunner.controller.buttonGroup.button.helpRequest":"ドラッグしたコードの質問","exerciseRunner.controller.buttonGroup.button.run":"ラン","exerciseRunner.controller.buttonGroup.button.stop":"停止","exerciseRunner.controller.buttonGroup.button.submit":"提出","exerciseRunner.controller.buttonGroup.button.submit.tooltip.noSubmit":"提出なしの運動","exerciseRunner.controller.buttonGroup.button.syncRequest":"コードを同期します","exerciseRunner.controller.buttonGroup.button.tooltip.aiHelp":"どんな質問がありますか。","exerciseRunner.controller.runningInfo.error.fetch":"ランニング情報を取得中にエラーが発生しました。","exerciseRunner.controller.runningInfo.lastRunningDatetime":"最終実行日時","exerciseRunner.controller.runningInfo.lastSubmitDatetime":"最終送信日時","exerciseRunner.controller.runningInfo.lastSubmitScore":"最後に提出したスコア","exerciseRunner.controller.runningInfo.score":"{得点}","exerciseRunner.controller.statusMessage.closed":"エディタが切断されました。","exerciseRunner.controller.statusMessage.connecting":"エディタへの接続中...","exerciseRunner.controller.statusMessage.open":"エディターが接続されました","exerciseRunner.controller.timer.runningRemainingTime":"残り時間: {remainingTime}","exerciseRunner.submitErrorDialog.action.confirm":"OK","exerciseRunner.submitErrorDialog.action.reload":"ページをリロードしてください。","exerciseRunner.submitErrorDialog.body.commonError":"コードを実行中にエラーが発生しました。\nページを更新してもう一度お試しください。","exerciseRunner.submitErrorDialog.body.exceedSubmitGradeLimit":"許可された実験提出回数を超えています。","exerciseRunner.submitErrorDialog.body.expiredExerciseImage":"エクササイズ画像が更新されました。\nもう一度更新してやり直してください。","exerciseRunner.submitErrorDialog.body.networkError":"コードを実行中にエラーが発生しました。\nページを更新して、もう一度お試しください。\n問題が解決しない場合は、ネットワークの状態を確認してください。","exerciseRunner.submitErrorDialog.body.notForSubmitGrade":"この演習は提出してはいけません。","exerciseRunner.submitErrorDialog.body.notPreparedRoom":"エクササイズルームは準備中です。\n後で再試行してください。","exerciseRunner.submitErrorDialog.body.roomIsBusy":"運動室は稼働しています。\n少々お待ちください。","exerciseRunner.submitErrorDialog.body.unknown":"コードの実行中にエラーが発生しました。\n後でもう一度お試しください。","exerciseRunner.submitErrorDialog.title":"コードを実行できません。"};
|
|
1
|
+
var ja = {"exerciseRunner.controller.arduino.connectionStatus.connected":"Arduinoに接続されました","exerciseRunner.controller.arduino.connectionStatus.connectedDevice":"{device}に接続されました","exerciseRunner.controller.arduino.connectionStatus.connecting":"Elice Arduino エージェントに接続中","exerciseRunner.controller.arduino.connectionStatus.disconnected":"Elice Arduino エージェントから切断されました","exerciseRunner.controller.arduino.connectionStatus.noDevice":"接続されたデバイスはありません。","exerciseRunner.controller.arduino.connectionStatus.reconnecting":"Elice Arduino エージェントに接続中","exerciseRunner.controller.arduino.connectionStatus.uploading":"アップロード中...","exerciseRunner.controller.arduino.agent.title":"エージェントに接続します","exerciseRunner.controller.arduino.agent.instruction.install":"1. Elice Arduino エージェントをインストールします。","exerciseRunner.controller.arduino.agent.instruction.install.detail":"'elice-arduino-agent' プログラムをインストールして Arduino に接続してください。","exerciseRunner.controller.arduino.agent.instruction.install.window":"Windows用のダウンロード","exerciseRunner.controller.arduino.agent.instruction.install.mac":"MacOS用のダウンロード","exerciseRunner.controller.arduino.agent.instruction.connect":"2. Arduinoに接続します。","exerciseRunner.controller.arduino.agent.instruction.connect.detail":"ダウンロードが完了したら、運動環境に接続する必要があります。接続できない場合は、マニュアルに従ってください。\nマニュアルを読むために下のボタンをクリックしてください。","exerciseRunner.controller.arduino.agent.instruction.connect.button":"マニュアルを参照してください。","exerciseRunner.controller.arduino.agent.instruction.close":"閉じる","exerciseRunner.controller.buttonGroup.button.compile":"コンパイル","exerciseRunner.controller.buttonGroup.button.helpRequest":"ドラッグしたコードの質問","exerciseRunner.controller.buttonGroup.button.run":"ラン","exerciseRunner.controller.buttonGroup.button.stop":"停止","exerciseRunner.controller.buttonGroup.button.submit":"提出","exerciseRunner.controller.buttonGroup.button.submit.tooltip.noSubmit":"提出なしの運動","exerciseRunner.controller.buttonGroup.button.syncRequest":"コードを同期します","exerciseRunner.controller.buttonGroup.button.tooltip.aiHelp":"どんな質問がありますか。","exerciseRunner.controller.runningInfo.error.fetch":"ランニング情報を取得中にエラーが発生しました。","exerciseRunner.controller.runningInfo.lastRunningDatetime":"最終実行日時","exerciseRunner.controller.runningInfo.lastSubmitDatetime":"最終送信日時","exerciseRunner.controller.runningInfo.lastSubmitScore":"最後に提出したスコア","exerciseRunner.controller.runningInfo.score":"{得点}","exerciseRunner.controller.statusMessage.closed":"エディタが切断されました。","exerciseRunner.controller.statusMessage.connecting":"エディタへの接続中...","exerciseRunner.controller.statusMessage.open":"エディターが接続されました","exerciseRunner.controller.tooltip.closed":"現在、コードサーバーとの接続が不安定なため、編集内容が反映されない可能性があります。\nネットワークの状態を確認してから作業を続けてください。","exerciseRunner.controller.timer.runningRemainingTime":"残り時間: {remainingTime}","exerciseRunner.submitErrorDialog.action.confirm":"OK","exerciseRunner.submitErrorDialog.action.reload":"ページをリロードしてください。","exerciseRunner.submitErrorDialog.body.commonError":"コードを実行中にエラーが発生しました。\nページを更新してもう一度お試しください。","exerciseRunner.submitErrorDialog.body.exceedSubmitGradeLimit":"許可された実験提出回数を超えています。","exerciseRunner.submitErrorDialog.body.expiredExerciseImage":"エクササイズ画像が更新されました。\nもう一度更新してやり直してください。","exerciseRunner.submitErrorDialog.body.networkError":"コードを実行中にエラーが発生しました。\nページを更新して、もう一度お試しください。\n問題が解決しない場合は、ネットワークの状態を確認してください。","exerciseRunner.submitErrorDialog.body.notForSubmitGrade":"この演習は提出してはいけません。","exerciseRunner.submitErrorDialog.body.notPreparedRoom":"エクササイズルームは準備中です。\n後で再試行してください。","exerciseRunner.submitErrorDialog.body.roomIsBusy":"運動室は稼働しています。\n少々お待ちください。","exerciseRunner.submitErrorDialog.body.unknown":"コードの実行中にエラーが発生しました。\n後でもう一度お試しください。","exerciseRunner.submitErrorDialog.title":"コードを実行できません。"};
|
|
2
2
|
|
|
3
3
|
export { ja as default };
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var messageKo = {"exerciseRunner.controller.arduino.connectionStatus.connected":"아두이노 기기 연결됨","exerciseRunner.controller.arduino.connectionStatus.connectedDevice":"{device} 연결됨","exerciseRunner.controller.arduino.connectionStatus.connecting":"엘리스 아두이노 에이전트 연결 중","exerciseRunner.controller.arduino.connectionStatus.disconnected":"엘리스 아두이노 에이전트 연결 끊김","exerciseRunner.controller.arduino.connectionStatus.noDevice":"연결된 기기 없음","exerciseRunner.controller.arduino.connectionStatus.reconnecting":"엘리스 아두이노 에이전트 연결 중","exerciseRunner.controller.arduino.connectionStatus.uploading":"업로드 중","exerciseRunner.controller.arduino.agent.title":"에이전트 연결","exerciseRunner.controller.arduino.agent.instruction.install":"1. 엘리스 아두이노 에이전트 설치하기","exerciseRunner.controller.arduino.agent.instruction.install.detail":"아두이노와 연결하기 위해 ‘엘리스 아두이노 에이전트'를 설치해주세요.","exerciseRunner.controller.arduino.agent.instruction.install.window":"Windows 용 설치","exerciseRunner.controller.arduino.agent.instruction.install.mac":"MacOS 용 설치","exerciseRunner.controller.arduino.agent.instruction.connect":"2. 연결하기","exerciseRunner.controller.arduino.agent.instruction.connect.detail":"다운로드를 완료하였다면 실습 환경과 연결이 필요합니다. 연결되지 않을 경우 매뉴얼을 확인하세요.\n아래 버튼을 클릭해 매뉴얼을 확인하실 수 있습니다.","exerciseRunner.controller.arduino.agent.instruction.connect.button":"매뉴얼 이동","exerciseRunner.controller.arduino.agent.instruction.close":"닫기","exerciseRunner.controller.buttonGroup.button.compile":"컴파일","exerciseRunner.controller.buttonGroup.button.helpRequest":"드래그한 코드 질문","exerciseRunner.controller.buttonGroup.button.run":"실행","exerciseRunner.controller.buttonGroup.button.stop":"정지","exerciseRunner.controller.buttonGroup.button.submit":"제출","exerciseRunner.controller.buttonGroup.button.submit.tooltip.noSubmit":"실행만 가능한 실습입니다.","exerciseRunner.controller.buttonGroup.button.syncRequest":"코드 동기화","exerciseRunner.controller.buttonGroup.button.tooltip.aiHelp":"궁금한 사항을 질문해 보세요.","exerciseRunner.controller.runningInfo.error.fetch":"최종 실행 내역을 가져오는데 문제가 발생하였습니다.","exerciseRunner.controller.runningInfo.lastRunningDatetime":"최종 실행 시간","exerciseRunner.controller.runningInfo.lastSubmitDatetime":"최종 제출 시간","exerciseRunner.controller.runningInfo.lastSubmitScore":"최종 제출 점수","exerciseRunner.controller.runningInfo.score":"{score} 점","exerciseRunner.controller.statusMessage.closed":"에디터 연결 끊김","exerciseRunner.controller.statusMessage.connecting":"에디터 연결 중...","exerciseRunner.controller.statusMessage.open":"에디터 연결됨","exerciseRunner.controller.timer.runningRemainingTime":"실행 제한시간: {remainingTime}","exerciseRunner.submitErrorDialog.action.confirm":"확인","exerciseRunner.submitErrorDialog.action.reload":"새로고침","exerciseRunner.submitErrorDialog.body.commonError":"코드 실행 중 오류가 발생했습니다.\n새로고침 후 다시 시도해주세요.","exerciseRunner.submitErrorDialog.body.exceedSubmitGradeLimit":"실습 제출 허용 횟수를 초과했습니다.","exerciseRunner.submitErrorDialog.body.expiredExerciseImage":"실습환경이 업데이트 되었습니다.\n새로고침 후 다시 시도해주세요.","exerciseRunner.submitErrorDialog.body.networkError":"코드 실행 중 오류가 발생했습니다.\n새로고침 후 다시 시도해주세요.\n문제가 계속되면 네트워크 상태를 확인해주세요.","exerciseRunner.submitErrorDialog.body.notForSubmitGrade":"제출이 허용되지 않은 실습입니다.","exerciseRunner.submitErrorDialog.body.notPreparedRoom":"실습환경이 준비 중입니다.\n잠시 후 다시 시도해주세요.","exerciseRunner.submitErrorDialog.body.roomIsBusy":"실습을 실행하고 있습니다.\n잠시만 기다려 주세요.","exerciseRunner.submitErrorDialog.body.unknown":"코드 실행 중 오류가 발생했습니다.\n잠시 후 다시 시도해주세요.","exerciseRunner.submitErrorDialog.title":"실습을 실행할 수 없습니다"};
|
|
1
|
+
var messageKo = {"exerciseRunner.controller.arduino.connectionStatus.connected":"아두이노 기기 연결됨","exerciseRunner.controller.arduino.connectionStatus.connectedDevice":"{device} 연결됨","exerciseRunner.controller.arduino.connectionStatus.connecting":"엘리스 아두이노 에이전트 연결 중","exerciseRunner.controller.arduino.connectionStatus.disconnected":"엘리스 아두이노 에이전트 연결 끊김","exerciseRunner.controller.arduino.connectionStatus.noDevice":"연결된 기기 없음","exerciseRunner.controller.arduino.connectionStatus.reconnecting":"엘리스 아두이노 에이전트 연결 중","exerciseRunner.controller.arduino.connectionStatus.uploading":"업로드 중","exerciseRunner.controller.arduino.agent.title":"에이전트 연결","exerciseRunner.controller.arduino.agent.instruction.install":"1. 엘리스 아두이노 에이전트 설치하기","exerciseRunner.controller.arduino.agent.instruction.install.detail":"아두이노와 연결하기 위해 ‘엘리스 아두이노 에이전트'를 설치해주세요.","exerciseRunner.controller.arduino.agent.instruction.install.window":"Windows 용 설치","exerciseRunner.controller.arduino.agent.instruction.install.mac":"MacOS 용 설치","exerciseRunner.controller.arduino.agent.instruction.connect":"2. 연결하기","exerciseRunner.controller.arduino.agent.instruction.connect.detail":"다운로드를 완료하였다면 실습 환경과 연결이 필요합니다. 연결되지 않을 경우 매뉴얼을 확인하세요.\n아래 버튼을 클릭해 매뉴얼을 확인하실 수 있습니다.","exerciseRunner.controller.arduino.agent.instruction.connect.button":"매뉴얼 이동","exerciseRunner.controller.arduino.agent.instruction.close":"닫기","exerciseRunner.controller.buttonGroup.button.compile":"컴파일","exerciseRunner.controller.buttonGroup.button.helpRequest":"드래그한 코드 질문","exerciseRunner.controller.buttonGroup.button.run":"실행","exerciseRunner.controller.buttonGroup.button.stop":"정지","exerciseRunner.controller.buttonGroup.button.submit":"제출","exerciseRunner.controller.buttonGroup.button.submit.tooltip.noSubmit":"실행만 가능한 실습입니다.","exerciseRunner.controller.buttonGroup.button.syncRequest":"코드 동기화","exerciseRunner.controller.buttonGroup.button.tooltip.aiHelp":"궁금한 사항을 질문해 보세요.","exerciseRunner.controller.runningInfo.error.fetch":"최종 실행 내역을 가져오는데 문제가 발생하였습니다.","exerciseRunner.controller.runningInfo.lastRunningDatetime":"최종 실행 시간","exerciseRunner.controller.runningInfo.lastSubmitDatetime":"최종 제출 시간","exerciseRunner.controller.runningInfo.lastSubmitScore":"최종 제출 점수","exerciseRunner.controller.runningInfo.score":"{score} 점","exerciseRunner.controller.statusMessage.closed":"에디터 연결 끊김","exerciseRunner.controller.statusMessage.connecting":"에디터 연결 중...","exerciseRunner.controller.statusMessage.open":"에디터 연결됨","exerciseRunner.controller.tooltip.closed":"현재 코드 서버와 네트워크 연결 상태가 불안정하여 편집 내용이 반영되지 않습니다.\n네트워크 상태를 확인하여 코드 작성을 진행해주세요.","exerciseRunner.controller.timer.runningRemainingTime":"실행 제한시간: {remainingTime}","exerciseRunner.submitErrorDialog.action.confirm":"확인","exerciseRunner.submitErrorDialog.action.reload":"새로고침","exerciseRunner.submitErrorDialog.body.commonError":"코드 실행 중 오류가 발생했습니다.\n새로고침 후 다시 시도해주세요.","exerciseRunner.submitErrorDialog.body.exceedSubmitGradeLimit":"실습 제출 허용 횟수를 초과했습니다.","exerciseRunner.submitErrorDialog.body.expiredExerciseImage":"실습환경이 업데이트 되었습니다.\n새로고침 후 다시 시도해주세요.","exerciseRunner.submitErrorDialog.body.networkError":"코드 실행 중 오류가 발생했습니다.\n새로고침 후 다시 시도해주세요.\n문제가 계속되면 네트워크 상태를 확인해주세요.","exerciseRunner.submitErrorDialog.body.notForSubmitGrade":"제출이 허용되지 않은 실습입니다.","exerciseRunner.submitErrorDialog.body.notPreparedRoom":"실습환경이 준비 중입니다.\n잠시 후 다시 시도해주세요.","exerciseRunner.submitErrorDialog.body.roomIsBusy":"실습을 실행하고 있습니다.\n잠시만 기다려 주세요.","exerciseRunner.submitErrorDialog.body.unknown":"코드 실행 중 오류가 발생했습니다.\n잠시 후 다시 시도해주세요.","exerciseRunner.submitErrorDialog.title":"실습을 실행할 수 없습니다"};
|
|
2
2
|
|
|
3
3
|
export { messageKo as default };
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var th = {"exerciseRunner.controller.arduino.connectionStatus.connected":"เชื่อมต่อกับ Arduino แล้ว","exerciseRunner.controller.arduino.connectionStatus.connectedDevice":"เชื่อมต่อกับ {device}","exerciseRunner.controller.arduino.connectionStatus.connecting":"กำลังเชื่อมต่อกับ Arduino Agent","exerciseRunner.controller.arduino.connectionStatus.disconnected":"ตัดการเชื่อมต่อกับ Arduino Agent","exerciseRunner.controller.arduino.connectionStatus.noDevice":"ไม่พบอุปกรณ์ที่เชื่อมต่อ","exerciseRunner.controller.arduino.connectionStatus.reconnecting":"กำลังเชื่อมต่อกับ Arduino Agent ใหม่","exerciseRunner.controller.arduino.connectionStatus.uploading":"กำลังอัปโหลด...","exerciseRunner.controller.arduino.agent.title":"เชื่อมต่อ Agent","exerciseRunner.controller.arduino.agent.instruction.install":"1. ติดตั้ง Arduino Agent","exerciseRunner.controller.arduino.agent.instruction.install.detail":"ติดตั้งโปรแกรม 'elice-arduino-agent' เพื่อเชื่อมต่อกับ Arduino ค่ะ.","exerciseRunner.controller.arduino.agent.instruction.install.window":"ดาวน์โหลดสำหรับ Windows","exerciseRunner.controller.arduino.agent.instruction.install.mac":"ดาวน์โหลดสำหรับ MacOS","exerciseRunner.controller.arduino.agent.instruction.connect":"2. เชื่อมต่อกับ Arduino","exerciseRunner.controller.arduino.agent.instruction.connect.detail":"หลังจากการดาวน์โหลดเสร็จสิ้นแล้ว ควรเชื่อมต่อกับสภาพแวดล้อมการฝึกหัด หากไม่สามารถเชื่อมต่อได้ โปรดทำตามคู่มือ\nคลิกที่ปุ่มด้านล่างเพื่ออ่านคู่มือ","exerciseRunner.controller.arduino.agent.instruction.connect.button":"ไปที่คู่มือ","exerciseRunner.controller.arduino.agent.instruction.close":"ปิด","exerciseRunner.controller.buttonGroup.button.compile":"คอมไพล์","exerciseRunner.controller.buttonGroup.button.helpRequest":"ถามเกี่ยวกับโค้ดที่ลาก","exerciseRunner.controller.buttonGroup.button.run":"เรียกใช้งาน","exerciseRunner.controller.buttonGroup.button.stop":"หยุด","exerciseRunner.controller.buttonGroup.button.submit":"ส่ง","exerciseRunner.controller.buttonGroup.button.submit.tooltip.noSubmit":"การฝึกอบรมนี้รองรับเฉพาะการรันเท่านั้น","exerciseRunner.controller.buttonGroup.button.syncRequest":"ซิงค์โค้ด","exerciseRunner.controller.buttonGroup.button.tooltip.aiHelp":"ถามคำถามได้เลยค่ะ","exerciseRunner.controller.runningInfo.error.fetch":"เกิดข้อผิดพลาดขณะดึงข้อมูลการทำงานใหม่","exerciseRunner.controller.runningInfo.lastRunningDatetime":"วันที่และเวลาที่ทำการเรียกใช้ครั้งล่าสุด","exerciseRunner.controller.runningInfo.lastSubmitDatetime":"เวลาส่งครั้งล่าสุด","exerciseRunner.controller.runningInfo.lastSubmitScore":"คะแนนส่งครั้งล่าสุด","exerciseRunner.controller.runningInfo.score":"{score} คะแนน","exerciseRunner.controller.statusMessage.closed":"การเชื่อมต่อกับ Editor ถูกยกเลิก","exerciseRunner.controller.statusMessage.connecting":"กำลังเชื่อมต่อกับ Editor...","exerciseRunner.controller.statusMessage.open":"เชื่อมต่อกับ Editor สำเร็จ","exerciseRunner.controller.timer.runningRemainingTime":"เวลาที่เหลืออยู่: {remainingTime}","exerciseRunner.submitErrorDialog.action.confirm":"ยืนยัน","exerciseRunner.submitErrorDialog.action.reload":"โหลดหน้าใหม่","exerciseRunner.submitErrorDialog.body.commonError":"เกิดข้อผิดพลาดขณะรันโค้ด\nโปรดรีเฟรชและลองอีกครั้ง","exerciseRunner.submitErrorDialog.body.exceedSubmitGradeLimit":"คุณส่งเกินจำนวนที่กำหนด","exerciseRunner.submitErrorDialog.body.expiredExerciseImage":"สภาพแวดล้อมการฝึกอบรมหมดอายุ กรุณารีเฟรชและลองอีกครั้ง","exerciseRunner.submitErrorDialog.body.networkError":"เกิดข้อผิดพลาดขณะรันโค้ด กรุณารีเฟรชและลองอีกครั้ง\nหากยังมีปัญหา กรุณาตรวจสอบสภาพการเชื่อมต่ออินเทอร์เน็ต","exerciseRunner.submitErrorDialog.body.notForSubmitGrade":"การส่งผลงานสำหรับการฝึกอบรมนี้ไม่ถูกต้อง","exerciseRunner.submitErrorDialog.body.notPreparedRoom":"สภาพแวดล้อมการฝึกอบรมกำลังถูกตั้งค่า กรุณารอสักครู่และลองอีกครั้ง","exerciseRunner.submitErrorDialog.body.roomIsBusy":"มีการรันโค้ดอยู่ในขณะนี้ กรุณารอจนกว่าจะเสร็จสิ้น","exerciseRunner.submitErrorDialog.body.unknown":"เกิดข้อผิดพลาดขณะรันโค้ด กรุณารอสักครู่และลองอีกครั้ง","exerciseRunner.submitErrorDialog.title":"ไม่สามารถรันโค้ดได้"};
|
|
1
|
+
var th = {"exerciseRunner.controller.arduino.connectionStatus.connected":"เชื่อมต่อกับ Arduino แล้ว","exerciseRunner.controller.arduino.connectionStatus.connectedDevice":"เชื่อมต่อกับ {device}","exerciseRunner.controller.arduino.connectionStatus.connecting":"กำลังเชื่อมต่อกับ Arduino Agent","exerciseRunner.controller.arduino.connectionStatus.disconnected":"ตัดการเชื่อมต่อกับ Arduino Agent","exerciseRunner.controller.arduino.connectionStatus.noDevice":"ไม่พบอุปกรณ์ที่เชื่อมต่อ","exerciseRunner.controller.arduino.connectionStatus.reconnecting":"กำลังเชื่อมต่อกับ Arduino Agent ใหม่","exerciseRunner.controller.arduino.connectionStatus.uploading":"กำลังอัปโหลด...","exerciseRunner.controller.arduino.agent.title":"เชื่อมต่อ Agent","exerciseRunner.controller.arduino.agent.instruction.install":"1. ติดตั้ง Arduino Agent","exerciseRunner.controller.arduino.agent.instruction.install.detail":"ติดตั้งโปรแกรม 'elice-arduino-agent' เพื่อเชื่อมต่อกับ Arduino ค่ะ.","exerciseRunner.controller.arduino.agent.instruction.install.window":"ดาวน์โหลดสำหรับ Windows","exerciseRunner.controller.arduino.agent.instruction.install.mac":"ดาวน์โหลดสำหรับ MacOS","exerciseRunner.controller.arduino.agent.instruction.connect":"2. เชื่อมต่อกับ Arduino","exerciseRunner.controller.arduino.agent.instruction.connect.detail":"หลังจากการดาวน์โหลดเสร็จสิ้นแล้ว ควรเชื่อมต่อกับสภาพแวดล้อมการฝึกหัด หากไม่สามารถเชื่อมต่อได้ โปรดทำตามคู่มือ\nคลิกที่ปุ่มด้านล่างเพื่ออ่านคู่มือ","exerciseRunner.controller.arduino.agent.instruction.connect.button":"ไปที่คู่มือ","exerciseRunner.controller.arduino.agent.instruction.close":"ปิด","exerciseRunner.controller.buttonGroup.button.compile":"คอมไพล์","exerciseRunner.controller.buttonGroup.button.helpRequest":"ถามเกี่ยวกับโค้ดที่ลาก","exerciseRunner.controller.buttonGroup.button.run":"เรียกใช้งาน","exerciseRunner.controller.buttonGroup.button.stop":"หยุด","exerciseRunner.controller.buttonGroup.button.submit":"ส่ง","exerciseRunner.controller.buttonGroup.button.submit.tooltip.noSubmit":"การฝึกอบรมนี้รองรับเฉพาะการรันเท่านั้น","exerciseRunner.controller.buttonGroup.button.syncRequest":"ซิงค์โค้ด","exerciseRunner.controller.buttonGroup.button.tooltip.aiHelp":"ถามคำถามได้เลยค่ะ","exerciseRunner.controller.runningInfo.error.fetch":"เกิดข้อผิดพลาดขณะดึงข้อมูลการทำงานใหม่","exerciseRunner.controller.runningInfo.lastRunningDatetime":"วันที่และเวลาที่ทำการเรียกใช้ครั้งล่าสุด","exerciseRunner.controller.runningInfo.lastSubmitDatetime":"เวลาส่งครั้งล่าสุด","exerciseRunner.controller.runningInfo.lastSubmitScore":"คะแนนส่งครั้งล่าสุด","exerciseRunner.controller.runningInfo.score":"{score} คะแนน","exerciseRunner.controller.statusMessage.closed":"การเชื่อมต่อกับ Editor ถูกยกเลิก","exerciseRunner.controller.statusMessage.connecting":"กำลังเชื่อมต่อกับ Editor...","exerciseRunner.controller.statusMessage.open":"เชื่อมต่อกับ Editor สำเร็จ","exerciseRunner.controller.tooltip.closed":"ขณะนี้การเชื่อมต่อกับเซิร์ฟเวอร์โค้ดไม่เสถียร การแก้ไขของคุณอาจไม่ถูกบันทึก\nกรุณาตรวจสอบเครือข่ายของคุณก่อนดำเนินการต่อ","exerciseRunner.controller.timer.runningRemainingTime":"เวลาที่เหลืออยู่: {remainingTime}","exerciseRunner.submitErrorDialog.action.confirm":"ยืนยัน","exerciseRunner.submitErrorDialog.action.reload":"โหลดหน้าใหม่","exerciseRunner.submitErrorDialog.body.commonError":"เกิดข้อผิดพลาดขณะรันโค้ด\nโปรดรีเฟรชและลองอีกครั้ง","exerciseRunner.submitErrorDialog.body.exceedSubmitGradeLimit":"คุณส่งเกินจำนวนที่กำหนด","exerciseRunner.submitErrorDialog.body.expiredExerciseImage":"สภาพแวดล้อมการฝึกอบรมหมดอายุ กรุณารีเฟรชและลองอีกครั้ง","exerciseRunner.submitErrorDialog.body.networkError":"เกิดข้อผิดพลาดขณะรันโค้ด กรุณารีเฟรชและลองอีกครั้ง\nหากยังมีปัญหา กรุณาตรวจสอบสภาพการเชื่อมต่ออินเทอร์เน็ต","exerciseRunner.submitErrorDialog.body.notForSubmitGrade":"การส่งผลงานสำหรับการฝึกอบรมนี้ไม่ถูกต้อง","exerciseRunner.submitErrorDialog.body.notPreparedRoom":"สภาพแวดล้อมการฝึกอบรมกำลังถูกตั้งค่า กรุณารอสักครู่และลองอีกครั้ง","exerciseRunner.submitErrorDialog.body.roomIsBusy":"มีการรันโค้ดอยู่ในขณะนี้ กรุณารอจนกว่าจะเสร็จสิ้น","exerciseRunner.submitErrorDialog.body.unknown":"เกิดข้อผิดพลาดขณะรันโค้ด กรุณารอสักครู่และลองอีกครั้ง","exerciseRunner.submitErrorDialog.title":"ไม่สามารถรันโค้ดได้"};
|
|
2
2
|
|
|
3
3
|
export { th as default };
|
|
@@ -132,7 +132,8 @@ var useRunnerRoomWebSocket = function useRunnerRoomWebSocket(_ref) {
|
|
|
132
132
|
return;
|
|
133
133
|
}
|
|
134
134
|
websocket.current = new EliceWebSocket(createUsercodeUrl, undefined, {
|
|
135
|
-
maxRetries: MAX_WEBSOCKET_RETRY_COUNT
|
|
135
|
+
maxRetries: MAX_WEBSOCKET_RETRY_COUNT,
|
|
136
|
+
maxPingQueueTolerance: 1
|
|
136
137
|
});
|
|
137
138
|
websocket.current.onopen = wsOpen;
|
|
138
139
|
websocket.current.onclose = wsClose;
|
|
@@ -158,7 +158,8 @@ var useStdioWebSocket = function useStdioWebSocket(_ref) {
|
|
|
158
158
|
}
|
|
159
159
|
websocket.current = new EliceWebSocket("".concat(wsUri, "/client/stdio/").concat(roomToken), undefined, {
|
|
160
160
|
maxRetries: MAX_WEBSOCKET_RETRY_COUNT,
|
|
161
|
-
heartAttack: true
|
|
161
|
+
heartAttack: true,
|
|
162
|
+
maxPingQueueTolerance: 1
|
|
162
163
|
});
|
|
163
164
|
websocket.current.onopen = wsOpen;
|
|
164
165
|
websocket.current.onclose = wsClose;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { WebsocketUsercodeMessageWriteSucceed as WSUsercodeMessageWriteSucceed } from '@elice/types';
|
|
1
2
|
import type { TextOp } from 'ot-text-unicode';
|
|
2
3
|
interface CursorRange {
|
|
3
4
|
from: number;
|
|
@@ -17,6 +18,10 @@ export type UseUsercodeEditWebSocketPropOnInit = (doc: string) => void;
|
|
|
17
18
|
* Event handler for `WRITE_NOTI` event.
|
|
18
19
|
*/
|
|
19
20
|
export type UseUsercodeEditWebSocketPropOnWriteNoti = (ots: TextOp, isFromServer: boolean) => void;
|
|
21
|
+
/**
|
|
22
|
+
* Event handler for `WRITE_SUCCEED` event.
|
|
23
|
+
*/
|
|
24
|
+
export type UseUsercodeEditWebSocketPropOnWriteSucceed = (msg: WSUsercodeMessageWriteSucceed, requestId: number) => void;
|
|
20
25
|
/**
|
|
21
26
|
* Props of `useUsercodeEditWebSocket`.
|
|
22
27
|
*/
|
|
@@ -25,6 +30,7 @@ interface UseUsercodeEditWebSocketProps {
|
|
|
25
30
|
filename: string | null;
|
|
26
31
|
onInit: UseUsercodeEditWebSocketPropOnInit;
|
|
27
32
|
onWriteNoti: UseUsercodeEditWebSocketPropOnWriteNoti;
|
|
33
|
+
onWriteSucceed: UseUsercodeEditWebSocketPropOnWriteSucceed;
|
|
28
34
|
}
|
|
29
35
|
/**
|
|
30
36
|
*
|
|
@@ -33,7 +39,9 @@ export type UseUsercodeEditWebSocketReturnSendCursor = (range: CursorRange) => v
|
|
|
33
39
|
/**
|
|
34
40
|
* Event handler for websocket message.
|
|
35
41
|
*/
|
|
36
|
-
export type UseUsercodeEditWebSocketReturnSendOTs = (ots: TextOp) =>
|
|
42
|
+
export type UseUsercodeEditWebSocketReturnSendOTs = (ots: TextOp) => {
|
|
43
|
+
requestId: number;
|
|
44
|
+
};
|
|
37
45
|
/**
|
|
38
46
|
* Return type of `useUsercodeEditWebSocket`.
|
|
39
47
|
*/
|