vega-frontend-monorepo/libs/wallet/src/provider.tsx
Joe Tsang 777d330f8e
chore(test fixes): use api token in test (#2316)
* chore: clean jsonrpc wallet api methods - remove permission methods

* chore: clean jsonrpc wallet api methods - remove permission methods

* chore: clean jsonrpc wallet api methods - remove permission methods

* chore: clean jsonrpc wallet api methods - fix failing unit test

* chore: update vega_version

* chore: update vega to v0.63.0 in workflows

* chore: mock api-token in connect wallet response

* chore: fix token env in workflow

* chore: remove dummy wallet leftovers

* chore: fix asset tests

* chore: fix remaining explorer tests

* chore: increase tx timeout

* chore: remove smoke test temporarily

* chore: remove other governance smoke test

* chore: remove smoke staking test

* chore: move validator tests to regression

* chore: revert regression change because they are also running

* chore: move vega wallet tests to slow

* chore: skip tests instead

Co-authored-by: maciek <maciek@vegaprotocol.io>
Co-authored-by: Rado <szpiechrados@gmail.com>
2022-12-05 16:51:53 +00:00

100 lines
2.6 KiB
TypeScript

import { LocalStorage } from '@vegaprotocol/react-helpers';
import type { ReactNode } from 'react';
import { useCallback, useMemo, useRef, useState } from 'react';
import type { VegaWalletContextShape } from '.';
import type {
PubKey,
Transaction,
VegaConnector,
} from './connectors/vega-connector';
import { VegaWalletContext } from './context';
import { WALLET_KEY } from './storage';
import { WalletError } from './connectors/vega-connector';
interface VegaWalletProviderProps {
children: ReactNode;
}
export const VegaWalletProvider = ({ children }: VegaWalletProviderProps) => {
// Current selected pubKey
const [pubKey, setPubKey] = useState<string | null>(null);
// Arary of pubkeys retrieved from the connector
const [pubKeys, setPubKeys] = useState<PubKey[] | null>(null);
// Reference to the current connector instance
const connector = useRef<VegaConnector | null>(null);
const selectPubKey = useCallback((pk: string) => {
setPubKey(pk);
LocalStorage.setItem(WALLET_KEY, pk);
}, []);
const connect = useCallback(async (c: VegaConnector) => {
connector.current = c;
try {
const keys = await connector.current.connect();
if (keys?.length) {
setPubKeys(keys);
const lastUsedPubKey = LocalStorage.getItem(WALLET_KEY);
const foundKey = keys.find((key) => key.publicKey === lastUsedPubKey);
if (foundKey) {
setPubKey(foundKey.publicKey);
} else {
setPubKey(keys[0].publicKey);
}
return keys;
} else {
return null;
}
} catch (err) {
if (err instanceof WalletError) {
throw err;
}
return null;
}
}, []);
const disconnect = useCallback(async () => {
try {
await connector.current?.disconnect();
setPubKeys(null);
setPubKey(null);
connector.current = null;
LocalStorage.removeItem(WALLET_KEY);
return true;
} catch (err) {
console.error(err);
return false;
}
}, []);
const sendTx = useCallback((pubkey: string, transaction: Transaction) => {
if (!connector.current) {
throw new Error('No connector');
}
return connector.current.sendTx(pubkey, transaction);
}, []);
const contextValue = useMemo<VegaWalletContextShape>(() => {
return {
pubKey,
pubKeys,
selectPubKey,
connect,
disconnect,
sendTx,
};
}, [pubKey, pubKeys, selectPubKey, connect, disconnect, sendTx]);
return (
<VegaWalletContext.Provider value={contextValue}>
{children}
</VegaWalletContext.Provider>
);
};