vega-frontend-monorepo/apps/trading/hooks/use-vega-transaction.ts

90 lines
2.0 KiB
TypeScript
Raw Normal View History

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
import { useCallback, useState } from 'react';
import { useVegaWallet, SendTxError, Transaction } from '@vegaprotocol/wallet';
export enum VegaTxStatus {
Default = 'Default',
AwaitingConfirmation = 'AwaitingConfirmation',
Rejected = 'Rejected',
Pending = 'Pending',
}
export interface TransactionState {
status: VegaTxStatus;
error: object | null;
hash: string | null;
signature: string | null;
}
export const useVegaTransaction = () => {
const { sendTx } = useVegaWallet();
const [transaction, _setTransaction] = useState<TransactionState>({
status: VegaTxStatus.Default,
error: null,
hash: null,
signature: null,
});
const setTransaction = useCallback((update: Partial<TransactionState>) => {
_setTransaction((curr) => ({
...curr,
...update,
}));
}, []);
const handleError = useCallback(
(error: SendTxError) => {
setTransaction({ error, status: VegaTxStatus.Rejected });
},
[setTransaction]
);
const send = useCallback(
async (tx: Transaction) => {
setTransaction({
error: null,
hash: null,
signature: null,
status: VegaTxStatus.AwaitingConfirmation,
});
const res = await sendTx(tx);
if (res === null) {
setTransaction({ status: VegaTxStatus.Default });
return null;
}
if ('error' in res) {
handleError(res);
return null;
} else if ('errors' in res) {
handleError(res);
return null;
} else if (res.tx && res.txHash) {
setTransaction({
status: VegaTxStatus.Pending,
hash: res.txHash,
signature: res.tx.signature.value,
});
return {
signature: res.tx.signature?.value,
};
}
return null;
},
[sendTx, handleError, setTransaction]
);
const reset = useCallback(() => {
setTransaction({
error: null,
hash: null,
signature: null,
status: VegaTxStatus.Default,
});
}, [setTransaction]);
return { send, transaction, reset };
};