81 lines
2.1 KiB
JavaScript
81 lines
2.1 KiB
JavaScript
import React, { useContext, useEffect, useMemo, useState } from 'react';
|
|
import Wallet from '@project-serum/sol-wallet-adapter';
|
|
import { notify } from './notifications';
|
|
import { useConnectionConfig } from './connection';
|
|
import { useLocalStorageState } from './utils';
|
|
|
|
export const WALLET_PROVIDERS = [
|
|
{ name: 'sollet.io', url: 'https://www.sollet.io' },
|
|
];
|
|
|
|
const WalletContext = React.createContext(null);
|
|
|
|
export function WalletProvider({ children }) {
|
|
const { endpoint } = useConnectionConfig();
|
|
const [providerUrl, setProviderUrl] = useLocalStorageState(
|
|
'walletProvider',
|
|
'https://www.sollet.io',
|
|
);
|
|
const wallet = useMemo(() => new Wallet(providerUrl, endpoint), [
|
|
providerUrl,
|
|
endpoint,
|
|
]);
|
|
|
|
const [connected, setConnected] = useState(false);
|
|
useEffect(() => {
|
|
console.log('trying to connect');
|
|
wallet.on('connect', () => {
|
|
console.log('connected');
|
|
setConnected(true);
|
|
let walletPublicKey = wallet.publicKey.toBase58();
|
|
let keyToDisplay =
|
|
walletPublicKey.length > 20
|
|
? `${walletPublicKey.substring(0, 7)}.....${walletPublicKey.substring(
|
|
walletPublicKey.length - 7,
|
|
walletPublicKey.length,
|
|
)}`
|
|
: walletPublicKey;
|
|
notify({
|
|
message: 'Wallet update',
|
|
description: 'Connected to wallet ' + keyToDisplay,
|
|
});
|
|
});
|
|
wallet.on('disconnect', () => {
|
|
setConnected(false);
|
|
notify({
|
|
message: 'Wallet update',
|
|
description: 'Disconnected from wallet',
|
|
});
|
|
});
|
|
return () => {
|
|
wallet.disconnect();
|
|
setConnected(false);
|
|
};
|
|
}, [wallet]);
|
|
return (
|
|
<WalletContext.Provider
|
|
value={{
|
|
wallet,
|
|
connected,
|
|
providerUrl,
|
|
setProviderUrl,
|
|
providerName: WALLET_PROVIDERS.find(({ url }) => url === providerUrl)
|
|
?.name,
|
|
}}
|
|
>
|
|
{children}
|
|
</WalletContext.Provider>
|
|
);
|
|
}
|
|
|
|
export function useWallet() {
|
|
const context = useContext(WalletContext);
|
|
return [
|
|
context.connected,
|
|
context.wallet,
|
|
context.providerUrl,
|
|
context.setProviderUrl,
|
|
context.providerName,
|
|
];
|
|
}
|