Merge branch 'master' into hot-reload

This commit is contained in:
undefined committed 2022-09-30 19:02:45 +08:00
commit 1608b4b9aa
4 files changed
+45 -23

No files matched your search

@@ -28,8 +28,13 @@ const loaders = {
}, },
}; };
let loadPromise = Promise.resolve();
export async function load(features = ['markdown']) { export async function load(features = ['markdown']) {
let s = Date.now(); let s = Date.now();
await loadPromise;
let resolve;
loadPromise = new Promise((r) => { resolve = r; });
if (!loaded) { if (!loaded) {
await loaders.i18n(); await loaders.i18n();
console.log('Loading monaco editor'); console.log('Loading monaco editor');
@@ -60,7 +65,8 @@ export async function load(features = ['markdown']) {
} }
} }
await res.loadThemePromise; await res.loadThemePromise;
return { monaco: res.default, registerAction: res.registerAction }; resolve();
return { monaco: res.default, registerAction: res.registerAction, customOptions: {} };
} }
export default load; export default load;
@@ -1,39 +1,49 @@
import type * as monaco from 'monaco-editor';
import React from 'react'; import React from 'react';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import { load } from 'vj/components/monaco/loader'; import { load } from 'vj/components/monaco/loader';
const mapStateToProps = (state) => ({ interface ScratchpadOptions {
value?: string;
language?: string;
handleUpdateCode?: (str: string, event: monaco.editor.IModelContentChangedEvent) => void;
mainSize?: number;
recordSize?: number;
pretestSize?: number;
}
export default connect((state: any) => ({
value: state.editor.code, value: state.editor.code,
language: window.LANGS[state.editor.lang]?.monaco, language: window.LANGS[state.editor.lang]?.monaco,
mainSize: state.ui.main.size, mainSize: state.ui.main.size,
pretestSize: state.ui.pretest.size, pretestSize: state.ui.pretest.size,
recordSize: state.ui.records.size, recordSize: state.ui.records.size,
}); }), (dispatch) => ({
const mapDispatchToProps = (dispatch) => ({ handleUpdateCode: (code: string) => {
handleUpdateCode: (code) => {
dispatch({ dispatch({
type: 'SCRATCHPAD_EDITOR_UPDATE_CODE', type: 'SCRATCHPAD_EDITOR_UPDATE_CODE',
payload: code, payload: code,
}); });
}, },
}); }))(class MonacoEditor extends React.PureComponent<ScratchpadOptions> {
export default connect(mapStateToProps, mapDispatchToProps)(class MonacoEditor extends React.PureComponent {
disposable = []; disposable = [];
__prevent_trigger_change_event = false;
model: monaco.editor.ITextModel;
editor: monaco.editor.IStandaloneCodeEditor;
containerElement: HTMLElement;
async componentDidMount() { async componentDidMount() {
const value = this.props.value || ''; const value = this.props.value || '';
const { language } = this.props; const { language } = this.props;
const { monaco, registerAction, customOptions } = await load([language]); const { monaco, registerAction, customOptions } = await load([language]);
const uri = monaco.Uri.parse(`hydro://${UiContext.pdoc.pid || UiContext.pdoc.docId}.${language}`); const uri = monaco.Uri.parse(`hydro://${UiContext.pdoc.pid || UiContext.pdoc.docId}.${language}`);
this.model = monaco.editor.createModel(value, language, uri); this.model = monaco.editor.getModel(uri) || monaco.editor.createModel(value, language, uri);
if (this.containerElement) { if (this.containerElement) {
/** @type {monaco.editor.IStandaloneEditorConstructionOptions} */ const config: monaco.editor.IStandaloneEditorConstructionOptions = {
const config = {
theme: 'vs-light', theme: 'vs-light',
...customOptions, ...customOptions,
fontFamily: UserContext.codeFontFamily, fontFamily: UserContext.codeFontFamily,
lineNumbers: true, lineNumbers: 'on',
glyphMargin: true, glyphMargin: true,
lightbulb: { enabled: true }, lightbulb: { enabled: true },
model: this.model, model: this.model,
@@ -43,12 +53,12 @@ export default connect(mapStateToProps, mapDispatchToProps)(class MonacoEditor e
this.disposable.push( this.disposable.push(
this.editor.onDidChangeModelContent((event) => { this.editor.onDidChangeModelContent((event) => {
if (!this.__prevent_trigger_change_event) { if (!this.__prevent_trigger_change_event) {
this.props.handleUpdateCode(this.editor.getValue({ lineEnding: '\n', preserveBOM: false }), event); this.props.handleUpdateCode?.(this.editor.getValue({ lineEnding: '\n', preserveBOM: false }), event);
} }
}), }),
); );
window.editor = this.editor; (window as any).editor = this.editor;
window.monaco = monaco; (window as any).monaco = monaco;
window.Hydro.bus.emit('scratchpadEditorCreate', this.editor, monaco); window.Hydro.bus.emit('scratchpadEditorCreate', this.editor, monaco);
} }
} }
@@ -71,6 +81,7 @@ export default connect(mapStateToProps, mapDispatchToProps)(class MonacoEditor e
text: value, text: value,
}, },
], ],
() => null,
); );
editor.pushUndoStop(); editor.pushUndoStop();
this.__prevent_trigger_change_event = false; this.__prevent_trigger_change_event = false;
@@ -79,7 +90,7 @@ export default connect(mapStateToProps, mapDispatchToProps)(class MonacoEditor e
const val = model.getValue(LF, false); const val = model.getValue(LF, false);
model.dispose(); model.dispose();
const uri = monaco.Uri.parse(`hydro://${UiContext.pdoc.pid || UiContext.pdoc.docId}.${language}`); const uri = monaco.Uri.parse(`hydro://${UiContext.pdoc.pid || UiContext.pdoc.docId}.${language}`);
this.model = monaco.editor.createModel(val, language, uri); this.model = monaco.editor.getModel(uri) || monaco.editor.createModel(val, language, uri);
editor.setModel(this.model); editor.setModel(this.model);
} }
if (editor) { if (editor) {
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@hydrooj/ui-default", "name": "@hydrooj/ui-default",
"version": "4.40.8", "version": "4.40.11",
"author": "undefined <i@undefined.moe>", "author": "undefined <i@undefined.moe>",
"license": "AGPL-3.0", "license": "AGPL-3.0",
"main": "hydro.js", "main": "hydro.js",
+11 -6
View File
@@ -1,6 +1,11 @@
/* eslint-disable @typescript-eslint/no-unused-vars */ declare global {
declare let UserContext: any; interface Window {
declare let UiContext: any; node_modules: any;
// eslint-disable-next-line LANGS: Record<string, any>;
declare let node_modules: any; }
declare let LANGS: Record<string, any>;
let UserContext: Record<string, any>;
let UiContext: Record<string, any>;
}
export { };