diff --git a/packages/neuron-ui/src/containers/Main/hooks.ts b/packages/neuron-ui/src/containers/Main/hooks.ts index 31ca663dfa..418bc3fa1d 100644 --- a/packages/neuron-ui/src/containers/Main/hooks.ts +++ b/packages/neuron-ui/src/containers/Main/hooks.ts @@ -10,13 +10,7 @@ import { showGlobalAlertDialog, } from 'states/stateProvider/actionCreators' -import { - getCurrentWallet, - getIsNodeRunExternal, - getWinID, - setCurrentNetwork, - startNodeIgnoreExternal, -} from 'services/remote' +import { getCurrentWallet, getWinID, setCurrentNetwork, startNodeIgnoreExternal } from 'services/remote' import { DataUpdate as DataUpdateSubject, NetworkList as NetworkListSubject, @@ -111,6 +105,7 @@ export const useSubscription = ({ navigate, dispatch, location, + showSwitchNetwork, }: { walletID: string chain: State.Chain @@ -118,6 +113,7 @@ export const useSubscription = ({ navigate: NavigateFunction location: ReturnType dispatch: StateDispatch + showSwitchNetwork: () => void }) => { const { pageNo, pageSize, keywords } = chain.transactions @@ -209,6 +205,9 @@ export const useSubscription = ({ type: NeuronWalletActions.UpdateConnectionStatus, payload: getConnectionStatus({ ...status, isTimeout: Date.now() > CONNECTING_DEADLINE }), }) + if (status.connected && status.isBundledNode && !status.startedBundledNode) { + showSwitchNetwork() + } } }) @@ -314,49 +313,32 @@ export const useSubscription = ({ commandSubscription.unsubscribe() showGlobalDialogSubject.unsubscribe() } - }, [walletID, pageNo, pageSize, keywords, isAllowedToFetchList, navigate, dispatch, location.pathname]) + }, [ + walletID, + pageNo, + pageSize, + keywords, + isAllowedToFetchList, + navigate, + dispatch, + location.pathname, + showSwitchNetwork, + ]) } -export const useCheckNode = (networks: State.Network[], network?: State.Network) => { - const [showSwitchNetwork, setShowSwitchNetwork] = useState(false) +export const useCheckNode = (networks: State.Network[]) => { + const [isSwitchNetworkShow, setIsSwitchNetworkShow] = useState(false) const [selectNetwork, setSelectNetwork] = useState(networks[0]?.id) - const navigate = useNavigate() useEffect(() => { - if (!network) return () => {} - let timer: ReturnType - const checkNode = () => { - return getIsNodeRunExternal().then(res => { - if (isSuccessResponse(res) && res.result !== null) { - if (res.result) { - navigate(RoutePath.Settings) - setShowSwitchNetwork(true) - } - } else { - timer = setTimeout(() => { - checkNode() - }, 2_000) - } - }) - } - if (network.readonly) { - checkNode() - } else { - setShowSwitchNetwork(false) - } - return () => { - clearTimeout(timer) - } - }, [network?.readonly, network?.type, navigate]) - useEffect(() => { - if (showSwitchNetwork) { + if (isSwitchNetworkShow) { setSelectNetwork(networks[0]?.id) } - }, [networks, showSwitchNetwork]) + }, [networks, isSwitchNetworkShow]) const [showEditorDialog, setShowEditorDialog] = useState(false) const onConfirm = useCallback(() => { if (selectNetwork) { setCurrentNetwork(selectNetwork) - setShowSwitchNetwork(false) + setIsSwitchNetworkShow(false) } }, [selectNetwork]) const onCloseEditorDialog = useCallback(() => { @@ -365,12 +347,18 @@ export const useCheckNode = (networks: State.Network[], network?: State.Network) const onOpenEditorDialog = useCallback(() => { setShowEditorDialog(true) }, []) + const navigate = useNavigate() + const showSwitchNetwork = useCallback(() => { + navigate(RoutePath.Settings) + setIsSwitchNetworkShow(true) + }, []) return { selectNetwork, onChangeSelected: setSelectNetwork, + isSwitchNetworkShow, showSwitchNetwork, onCancel: useCallback(() => { - setShowSwitchNetwork(false) + setIsSwitchNetworkShow(false) startNodeIgnoreExternal() }, []), onConfirm, diff --git a/packages/neuron-ui/src/containers/Main/index.tsx b/packages/neuron-ui/src/containers/Main/index.tsx index b32f5cd382..b379498d2f 100644 --- a/packages/neuron-ui/src/containers/Main/index.tsx +++ b/packages/neuron-ui/src/containers/Main/index.tsx @@ -25,15 +25,6 @@ const MainContent = () => { const { networkID } = chain const [t, i18n] = useTranslation() - useSubscription({ - walletID, - chain, - isAllowedToFetchList, - navigate, - dispatch, - location, - }) - const network = useMemo(() => networks.find(n => n.id === networkID), [networks, networkID]) const sameUrlNetworks = useMemo( @@ -46,6 +37,27 @@ const MainContent = () => { dispatch, }) + const { + isSwitchNetworkShow, + showSwitchNetwork, + onCancel: onCloseSwitchNetwork, + onConfirm: onSwitchNetwork, + onChangeSelected, + showEditorDialog, + onCloseEditorDialog, + onOpenEditorDialog, + } = useCheckNode(sameUrlNetworks) + + useSubscription({ + walletID, + chain, + isAllowedToFetchList, + navigate, + dispatch, + location, + showSwitchNetwork, + }) + useOnCurrentWalletChange({ walletID, chain, @@ -58,15 +70,6 @@ const MainContent = () => { dismissGlobalAlertDialog()(dispatch) }, [dispatch]) const { isMigrateDialogShow, onCancel, onBackUp, onConfirm } = useMigrate() - const { - showSwitchNetwork, - onCancel: onCloseSwitchNetwork, - onConfirm: onSwitchNetwork, - onChangeSelected, - showEditorDialog, - onCloseEditorDialog, - onOpenEditorDialog, - } = useCheckNode(sameUrlNetworks, network) return (
@@ -92,7 +95,7 @@ const MainContent = () => {
('stop-process-monitor') export const startProcessMonitor = remoteApi<'ckb'>('start-process-monitor') -export const getIsNodeRunExternal = remoteApi('is-node-run-external') export const startNodeIgnoreExternal = remoteApi('start-node-ignore-external') export type VerifyExternalCkbNodeRes = diff --git a/packages/neuron-ui/src/services/remote/remoteApiWrapper.ts b/packages/neuron-ui/src/services/remote/remoteApiWrapper.ts index 94e2942f7b..d09a5d2d04 100644 --- a/packages/neuron-ui/src/services/remote/remoteApiWrapper.ts +++ b/packages/neuron-ui/src/services/remote/remoteApiWrapper.ts @@ -48,7 +48,6 @@ type Action = | 'start-process-monitor' | 'is-dark' | 'set-theme' - | 'is-node-run-external' | 'verify-external-ckb-node' | 'start-node-ignore-external' // Wallets diff --git a/packages/neuron-wallet/src/controllers/api.ts b/packages/neuron-wallet/src/controllers/api.ts index b23a30e718..419e25b484 100644 --- a/packages/neuron-wallet/src/controllers/api.ts +++ b/packages/neuron-wallet/src/controllers/api.ts @@ -289,13 +289,6 @@ export default class ApiController { } }) - handle('is-node-run-external', () => { - return { - status: ResponseCode.Success, - result: NodeService.getInstance().isCkbNodeExternal, - } - }) - handle('verify-external-ckb-node', async () => { return { status: ResponseCode.Success, diff --git a/packages/neuron-wallet/src/controllers/networks/index.ts b/packages/neuron-wallet/src/controllers/networks/index.ts index d2a73f7a40..45f620d13e 100644 --- a/packages/neuron-wallet/src/controllers/networks/index.ts +++ b/packages/neuron-wallet/src/controllers/networks/index.ts @@ -167,7 +167,7 @@ export default class NetworksController { const id = networksService.getCurrentID() const network = await networksService.update(id, {}) const genesisHashMatched = await new ChainInfo(network).load() - const isNodeMatched = !network.readonly || NodeService.getInstance().isCkbNodeExternal === false + const isNodeMatched = !network.readonly || (reconnected && NodeService.getInstance().startedBundledNode) await switchToNetwork(network, reconnected, genesisHashMatched && isNodeMatched) } diff --git a/packages/neuron-wallet/src/services/node.ts b/packages/neuron-wallet/src/services/node.ts index 9c6de8e553..50820894da 100644 --- a/packages/neuron-wallet/src/services/node.ts +++ b/packages/neuron-wallet/src/services/node.ts @@ -43,8 +43,11 @@ class NodeService { public connectionStatusSubject = new BehaviorSubject(false) private _tipBlockNumber: string = '0' - private startedBundledNode: boolean = false - private _isCkbNodeExternal?: boolean = undefined + #startedBundledNode: boolean = false + + get startedBundledNode() { + return this.#startedBundledNode + } private constructor() { this.start() @@ -68,13 +71,12 @@ class NodeService { url: currentNetwork.remote, connected, isBundledNode, - startedBundledNode: isBundledNode ? this.startedBundledNode : false, + startedBundledNode: isBundledNode ? this.#startedBundledNode : false, }) }) } private whenNetworkUpdate = () => { - this._isCkbNodeExternal = undefined this.tipNumberSubject.next('0') this.connectionStatusSubject.next(false) } @@ -130,13 +132,11 @@ class NodeService { await stopMonitor('ckb') if (isDefaultCKBNeedStart) { logger.info('CKB:\texternal RPC on default uri not detected, starting bundled CKB node.') - this._isCkbNodeExternal = false const redistReady = await redistCheck() await (redistReady ? this.startNode() : this.showGuideDialog()) await startMonitor() } else { logger.info('CKB:\texternal RPC on default uri detected, skip starting bundled CKB node.') - this._isCkbNodeExternal = true } } @@ -179,9 +179,9 @@ class NodeService { await CKBLightRunner.getInstance().stop() await startCkbNode() } - this.startedBundledNode = true + this.#startedBundledNode = true } catch (error) { - this.startedBundledNode = false + this.#startedBundledNode = false logger.info('CKB:\tfail to start bundled CKB with error:') logger.error(error) } @@ -190,16 +190,11 @@ class NodeService { public async startNodeIgnoreExternal() { logger.info('CKB:\tignore running external node, and start node with another port') await stopMonitor('ckb') - this._isCkbNodeExternal = false const redistReady = await redistCheck() await (redistReady ? this.startNode() : this.showGuideDialog()) await startMonitor() } - get isCkbNodeExternal() { - return this._isCkbNodeExternal - } - private showGuideDialog = () => { const I18N_PATH = `messageBox.ckb-dependency` return dialog