-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathMetamaskContext.tsx
94 lines (81 loc) · 2.31 KB
/
MetamaskContext.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import type { MetaMaskInpageProvider } from '@metamask/providers';
import type { ReactNode } from 'react';
import { createContext, useContext, useEffect, useState } from 'react';
import type { Snap } from '../types';
import { getSnapsProvider } from '../utils';
import { SnapState } from 'src/hooks/snaps/useGetSnapState';
type MetaMaskContextType = {
provider: MetaMaskInpageProvider | null;
installedSnap: Snap | null;
error: Error | null;
snapState: SnapState | null;
setSnapState: (SnapState: SnapState) => void;
setInstalledSnap: (snap: Snap | null) => void;
setError: (error: Error) => void;
};
const MetaMaskContext = createContext<MetaMaskContextType>({
provider: null,
installedSnap: null,
error: null,
snapState: null,
setSnapState: () => {},
setInstalledSnap: () => {},
setError: () => {},
});
/**
* MetaMask context provider to handle MetaMask and snap status.
*
* @param props - React Props.
* @param props.children - React component to be wrapped by the Provider.
* @returns JSX.
*/
export const MetaMaskProvider = ({ children }: { children: ReactNode }) => {
// const { getSnapState } = useGetSnapState();
const [provider, setProvider] = useState<MetaMaskInpageProvider | null>(null);
const [installedSnap, setInstalledSnap] = useState<Snap | null>(null);
const [error, setError] = useState<Error | null>(null);
const [snapState, setSnapState] = useState<SnapState | null>(null);
useEffect(() => {
getSnapsProvider().then(setProvider).catch(console.error);
}, []);
useEffect(() => {
if (error) {
const timeout = setTimeout(() => {
setError(null);
}, 10000);
return () => {
clearTimeout(timeout);
};
}
return undefined;
}, [error]);
return (
<MetaMaskContext.Provider
value={{
provider,
error,
snapState,
setSnapState,
setError,
installedSnap,
setInstalledSnap,
}}
>
{children}
</MetaMaskContext.Provider>
);
};
/**
* Utility hook to consume the MetaMask context.
*
* @returns The MetaMask context.
*/
export function useMetaMaskContext() {
const context = useContext(MetaMaskContext);
if (context === undefined) {
throw new Error(
'useMetaMaskContext must be called within a MetaMaskProvider',
);
}
return context;
}