1import WalletConnect from '@walletconnect/client';
2import QRCodeModal from '@walletconnect/qrcode-modal';
3import { ITxData } from '@walletconnect/types';
5import { useEffect, useState } from 'react';
6import { Just } from 'folktale/maybe';
8import { useWallet } from 'store/wallet';
9import { getAuthToken } from './authToken';
10import { WALLET_TYPES } from './constants';
11import WalletConnectWallet from './types/WalletConnectWallet';
32export const useWalletConnect = () => {
33 const { setWallet, setAuthToken, resetWallet } = useWallet();
34 const [connector, setConnector] = useState<WalletConnect | null>(null);
35 const [address, setAddress] = useState<string | null>(null);
36 const [peerMeta, setPeerMeta] = useState<PeerMeta | null>(null);
38 const resetConnector = () => {
39 const newConnector = new WalletConnect({
40 bridge: 'https://bridge.walletconnect.org',
41 qrcodeModal: QRCodeModal,
44 setConnector(newConnector);
46 // restore state from cached connection
47 if (newConnector.accounts.length > 0) {
48 setAddress(newConnector.accounts[0]);
51 if (newConnector.peerMeta) {
52 setPeerMeta(newConnector.peerMeta);
59 // eslint-disable-next-line react-hooks/exhaustive-deps
63 const connect = async () => {
64 if (!connector || connector.connected) {
68 await connector.createSession();
71 const disconnect = async () => {
76 await connector.killSession();
79 const authenticate = async () => {
80 if (!(address && connector)) {
84 const authToken = await getAuthToken({
87 walletType: WALLET_TYPES.WALLET_CONNECT,
90 const wallet: WalletConnectWallet = {
94 setAuthToken(Just(authToken));
95 setWallet(Just(wallet));
98 const isConnected = () => {
103 return connector.connected;
106 const signTransaction = async ({
114 }: ITxData): Promise<string> => {
115 return new Promise((resolve, reject) => {
116 if (!connector || !isConnected()) {
117 reject(new Error('No connected wallet available for signing'));
131 .then((txHash: string) => resolve(txHash))
132 .catch((error: Error) => reject(error));
137 const initConnectHandler = () => {
142 connector.on('connect', async (error, payload: ConnectEvent) => {
147 const address = payload.params[0].accounts[0];
149 setPeerMeta(payload.params[0].peerMeta);
153 const initDisconnectHandler = () => {
158 connector.on('disconnect', (error, _payload) => {
169 const initSessionUpdateHandler = () => {
174 connector.on('session_update', (error, payload) => {
183 const initModalClosedHandler = () => {
188 connector.on('modal_closed', () => {
200 initConnectHandler();
201 initDisconnectHandler();
202 initSessionUpdateHandler();
203 initModalClosedHandler();
206 // Clean up listeners
207 connector.off('connect');
208 connector.off('disconnect');
209 connector.off('session_update');
210 connector.off('modal_closed');
212 // eslint-disable-next-line react-hooks/exhaustive-deps
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list