Merge pull request #2074 from ethereum/rendercomponent

remove reactDom render
pull/2078/head^2
bunsenstraat 3 years ago committed by GitHub
commit 2725d9d21c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 21
      apps/remix-ide/src/app/components/hidden-panel.tsx
  2. 21
      apps/remix-ide/src/app/components/main-panel.tsx
  3. 32
      apps/remix-ide/src/app/components/plugin-manager-component.js
  4. 21
      apps/remix-ide/src/app/components/side-panel.tsx
  5. 31
      apps/remix-ide/src/app/components/vertical-icons.tsx
  6. 61
      apps/remix-ide/src/app/editor/editor.js
  7. 13
      apps/remix-ide/src/app/panels/file-panel.js
  8. 27
      apps/remix-ide/src/app/panels/tab-proxy.js
  9. 32
      apps/remix-ide/src/app/panels/terminal.js
  10. 52
      apps/remix-ide/src/app/tabs/analysis-tab.js
  11. 9
      apps/remix-ide/src/app/tabs/compile-tab.js
  12. 10
      apps/remix-ide/src/app/tabs/debugger-tab.js
  13. 48
      apps/remix-ide/src/app/tabs/settings-tab.tsx
  14. 23
      apps/remix-ide/src/app/tabs/test-tab.js
  15. 11
      apps/remix-ide/src/app/udapp/run-tab.js
  16. 13
      apps/remix-ide/src/app/ui/landing-page/landing-page.js
  17. 4
      apps/remix-ide/src/index.tsx
  18. 39
      libs/remix-ui/app/src/lib/remix-app/remix-app.tsx
  19. 1
      libs/remix-ui/helper/src/index.ts
  20. 24
      libs/remix-ui/helper/src/lib/components/PluginViewWrapper.tsx
  21. 1
      libs/remix-ui/panel/src/lib/plugins/panel-plugin.tsx
  22. 5
      libs/remix-ui/panel/src/lib/plugins/panel.css
  23. 14
      package.json

@ -1,9 +1,9 @@
// eslint-disable-next-line no-use-before-define // eslint-disable-next-line no-use-before-define
import React from 'react' import React from 'react'
import ReactDOM from 'react-dom' // eslint-disable-line
import { AbstractPanel } from './panel' import { AbstractPanel } from './panel'
import * as packageJson from '../../../../../package.json' import * as packageJson from '../../../../../package.json'
import { RemixPluginPanel } from '@remix-ui/panel' import { RemixPluginPanel } from '@remix-ui/panel'
import { PluginViewWrapper } from '@remix-ui/helper'
const profile = { const profile = {
name: 'hiddenPanel', name: 'hiddenPanel',
@ -15,6 +15,7 @@ const profile = {
export class HiddenPanel extends AbstractPanel { export class HiddenPanel extends AbstractPanel {
el: HTMLElement el: HTMLElement
dispatch: React.Dispatch<any> = () => {}
constructor () { constructor () {
super(profile) super(profile)
this.el = document.createElement('div') this.el = document.createElement('div')
@ -27,11 +28,23 @@ export class HiddenPanel extends AbstractPanel {
this.renderComponent() this.renderComponent()
} }
render () { updateComponent (state: any) {
return this.el return <RemixPluginPanel header={<></>} plugins={state.plugins}/>
}
setDispatch (dispatch: React.Dispatch<any>) {
this.dispatch = dispatch
}
render() {
return (
<div className='pluginsContainer'><PluginViewWrapper plugin={this} /></div>
);
} }
renderComponent () { renderComponent () {
ReactDOM.render(<RemixPluginPanel header={<></>} plugins={this.plugins}/>, this.el) this.dispatch({
plugins: this.plugins,
})
} }
} }

@ -1,8 +1,8 @@
import React from 'react' // eslint-disable-line import React from 'react' // eslint-disable-line
import { AbstractPanel } from './panel' import { AbstractPanel } from './panel'
import ReactDOM from 'react-dom' // eslint-disable-line
import { RemixPluginPanel } from '@remix-ui/panel' import { RemixPluginPanel } from '@remix-ui/panel'
import packageJson from '../../../../../package.json' import packageJson from '../../../../../package.json'
import { PluginViewWrapper } from '@remix-ui/helper'
const profile = { const profile = {
name: 'mainPanel', name: 'mainPanel',
@ -14,6 +14,7 @@ const profile = {
export class MainPanel extends AbstractPanel { export class MainPanel extends AbstractPanel {
element: HTMLDivElement element: HTMLDivElement
dispatch: React.Dispatch<any> = () => {}
constructor (config) { constructor (config) {
super(profile) super(profile)
this.element = document.createElement('div') this.element = document.createElement('div')
@ -22,6 +23,10 @@ export class MainPanel extends AbstractPanel {
// this.config = config // this.config = config
} }
setDispatch (dispatch: React.Dispatch<any>) {
this.dispatch = dispatch
}
onActivation () { onActivation () {
this.renderComponent() this.renderComponent()
} }
@ -47,11 +52,17 @@ export class MainPanel extends AbstractPanel {
this.renderComponent() this.renderComponent()
} }
render () { renderComponent () {
return this.element this.dispatch({
plugins: this.plugins
})
}
render() {
return <div style={{height: '100%', width: '100%'}} data-id='mainPanelPluginsContainer'><PluginViewWrapper plugin={this} /></div>
} }
renderComponent () { updateComponent (state: any) {
ReactDOM.render(<RemixPluginPanel header={<></>} plugins={this.plugins}/>, this.element) return <RemixPluginPanel header={<></>} plugins={state.plugins}/>
} }
} }

@ -1,8 +1,8 @@
import { ViewPlugin } from '@remixproject/engine-web' import { ViewPlugin } from '@remixproject/engine-web'
import React from 'react' // eslint-disable-line import React from 'react' // eslint-disable-line
import ReactDOM from 'react-dom'
import {RemixUiPluginManager} from '@remix-ui/plugin-manager' // eslint-disable-line import {RemixUiPluginManager} from '@remix-ui/plugin-manager' // eslint-disable-line
import * as packageJson from '../../../../../package.json' import * as packageJson from '../../../../../package.json'
import { PluginViewWrapper } from '@remix-ui/helper'
const _paq = window._paq = window._paq || [] const _paq = window._paq = window._paq || []
const profile = { const profile = {
@ -31,6 +31,7 @@ class PluginManagerComponent extends ViewPlugin {
this.inactivePlugins = [] this.inactivePlugins = []
this.activeProfiles = this.appManager.actives this.activeProfiles = this.appManager.actives
this._paq = _paq this._paq = _paq
this.dispatch = null
this.listenOnEvent() this.listenOnEvent()
} }
@ -40,7 +41,7 @@ class PluginManagerComponent extends ViewPlugin {
* RemixAppManager * RemixAppManager
* @param {string} name name of Plugin * @param {string} name name of Plugin
*/ */
isActive (name) { isActive = (name) =>{
return this.appManager.actives.includes(name) return this.appManager.actives.includes(name)
} }
@ -49,7 +50,7 @@ class PluginManagerComponent extends ViewPlugin {
* RemixAppManager to enable plugin activation * RemixAppManager to enable plugin activation
* @param {string} name name of Plugin * @param {string} name name of Plugin
*/ */
activateP (name) { activateP = (name) => {
this.appManager.activatePlugin(name) this.appManager.activatePlugin(name)
_paq.push(['trackEvent', 'manager', 'activate', name]) _paq.push(['trackEvent', 'manager', 'activate', name])
} }
@ -60,7 +61,7 @@ class PluginManagerComponent extends ViewPlugin {
* @param {Profile} pluginName * @param {Profile} pluginName
* @returns {void} * @returns {void}
*/ */
async activateAndRegisterLocalPlugin (localPlugin) { activateAndRegisterLocalPlugin = async (localPlugin) => {
if (localPlugin) { if (localPlugin) {
this.engine.register(localPlugin) this.engine.register(localPlugin)
this.appManager.activatePlugin(localPlugin.profile.name) this.appManager.activatePlugin(localPlugin.profile.name)
@ -75,28 +76,33 @@ class PluginManagerComponent extends ViewPlugin {
* of the plugin * of the plugin
* @param {string} name name of Plugin * @param {string} name name of Plugin
*/ */
deactivateP (name) { deactivateP = (name) => {
this.call('manager', 'deactivatePlugin', name) this.call('manager', 'deactivatePlugin', name)
_paq.push(['trackEvent', 'manager', 'deactivate', name]) _paq.push(['trackEvent', 'manager', 'deactivate', name])
} }
onActivation () { setDispatch (dispatch) {
this.dispatch = dispatch
this.renderComponent() this.renderComponent()
} }
updateComponent(state){
return <RemixUiPluginManager
pluginComponent={state}/>
}
renderComponent () { renderComponent () {
ReactDOM.render( if(this.dispatch) this.dispatch({...this, activePlugins: this.activePlugins, inactivePlugins: this.inactivePlugins})
<RemixUiPluginManager
pluginComponent={this}
/>,
this.htmlElement)
} }
render () { render () {
return this.htmlElement return (
<div id='pluginManager'><PluginViewWrapper plugin={this} /></div>
);
} }
getAndFilterPlugins (filter) { getAndFilterPlugins = (filter) => {
this.filter = typeof filter === 'string' ? filter.toLowerCase() : this.filter this.filter = typeof filter === 'string' ? filter.toLowerCase() : this.filter
const isFiltered = (profile) => (profile.displayName ? profile.displayName : profile.name).toLowerCase().includes(this.filter) const isFiltered = (profile) => (profile.displayName ? profile.displayName : profile.name).toLowerCase().includes(this.filter)

@ -1,10 +1,10 @@
// eslint-disable-next-line no-use-before-define // eslint-disable-next-line no-use-before-define
import React from 'react' import React from 'react'
import ReactDOM from 'react-dom'
import { AbstractPanel } from './panel' import { AbstractPanel } from './panel'
import { RemixPluginPanel } from '@remix-ui/panel' import { RemixPluginPanel } from '@remix-ui/panel'
import packageJson from '../../../../../package.json' import packageJson from '../../../../../package.json'
import RemixUIPanelHeader from 'libs/remix-ui/panel/src/lib/plugins/panel-header' import RemixUIPanelHeader from 'libs/remix-ui/panel/src/lib/plugins/panel-header'
import { PluginViewWrapper } from '@remix-ui/helper'
// const csjs = require('csjs-inject') // const csjs = require('csjs-inject')
const sidePanel = { const sidePanel = {
@ -17,6 +17,7 @@ const sidePanel = {
export class SidePanel extends AbstractPanel { export class SidePanel extends AbstractPanel {
sideelement: any sideelement: any
dispatch: React.Dispatch<any> = () => {}
constructor() { constructor() {
super(sidePanel) super(sidePanel)
this.sideelement = document.createElement('section') this.sideelement = document.createElement('section')
@ -78,11 +79,23 @@ export class SidePanel extends AbstractPanel {
this.renderComponent() this.renderComponent()
} }
render() { setDispatch (dispatch: React.Dispatch<any>) {
return this.sideelement this.dispatch = dispatch
}
render() {
return (
<section className='panel plugin-manager'> <PluginViewWrapper plugin={this} /></section>
);
}
updateComponent(state: any) {
return <RemixPluginPanel header={<RemixUIPanelHeader plugins={state.plugins}></RemixUIPanelHeader>} plugins={state.plugins} />
} }
renderComponent() { renderComponent() {
ReactDOM.render(<RemixPluginPanel header={<RemixUIPanelHeader plugins={this.plugins}></RemixUIPanelHeader>} plugins={this.plugins} />, this.sideelement) this.dispatch({
plugins: this.plugins
})
} }
} }

@ -1,11 +1,11 @@
// eslint-disable-next-line no-use-before-define // eslint-disable-next-line no-use-before-define
import React from 'react' import React from 'react'
import ReactDOM from 'react-dom'
import packageJson from '../../../../../package.json' import packageJson from '../../../../../package.json'
import { Plugin } from '@remixproject/engine' import { Plugin } from '@remixproject/engine'
import { EventEmitter } from 'events' import { EventEmitter } from 'events'
import { IconRecord, RemixUiVerticalIconsPanel } from '@remix-ui/vertical-icons-panel' import { IconRecord, RemixUiVerticalIconsPanel } from '@remix-ui/vertical-icons-panel'
import { Profile } from '@remixproject/plugin-utils' import { Profile } from '@remixproject/plugin-utils'
import { PluginViewWrapper } from '@remix-ui/helper'
const profile = { const profile = {
name: 'menuicons', name: 'menuicons',
@ -20,6 +20,7 @@ export class VerticalIcons extends Plugin {
events: EventEmitter events: EventEmitter
htmlElement: HTMLDivElement htmlElement: HTMLDivElement
icons: Record<string, IconRecord> = {} icons: Record<string, IconRecord> = {}
dispatch: React.Dispatch<any> = () => {}
constructor () { constructor () {
super(profile) super(profile)
this.events = new EventEmitter() this.events = new EventEmitter()
@ -46,12 +47,15 @@ export class VerticalIcons extends Plugin {
...divived.filter((value) => { return !value.isRequired }) ...divived.filter((value) => { return !value.isRequired })
] ]
ReactDOM.render( this.dispatch({
<RemixUiVerticalIconsPanel verticalIconsPlugin: this,
verticalIconsPlugin={this} icons: sorted
icons={sorted} })
/>,
this.htmlElement) }
setDispatch (dispatch: React.Dispatch<any>) {
this.dispatch = dispatch
} }
onActivation () { onActivation () {
@ -107,7 +111,16 @@ export class VerticalIcons extends Plugin {
this.events.emit('toggleContent', name) this.events.emit('toggleContent', name)
} }
render () { updateComponent(state: any){
return this.htmlElement return <RemixUiVerticalIconsPanel
verticalIconsPlugin={state.verticalIconsPlugin}
icons={state.icons}
/>
}
render() {
return (
<div id='icon-panel'><PluginViewWrapper plugin={this} /></div>
);
} }
} }

@ -1,9 +1,9 @@
'use strict' 'use strict'
import React from 'react' // eslint-disable-line import React from 'react' // eslint-disable-line
import ReactDOM from 'react-dom'
import { EditorUI } from '@remix-ui/editor' // eslint-disable-line import { EditorUI } from '@remix-ui/editor' // eslint-disable-line
import { Plugin } from '@remixproject/engine' import { Plugin } from '@remixproject/engine'
import * as packageJson from '../../../../../package.json' import * as packageJson from '../../../../../package.json'
import { PluginViewWrapper } from '@remix-ui/helper'
const EventManager = require('../../lib/events') const EventManager = require('../../lib/events')
@ -61,10 +61,29 @@ class Editor extends Plugin {
// to be implemented by the react component // to be implemented by the react component
this.api = {} this.api = {}
this.dispatch = null
this.ref = null
}
setDispatch (dispatch) {
this.dispatch = dispatch
}
updateComponent(state) {
return <EditorUI
editorAPI={state.api}
themeType={state.currentThemeType}
currentFile={state.currentFile}
sourceAnnotationsPerFile={state.sourceAnnotationsPerFile}
markerPerFile={state.markerPerFile}
events={state.events}
plugin={state.plugin}
/>
} }
render () { render () {
if (this.el) return this.el
/* if (this.el) return this.el
this.el = document.createElement('div') this.el = document.createElement('div')
this.el.setAttribute('id', 'editorView') this.el.setAttribute('id', 'editorView')
@ -76,22 +95,34 @@ class Editor extends Plugin {
} }
} }
this.el.gotoLine = (line, column) => this.gotoLine(line, column || 0) this.el.gotoLine = (line, column) => this.gotoLine(line, column || 0)
this.el.getCursorPosition = () => this.getCursorPosition() this.el.getCursorPosition = () => this.getCursorPosition() */
return this.el
return <div ref={(element)=>{
this.ref = element
this.ref.currentContent = () => this.currentContent() // used by e2e test
this.ref.setCurrentContent = (value) => {
if (this.sessions[this.currentFile]) {
this.sessions[this.currentFile].setValue(value)
this._onChange(this.currentFile)
}
}
this.ref.gotoLine = (line, column) => this.gotoLine(line, column || 0)
this.ref.getCursorPosition = () => this.getCursorPosition()
}} id='editorView'>
<PluginViewWrapper plugin={this} />
</div>
} }
renderComponent () { renderComponent () {
ReactDOM.render( this.dispatch({
<EditorUI api: this.api,
editorAPI={this.api} currentThemeType: this.currentThemeType,
themeType={this.currentThemeType} currentFile: this.currentFile,
currentFile={this.currentFile} sourceAnnotationsPerFile: this.sourceAnnotationsPerFile,
sourceAnnotationsPerFile={this.sourceAnnotationsPerFile} markerPerFile: this.markerPerFile,
markerPerFile={this.markerPerFile} events: this.events,
events={this.events} plugin: this
plugin={this} })
/>
, this.el)
} }
triggerEvent (name, params) { triggerEvent (name, params) {

@ -2,7 +2,6 @@ import { ViewPlugin } from '@remixproject/engine-web'
import * as packageJson from '../../../../../package.json' import * as packageJson from '../../../../../package.json'
import React from 'react' // eslint-disable-line import React from 'react' // eslint-disable-line
import ReactDOM from 'react-dom'
import { FileSystemProvider } from '@remix-ui/workspace' // eslint-disable-line import { FileSystemProvider } from '@remix-ui/workspace' // eslint-disable-line
import Registry from '../state/registry' import Registry from '../state/registry'
import { RemixdHandle } from '../plugins/remixd-handle' import { RemixdHandle } from '../plugins/remixd-handle'
@ -58,18 +57,8 @@ module.exports = class Filepanel extends ViewPlugin {
this.currentWorkspaceMetadata = {} this.currentWorkspaceMetadata = {}
} }
onActivation () {
this.renderComponent()
}
render () { render () {
return this.el return <div id='fileExplorerView'><FileSystemProvider plugin={this} /></div>
}
renderComponent () {
ReactDOM.render(
<FileSystemProvider plugin={this} />
, this.el)
} }
/** /**

@ -1,8 +1,7 @@
import React from 'react' // eslint-disable-line import React from 'react' // eslint-disable-line
import ReactDOM from 'react-dom'
import { Plugin } from '@remixproject/engine' import { Plugin } from '@remixproject/engine'
import { TabsUI } from '@remix-ui/tabs' import { TabsUI } from '@remix-ui/tabs'
import { getPathIcon } from '@remix-ui/helper' import { PluginViewWrapper, getPathIcon } from '@remix-ui/helper'
const EventEmitter = require('events') const EventEmitter = require('events')
const profile = { const profile = {
@ -11,7 +10,6 @@ const profile = {
kind: 'other' kind: 'other'
} }
// @todo(#650) Merge this with MainPanel into one plugin
export class TabProxy extends Plugin { export class TabProxy extends Plugin {
constructor (fileManager, editor) { constructor (fileManager, editor) {
super(profile) super(profile)
@ -23,6 +21,7 @@ export class TabProxy extends Plugin {
this._handlers = {} this._handlers = {}
this.loadedTabs = [] this.loadedTabs = []
this.el = document.createElement('div') this.el = document.createElement('div')
this.dispatch = null
} }
onActivation () { onActivation () {
@ -286,6 +285,15 @@ export class TabProxy extends Plugin {
this.handlers[type] = fn this.handlers[type] = fn
} }
setDispatch (dispatch) {
this.dispatch = dispatch
this.renderComponent()
}
updateComponent(state) {
return <TabsUI tabs={state.loadedTabs} onSelect={state.onSelect} onClose={state.onClose} onZoomIn={state.onZoomIn} onZoomOut={state.onZoomOut} onReady={state.onReady} />
}
renderComponent () { renderComponent () {
const onSelect = (index) => { const onSelect = (index) => {
if (this.loadedTabs[index]) { if (this.loadedTabs[index]) {
@ -308,12 +316,17 @@ export class TabProxy extends Plugin {
const onReady = (api) => { this.tabsApi = api } const onReady = (api) => { this.tabsApi = api }
ReactDOM.render( this.dispatch({
<TabsUI tabs={this.loadedTabs} onSelect={onSelect} onClose={onClose} onZoomIn={onZoomIn} onZoomOut={onZoomOut} onReady={onReady} /> loadedTabs: this.loadedTabs,
, this.el) onSelect,
onClose,
onZoomIn,
onZoomOut,
onReady
})
} }
renderTabsbar () { renderTabsbar () {
return this.el return <div><PluginViewWrapper plugin={this} /></div>
} }
} }

@ -1,15 +1,16 @@
/* global Node, requestAnimationFrame */ // eslint-disable-line /* global Node, requestAnimationFrame */ // eslint-disable-line
import React from 'react' // eslint-disable-line import React from 'react' // eslint-disable-line
import ReactDOM from 'react-dom'
import { RemixUiTerminal } from '@remix-ui/terminal' // eslint-disable-line import { RemixUiTerminal } from '@remix-ui/terminal' // eslint-disable-line
import { Plugin } from '@remixproject/engine' import { Plugin } from '@remixproject/engine'
import * as packageJson from '../../../../../package.json' import * as packageJson from '../../../../../package.json'
import Registry from '../state/registry' import Registry from '../state/registry'
import { PluginViewWrapper } from '@remix-ui/helper'
const vm = require('vm') const vm = require('vm')
const EventManager = require('../../lib/events') const EventManager = require('../../lib/events')
import { CompilerImports } from '@remix-project/core-plugin' // eslint-disable-line import { CompilerImports } from '@remix-project/core-plugin' // eslint-disable-line
const KONSOLES = [] const KONSOLES = []
function register (api) { KONSOLES.push(api) } function register (api) { KONSOLES.push(api) }
@ -79,9 +80,12 @@ class Terminal extends Plugin {
this.call('menuicons', 'select', 'debugger') this.call('menuicons', 'select', 'debugger')
this.call('debugger', 'debug', hash) this.call('debugger', 'debug', hash)
}) })
this.dispatch = null
} }
onActivation () { onActivation() {
this.renderComponent() this.renderComponent()
} }
@ -100,19 +104,27 @@ class Terminal extends Plugin {
this.terminalApi.log(message) this.terminalApi.log(message)
} }
setDispatch(dispatch) {
this.dispatch = dispatch
}
render () { render () {
return this.element return <div id='terminal-view' className='panel' data-id='terminalContainer-view'><PluginViewWrapper plugin={this}/></div>
}
updateComponent(state) {
return <RemixUiTerminal
plugin={state.plugin}
onReady={state.onReady}
/>
} }
renderComponent () { renderComponent () {
const onReady = (api) => { this.terminalApi = api } const onReady = (api) => { this.terminalApi = api }
ReactDOM.render( this.dispatch({
<RemixUiTerminal plugin: this,
plugin={this} onReady: onReady
onReady={onReady} })
/>,
this.element
)
} }
scroll2bottom () { scroll2bottom () {

@ -1,10 +1,10 @@
import React from 'react' // eslint-disable-line import React from 'react' // eslint-disable-line
import { ViewPlugin } from '@remixproject/engine-web' import { ViewPlugin } from '@remixproject/engine-web'
import ReactDOM from 'react-dom'
import { EventEmitter } from 'events' import { EventEmitter } from 'events'
import {RemixUiStaticAnalyser} from '@remix-ui/static-analyser' // eslint-disable-line import {RemixUiStaticAnalyser} from '@remix-ui/static-analyser' // eslint-disable-line
import * as packageJson from '../../../../../package.json' import * as packageJson from '../../../../../package.json'
import Registry from '../state/registry' import Registry from '../state/registry'
import { PluginViewWrapper } from '@remix-ui/helper'
var EventManager = require('../../lib/events') var EventManager = require('../../lib/events')
@ -35,6 +35,7 @@ class AnalysisTab extends ViewPlugin {
offsetToLineColumnConverter: this.registry.get( offsetToLineColumnConverter: this.registry.get(
'offsettolinecolumnconverter').api 'offsettolinecolumnconverter').api
} }
this.dispatch = null
} }
async onActivation () { async onActivation () {
@ -43,33 +44,40 @@ class AnalysisTab extends ViewPlugin {
await this.call('manager', 'activatePlugin', 'solidity') await this.call('manager', 'activatePlugin', 'solidity')
} }
this.renderComponent() this.renderComponent()
this.event.register('staticAnaysisWarning', (count) => {
if (count > 0) {
this.emit('statusChanged', { key: count, title: `${count} warning${count === 1 ? '' : 's'}`, type: 'warning' })
} else if (count === 0) {
this.emit('statusChanged', { key: 'succeed', title: 'no warning', type: 'success' })
} else {
// count ==-1 no compilation result
this.emit('statusChanged', { key: 'none' })
}
})
}
setDispatch (dispatch) {
this.dispatch = dispatch
} }
render () { render () {
return this.element return <div id='staticAnalyserView'><PluginViewWrapper plugin={this} /></div>
}
updateComponent(state) {
return <RemixUiStaticAnalyser
registry={state.registry}
analysisModule={state.analysisModule}
event={state.event}
/>
} }
renderComponent () { renderComponent () {
ReactDOM.render( this.dispatch({
<RemixUiStaticAnalyser registry: this.registry,
registry={this.registry} analysisModule: this,
analysisModule={this} event: this.event
event={this.event} })
/>,
this.element,
() => {
this.event.register('staticAnaysisWarning', (count) => {
if (count > 0) {
this.emit('statusChanged', { key: count, title: `${count} warning${count === 1 ? '' : 's'}`, type: 'warning' })
} else if (count === 0) {
this.emit('statusChanged', { key: 'succeed', title: 'no warning', type: 'success' })
} else {
// count ==-1 no compilation result
this.emit('statusChanged', { key: 'none' })
}
})
}
)
} }
} }

@ -1,6 +1,5 @@
/* global */ /* global */
import React from 'react' // eslint-disable-line import React from 'react' // eslint-disable-line
import ReactDOM from 'react-dom'
import { SolidityCompiler } from '@remix-ui/solidity-compiler' // eslint-disable-line import { SolidityCompiler } from '@remix-ui/solidity-compiler' // eslint-disable-line
import { CompileTabLogic } from '@remix-ui/solidity-compiler' // eslint-disable-line import { CompileTabLogic } from '@remix-ui/solidity-compiler' // eslint-disable-line
import { CompilerApiMixin } from '@remixproject/solidity-compiler-plugin' // eslint-disable-line import { CompilerApiMixin } from '@remixproject/solidity-compiler-plugin' // eslint-disable-line
@ -42,9 +41,7 @@ class CompileTab extends CompilerApiMixin(ViewPlugin) { // implements ICompilerA
} }
renderComponent () { renderComponent () {
ReactDOM.render( // empty method, is a state update needed?
<SolidityCompiler api={this}/>
, this.el)
} }
onCurrentFileChanged () { onCurrentFileChanged () {
@ -68,9 +65,7 @@ class CompileTab extends CompilerApiMixin(ViewPlugin) { // implements ICompilerA
} }
render () { render () {
this.renderComponent() return <div id='compileTabView'><SolidityCompiler api={this}/></div>
return this.el
} }
async compileWithParameters (compilationTargets, settings) { async compileWithParameters (compilationTargets, settings) {

@ -3,7 +3,6 @@ import { DebuggerApiMixin } from '@remixproject/debugger-plugin' // eslint-disab
import { ViewPlugin } from '@remixproject/engine-web' import { ViewPlugin } from '@remixproject/engine-web'
import * as packageJson from '../../../../../package.json' import * as packageJson from '../../../../../package.json'
import React from 'react' // eslint-disable-line import React from 'react' // eslint-disable-line
import ReactDOM from 'react-dom'
import * as remixBleach from '../../lib/remixBleach' import * as remixBleach from '../../lib/remixBleach'
import { compilationFinishedToastMsg, compilingToastMsg, localCompilationToastMsg, notFoundToastMsg, sourceVerificationNotAvailableToastMsg } from '@remix-ui/helper' import { compilationFinishedToastMsg, compilingToastMsg, localCompilationToastMsg, notFoundToastMsg, sourceVerificationNotAvailableToastMsg } from '@remix-ui/helper'
const css = require('./styles/debugger-tab-styles') const css = require('./styles/debugger-tab-styles')
@ -51,9 +50,7 @@ export class DebuggerTab extends DebuggerApiMixin(ViewPlugin) {
this.on('fetchAndCompile', 'sourceVerificationNotAvailable', () => { this.on('fetchAndCompile', 'sourceVerificationNotAvailable', () => {
this.call('notification', 'toast', sourceVerificationNotAvailableToastMsg()) this.call('notification', 'toast', sourceVerificationNotAvailableToastMsg())
}) })
return <div className={css.debuggerTabView} id='debugView'><DebuggerUI debuggerAPI={this} /></div>
this.renderComponent()
return this.el
} }
showMessage (title, message) { showMessage (title, message) {
@ -68,9 +65,4 @@ export class DebuggerTab extends DebuggerApiMixin(ViewPlugin) {
} }
} }
renderComponent () {
ReactDOM.render(
<DebuggerUI debuggerAPI={this} />
, this.el)
}
} }

@ -1,9 +1,9 @@
import React from 'react' // eslint-disable-line import React from 'react' // eslint-disable-line
import { ViewPlugin } from '@remixproject/engine-web' import { ViewPlugin } from '@remixproject/engine-web'
import ReactDOM from 'react-dom'
import * as packageJson from '../../../../../package.json' import * as packageJson from '../../../../../package.json'
import { RemixUiSettings } from '@remix-ui/settings' //eslint-disable-line import { RemixUiSettings } from '@remix-ui/settings' //eslint-disable-line
import Registry from '../state/registry' import Registry from '../state/registry'
import { PluginViewWrapper } from '@remix-ui/helper'
const profile = { const profile = {
name: 'settings', name: 'settings',
@ -20,6 +20,15 @@ const profile = {
} }
module.exports = class SettingsTab extends ViewPlugin { module.exports = class SettingsTab extends ViewPlugin {
config: any = {}
editor: any
private _deps: {
themeModule: any // eslint-disable-line
}
element: HTMLDivElement
public useMatomoAnalytics: any
dispatch: React.Dispatch<any> = () => {}
constructor (config, editor) { constructor (config, editor) {
super(profile) super(profile)
this.config = config this.config = config
@ -32,24 +41,31 @@ module.exports = class SettingsTab extends ViewPlugin {
this.useMatomoAnalytics = null this.useMatomoAnalytics = null
} }
onActivation () { setDispatch (dispatch: React.Dispatch<any>) {
this.dispatch = dispatch
this.renderComponent() this.renderComponent()
} }
render () { render() {
return this.element return (
<div id='settingsTab'>
<PluginViewWrapper plugin={this} />
</div>
);
}
updateComponent(state: any){
return <RemixUiSettings
config={state.config}
editor={state.editor}
_deps={state._deps}
useMatomoAnalytics={state.useMatomoAnalytics}
themeModule = {state._deps.themeModule}
/>
} }
renderComponent () { renderComponent () {
ReactDOM.render( this.dispatch(this)
<RemixUiSettings
config = { this.config }
editor = { this.editor }
_deps = { this._deps }
useMatomoAnalytics = {this.useMatomoAnalytics}
/>,
this.element
)
} }
get (key) { get (key) {
@ -59,6 +75,8 @@ module.exports = class SettingsTab extends ViewPlugin {
updateMatomoAnalyticsChoice (isChecked) { updateMatomoAnalyticsChoice (isChecked) {
this.config.set('settings/matomo-analytics', isChecked) this.config.set('settings/matomo-analytics', isChecked)
this.useMatomoAnalytics = isChecked this.useMatomoAnalytics = isChecked
this.renderComponent() this.dispatch({
...this
})
} }
} }

@ -1,12 +1,12 @@
/* global */ /* global */
import React from 'react' // eslint-disable-line import React from 'react' // eslint-disable-line
import ReactDOM from 'react-dom'
import { SolidityUnitTesting } from '@remix-ui/solidity-unit-testing' // eslint-disable-line import { SolidityUnitTesting } from '@remix-ui/solidity-unit-testing' // eslint-disable-line
import { TestTabLogic } from '@remix-ui/solidity-unit-testing' // eslint-disable-line import { TestTabLogic } from '@remix-ui/solidity-unit-testing' // eslint-disable-line
import { ViewPlugin } from '@remixproject/engine-web' import { ViewPlugin } from '@remixproject/engine-web'
import helper from '../../lib/helper' import helper from '../../lib/helper'
import { canUseWorker, urlFromVersion } from '@remix-project/remix-solidity' import { canUseWorker, urlFromVersion } from '@remix-project/remix-solidity'
import { PluginViewWrapper } from '@remix-ui/helper'
var { UnitTestRunner, assertLibCode } = require('@remix-project/remix-tests') var { UnitTestRunner, assertLibCode } = require('@remix-project/remix-tests')
@ -34,6 +34,7 @@ module.exports = class TestTab extends ViewPlugin {
this.offsetToLineColumnConverter = offsetToLineColumnConverter this.offsetToLineColumnConverter = offsetToLineColumnConverter
this.allFilesInvolved = ['.deps/remix-tests/remix_tests.sol', '.deps/remix-tests/remix_accounts.sol'] this.allFilesInvolved = ['.deps/remix-tests/remix_tests.sol', '.deps/remix-tests/remix_accounts.sol']
this.element = document.createElement('div') this.element = document.createElement('div')
this.dispatch = null
} }
onActivationInternal () { onActivationInternal () {
@ -128,15 +129,25 @@ module.exports = class TestTab extends ViewPlugin {
}) })
} }
setDispatch (dispatch) {
this.dispatch = dispatch
this.renderComponent('tests')
}
render () { render () {
this.onActivationInternal() this.onActivationInternal()
this.renderComponent('tests') return <div><PluginViewWrapper plugin={this} /></div>
return this.element }
updateComponent(state) {
return <SolidityUnitTesting testTab={state.testTab} helper={state.helper} initialPath={state.testDirPath} />
} }
renderComponent (testDirPath) { renderComponent (testDirPath) {
ReactDOM.render( this.dispatch({
<SolidityUnitTesting testTab={this} helper={helper} initialPath={testDirPath} /> testTab: this,
, this.element) helper: this.helper,
testDirPath: testDirPath
})
} }
} }

@ -1,5 +1,4 @@
import React from 'react' // eslint-disable-line import React from 'react' // eslint-disable-line
import ReactDOM from 'react-dom'
import { RunTabUI } from '@remix-ui/run-tab' import { RunTabUI } from '@remix-ui/run-tab'
import { ViewPlugin } from '@remixproject/engine-web' import { ViewPlugin } from '@remixproject/engine-web'
import * as packageJson from '../../../../../package.json' import * as packageJson from '../../../../../package.json'
@ -40,9 +39,6 @@ export class RunTab extends ViewPlugin {
this.el = document.createElement('div') this.el = document.createElement('div')
} }
onActivation () {
this.renderComponent()
}
setupEvents () { setupEvents () {
this.blockchain.events.on('newTransaction', (tx, receipt) => { this.blockchain.events.on('newTransaction', (tx, receipt) => {
@ -86,14 +82,9 @@ export class RunTab extends ViewPlugin {
} }
render () { render () {
return this.el return <div><RunTabUI plugin={this} /></div>
} }
renderComponent () {
ReactDOM.render(
<RunTabUI plugin={this} />
, this.el)
}
onReady (api) { onReady (api) {
this.REACT_API = api this.REACT_API = api

@ -1,6 +1,5 @@
/* global */ /* global */
import React from 'react' // eslint-disable-line import React from 'react' // eslint-disable-line
import ReactDOM from 'react-dom'
import * as packageJson from '../../../../../../package.json' import * as packageJson from '../../../../../../package.json'
import { ViewPlugin } from '@remixproject/engine-web' import { ViewPlugin } from '@remixproject/engine-web'
import { RemixUiHomeTab } from '@remix-ui/home-tab' // eslint-disable-line import { RemixUiHomeTab } from '@remix-ui/home-tab' // eslint-disable-line
@ -31,15 +30,9 @@ export class LandingPage extends ViewPlugin {
} }
render () { render () {
this.renderComponent() return <div id='landingPageHomeContainer' className='remixui_homeContainer justify-content-between bg-light d-flex' data-id='landingPageHomeContainer'><RemixUiHomeTab
return this.el plugin={this}
/></div>
} }
renderComponent () {
ReactDOM.render(
<RemixUiHomeTab
plugin={this}
/>
, this.el)
}
} }

@ -33,9 +33,9 @@ import ('./app').then((AppComponent) => {
const appComponent = new AppComponent.default() const appComponent = new AppComponent.default()
appComponent.run().then(() => { appComponent.run().then(() => {
render( render(
<React.StrictMode> <>
<RemixApp app={appComponent} /> <RemixApp app={appComponent} />
</React.StrictMode>, </>,
document.getElementById('root') document.getElementById('root')
) )
}) })

@ -1,4 +1,4 @@
import React, { useEffect, useRef, useState } from 'react' import React, { useContext, useEffect, useRef, useState } from 'react'
import './style/remix-app.css' import './style/remix-app.css'
import { RemixUIMainPanel } from '@remix-ui/panel' import { RemixUIMainPanel } from '@remix-ui/panel'
import MatomoDialog from './components/modals/matomo' import MatomoDialog from './components/modals/matomo'
@ -8,6 +8,7 @@ import { AppProvider } from './context/provider'
import AppDialogs from './components/modals/dialogs' import AppDialogs from './components/modals/dialogs'
import DialogViewPlugin from './components/modals/dialogViewPlugin' import DialogViewPlugin from './components/modals/dialogViewPlugin'
import { AppContext } from './context/context' import { AppContext } from './context/context'
import { RemixUiVerticalIconsPanel } from '@remix-ui/vertical-icons-panel'
interface IRemixAppUi { interface IRemixAppUi {
app: any app: any
@ -17,31 +18,8 @@ const RemixApp = (props: IRemixAppUi) => {
const [appReady, setAppReady] = useState<boolean>(false) const [appReady, setAppReady] = useState<boolean>(false)
const [hideSidePanel, setHideSidePanel] = useState<boolean>(false) const [hideSidePanel, setHideSidePanel] = useState<boolean>(false)
const sidePanelRef = useRef(null) const sidePanelRef = useRef(null)
const mainPanelRef = useRef(null)
const iconPanelRef = useRef(null)
const hiddenPanelRef = useRef(null)
useEffect(() => { useEffect(() => {
if (sidePanelRef.current) {
if (props.app.sidePanel) {
sidePanelRef.current.appendChild(props.app.sidePanel.render())
}
}
if (mainPanelRef.current) {
if (props.app.mainview) {
mainPanelRef.current.appendChild(props.app.mainview.render())
}
}
if (iconPanelRef.current) {
if (props.app.menuicons) {
iconPanelRef.current.appendChild(props.app.menuicons.render())
}
}
if (hiddenPanelRef.current) {
if (props.app.hiddenPanel) {
hiddenPanelRef.current.appendChild(props.app.hiddenPanel.render())
}
}
async function activateApp () { async function activateApp () {
props.app.themeModule.initTheme(() => { props.app.themeModule.initTheme(() => {
setAppReady(true) setAppReady(true)
@ -72,13 +50,6 @@ const RemixApp = (props: IRemixAppUi) => {
}) })
} }
const components = {
iconPanel: <div ref={iconPanelRef} id="icon-panel" data-id="remixIdeIconPanel" className="iconpanel bg-light"></div>,
sidePanel: <div ref={sidePanelRef} id="side-panel" data-id="remixIdeSidePanel" className={`sidepanel border-right border-left ${hideSidePanel ? 'd-none' : ''}`}></div>,
mainPanel: <div ref={mainPanelRef} id="main-panel" data-id="remixIdeMainPanel" className='mainpanel'></div>,
hiddenPanel: <div ref={hiddenPanelRef}></div>
}
const value = { const value = {
settings: props.app.settings, settings: props.app.settings,
showMatamo: props.app.showMatamo, showMatamo: props.app.showMatamo,
@ -93,14 +64,14 @@ const RemixApp = (props: IRemixAppUi) => {
<MatomoDialog hide={!appReady}></MatomoDialog> <MatomoDialog hide={!appReady}></MatomoDialog>
<div className={`remixIDE ${appReady ? '' : 'd-none'}`} data-id="remixIDE"> <div className={`remixIDE ${appReady ? '' : 'd-none'}`} data-id="remixIDE">
{components.iconPanel} <div id="icon-panel" data-id="remixIdeIconPanel" className="iconpanel bg-light">{props.app.menuicons.render()}</div>
{components.sidePanel} <div ref={sidePanelRef} id="side-panel" data-id="remixIdeSidePanel" className={`sidepanel border-right border-left ${hideSidePanel ? 'd-none' : ''}`}>{props.app.sidePanel.render()}</div>
<DragBar minWidth={250} refObject={sidePanelRef} hidden={hideSidePanel} setHideStatus={setHideSidePanel}></DragBar> <DragBar minWidth={250} refObject={sidePanelRef} hidden={hideSidePanel} setHideStatus={setHideSidePanel}></DragBar>
<div id="main-panel" data-id="remixIdeMainPanel" className='mainpanel'> <div id="main-panel" data-id="remixIdeMainPanel" className='mainpanel'>
<RemixUIMainPanel Context={AppContext}></RemixUIMainPanel> <RemixUIMainPanel Context={AppContext}></RemixUIMainPanel>
</div> </div>
</div> </div>
{components.hiddenPanel} <div>{props.app.hiddenPanel.render()}</div>
<AppDialogs></AppDialogs> <AppDialogs></AppDialogs>
<DialogViewPlugin></DialogViewPlugin> <DialogViewPlugin></DialogViewPlugin>
</AppProvider> </AppProvider>

@ -1,2 +1,3 @@
export * from './lib/remix-ui-helper' export * from './lib/remix-ui-helper'
export * from './lib/helper-components' export * from './lib/helper-components'
export * from './lib/components/PluginViewWrapper'

@ -0,0 +1,24 @@
import React from "react"
import { useEffect, useState } from "react"
interface IPluginViewWrapperProps {
plugin: any
}
export const PluginViewWrapper = (props: IPluginViewWrapperProps) => {
const [state, setState] = useState<any>(null)
useEffect(() => {
if(props.plugin.setDispatch){
props.plugin.setDispatch(setState)
}
}, [])
return (
<>{state?
<>{props.plugin.updateComponent(state)}</>
:<></>
}</>
)
}

@ -10,6 +10,7 @@ const RemixUIPanelPlugin = (props: panelPLuginProps, panelRef: any) => {
const localRef = useRef<HTMLDivElement>(null) const localRef = useRef<HTMLDivElement>(null)
const [view, setView] = useState<JSX.Element | HTMLDivElement>() const [view, setView] = useState<JSX.Element | HTMLDivElement>()
useEffect(() => { useEffect(() => {
const ref:any = panelRef || localRef const ref:any = panelRef || localRef
if (ref.current) { if (ref.current) {
if (props.pluginRecord.view) { if (props.pluginRecord.view) {

@ -76,11 +76,6 @@ iframe {
display: block; display: block;
} }
.pluginsContainer {
height: 100%;
overflow-y: hidden;
}
#editorView { #editorView {
height: 100%; height: 100%;
width: 100%; width: 100%;

@ -149,13 +149,13 @@
"@ethereumjs/tx": "^3.3.2", "@ethereumjs/tx": "^3.3.2",
"@ethereumjs/vm": "^5.5.3", "@ethereumjs/vm": "^5.5.3",
"@monaco-editor/react": "^4.3.1", "@monaco-editor/react": "^4.3.1",
"@remixproject/engine": "^0.3.26", "@remixproject/engine": "^0.3.28",
"@remixproject/engine-web": "^0.3.26", "@remixproject/engine-web": "^0.3.28",
"@remixproject/plugin": "^0.3.26", "@remixproject/plugin": "^0.3.28",
"@remixproject/plugin-api": "^0.3.26", "@remixproject/plugin-api": "^0.3.28",
"@remixproject/plugin-utils": "^0.3.26", "@remixproject/plugin-utils": "^0.3.28",
"@remixproject/plugin-webview": "^0.3.26", "@remixproject/plugin-webview": "^0.3.28",
"@remixproject/plugin-ws": "^0.3.26", "@remixproject/plugin-ws": "^0.3.28",
"ansi-gray": "^0.1.1", "ansi-gray": "^0.1.1",
"async": "^2.6.2", "async": "^2.6.2",
"axios": ">=0.21.1", "axios": ">=0.21.1",

Loading…
Cancel
Save