diff --git a/apps/remix-ide/src/app/ui/tooltip.js b/apps/remix-ide/src/app/ui/tooltip.js index 63ab6283d5..700a08ef56 100644 --- a/apps/remix-ide/src/app/ui/tooltip.js +++ b/apps/remix-ide/src/app/ui/tooltip.js @@ -24,15 +24,6 @@ class Toaster { animation(this.tooltip, css.animateTop.className) } - /** - * Force resolve the promise to close - * the toaster ignoring timeout - */ - forceResolve () { - if (this.id) clearTimeout(this.id) - if (this.resolveFn) this.resolveFn() - } - render (tooltipText, actionElement, opts) { opts = defaultOptions(opts) let canShorten = true diff --git a/libs/remix-ui/debugger-ui/src/lib/debugger-ui.tsx b/libs/remix-ui/debugger-ui/src/lib/debugger-ui.tsx index f28ce848fb..72e79383db 100644 --- a/libs/remix-ui/debugger-ui/src/lib/debugger-ui.tsx +++ b/libs/remix-ui/debugger-ui/src/lib/debugger-ui.tsx @@ -4,7 +4,8 @@ import StepManager from './step-manager/step-manager' import VmDebugger from './vm-debugger/vm-debugger' import VmDebuggerHead from './vm-debugger/vm-debugger-head' import { TransactionDebugger as Debugger } from '@remix-project/remix-debug' -import { DebuggerAPI, DebuggerUIProps } from './DebuggerAPI' +import { DebuggerUIProps } from './DebuggerAPI' +import { Toaster } from '@remix-ui/toaster' /* eslint-disable-next-line */ import './debugger-ui.css' @@ -23,7 +24,8 @@ export const DebuggerUI = (props: DebuggerUIProps) => { debugging: false, opt: { debugWithGeneratedSources: false - } + }, + toastMessage: '' }) useEffect(() => { @@ -141,7 +143,6 @@ export const DebuggerUI = (props: DebuggerUIProps) => { } }) } - const startDebugging = async (blockNumber, txNumber, tx) => { if (state.debugger) unLoad() if (!txNumber) return @@ -169,14 +170,20 @@ export const DebuggerUI = (props: DebuggerUIProps) => { txNumber, debugging: true, currentReceipt, - debugger: debuggerInstance + debugger: debuggerInstance, + toastMessage: `debugging ${txNumber}` } }) }).catch((error) => { - // toaster(error, null, null) + setState(prevState => { + return { + ...prevState, + toastMessage: JSON.stringify(error) + } + }) unLoad() }) -} + } const debug = (txHash) => { startDebugging(null, txHash, null) @@ -205,9 +212,9 @@ const vmDebugger = { registerEvent: state.debugger && state.debugger.vmDebuggerLogic ? state.debugger.vmDebuggerLogic.event.register.bind(state.debugger.vmDebuggerLogic.event) : null, triggerEvent: state.debugger && state.debugger.vmDebuggerLogic ? state.debugger.vmDebuggerLogic.event.trigger.bind(state.debugger.vmDebuggerLogic.event) : null } - - return ( + return (
+

Debugger Configuration

diff --git a/libs/remix-ui/toaster/.babelrc b/libs/remix-ui/toaster/.babelrc new file mode 100644 index 0000000000..09d67939cc --- /dev/null +++ b/libs/remix-ui/toaster/.babelrc @@ -0,0 +1,4 @@ +{ + "presets": ["@nrwl/react/babel"], + "plugins": [] +} diff --git a/libs/remix-ui/toaster/.eslintrc b/libs/remix-ui/toaster/.eslintrc new file mode 100644 index 0000000000..b8666066e9 --- /dev/null +++ b/libs/remix-ui/toaster/.eslintrc @@ -0,0 +1,18 @@ +{ + "env": { + "browser": true, + "es6": true + }, + "extends": "../../../.eslintrc", + "globals": { + "Atomics": "readonly", + "SharedArrayBuffer": "readonly" + }, + "parserOptions": { + "ecmaVersion": 11, + "sourceType": "module" + }, + "rules": { + "standard/no-callback-literal": "off" + } +} diff --git a/libs/remix-ui/toaster/README.md b/libs/remix-ui/toaster/README.md new file mode 100644 index 0000000000..7686d07019 --- /dev/null +++ b/libs/remix-ui/toaster/README.md @@ -0,0 +1,7 @@ +# remix-ui-toaster + +This library was generated with [Nx](https://nx.dev). + +## Running unit tests + +Run `nx test remix-ui-toaster` to execute the unit tests via [Jest](https://jestjs.io). diff --git a/libs/remix-ui/toaster/src/index.ts b/libs/remix-ui/toaster/src/index.ts new file mode 100644 index 0000000000..1db646761e --- /dev/null +++ b/libs/remix-ui/toaster/src/index.ts @@ -0,0 +1 @@ +export * from './lib/toaster' diff --git a/libs/remix-ui/toaster/src/lib/toaster.css b/libs/remix-ui/toaster/src/lib/toaster.css new file mode 100644 index 0000000000..c026edbf49 --- /dev/null +++ b/libs/remix-ui/toaster/src/lib/toaster.css @@ -0,0 +1,43 @@ +.remixui_tooltip { + z-index: 1001; + display: flex; + justify-content: space-between; + align-items: center; + position: fixed; + min-height: 50px; + padding: 16px 24px 12px; + border-radius: 3px; + left: 40%; + font-size: 14px; + text-align: center; + bottom: -0px; + flex-direction: row; +} +@-webkit-keyframes remixui_animatebottom { + 0% {bottom: -300px} + 100% {bottom: 0px} +} +@keyframes remixui_animatebottom { + 0% {bottom: -300px} + 100% {bottom: 0px} +} +@-webkit-keyframes remixui_animatetop { + 0% {bottom: 0px} + 100% {bottom: -300px} +} +@keyframes remixui_animatetop { + 0% {bottom: 0px} + 100% {bottom: -300px} +} +.remixui_animateTop { + -webkit-animation-name: remixui_animatetop; + -webkit-animation-duration: 2s; + animation-name: remixui_animatetop; + animation-duration: 2s; +} +.remixui_animateBottom { + -webkit-animation-name: remixui_animatebottom; + -webkit-animation-duration: 2s; + animation-name: remixui_animatebottom; + animation-duration: 2s; +} diff --git a/libs/remix-ui/toaster/src/lib/toaster.tsx b/libs/remix-ui/toaster/src/lib/toaster.tsx new file mode 100644 index 0000000000..6d3039dbc4 --- /dev/null +++ b/libs/remix-ui/toaster/src/lib/toaster.tsx @@ -0,0 +1,108 @@ +import React, { useEffect, useState } from 'react' // eslint-disable-line +import { ModalDialog } from '@remix-ui/modal-dialog' // eslint-disable-line + +import './toaster.css' + +/* eslint-disable-next-line */ +export interface ToasterProps { + message: string + timeOut?: number +} + +export const Toaster = (props: ToasterProps) => { + const [state, setState] = useState({ + message: '', + hide: true, + hiding: false, + timeOutId: null, + timeOut: props.timeOut || 7000, + showModal: false + }) + + useEffect(() => { + if (props.message) { + const timeOutId = setTimeout(() => { + setState(prevState => { + return { ...prevState, hiding: true } + }) + }, state.timeOut) + + setState(prevState => { + const shortTooltipText = props.message.length > 201 ? props.message.substring(0, 200) + '...' : props.message + + return { ...prevState, hide: false, hiding: false, timeOutId, message: shortTooltipText } + }) + } + }, [props.message]) + + useEffect(() => { + if (state.hiding) { + setTimeout(() => { + closeTheToaster() + }, 1800) + } + }, [state.hiding]) + + const showFullMessage = () => { + setState(prevState => { + return { ...prevState, showModal: true } + }) + } + + const hideFullMessage = () => { //eslint-disable-line + setState(prevState => { + return { ...prevState, showModal: false } + }) + } + + const closeTheToaster = () => { + if (state.timeOutId) { + clearTimeout(state.timeOutId) + } + setState(prevState => { + return { ...prevState, message: '', hide: true, hiding: false, timeOutId: null, showModal: false } + }) + } + + const handleMouseEnter = () => { + if (state.timeOutId) { + clearTimeout(state.timeOutId) + } + setState(prevState => { + return { ...prevState, timeOutId: null } + }) + } + + const handleMouseLeave = () => { + if (!state.timeOutId) { + const timeOutId = setTimeout(() => { + setState(prevState => { + return { ...prevState, hiding: true } + }) + }, state.timeOut) + + setState(prevState => { + return { ...prevState, timeOutId } + }) + } + } + + return ( + <> + {/* */} + { !state.hide && +
+ + { state.message } + { (props.message.length > 201) && } + + + + +
+ } + + ) +} + +export default Toaster diff --git a/libs/remix-ui/toaster/tsconfig.json b/libs/remix-ui/toaster/tsconfig.json new file mode 100644 index 0000000000..6b65264565 --- /dev/null +++ b/libs/remix-ui/toaster/tsconfig.json @@ -0,0 +1,16 @@ +{ + "extends": "../../../tsconfig.json", + "compilerOptions": { + "jsx": "react", + "allowJs": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + } + ] +} diff --git a/libs/remix-ui/toaster/tsconfig.lib.json b/libs/remix-ui/toaster/tsconfig.lib.json new file mode 100644 index 0000000000..b560bc4dec --- /dev/null +++ b/libs/remix-ui/toaster/tsconfig.lib.json @@ -0,0 +1,13 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../dist/out-tsc", + "types": ["node"] + }, + "files": [ + "../../../node_modules/@nrwl/react/typings/cssmodule.d.ts", + "../../../node_modules/@nrwl/react/typings/image.d.ts" + ], + "exclude": ["**/*.spec.ts", "**/*.spec.tsx"], + "include": ["**/*.js", "**/*.jsx", "**/*.ts", "**/*.tsx"] +} diff --git a/nx.json b/nx.json index 4d67dd8f78..91c901d448 100644 --- a/nx.json +++ b/nx.json @@ -81,6 +81,9 @@ }, "remix-ui-modal-dialog": { "tags": [] + }, + "remix-ui-toaster": { + "tags": [] } } } diff --git a/package.json b/package.json index fcb6d4c0fa..6f027da5d7 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "workspace-schematic": "nx workspace-schematic", "dep-graph": "nx dep-graph", "help": "nx help", - "lint:libs": "nx run-many --target=lint --projects=remixd,remix-ui-modal-dialog", + "lint:libs": "nx run-many --target=lint --projects=remixd,remix-ui-modal-dialog,remix-ui-toaster", "build:libs": "nx run-many --target=build --parallel=false --with-deps=true --projects=remix-analyzer,remix-astwalker,remix-debug,remix-lib,remix-simulator,remix-solidity,remix-tests,remix-url-resolver,remixd", "test:libs": "nx run-many --target=test --projects=remix-analyzer,remix-astwalker,remix-debug,remix-lib,remix-simulator,remix-solidity,remix-tests,remix-url-resolver,remixd", "publish:libs": "npm run build:libs & lerna publish --skip-git & npm run bumpVersion:libs", diff --git a/tsconfig.json b/tsconfig.json index 1aa5cd38a0..07d617152b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -32,7 +32,8 @@ "@remix-ui/utils": ["libs/remix-ui/utils/src/index.ts"], "@remix-ui/clipboard": ["libs/remix-ui/clipboard/src/index.ts"], "@remix-project/remix-solidity-ts": ["libs/remix-solidity/src/index.ts"], - "@remix-ui/modal-dialog": ["libs/remix-ui/modal-dialog/src/index.ts"] + "@remix-ui/modal-dialog": ["libs/remix-ui/modal-dialog/src/index.ts"], + "@remix-ui/toaster": ["libs/remix-ui/toaster/src/index.ts"] } }, "exclude": ["node_modules", "tmp"] diff --git a/workspace.json b/workspace.json index 98681978c6..6f6935c308 100644 --- a/workspace.json +++ b/workspace.json @@ -601,6 +601,22 @@ } } } + }, + "remix-ui-toaster": { + "root": "libs/remix-ui/toaster", + "sourceRoot": "libs/remix-ui/toaster/src", + "projectType": "library", + "schematics": {}, + "architect": { + "lint": { + "builder": "@nrwl/linter:lint", + "options": { + "linter": "eslint", + "tsConfig": ["libs/remix-ui/toaster/tsconfig.lib.json"], + "exclude": ["**/node_modules/**", "!libs/remix-ui/toaster/**/*"] + } + } + } } }, "cli": {