-
Notifications
You must be signed in to change notification settings - Fork 101
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat/264 - Handle third-party extension events (#310)
* Enable event handling for Keplr account changes * Clean up, add placeholders for Metamask * Register ethereum provider events for Metamask * Provide optional callbacks for handling extension events (for ethereum) * Remove unnecessary log * Removed erroneous (and unused) event definition
- Loading branch information
Showing
6 changed files
with
84 additions
and
37 deletions.
There are no files selected for viewing
17 changes: 5 additions & 12 deletions
17
apps/namada-interface/src/services/extensionEvents/handlers/keplr.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,22 +1,15 @@ | ||
import { Dispatch } from "react"; | ||
|
||
import { chains } from "@anoma/chains"; | ||
import { Keplr } from "@anoma/integrations"; | ||
|
||
import { addAccounts, fetchBalances } from "slices/accounts"; | ||
|
||
export const KeplrAccountChangedHandler = | ||
(dispatch: Dispatch<unknown>, integration: Keplr) => | ||
async (event: CustomEventInit) => { | ||
const chainId = event.detail?.chainId; | ||
const chain = chains[chainId]; | ||
(dispatch: Dispatch<unknown>, integration: Keplr) => async () => { | ||
const accounts = await integration.accounts(); | ||
|
||
if (chain.extension.id === "keplr") { | ||
const accounts = await integration.accounts(); | ||
|
||
if (accounts) { | ||
dispatch(addAccounts(accounts)); | ||
dispatch(fetchBalances()); | ||
} | ||
if (accounts) { | ||
dispatch(addAccounts(accounts)); | ||
dispatch(fetchBalances()); | ||
} | ||
}; |
19 changes: 5 additions & 14 deletions
19
apps/namada-interface/src/services/extensionEvents/handlers/metamask.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,22 +1,13 @@ | ||
import { Dispatch } from "react"; | ||
|
||
import { chains } from "@anoma/chains"; | ||
import { Metamask } from "@anoma/integrations"; | ||
|
||
import { addAccounts, fetchBalances } from "slices/accounts"; | ||
|
||
export const MetamaskAccountChangedHandler = | ||
(dispatch: Dispatch<unknown>, integration: Metamask) => | ||
async (event: CustomEventInit) => { | ||
const chainId = event.detail?.chainId; | ||
const chain = chains[chainId]; | ||
|
||
if (chain.extension.id === "metamask") { | ||
const accounts = await integration.accounts(); | ||
(dispatch: Dispatch<unknown>, integration: Metamask) => async () => { | ||
const accounts = await integration.accounts(); | ||
|
||
if (accounts) { | ||
dispatch(addAccounts(accounts)); | ||
dispatch(fetchBalances()); | ||
} | ||
if (accounts) { | ||
dispatch(addAccounts(accounts)); | ||
dispatch(fetchBalances()); | ||
} | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,24 +1,43 @@ | ||
import { useEffect } from "react"; | ||
|
||
type EventHandler = (e: CustomEventInit) => void; | ||
type EventCallback = (event: string, handler: EventHandler) => void; | ||
|
||
export const useEventListener = ( | ||
event: string, | ||
handler: (e: CustomEventInit) => void, | ||
handler: EventHandler, | ||
deps?: React.DependencyList, | ||
useCapture = false | ||
useCapture = false, | ||
registerCallback?: EventCallback, | ||
removeCallback?: EventCallback | ||
): void => { | ||
useEffect(() => { | ||
window.addEventListener(event, handler, useCapture); | ||
registerCallback | ||
? registerCallback(event, handler) | ||
: window.addEventListener(event, handler, useCapture); | ||
|
||
return () => { | ||
if (removeCallback) { | ||
return removeCallback(event, handler); | ||
} | ||
window.removeEventListener(event, handler); | ||
}; | ||
}, deps); | ||
}; | ||
|
||
export const useEventListenerOnce = ( | ||
event: string, | ||
handler: (e: CustomEventInit) => void, | ||
useCapture = false | ||
handler: EventHandler, | ||
useCapture = false, | ||
registerCallback?: EventCallback, | ||
removeCallback?: EventCallback | ||
): void => { | ||
useEventListener(event, handler, [], useCapture); | ||
useEventListener( | ||
event, | ||
handler, | ||
[], | ||
useCapture, | ||
registerCallback, | ||
removeCallback | ||
); | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,8 +1,19 @@ | ||
// Constants defining events which may be subscribed to | ||
|
||
// Anoma extension events | ||
export enum Events { | ||
AccountChanged = "anoma-account-changed", | ||
TransferStarted = "anoma-transfer-started", | ||
TransferCompleted = "anoma-transfer-completed", | ||
UpdatedBalances = "anoma-updated-balances", | ||
} | ||
|
||
// Keplr extension events | ||
export enum KeplrEvents { | ||
AccountChanged = "keplr_keystorechange", | ||
} | ||
|
||
// Metamask extension window.ethereum events | ||
export enum MetamaskEvents { | ||
AccountChanged = "accountsChanged", | ||
} |