// eslint-disable-next-line no-use-before-define import React, { Fragment, useEffect, useReducer, useState } from 'react' import { ModalDialog } from '@remix-ui/modal-dialog' // eslint-disable-next-line no-unused-vars import { Toaster } from '@remix-ui/toaster' import { ContractDropdownUI } from './components/contractDropdownUI' import { InstanceContainerUI } from './components/instanceContainerUI' import { RecorderUI } from './components/recorderCardUI' import { SettingsUI } from './components/settingsUI' import { Modal, RunTabProps } from './types' import { runTabInitialState, runTabReducer } from './reducers/runTab' import { initRunTab, setAccount, setUnit, setGasFee, setExecutionContext, setWeb3Endpoint, clearPopUp, createNewBlockchainAccount, setPassphrasePrompt, setMatchPassphrasePrompt } from './actions' import './css/run-tab.css' export function RunTabUI (props: RunTabProps) { const { plugin } = props const [focusModal, setFocusModal] = useState({ hide: true, title: '', message: '', okLabel: '', okFn: () => {}, cancelLabel: '', cancelFn: () => {} }) const [modals, setModals] = useState([]) const [focusToaster, setFocusToaster] = useState('') const [toasters, setToasters] = useState([]) const [runTab, dispatch] = useReducer(runTabReducer, runTabInitialState) const REACT_API = { runTab } useEffect(() => { initRunTab(plugin)(dispatch) }, [plugin]) useEffect(() => { plugin.onReady(runTab) }, [REACT_API]) useEffect(() => { if (modals.length > 0) { setFocusModal(() => { const focusModal = { hide: false, title: modals[0].title, message: modals[0].message, okLabel: modals[0].okLabel, okFn: modals[0].okFn, cancelLabel: modals[0].cancelLabel, cancelFn: modals[0].cancelFn } return focusModal }) const modalList = modals.slice() modalList.shift() setModals(modalList) } }, [modals]) useEffect(() => { if (runTab.notification.title) { modal(runTab.notification.title, runTab.notification.message, runTab.notification.labelOk, runTab.notification.actionOk, runTab.notification.labelCancel, runTab.notification.actionCancel) } }, [runTab.notification]) useEffect(() => { if (toasters.length > 0) { setFocusToaster(() => { return toasters[0] }) const toasterList = toasters.slice() toasterList.shift() setToasters(toasterList) } }, [toasters]) useEffect(() => { if (runTab.popup) { toast(runTab.popup) } }, [runTab.popup]) // eslint-disable-next-line no-undef const modal = (title: string, message: string | JSX.Element, okLabel: string, okFn: () => void, cancelLabel?: string, cancelFn?: () => void) => { setModals(modals => { modals.push({ message, title, okLabel, okFn, cancelLabel, cancelFn }) return [...modals] }) } const handleHideModal = () => { setFocusModal(modal => { return { ...modal, hide: true, message: null } }) } const handleToaster = () => { setFocusToaster('') clearPopUp() } const toast = (toasterMsg: string) => { setToasters(messages => { messages.push(toasterMsg) return [...messages] }) } return (
) }