diff --git a/services/app/apps/codebattle/assets/js/__tests__/RootContainer.test.jsx b/services/app/apps/codebattle/assets/js/__tests__/RootContainer.test.jsx
index 186f4f2c0..142b6e4d8 100644
--- a/services/app/apps/codebattle/assets/js/__tests__/RootContainer.test.jsx
+++ b/services/app/apps/codebattle/assets/js/__tests__/RootContainer.test.jsx
@@ -19,6 +19,8 @@ import waitingRoom from '../widgets/machines/waitingRoom';
import RootContainer from '../widgets/pages/RoomWidget';
import reducers from '../widgets/slices';
+jest.mock('../widgets/initEditor.js', () => ({}));
+
jest.mock('../widgets/pages/game/TaskDescriptionMarkdown', () => () => (<>Examples: >));
jest.mock('@fortawesome/react-fontawesome', () => ({
@@ -77,7 +79,7 @@ jest.mock(
jest.mock(
'../widgets/utils/useStayScrolled',
- () => () => ({ stayScrolled: () => {} }),
+ () => () => ({ stayScrolled: () => { } }),
{ virtual: true },
);
@@ -105,7 +107,7 @@ jest.mock(
return channel;
}),
- connect: jest.fn(() => {}),
+ connect: jest.fn(() => { }),
})),
};
},
@@ -161,8 +163,8 @@ const preloadedState = {
},
},
usersInfo: {
- 1: { },
- 2: { },
+ 1: {},
+ 2: {},
},
chat: {
users: Object.values(players),
diff --git a/services/app/apps/codebattle/assets/js/widgets/components/Editor.jsx b/services/app/apps/codebattle/assets/js/widgets/components/Editor.jsx
index 4a7861145..39325bc5f 100644
--- a/services/app/apps/codebattle/assets/js/widgets/components/Editor.jsx
+++ b/services/app/apps/codebattle/assets/js/widgets/components/Editor.jsx
@@ -1,68 +1,47 @@
import React, { memo } from 'react';
-import MonacoEditor, { loader } from '@monaco-editor/react';
+import '../initEditor';
+import MonacoEditor from '@monaco-editor/react';
import PropTypes from 'prop-types';
-import haskellProvider from '../config/editor/haskell';
-import sassProvider from '../config/editor/sass';
-import stylusProvider from '../config/editor/stylus';
import languages from '../config/languages';
import useEditor from '../utils/useEditor';
import EditorLoading from './EditorLoading';
-const monacoVersion = '0.52.0';
-
-loader.config({
- paths: {
- vs: `https://cdn.jsdelivr.net/npm/monaco-editor@${monacoVersion}/min/vs`,
- },
-});
-
-loader.init().then(monaco => {
- monaco.languages.register({ id: 'haskell', aliases: ['haskell'] });
- monaco.languages.setMonarchTokensProvider('haskell', haskellProvider);
-
- monaco.languages.register({ id: 'stylus', aliases: ['stylus'] });
- monaco.languages.setMonarchTokensProvider('stylus', stylusProvider);
-
- monaco.languages.register({ id: 'scss', aliases: ['scss'] });
- monaco.languages.setMonarchTokensProvider('scss', sassProvider);
-});
-
function Editor(props) {
- const {
- value,
- syntax,
- onChange,
- theme,
- loading = false,
- } = props;
- const mappedSyntax = languages[syntax];
+ const {
+ value,
+ syntax,
+ onChange,
+ theme,
+ loading = false,
+ } = props;
+ const mappedSyntax = languages[syntax];
- const {
- options,
- handleEditorDidMount,
- handleEditorWillMount,
- } = useEditor(props);
+ const {
+ options,
+ handleEditorDidMount,
+ handleEditorWillMount,
+ } = useEditor(props);
- return (
- <>
-
-
- >
- );
+ return (
+ <>
+
+
+ >
+ );
}
Editor.propTypes = {
@@ -75,7 +54,7 @@ Editor.propTypes = {
lineNumbers: PropTypes.string,
fontSize: PropTypes.number,
editable: PropTypes.bool,
- gameMode: PropTypes.string.isRequired,
+ roomMode: PropTypes.string.isRequired,
checkResult: PropTypes.func.isRequired,
toggleMuteSound: PropTypes.func.isRequired,
mute: PropTypes.bool.isRequired,
diff --git a/services/app/apps/codebattle/assets/js/widgets/components/ExtendedEditor.jsx b/services/app/apps/codebattle/assets/js/widgets/components/ExtendedEditor.jsx
index 6fc029d29..116936fe4 100644
--- a/services/app/apps/codebattle/assets/js/widgets/components/ExtendedEditor.jsx
+++ b/services/app/apps/codebattle/assets/js/widgets/components/ExtendedEditor.jsx
@@ -98,7 +98,7 @@ const mapStateToProps = state => {
const locked = gameLockedSelector(state);
return {
gameId,
- gameMode,
+ roomMode: gameMode,
locked,
mute: state.user.settings.mute,
};
diff --git a/services/app/apps/codebattle/assets/js/widgets/initEditor.js b/services/app/apps/codebattle/assets/js/widgets/initEditor.js
new file mode 100644
index 000000000..832e66520
--- /dev/null
+++ b/services/app/apps/codebattle/assets/js/widgets/initEditor.js
@@ -0,0 +1,26 @@
+import { loader } from '@monaco-editor/react';
+import * as monacoLib from 'monaco-editor';
+
+import haskellProvider from './config/editor/haskell';
+import sassProvider from './config/editor/sass';
+import stylusProvider from './config/editor/stylus';
+
+// const monacoVersion = '0.52.0';
+
+loader.config({
+ monaco: monacoLib,
+ // paths: {
+ // vs: `https://cdn.jsdelivr.net/npm/monaco-editor@${monacoVersion}/min/vs`,
+ // },
+});
+
+loader.init().then(monaco => {
+ monaco.languages.register({ id: 'haskell', aliases: ['haskell'] });
+ monaco.languages.setMonarchTokensProvider('haskell', haskellProvider);
+
+ monaco.languages.register({ id: 'stylus', aliases: ['stylus'] });
+ monaco.languages.setMonarchTokensProvider('stylus', stylusProvider);
+
+ monaco.languages.register({ id: 'scss', aliases: ['scss'] });
+ monaco.languages.setMonarchTokensProvider('scss', sassProvider);
+});
diff --git a/services/app/apps/codebattle/assets/js/widgets/middlewares/Room.js b/services/app/apps/codebattle/assets/js/widgets/middlewares/Room.js
index 5db8e33d4..546ab8f6b 100644
--- a/services/app/apps/codebattle/assets/js/widgets/middlewares/Room.js
+++ b/services/app/apps/codebattle/assets/js/widgets/middlewares/Room.js
@@ -327,9 +327,19 @@ export const resetTextToTemplateAndSend = langSlug => (dispatch, getState) => {
export const soundNotification = notification();
-export const addCursorListeners = (userId, onChangePosition, onChangeSelection) => {
- if (!userId || isRecord) {
- return () => {};
+export const addCursorListeners = (params, onChangePosition, onChangeSelection) => {
+ const {
+ roomMode,
+ userId,
+ } = params;
+
+ const isBuilder = roomMode === GameRoomModes.builder;
+ const isHistory = roomMode === GameRoomModes.history;
+
+ const canReceivedRemoteCursor = !isBuilder && !isHistory && !!userId && !isRecord;
+
+ if (!canReceivedRemoteCursor) {
+ return () => { };
}
const handleNewCursorPosition = debounce(data => {
@@ -1039,7 +1049,7 @@ export const changePlaybookSolution = method => dispatch => {
export const storedEditorReady = service => {
service.send('load_stored_editor');
- return () => {};
+ return () => { };
};
export const downloadPlaybook = service => dispatch => {
diff --git a/services/app/apps/codebattle/assets/js/widgets/pages/game/DarkModeButton.jsx b/services/app/apps/codebattle/assets/js/widgets/pages/game/DarkModeButton.jsx
index f9a3459cd..68001e102 100644
--- a/services/app/apps/codebattle/assets/js/widgets/pages/game/DarkModeButton.jsx
+++ b/services/app/apps/codebattle/assets/js/widgets/pages/game/DarkModeButton.jsx
@@ -1,5 +1,6 @@
import React from 'react';
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import cn from 'classnames';
import { useDispatch, useSelector } from 'react-redux';
@@ -15,7 +16,7 @@ function DakModeButton() {
const isDarkMode = currentTheme === editorThemes.dark;
const mode = isDarkMode ? editorThemes.light : editorThemes.dark;
- const classNames = cn('btn btn-sm mr-2 border rounded', {
+ const className = cn('btn mr-2 border rounded', {
'btn-light': isDarkMode,
'btn-secondary': !isDarkMode,
});
@@ -25,8 +26,8 @@ function DakModeButton() {
};
return (
-