From c957acfbfc865f28981b9645b693628046b2970e Mon Sep 17 00:00:00 2001 From: "Justin R. Evans" Date: Fri, 16 Jun 2023 04:02:46 -0400 Subject: [PATCH] Register ethereum provider events for Metamask --- .../src/services/extensionEvents/provider.tsx | 5 +++-- packages/hooks/src/useEvent.ts | 15 +++++++++++---- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/apps/namada-interface/src/services/extensionEvents/provider.tsx b/apps/namada-interface/src/services/extensionEvents/provider.tsx index e1ed1c4ad6..e889d2afa1 100644 --- a/apps/namada-interface/src/services/extensionEvents/provider.tsx +++ b/apps/namada-interface/src/services/extensionEvents/provider.tsx @@ -54,10 +54,11 @@ export const ExtensionEventsProvider: React.FC = (props): JSX.Element => { useEventListenerOnce(Events.TransferCompleted, anomaTransferCompletedHandler); useEventListenerOnce(Events.UpdatedBalances, anomaUpdatedBalancesHandler); useEventListenerOnce(KeplrEvents.AccountChanged, keplrAccountChangedHandler); - // TODO: This should be bound to window.ethereum: useEventListenerOnce( MetamaskEvents.AccountChanged, - metamaskAccountChangedHandler + metamaskAccountChangedHandler, + false, + true ); return ( diff --git a/packages/hooks/src/useEvent.ts b/packages/hooks/src/useEvent.ts index a9a4761c3a..34e947a426 100644 --- a/packages/hooks/src/useEvent.ts +++ b/packages/hooks/src/useEvent.ts @@ -4,12 +4,18 @@ export const useEventListener = ( event: string, handler: (e: CustomEventInit) => void, deps?: React.DependencyList, - useCapture = false + useCapture = false, + isEthereumEvent = false ): void => { useEffect(() => { - window.addEventListener(event, handler, useCapture); + isEthereumEvent + ? window.ethereum.on(event, handler) + : window.addEventListener(event, handler, useCapture); return () => { + if (isEthereumEvent) { + return window.ethereum.removeListener(event, handler); + } window.removeEventListener(event, handler); }; }, deps); @@ -18,7 +24,8 @@ export const useEventListener = ( export const useEventListenerOnce = ( event: string, handler: (e: CustomEventInit) => void, - useCapture = false + useCapture = false, + isEthereumEvent = false ): void => { - useEventListener(event, handler, [], useCapture); + useEventListener(event, handler, [], useCapture, isEthereumEvent); };