From 9367e03483419c853d49ac8f930f392e42559d49 Mon Sep 17 00:00:00 2001 From: yann300 Date: Fri, 17 Jun 2022 15:32:41 +0200 Subject: [PATCH 1/4] add validationFn to the prompt modal to validate the input --- .../src/app/tabs/abstract-provider.tsx | 14 ++++++++ .../components/modals/modal-wrapper.tsx | 34 +++++++++++++++---- .../src/lib/remix-app/context/provider.tsx | 6 ++-- .../app/src/lib/remix-app/interface/index.ts | 6 ++++ .../app/src/lib/remix-app/reducer/modals.ts | 1 + .../app/src/lib/remix-app/state/modals.ts | 1 + .../src/lib/remix-ui-modal-dialog.tsx | 10 +++--- .../modal-dialog/src/lib/types/index.ts | 7 ++++ 8 files changed, 66 insertions(+), 13 deletions(-) diff --git a/apps/remix-ide/src/app/tabs/abstract-provider.tsx b/apps/remix-ide/src/app/tabs/abstract-provider.tsx index b17f181166..ff924a618a 100644 --- a/apps/remix-ide/src/app/tabs/abstract-provider.tsx +++ b/apps/remix-ide/src/app/tabs/abstract-provider.tsx @@ -58,6 +58,20 @@ export abstract class AbstractProvider extends Plugin { modalType: ModalTypes.prompt, okLabel: 'OK', cancelLabel: 'Cancel', + validationFn: (value) => { + if (!value) return { valid: false, message: "value is empty" } + if (value.startsWith('https://') || value.startsWith('http://')) { + return { + valid: true, + message: '' + } + } else { + return { + valid: false, + message: 'the provided value should contain the protocol ( e.g starts with http:// or https:// )' + } + } + }, okFn: (value: string) => { setTimeout(() => resolve(value), 0) }, diff --git a/libs/remix-ui/app/src/lib/remix-app/components/modals/modal-wrapper.tsx b/libs/remix-ui/app/src/lib/remix-app/components/modals/modal-wrapper.tsx index 12644f5fa7..9ee12e871a 100644 --- a/libs/remix-ui/app/src/lib/remix-app/components/modals/modal-wrapper.tsx +++ b/libs/remix-ui/app/src/lib/remix-app/components/modals/modal-wrapper.tsx @@ -1,5 +1,5 @@ import React, { useEffect, useRef, useState } from 'react' -import { ModalDialog, ModalDialogProps } from '@remix-ui/modal-dialog' +import { ModalDialog, ModalDialogProps, ValidationResult } from '@remix-ui/modal-dialog' import { ModalTypes } from '../../types' interface ModalWrapperProps extends ModalDialogProps { @@ -29,12 +29,25 @@ const ModalWrapper = (props: ModalWrapperProps) => { (props.cancelFn) ? props.cancelFn() : props.resolve(false) } - const createModalMessage = (defaultValue: string) => { + const onInputChanged = (event) => { + if (props.validationFn) { + const validation = props.validationFn(event.target.value) + setState({ + ...props, + message: createModalMessage(props.defaultValue, validation), + validation + }) + } + } + + const createModalMessage = (defaultValue: string, validation: ValidationResult) => { return ( <> {props.message} - - ) + + {!validation.valid && {validation.message}} + + ) } useEffect(() => { @@ -47,7 +60,7 @@ const ModalWrapper = (props: ModalWrapperProps) => { ...props, okFn: onFinishPrompt, cancelFn: onCancelFn, - message: createModalMessage(props.defaultValue) + message: createModalMessage(props.defaultValue, { valid: true }) }) break default: @@ -67,8 +80,17 @@ const ModalWrapper = (props: ModalWrapperProps) => { } }, [props]) + // reset the message and input if any, so when the modal is shown again it doesn't show the previous value. + const handleHide = () => { + setState({ + ...props, + message: '' + }) + props.handleHide() + } + return ( - + ) } export default ModalWrapper diff --git a/libs/remix-ui/app/src/lib/remix-app/context/provider.tsx b/libs/remix-ui/app/src/lib/remix-app/context/provider.tsx index 2aca27c1be..48f810bea2 100644 --- a/libs/remix-ui/app/src/lib/remix-app/context/provider.tsx +++ b/libs/remix-ui/app/src/lib/remix-app/context/provider.tsx @@ -16,11 +16,11 @@ export const ModalProvider = ({ children = [], reducer = modalReducer, initialSt } const modal = (modalData: AppModal) => { - const { id, title, message, okLabel, okFn, cancelLabel, cancelFn, modalType, defaultValue, hideFn, data } = modalData + const { id, title, message, validationFn, okLabel, okFn, cancelLabel, cancelFn, modalType, defaultValue, hideFn, data } = modalData return new Promise((resolve, reject) => { dispatch({ type: modalActionTypes.setModal, - payload: { id, title, message, okLabel, okFn, cancelLabel, cancelFn, modalType: modalType || ModalTypes.default, defaultValue: defaultValue, hideFn, resolve, next: onNextFn, data } + payload: { id, title, message, okLabel, validationFn, okFn, cancelLabel, cancelFn, modalType: modalType || ModalTypes.default, defaultValue: defaultValue, hideFn, resolve, next: onNextFn, data } }) }) } @@ -32,7 +32,7 @@ export const ModalProvider = ({ children = [], reducer = modalReducer, initialSt const handleHideModal = () => { dispatch({ type: modalActionTypes.handleHideModal, - payload: null + payload: null, }) } diff --git a/libs/remix-ui/app/src/lib/remix-app/interface/index.ts b/libs/remix-ui/app/src/lib/remix-app/interface/index.ts index f31536678e..cc0521dd51 100644 --- a/libs/remix-ui/app/src/lib/remix-app/interface/index.ts +++ b/libs/remix-ui/app/src/lib/remix-app/interface/index.ts @@ -1,10 +1,16 @@ import { ModalTypes } from '../types' +export type ValidationResult = { + valid: boolean, + message?: string +} + export interface AppModal { id: string timestamp?: number hide?: boolean title: string + validationFn?: (value: string) => ValidationResult // eslint-disable-next-line no-undef message: string | JSX.Element okLabel: string diff --git a/libs/remix-ui/app/src/lib/remix-app/reducer/modals.ts b/libs/remix-ui/app/src/lib/remix-app/reducer/modals.ts index a50a3dbd66..51641c654c 100644 --- a/libs/remix-ui/app/src/lib/remix-app/reducer/modals.ts +++ b/libs/remix-ui/app/src/lib/remix-app/reducer/modals.ts @@ -11,6 +11,7 @@ export const modalReducer = (state: ModalState = ModalInitialState, action: Moda id: action.payload.id || timestamp.toString(), hide: false, title: action.payload.title, + validationFn: action.payload.validationFn, message: action.payload.message, okLabel: action.payload.okLabel, okFn: action.payload.okFn, diff --git a/libs/remix-ui/app/src/lib/remix-app/state/modals.ts b/libs/remix-ui/app/src/lib/remix-app/state/modals.ts index 8332d60120..2b10dccbea 100644 --- a/libs/remix-ui/app/src/lib/remix-app/state/modals.ts +++ b/libs/remix-ui/app/src/lib/remix-app/state/modals.ts @@ -8,6 +8,7 @@ export const ModalInitialState: ModalState = { hide: true, title: '', message: '', + validationFn: () => { return {valid: true, message: ''} }, okLabel: '', okFn: () => { }, cancelLabel: '', diff --git a/libs/remix-ui/modal-dialog/src/lib/remix-ui-modal-dialog.tsx b/libs/remix-ui/modal-dialog/src/lib/remix-ui-modal-dialog.tsx index 38df2fd8b8..936956c62a 100644 --- a/libs/remix-ui/modal-dialog/src/lib/remix-ui-modal-dialog.tsx +++ b/libs/remix-ui/modal-dialog/src/lib/remix-ui-modal-dialog.tsx @@ -96,18 +96,20 @@ export const ModalDialog = (props: ModalDialogProps) => {
{/* todo add autofocus ^^ */} - { props.okLabel && { + if (props.validation && !props.validation.valid) return if (props.okFn) props.okFn() handleHide() }} > {props.okLabel ? props.okLabel : 'OK'} - + } - { props.cancelLabel && { }} > {props.cancelLabel ? props.cancelLabel : 'Cancel'} - + }
diff --git a/libs/remix-ui/modal-dialog/src/lib/types/index.ts b/libs/remix-ui/modal-dialog/src/lib/types/index.ts index a8793971d7..f1ec8c88d9 100644 --- a/libs/remix-ui/modal-dialog/src/lib/types/index.ts +++ b/libs/remix-ui/modal-dialog/src/lib/types/index.ts @@ -1,8 +1,15 @@ +export type ValidationResult = { + valid: boolean, + message?: string +} + /* eslint-disable no-undef */ export interface ModalDialogProps { id: string timestamp?: number, title?: string, + validation?: ValidationResult + validationFn?: (value: string) => ValidationResult message?: string | JSX.Element, okLabel?: string, okFn?: (value?:any) => void, From db7d93a24612159c81a1a4e0802c692ec941f9f7 Mon Sep 17 00:00:00 2001 From: yann300 Date: Tue, 28 Jun 2022 12:13:03 +0200 Subject: [PATCH 2/4] refactor web provider as a provider plugin --- apps/remix-ide/src/app.js | 3 ++ .../src/app/tabs/basic-http-provider.tsx | 45 +++++++++++++++++++ apps/remix-ide/src/app/udapp/run-tab.js | 14 ++++++ .../src/blockchain/execution-context.js | 3 -- apps/remix-ide/src/remixAppManager.js | 2 +- .../helper/src/lib/helper-components.tsx | 5 --- .../run-tab/src/lib/actions/account.ts | 25 +---------- .../src/lib/components/environment.tsx | 2 +- .../run-tab/src/lib/reducers/runTab.ts | 6 --- 9 files changed, 66 insertions(+), 39 deletions(-) create mode 100644 apps/remix-ide/src/app/tabs/basic-http-provider.tsx diff --git a/apps/remix-ide/src/app.js b/apps/remix-ide/src/app.js index 1b7c7b483a..0fd4ebae2f 100644 --- a/apps/remix-ide/src/app.js +++ b/apps/remix-ide/src/app.js @@ -28,6 +28,7 @@ import { Blockchain } from './blockchain/blockchain.js' import { HardhatProvider } from './app/tabs/hardhat-provider' import { GanacheProvider } from './app/tabs/ganache-provider' import { FoundryProvider } from './app/tabs/foundry-provider' +import { BasicHttpProvider } from './app/tabs/basic-http-provider' const isElectron = require('is-electron') @@ -179,6 +180,7 @@ class AppComponent { const hardhatProvider = new HardhatProvider(blockchain) const ganacheProvider = new GanacheProvider(blockchain) const foundryProvider = new FoundryProvider(blockchain) + const basicHttpProvider = new BasicHttpProvider(blockchain) // ----------------- convert offset to line/column service ----------- const offsetToLineColumnConverter = new OffsetToLineColumnConverter() Registry.getInstance().put({ @@ -236,6 +238,7 @@ class AppComponent { hardhatProvider, ganacheProvider, foundryProvider, + basicHttpProvider, this.walkthroughService, search ]) diff --git a/apps/remix-ide/src/app/tabs/basic-http-provider.tsx b/apps/remix-ide/src/app/tabs/basic-http-provider.tsx new file mode 100644 index 0000000000..5acd2a5200 --- /dev/null +++ b/apps/remix-ide/src/app/tabs/basic-http-provider.tsx @@ -0,0 +1,45 @@ +import * as packageJson from '../../../../../package.json' +import { Plugin } from '@remixproject/engine' +import { AppModal, AlertModal, ModalTypes } from '@remix-ui/app' +import React from 'react' // eslint-disable-line +import { Blockchain } from '../../blockchain/blockchain' +import { ethers } from 'ethers' +import { AbstractProvider } from './abstract-provider' + +const profile = { + name: 'basic-http-provider', + displayName: 'Basic Http Provider', + kind: 'provider', + description: 'Anvil', + methods: ['sendAsync'], + version: packageJson.version +} + +export class BasicHttpProvider extends AbstractProvider { + constructor (blockchain) { + super(profile, blockchain, 'http://127.0.0.1:8545') + } + + body (): JSX.Element { + const thePath = '' + return ( + <> +
+ Note: To use Geth & https://remix.ethereum.org, configure it to allow requests from Remix:(see Geth Docs on rpc server) +
geth --http --http.corsdomain https://remix.ethereum.org
+
+ To run Remix & a local Geth test node, use this command: (see Geth Docs on Dev mode) +
geth --http --http.corsdomain="{window.origin}" --http.api web3,eth,debug,personal,net --vmdebug --datadir {thePath} --dev console
+
+
+ WARNING: It is not safe to use the --http.corsdomain flag with a wildcard: --http.corsdomain * +
+
For more info: Remix Docs on Web3 Provider +
+
+ Web3 Provider Endpoint +
+ + ) + } +} \ No newline at end of file diff --git a/apps/remix-ide/src/app/udapp/run-tab.js b/apps/remix-ide/src/app/udapp/run-tab.js index 8a1e30324e..b1d6d31290 100644 --- a/apps/remix-ide/src/app/udapp/run-tab.js +++ b/apps/remix-ide/src/app/udapp/run-tab.js @@ -155,6 +155,20 @@ export class RunTab extends ViewPlugin { } } }) + + await this.call('blockchain', 'addProvider', { + name: 'Web3 Provider', + provider: { + async sendAsync (payload, callback) { + try { + const result = await udapp.call('basic-http-provider', 'sendAsync', payload) + callback(null, result) + } catch (e) { + callback(e) + } + } + } + }) } writeFile (fileName, content) { diff --git a/apps/remix-ide/src/blockchain/execution-context.js b/apps/remix-ide/src/blockchain/execution-context.js index e570b25056..95b4abe45d 100644 --- a/apps/remix-ide/src/blockchain/execution-context.js +++ b/apps/remix-ide/src/blockchain/execution-context.js @@ -164,9 +164,6 @@ export class ExecutionContext { } } - if (context === 'web3') { - confirmCb(cb) - } if (this.customNetWorks[context]) { var network = this.customNetWorks[context] this.setProviderFromEndpoint(network.provider, { context: network.name }, (error) => { diff --git a/apps/remix-ide/src/remixAppManager.js b/apps/remix-ide/src/remixAppManager.js index bf8c5dccd3..9c00f8ab46 100644 --- a/apps/remix-ide/src/remixAppManager.js +++ b/apps/remix-ide/src/remixAppManager.js @@ -19,7 +19,7 @@ const sensitiveCalls = { } export function isNative(name) { - const nativePlugins = ['vyper', 'workshops', 'debugger', 'remixd', 'menuicons', 'solidity', 'solidity-logic', 'solidityStaticAnalysis', 'solidityUnitTesting', 'layout', 'notification', 'hardhat-provider', 'ganache-provider'] + const nativePlugins = ['vyper', 'workshops', 'debugger', 'remixd', 'menuicons', 'solidity', 'solidity-logic', 'solidityStaticAnalysis', 'solidityUnitTesting', 'layout', 'notification', 'hardhat-provider', 'ganache-provider', 'foundry-provider', 'basic-http-provider'] return nativePlugins.includes(name) || requiredModules.includes(name) } diff --git a/libs/remix-ui/helper/src/lib/helper-components.tsx b/libs/remix-ui/helper/src/lib/helper-components.tsx index 7cf79c9a46..206fbec926 100644 --- a/libs/remix-ui/helper/src/lib/helper-components.tsx +++ b/libs/remix-ui/helper/src/lib/helper-components.tsx @@ -1,5 +1,4 @@ import React from 'react' -import { Web3ProviderDialog } from './components/web3Dialog' export const fileChangedToastMsg = (from: string, path: string) => (
@@ -54,10 +53,6 @@ export const sourceVerificationNotAvailableToastMsg = () => (
) -export const web3Dialog = (externalEndpoint: string, setWeb3Endpoint: (value: string) => void) => ( - -) - export const envChangeNotification = (env: { context: string, fork: string }, from: string) => (
diff --git a/libs/remix-ui/run-tab/src/lib/actions/account.ts b/libs/remix-ui/run-tab/src/lib/actions/account.ts index 9fba9a0723..12b05bec2b 100644 --- a/libs/remix-ui/run-tab/src/lib/actions/account.ts +++ b/libs/remix-ui/run-tab/src/lib/actions/account.ts @@ -1,4 +1,4 @@ -import { shortenAddress, web3Dialog } from "@remix-ui/helper" +import { shortenAddress } from "@remix-ui/helper" import { RunTab } from "../types/run-tab" import { clearInstances, setAccount, setExecEnv } from "./actions" import { displayNotification, displayPopUp, fetchAccountsListFailed, fetchAccountsListRequest, fetchAccountsListSuccess, setExternalEndpoint, setMatchPassphrase, setPassphrase } from "./payload" @@ -74,28 +74,7 @@ const _getProviderDropdownValue = (plugin: RunTab): string => { } export const setExecutionContext = (plugin: RunTab, dispatch: React.Dispatch, executionContext: { context: string, fork: string }) => { - const displayContent = web3Dialog(plugin.REACT_API.externalEndpoint, (endpoint: string) => { - dispatch(setExternalEndpoint(endpoint)) - }) - - plugin.blockchain.changeExecutionContext(executionContext, () => { - plugin.call('notification', 'modal', { - id: 'envNotification', - title: 'External node request', - message: displayContent, - okLabel: 'OK', - cancelLabel: 'Cancel', - okFn: () => { - plugin.blockchain.setProviderFromEndpoint(plugin.REACT_API.externalEndpoint, executionContext, (alertMsg) => { - if (alertMsg) plugin.call('notification', 'toast', alertMsg) - setFinalContext(plugin, dispatch) - }) - }, - cancelFn: () => { - setFinalContext(plugin, dispatch) - } - }) - }, (alertMsg) => { + plugin.blockchain.changeExecutionContext(executionContext, null, (alertMsg) => { plugin.call('notification', 'toast', alertMsg) }, () => { setFinalContext(plugin, dispatch) }) } diff --git a/libs/remix-ui/run-tab/src/lib/components/environment.tsx b/libs/remix-ui/run-tab/src/lib/components/environment.tsx index c63f1ba88f..be6b4a3f94 100644 --- a/libs/remix-ui/run-tab/src/lib/components/environment.tsx +++ b/libs/remix-ui/run-tab/src/lib/components/environment.tsx @@ -8,7 +8,7 @@ export function EnvironmentUI (props: EnvironmentProps) { const fork = provider.fork // can be undefined if connected to an external source (web3 provider / injected) let context = provider.value - context = context.startsWith('vm') ? 'vm' : context // context has to be 'vm', 'web3' or 'injected' + context = context.startsWith('vm') ? 'vm' : context props.setExecutionContext({ context, fork }) } diff --git a/libs/remix-ui/run-tab/src/lib/reducers/runTab.ts b/libs/remix-ui/run-tab/src/lib/reducers/runTab.ts index 010ebf31c5..2a0ff1c855 100644 --- a/libs/remix-ui/run-tab/src/lib/reducers/runTab.ts +++ b/libs/remix-ui/run-tab/src/lib/reducers/runTab.ts @@ -135,12 +135,6 @@ export const runTabInitialState: RunTabState = { title: 'Execution environment has been provided by Metamask or similar provider.', value: 'injected', content: `Injected Provider${(window && window.ethereum && window.ethereum.isMetaMask) ? ' - Metamask' : ''}` - }, { - id: 'web3-mode', - dataId: 'settingsWeb3Mode', - title: `Execution environment connects to an external node. For security, only connect to trusted networks. If Remix is served via https and your node is accessed via http, it might not work. In this case, try cloning the repository and serving it via http.`, - value: 'web3', - content: 'External HTTP Provider' }], isRequesting: false, isSuccessful: false, From d157b914248577bcdbf3006f282f8255113b5650 Mon Sep 17 00:00:00 2001 From: yann300 Date: Tue, 28 Jun 2022 12:50:34 +0200 Subject: [PATCH 3/4] fix test --- apps/remix-ide-e2e/src/tests/ballot.test.ts | 8 ++++---- apps/remix-ide-e2e/src/tests/ballot_0_4_11.test.ts | 6 +++--- apps/remix-ide-e2e/src/tests/debugger.test.ts | 8 ++++---- apps/remix-ide-e2e/src/tests/providers.test.ts | 3 --- apps/remix-ide-e2e/src/tests/terminal.test.ts | 4 ++-- apps/remix-ide-e2e/src/tests/workspace.test.ts | 12 ++++++------ apps/remix-ide/src/app/tabs/basic-http-provider.tsx | 2 +- apps/remix-ide/src/app/udapp/run-tab.js | 2 +- .../remix-app/components/modals/modal-wrapper.tsx | 13 +++++-------- .../app/src/lib/remix-app/context/provider.tsx | 2 +- 10 files changed, 27 insertions(+), 33 deletions(-) diff --git a/apps/remix-ide-e2e/src/tests/ballot.test.ts b/apps/remix-ide-e2e/src/tests/ballot.test.ts index 5244241e89..2f316e09d4 100644 --- a/apps/remix-ide-e2e/src/tests/ballot.test.ts +++ b/apps/remix-ide-e2e/src/tests/ballot.test.ts @@ -83,10 +83,10 @@ module.exports = { browser .openFile('Untitled.sol') .clickLaunchIcon('udapp') - .click('*[data-id="settingsWeb3Mode"]') - .waitForElementPresent('[data-id="envNotification-modal-footer-ok-react"]') + .click('*[data-id="settingsSelectEnvOptions"] *[data-id="Basic Http Provider"]') + .waitForElementPresent('[data-id="basic-http-provider-modal-footer-ok-react"]') .execute(function () { - const modal = document.querySelector('[data-id="envNotification-modal-footer-ok-react"]') as any + const modal = document.querySelector('[data-id="basic-http-provider-modal-footer-ok-react"]') as any modal.click() }) @@ -96,7 +96,7 @@ module.exports = { return env.value }, [], function (result) { - browser.assert.ok(result.value === 'web3', 'Web3 Provider not selected') + browser.assert.ok(result.value === 'Basic Http Provider', 'Web3 Provider not selected') }) .clickLaunchIcon('solidity') .clickLaunchIcon('udapp') diff --git a/apps/remix-ide-e2e/src/tests/ballot_0_4_11.test.ts b/apps/remix-ide-e2e/src/tests/ballot_0_4_11.test.ts index 28b03219fc..c82efff738 100644 --- a/apps/remix-ide-e2e/src/tests/ballot_0_4_11.test.ts +++ b/apps/remix-ide-e2e/src/tests/ballot_0_4_11.test.ts @@ -78,10 +78,10 @@ module.exports = { browser .openFile('Untitled.sol') .clickLaunchIcon('udapp') - .click('*[data-id="settingsWeb3Mode"]') - .waitForElementPresent('[data-id="envNotification-modal-footer-ok-react"]') + .click('*[data-id="settingsSelectEnvOptions"] *[data-id="Basic Http Provider"]') + .waitForElementPresent('[data-id="basic-http-provider-modal-footer-ok-react"]') .execute(function () { - const modal = document.querySelector('[data-id="envNotification-modal-footer-ok-react"]') as any + const modal = document.querySelector('[data-id="basic-http-provider-modal-footer-ok-react"]') as any modal.click() }) diff --git a/apps/remix-ide-e2e/src/tests/debugger.test.ts b/apps/remix-ide-e2e/src/tests/debugger.test.ts index d46c1020ce..fe424b5e61 100644 --- a/apps/remix-ide-e2e/src/tests/debugger.test.ts +++ b/apps/remix-ide-e2e/src/tests/debugger.test.ts @@ -214,10 +214,10 @@ module.exports = { .setSolidityCompilerVersion('soljson-v0.8.7+commit.e28d00a7.js') .addFile('useDebugNodes.sol', sources[5]['useDebugNodes.sol']) // compile contract .clickLaunchIcon('udapp') - .click('*[data-id="settingsWeb3Mode"]') // select web3 provider with debug nodes URL - .clearValue('*[data-id="modalDialogCustomPromptText"]') - .setValue('*[data-id="modalDialogCustomPromptText"]', 'https://remix-rinkeby.ethdevops.io') - .modalFooterOKClick() + .click('*[data-id="settingsSelectEnvOptions"] *[data-id="Basic Http Provider"]') // select web3 provider with debug nodes URL + .clearValue('*[data-id="modalDialogCustomPromp"]') + .setValue('*[data-id="modalDialogCustomPromp"]', 'https://remix-rinkeby.ethdevops.io') + .modalFooterOKClick('basic-http-provider') .waitForElementPresent('*[title="Deploy - transact (not payable)"]', 65000) // wait for the compilation to succeed .clickLaunchIcon('debugger') .clearValue('*[data-id="debuggerTransactionInput"]') diff --git a/apps/remix-ide-e2e/src/tests/providers.test.ts b/apps/remix-ide-e2e/src/tests/providers.test.ts index b2c883fd53..fe6dcde8bf 100644 --- a/apps/remix-ide-e2e/src/tests/providers.test.ts +++ b/apps/remix-ide-e2e/src/tests/providers.test.ts @@ -44,9 +44,6 @@ module.exports = { .waitForElementContainsText('*[data-id="foundry-providerModalDialogModalBody-react"]', 'Error while connecting to the provider') .modalFooterOKClick('foundry-provider') .waitForElementNotVisible('*[data-id="foundry-providerModalDialogModalBody-react"]') - .waitForElementVisible('*[data-id="PermissionHandler-modal-footer-ok-react"]') - .click('*[data-id="PermissionHandler-modal-footer-ok-react"]') - .waitForElementNotVisible('*[data-id="PermissionHandler-modal-footer-ok-react"]') .pause(1000) }, diff --git a/apps/remix-ide-e2e/src/tests/terminal.test.ts b/apps/remix-ide-e2e/src/tests/terminal.test.ts index a4b9421b56..7abbbccf05 100644 --- a/apps/remix-ide-e2e/src/tests/terminal.test.ts +++ b/apps/remix-ide-e2e/src/tests/terminal.test.ts @@ -50,8 +50,8 @@ module.exports = { browser .click('*[data-id="terminalClearConsole"]') // clear the terminal .clickLaunchIcon('udapp') - .click('*[data-id="settingsWeb3Mode"]') - .modalFooterOKClick('envNotification') + .click('*[data-id="settingsSelectEnvOptions"] *[data-id="Basic Http Provider"]') + .modalFooterOKClick('basic-http-provider') .executeScript('web3.eth.getAccounts()') .waitForElementContainsText('*[data-id="terminalJournal"]', '["', 60000) // we check if an array is present, don't need to check for the content .waitForElementContainsText('*[data-id="terminalJournal"]', '"]', 60000) diff --git a/apps/remix-ide-e2e/src/tests/workspace.test.ts b/apps/remix-ide-e2e/src/tests/workspace.test.ts index 7e7cfbd55e..95819b7598 100644 --- a/apps/remix-ide-e2e/src/tests/workspace.test.ts +++ b/apps/remix-ide-e2e/src/tests/workspace.test.ts @@ -38,7 +38,7 @@ module.exports = { .clickLaunchIcon('filePanel') .click('*[data-id="workspaceCreate"]') .waitForElementVisible('*[data-id="modalDialogCustomPromptTextCreate"]') - .waitForElementVisible('[data-id="fileSystemModalDialogModalFooter-react"] > span') + .waitForElementVisible('[data-id="fileSystemModalDialogModalFooter-react"] > button') // eslint-disable-next-line dot-notation .execute(function () { document.querySelector('*[data-id="modalDialogCustomPromptTextCreate"]')['value'] = 'workspace_remix_default' }) .waitForElementPresent('[data-id="fileSystemModalDialogModalFooter-react"] .modal-ok') @@ -94,7 +94,7 @@ module.exports = { browser .click('*[data-id="workspaceCreate"]') .waitForElementVisible('*[data-id="modalDialogCustomPromptTextCreate"]') - .waitForElementVisible('[data-id="fileSystemModalDialogModalFooter-react"] > span') + .waitForElementVisible('[data-id="fileSystemModalDialogModalFooter-react"] > button') // eslint-disable-next-line dot-notation .execute(function () { document.querySelector('*[data-id="modalDialogCustomPromptTextCreate"]')['value'] = 'workspace_blank' }) .click('select[id="wstemplate"]') @@ -115,7 +115,7 @@ module.exports = { browser .click('*[data-id="workspaceCreate"]') .waitForElementVisible('*[data-id="modalDialogCustomPromptTextCreate"]') - .waitForElementVisible('[data-id="fileSystemModalDialogModalFooter-react"] > span') + .waitForElementVisible('[data-id="fileSystemModalDialogModalFooter-react"] > button') // eslint-disable-next-line dot-notation .execute(function () { document.querySelector('*[data-id="modalDialogCustomPromptTextCreate"]')['value'] = 'workspace_erc20' }) .click('select[id="wstemplate"]') @@ -163,7 +163,7 @@ module.exports = { browser .click('*[data-id="workspaceCreate"]') .waitForElementVisible('*[data-id="modalDialogCustomPromptTextCreate"]') - .waitForElementVisible('[data-id="fileSystemModalDialogModalFooter-react"] > span') + .waitForElementVisible('[data-id="fileSystemModalDialogModalFooter-react"] > button') // eslint-disable-next-line dot-notation .execute(function () { document.querySelector('*[data-id="modalDialogCustomPromptTextCreate"]')['value'] = 'workspace_erc721' }) .click('select[id="wstemplate"]') @@ -213,7 +213,7 @@ module.exports = { browser .click('*[data-id="workspaceCreate"]') // create workspace_name .waitForElementVisible('*[data-id="modalDialogCustomPromptTextCreate"]') - .waitForElementVisible('[data-id="fileSystemModalDialogModalFooter-react"] > span') + .waitForElementVisible('[data-id="fileSystemModalDialogModalFooter-react"] > button') .click('*[data-id="modalDialogCustomPromptTextCreate"]') .clearValue('*[data-id="modalDialogCustomPromptTextCreate"]') .setValue('*[data-id="modalDialogCustomPromptTextCreate"]', 'workspace_name') @@ -225,7 +225,7 @@ module.exports = { .waitForElementVisible('*[data-id="treeViewLitreeViewItemtest.sol"]') .click('*[data-id="workspaceCreate"]') // create workspace_name_1 .waitForElementVisible('*[data-id="modalDialogCustomPromptTextCreate"]') - .waitForElementVisible('[data-id="fileSystemModalDialogModalFooter-react"] > span') + .waitForElementVisible('[data-id="fileSystemModalDialogModalFooter-react"] > button') .click('*[data-id="modalDialogCustomPromptTextCreate"]') .clearValue('*[data-id="modalDialogCustomPromptTextCreate"]') .setValue('*[data-id="modalDialogCustomPromptTextCreate"]', 'workspace_name_1') diff --git a/apps/remix-ide/src/app/tabs/basic-http-provider.tsx b/apps/remix-ide/src/app/tabs/basic-http-provider.tsx index 5acd2a5200..30a0f1f310 100644 --- a/apps/remix-ide/src/app/tabs/basic-http-provider.tsx +++ b/apps/remix-ide/src/app/tabs/basic-http-provider.tsx @@ -10,7 +10,7 @@ const profile = { name: 'basic-http-provider', displayName: 'Basic Http Provider', kind: 'provider', - description: 'Anvil', + description: '', methods: ['sendAsync'], version: packageJson.version } diff --git a/apps/remix-ide/src/app/udapp/run-tab.js b/apps/remix-ide/src/app/udapp/run-tab.js index b1d6d31290..af0ecf6563 100644 --- a/apps/remix-ide/src/app/udapp/run-tab.js +++ b/apps/remix-ide/src/app/udapp/run-tab.js @@ -157,7 +157,7 @@ export class RunTab extends ViewPlugin { }) await this.call('blockchain', 'addProvider', { - name: 'Web3 Provider', + name: 'Basic Http Provider', provider: { async sendAsync (payload, callback) { try { diff --git a/libs/remix-ui/app/src/lib/remix-app/components/modals/modal-wrapper.tsx b/libs/remix-ui/app/src/lib/remix-app/components/modals/modal-wrapper.tsx index 9ee12e871a..17c6f604d6 100644 --- a/libs/remix-ui/app/src/lib/remix-app/components/modals/modal-wrapper.tsx +++ b/libs/remix-ui/app/src/lib/remix-app/components/modals/modal-wrapper.tsx @@ -32,10 +32,8 @@ const ModalWrapper = (props: ModalWrapperProps) => { const onInputChanged = (event) => { if (props.validationFn) { const validation = props.validationFn(event.target.value) - setState({ - ...props, - message: createModalMessage(props.defaultValue, validation), - validation + setState(prevState => { + return { ...prevState, message: createModalMessage(props.defaultValue, validation), validation } }) } } @@ -66,7 +64,7 @@ const ModalWrapper = (props: ModalWrapperProps) => { default: setState({ ...props, - okFn: (onOkFn), + okFn: onOkFn, cancelFn: onCancelFn }) break @@ -82,9 +80,8 @@ const ModalWrapper = (props: ModalWrapperProps) => { // reset the message and input if any, so when the modal is shown again it doesn't show the previous value. const handleHide = () => { - setState({ - ...props, - message: '' + setState(prevState => { + return { ...prevState, message: '' } }) props.handleHide() } diff --git a/libs/remix-ui/app/src/lib/remix-app/context/provider.tsx b/libs/remix-ui/app/src/lib/remix-app/context/provider.tsx index 48f810bea2..701375265d 100644 --- a/libs/remix-ui/app/src/lib/remix-app/context/provider.tsx +++ b/libs/remix-ui/app/src/lib/remix-app/context/provider.tsx @@ -32,7 +32,7 @@ export const ModalProvider = ({ children = [], reducer = modalReducer, initialSt const handleHideModal = () => { dispatch({ type: modalActionTypes.handleHideModal, - payload: null, + payload: null }) } From ab2e4cff108a59d868809b5c5ac4834e7d7ec9e9 Mon Sep 17 00:00:00 2001 From: yann300 Date: Tue, 5 Jul 2022 13:59:41 +0200 Subject: [PATCH 4/4] rename basic provider to external provider --- apps/remix-ide-e2e/src/tests/ballot.test.ts | 4 ++-- apps/remix-ide-e2e/src/tests/ballot_0_4_11.test.ts | 2 +- apps/remix-ide-e2e/src/tests/debugger.test.ts | 2 +- apps/remix-ide-e2e/src/tests/terminal.test.ts | 2 +- apps/remix-ide/src/app.js | 6 +++--- ...ic-http-provider.tsx => external-http-provider.tsx} | 10 +++------- apps/remix-ide/src/app/udapp/run-tab.js | 2 +- 7 files changed, 12 insertions(+), 16 deletions(-) rename apps/remix-ide/src/app/tabs/{basic-http-provider.tsx => external-http-provider.tsx} (83%) diff --git a/apps/remix-ide-e2e/src/tests/ballot.test.ts b/apps/remix-ide-e2e/src/tests/ballot.test.ts index 2f316e09d4..9d2e9c5b07 100644 --- a/apps/remix-ide-e2e/src/tests/ballot.test.ts +++ b/apps/remix-ide-e2e/src/tests/ballot.test.ts @@ -83,7 +83,7 @@ module.exports = { browser .openFile('Untitled.sol') .clickLaunchIcon('udapp') - .click('*[data-id="settingsSelectEnvOptions"] *[data-id="Basic Http Provider"]') + .click('*[data-id="settingsSelectEnvOptions"] *[data-id="External Http Provider"]') .waitForElementPresent('[data-id="basic-http-provider-modal-footer-ok-react"]') .execute(function () { const modal = document.querySelector('[data-id="basic-http-provider-modal-footer-ok-react"]') as any @@ -96,7 +96,7 @@ module.exports = { return env.value }, [], function (result) { - browser.assert.ok(result.value === 'Basic Http Provider', 'Web3 Provider not selected') + browser.assert.ok(result.value === 'External Http Provider', 'Web3 Provider not selected') }) .clickLaunchIcon('solidity') .clickLaunchIcon('udapp') diff --git a/apps/remix-ide-e2e/src/tests/ballot_0_4_11.test.ts b/apps/remix-ide-e2e/src/tests/ballot_0_4_11.test.ts index c82efff738..95696e3882 100644 --- a/apps/remix-ide-e2e/src/tests/ballot_0_4_11.test.ts +++ b/apps/remix-ide-e2e/src/tests/ballot_0_4_11.test.ts @@ -78,7 +78,7 @@ module.exports = { browser .openFile('Untitled.sol') .clickLaunchIcon('udapp') - .click('*[data-id="settingsSelectEnvOptions"] *[data-id="Basic Http Provider"]') + .click('*[data-id="settingsSelectEnvOptions"] *[data-id="External Http Provider"]') .waitForElementPresent('[data-id="basic-http-provider-modal-footer-ok-react"]') .execute(function () { const modal = document.querySelector('[data-id="basic-http-provider-modal-footer-ok-react"]') as any diff --git a/apps/remix-ide-e2e/src/tests/debugger.test.ts b/apps/remix-ide-e2e/src/tests/debugger.test.ts index fe424b5e61..9b8da7e7df 100644 --- a/apps/remix-ide-e2e/src/tests/debugger.test.ts +++ b/apps/remix-ide-e2e/src/tests/debugger.test.ts @@ -214,7 +214,7 @@ module.exports = { .setSolidityCompilerVersion('soljson-v0.8.7+commit.e28d00a7.js') .addFile('useDebugNodes.sol', sources[5]['useDebugNodes.sol']) // compile contract .clickLaunchIcon('udapp') - .click('*[data-id="settingsSelectEnvOptions"] *[data-id="Basic Http Provider"]') // select web3 provider with debug nodes URL + .click('*[data-id="settingsSelectEnvOptions"] *[data-id="External Http Provider"]') // select web3 provider with debug nodes URL .clearValue('*[data-id="modalDialogCustomPromp"]') .setValue('*[data-id="modalDialogCustomPromp"]', 'https://remix-rinkeby.ethdevops.io') .modalFooterOKClick('basic-http-provider') diff --git a/apps/remix-ide-e2e/src/tests/terminal.test.ts b/apps/remix-ide-e2e/src/tests/terminal.test.ts index 7abbbccf05..59af766031 100644 --- a/apps/remix-ide-e2e/src/tests/terminal.test.ts +++ b/apps/remix-ide-e2e/src/tests/terminal.test.ts @@ -50,7 +50,7 @@ module.exports = { browser .click('*[data-id="terminalClearConsole"]') // clear the terminal .clickLaunchIcon('udapp') - .click('*[data-id="settingsSelectEnvOptions"] *[data-id="Basic Http Provider"]') + .click('*[data-id="settingsSelectEnvOptions"] *[data-id="External Http Provider"]') .modalFooterOKClick('basic-http-provider') .executeScript('web3.eth.getAccounts()') .waitForElementContainsText('*[data-id="terminalJournal"]', '["', 60000) // we check if an array is present, don't need to check for the content diff --git a/apps/remix-ide/src/app.js b/apps/remix-ide/src/app.js index 0fd4ebae2f..464356b902 100644 --- a/apps/remix-ide/src/app.js +++ b/apps/remix-ide/src/app.js @@ -28,7 +28,7 @@ import { Blockchain } from './blockchain/blockchain.js' import { HardhatProvider } from './app/tabs/hardhat-provider' import { GanacheProvider } from './app/tabs/ganache-provider' import { FoundryProvider } from './app/tabs/foundry-provider' -import { BasicHttpProvider } from './app/tabs/basic-http-provider' +import { ExternalHttpProvider } from './app/tabs/external-http-provider' const isElectron = require('is-electron') @@ -180,7 +180,7 @@ class AppComponent { const hardhatProvider = new HardhatProvider(blockchain) const ganacheProvider = new GanacheProvider(blockchain) const foundryProvider = new FoundryProvider(blockchain) - const basicHttpProvider = new BasicHttpProvider(blockchain) + const externalHttpProvider = new ExternalHttpProvider(blockchain) // ----------------- convert offset to line/column service ----------- const offsetToLineColumnConverter = new OffsetToLineColumnConverter() Registry.getInstance().put({ @@ -238,7 +238,7 @@ class AppComponent { hardhatProvider, ganacheProvider, foundryProvider, - basicHttpProvider, + externalHttpProvider, this.walkthroughService, search ]) diff --git a/apps/remix-ide/src/app/tabs/basic-http-provider.tsx b/apps/remix-ide/src/app/tabs/external-http-provider.tsx similarity index 83% rename from apps/remix-ide/src/app/tabs/basic-http-provider.tsx rename to apps/remix-ide/src/app/tabs/external-http-provider.tsx index 30a0f1f310..5a22b48ba4 100644 --- a/apps/remix-ide/src/app/tabs/basic-http-provider.tsx +++ b/apps/remix-ide/src/app/tabs/external-http-provider.tsx @@ -1,21 +1,17 @@ import * as packageJson from '../../../../../package.json' -import { Plugin } from '@remixproject/engine' -import { AppModal, AlertModal, ModalTypes } from '@remix-ui/app' import React from 'react' // eslint-disable-line -import { Blockchain } from '../../blockchain/blockchain' -import { ethers } from 'ethers' import { AbstractProvider } from './abstract-provider' const profile = { name: 'basic-http-provider', - displayName: 'Basic Http Provider', + displayName: 'External Http Provider', kind: 'provider', description: '', methods: ['sendAsync'], version: packageJson.version } -export class BasicHttpProvider extends AbstractProvider { +export class ExternalHttpProvider extends AbstractProvider { constructor (blockchain) { super(profile, blockchain, 'http://127.0.0.1:8545') } @@ -37,7 +33,7 @@ export class BasicHttpProvider extends AbstractProvider {
For more info: Remix Docs on Web3 Provider

- Web3 Provider Endpoint + External HTTP Provider Endpoint
) diff --git a/apps/remix-ide/src/app/udapp/run-tab.js b/apps/remix-ide/src/app/udapp/run-tab.js index af0ecf6563..cf71ad3780 100644 --- a/apps/remix-ide/src/app/udapp/run-tab.js +++ b/apps/remix-ide/src/app/udapp/run-tab.js @@ -157,7 +157,7 @@ export class RunTab extends ViewPlugin { }) await this.call('blockchain', 'addProvider', { - name: 'Basic Http Provider', + name: 'External Http Provider', provider: { async sendAsync (payload, callback) { try {