2022-03-14 13:18:11 +00:00
|
|
|
import { LocalStorage } from '@vegaprotocol/react-helpers';
|
2022-03-30 09:49:48 +00:00
|
|
|
import type { ReactNode } from 'react';
|
|
|
|
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
|
|
import type { VegaKeyExtended, VegaWalletContextShape } from '.';
|
|
|
|
import type { VegaConnector } from './connectors';
|
2022-02-22 23:06:35 +00:00
|
|
|
import { VegaWalletContext } from './context';
|
2022-03-08 18:57:07 +00:00
|
|
|
import { WALLET_KEY } from './storage-keys';
|
2022-03-30 09:49:48 +00:00
|
|
|
import type { OrderSubmissionBody } from '@vegaprotocol/vegawallet-service-api-client';
|
2022-02-22 06:40:55 +00:00
|
|
|
|
|
|
|
interface VegaWalletProviderProps {
|
|
|
|
children: ReactNode;
|
|
|
|
}
|
|
|
|
|
|
|
|
export const VegaWalletProvider = ({ children }: VegaWalletProviderProps) => {
|
2022-02-24 00:03:59 +00:00
|
|
|
// Current selected publicKey, default with value from local storage
|
|
|
|
const [publicKey, setPublicKey] = useState<string | null>(() => {
|
2022-03-08 18:57:07 +00:00
|
|
|
const pk = LocalStorage.getItem(WALLET_KEY);
|
2022-02-24 00:03:59 +00:00
|
|
|
return pk ? pk : null;
|
|
|
|
});
|
|
|
|
|
|
|
|
// Keypair objects retrieved from the connector
|
|
|
|
const [keypairs, setKeypairs] = useState<VegaKeyExtended[] | null>(null);
|
|
|
|
|
|
|
|
// Reference to the current connector instance
|
2022-02-22 06:40:55 +00:00
|
|
|
const connector = useRef<VegaConnector | null>(null);
|
|
|
|
|
2022-03-20 01:31:44 +00:00
|
|
|
const connect = useCallback(
|
|
|
|
async (c: VegaConnector) => {
|
|
|
|
connector.current = c;
|
|
|
|
try {
|
|
|
|
const res = await connector.current.connect();
|
|
|
|
|
|
|
|
if (!res) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
const publicKeysWithName = res.map((pk) => {
|
|
|
|
const nameMeta = pk.meta?.find((m) => m.key === 'name');
|
|
|
|
return {
|
|
|
|
...pk,
|
|
|
|
name: nameMeta?.value ? nameMeta.value : 'None',
|
|
|
|
};
|
|
|
|
});
|
|
|
|
|
|
|
|
setKeypairs(publicKeysWithName);
|
|
|
|
|
|
|
|
if (publicKey === null) {
|
|
|
|
setPublicKey(publicKeysWithName[0].pub);
|
|
|
|
}
|
2022-02-23 19:24:30 +00:00
|
|
|
|
2022-03-20 01:31:44 +00:00
|
|
|
return publicKeysWithName;
|
|
|
|
} catch (err) {
|
2022-03-08 18:57:07 +00:00
|
|
|
return null;
|
2022-02-23 19:24:30 +00:00
|
|
|
}
|
2022-03-20 01:31:44 +00:00
|
|
|
},
|
|
|
|
[publicKey]
|
|
|
|
);
|
2022-02-22 06:40:55 +00:00
|
|
|
|
|
|
|
const disconnect = useCallback(async () => {
|
|
|
|
try {
|
2022-02-22 23:06:35 +00:00
|
|
|
await connector.current?.disconnect();
|
2022-02-24 00:03:59 +00:00
|
|
|
setKeypairs(null);
|
2022-02-22 06:40:55 +00:00
|
|
|
connector.current = null;
|
2022-03-25 07:43:49 +00:00
|
|
|
LocalStorage.removeItem(WALLET_KEY);
|
2022-03-08 18:57:07 +00:00
|
|
|
return true;
|
2022-02-22 06:40:55 +00:00
|
|
|
} catch (err) {
|
2022-02-23 05:39:12 +00:00
|
|
|
console.error(err);
|
2022-03-08 18:57:07 +00:00
|
|
|
return false;
|
2022-02-22 06:40:55 +00:00
|
|
|
}
|
|
|
|
}, []);
|
|
|
|
|
Feat/63 Deal ticket (#82)
* scaffold dealticket package, remove trading views from react-helpers
* add deal ticket component, add intent utils, expand dialog and form group styles
* add splash component, show market not found message if market doesnt exist
* tidy up error handling
* add handleError method for vega tx hook
* add better testname for provider test, flesh out tests a bit more for deal ticket
* Add unit tests for useVegaTransaction and useOrderSubmit hooks
* add wrapper component for order dialog styles
* add vega styled loader to ui toolkit and use in order dialog
* add title prop to order dialog
* split limit and market tickets into own files
* add button radio component
* revert dialog styles
* move splash component to ui-toolkit, add story
* convert intent to enum
* Make button always type=button unless type prop is passed
* inline filter logic for tif selector
* add date-fns, add datetime to helpers
* add order types to wallet package, make price undefined if order type is market
* use enums in deal ticket logic
* tidy up order state by moving submit and transaction hooks out of deal ticket
* add comment for dialog styles
* remove decimal from price input
* add types package, delete old generated types from trading project
* rename types package to graphql
* update generate command to point to correct locations
* fix use order submit test
* use intent shadow helper
* remove date-fns and format manually, update submit button error to use input-error
* remove stray console.log
2022-03-17 19:35:46 +00:00
|
|
|
const sendTx = useCallback((body: OrderSubmissionBody) => {
|
2022-03-10 00:39:59 +00:00
|
|
|
if (!connector.current) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
Feat/63 Deal ticket (#82)
* scaffold dealticket package, remove trading views from react-helpers
* add deal ticket component, add intent utils, expand dialog and form group styles
* add splash component, show market not found message if market doesnt exist
* tidy up error handling
* add handleError method for vega tx hook
* add better testname for provider test, flesh out tests a bit more for deal ticket
* Add unit tests for useVegaTransaction and useOrderSubmit hooks
* add wrapper component for order dialog styles
* add vega styled loader to ui toolkit and use in order dialog
* add title prop to order dialog
* split limit and market tickets into own files
* add button radio component
* revert dialog styles
* move splash component to ui-toolkit, add story
* convert intent to enum
* Make button always type=button unless type prop is passed
* inline filter logic for tif selector
* add date-fns, add datetime to helpers
* add order types to wallet package, make price undefined if order type is market
* use enums in deal ticket logic
* tidy up order state by moving submit and transaction hooks out of deal ticket
* add comment for dialog styles
* remove decimal from price input
* add types package, delete old generated types from trading project
* rename types package to graphql
* update generate command to point to correct locations
* fix use order submit test
* use intent shadow helper
* remove date-fns and format manually, update submit button error to use input-error
* remove stray console.log
2022-03-17 19:35:46 +00:00
|
|
|
return connector.current.sendTx(body);
|
2022-03-10 00:39:59 +00:00
|
|
|
}, []);
|
|
|
|
|
2022-02-24 00:03:59 +00:00
|
|
|
// Current selected keypair derived from publicKey state
|
|
|
|
const keypair = useMemo(() => {
|
|
|
|
const found = keypairs?.find((x) => x.pub === publicKey);
|
|
|
|
|
|
|
|
if (found) {
|
|
|
|
return found;
|
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
|
|
}, [publicKey, keypairs]);
|
|
|
|
|
|
|
|
// Whenever selected public key changes store it
|
|
|
|
useEffect(() => {
|
|
|
|
if (publicKey) {
|
2022-03-08 18:57:07 +00:00
|
|
|
LocalStorage.setItem(WALLET_KEY, publicKey);
|
2022-02-24 00:03:59 +00:00
|
|
|
}
|
|
|
|
}, [publicKey]);
|
|
|
|
|
2022-02-23 05:05:39 +00:00
|
|
|
const contextValue = useMemo<VegaWalletContextShape>(() => {
|
2022-02-22 06:40:55 +00:00
|
|
|
return {
|
2022-02-24 00:03:59 +00:00
|
|
|
keypair,
|
|
|
|
keypairs,
|
|
|
|
selectPublicKey: setPublicKey,
|
2022-02-22 06:40:55 +00:00
|
|
|
connect,
|
|
|
|
disconnect,
|
|
|
|
connector: connector.current,
|
2022-03-10 00:39:59 +00:00
|
|
|
sendTx,
|
2022-02-22 06:40:55 +00:00
|
|
|
};
|
2022-03-10 00:39:59 +00:00
|
|
|
}, [keypair, keypairs, setPublicKey, connect, disconnect, connector, sendTx]);
|
2022-02-22 06:40:55 +00:00
|
|
|
|
|
|
|
return (
|
|
|
|
<VegaWalletContext.Provider value={contextValue}>
|
|
|
|
{children}
|
|
|
|
</VegaWalletContext.Provider>
|
|
|
|
);
|
|
|
|
};
|