diff --git a/.circleci/config.yml b/.circleci/config.yml index 27bf9933..0948946e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -41,6 +41,7 @@ templates: - run: mkdir -p /tmp/artifacts/logs - run: npm run build + - run: npm run profiling-build - run: npm run lint - run: npm run lint-styles - run: DOCKER_HOST=localhost npm test diff --git a/config/webpack.profiling.config.js b/config/webpack.profiling.config.js new file mode 100644 index 00000000..84c4da23 --- /dev/null +++ b/config/webpack.profiling.config.js @@ -0,0 +1,20 @@ +const webpackProdConfig = require('./webpack.production.config'); +const artifacts = require("../test/artifacts"); + +const OUTPATH = artifacts.pathSync("/profiling"); + +module.exports = { + ...webpackProdConfig, + output: { + ...webpackProdConfig.output, + path: OUTPATH, + }, + resolve: { + ...webpackProdConfig.resolve, + alias: { + ...webpackProdConfig.resolve.alias, + 'react-dom$': 'react-dom/profiling', + 'scheduler/tracing': 'scheduler/tracing-profiling', + } + } +}; diff --git a/package-lock.json b/package-lock.json index 4599d8c5..ecc57ecc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9069,11 +9069,6 @@ "prop-types": "^15.5.10" } }, - "react-codemirror2": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/react-codemirror2/-/react-codemirror2-6.0.0.tgz", - "integrity": "sha512-D7y9qZ05FbUh9blqECaJMdDwKluQiO3A9xB+fssd5jKM7YAXucRuEOlX32mJQumUvHUkHRHqXIPBjm6g0FW0Ag==" - }, "react-collapse": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/react-collapse/-/react-collapse-4.0.3.tgz", diff --git a/package.json b/package.json index b7d9a6b1..3cb02019 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "scripts": { "stats": "webpack --config config/webpack.production.config.js --profile --json > stats.json", "build": "webpack --config config/webpack.production.config.js --progress --profile --colors", + "profiling-build": "webpack --config config/webpack.profiling.config.js --progress --profile --colors", "test": "cross-env NODE_ENV=test wdio config/wdio.conf.js", "test-watch": "cross-env NODE_ENV=test wdio config/wdio.conf.js --watch", "start": "webpack-dev-server --progress --profile --colors --config config/webpack.config.js", @@ -47,7 +48,6 @@ "react-aria-modal": "^4.0.0", "react-autobind": "^1.0.6", "react-autocomplete": "^1.8.1", - "react-codemirror2": "^6.0.0", "react-collapse": "^4.0.3", "react-color": "^2.17.3", "react-dom": "^16.10.2", diff --git a/src/components/inputs/EnumInput.jsx b/src/components/inputs/EnumInput.jsx index 0c6039cc..e7041104 100644 --- a/src/components/inputs/EnumInput.jsx +++ b/src/components/inputs/EnumInput.jsx @@ -42,4 +42,4 @@ class EnumInput extends React.Component { } } -export default StringInput +export default EnumInput diff --git a/src/components/layers/JSONEditor.jsx b/src/components/layers/JSONEditor.jsx index 34a2fb6c..a8c0ce58 100644 --- a/src/components/layers/JSONEditor.jsx +++ b/src/components/layers/JSONEditor.jsx @@ -1,9 +1,9 @@ import React from 'react' import PropTypes from 'prop-types' -import {Controlled as CodeMirror} from 'react-codemirror2' import InputBlock from '../inputs/InputBlock' import StringInput from '../inputs/StringInput' +import CodeMirror from 'codemirror'; import 'codemirror/mode/javascript/javascript' import 'codemirror/addon/lint/lint' @@ -26,36 +26,82 @@ class JSONEditor extends React.Component { constructor(props) { super(props) this.state = { - code: JSON.stringify(props.layer, null, 2) - } + isEditing: false, + prevValue: this.getValue(), + }; + } + + getValue () { + return JSON.stringify(this.props.layer, null, 2); + } + + componentDidMount () { + this._doc = CodeMirror(this._el, { + value: this.getValue(), + mode: { + name: "javascript", + json: true + }, + tabSize: 2, + theme: 'maputnik', + viewportMargin: Infinity, + lineNumbers: true, + lint: true, + gutters: ["CodeMirror-lint-markers"], + scrollbarStyle: "null", + }); + + this._doc.on('change', this.onChange); + this._doc.on('focus', this.onFocus); + this._doc.on('blur', this.onBlur); + } + + onFocus = () => { + this.setState({ + isEditing: true + }); + } + + onBlur = () => { + this.setState({ + isEditing: false + }); + } + + componentWillUnMount () { + this._doc.off('change', this.onChange); + this._doc.off('focus', this.onFocus); + this._doc.off('blur', this.onBlur); } componentDidUpdate(prevProps) { - if (prevProps.layer !== this.props.layer) { - this.setState({ - code: JSON.stringify(this.props.layer, null, 2) - }) + if (!this.state.isEditing && prevProps.layer !== this.props.layer) { + this._cancelNextChange = true; + this._doc.setValue( + this.getValue(), + ) } } - onCodeUpdate(newCode) { - try { - const parsedLayer = JSON.parse(newCode) - this.props.onChange(parsedLayer) - } catch(err) { - console.warn(err) - } finally { - this.setState({ - code: newCode - }) + onChange = (e) => { + if (this._cancelNextChange) { + this._cancelNextChange = false; + return; + } + const newCode = this._doc.getValue(); + + if (this.state.prevValue !== newCode) { + try { + const parsedLayer = JSON.parse(newCode) + this.props.onChange(parsedLayer) + } catch(err) { + console.warn(err) + } } - } - resetValue() { - console.log('reset') this.setState({ - code: JSON.stringify(this.props.layer, null, 2) - }) + prevValue: newCode, + }); } render() { @@ -75,14 +121,11 @@ class JSONEditor extends React.Component { style.maxHeight = this.props.maxHeight; } - return
- this.onCodeUpdate(value)} - onFocusChange={focused => focused ? true : this.resetValue()} - options={codeMirrorOptions} - /> -
+ return
this._el = el} + style={style} + /> } } diff --git a/src/components/layers/LayerEditor.jsx b/src/components/layers/LayerEditor.jsx index 39c862d9..ed161163 100644 --- a/src/components/layers/LayerEditor.jsx +++ b/src/components/layers/LayerEditor.jsx @@ -141,7 +141,7 @@ export default class LayerEditor extends React.Component { onChange={v => this.changeProperty(null, 'source', v)} /> } - {['background', 'raster', 'hillshade', 'heatmap'].indexOf(this.state.type) < 0 && + {['background', 'raster', 'hillshade', 'heatmap'].indexOf(this.props.layer.type) < 0 &&