import type { ReactNode } from 'react'; import { Dialog, Icon, Intent, Loader } from '@vegaprotocol/ui-toolkit'; import { WalletClientError } from '@vegaprotocol/wallet-client'; import type { VegaTxState } from '../../lib/proposals-hooks/use-vega-transaction'; import { VegaTxStatus } from '../../lib/proposals-hooks/use-vega-transaction'; import { useVegaWallet } from '@vegaprotocol/wallet'; import { useT } from '../../use-t'; export type VegaTransactionContentMap = { [C in VegaTxStatus]?: JSX.Element; }; export interface VegaTransactionDialogProps { isOpen: boolean; transaction: VegaTxState; onChange?: (isOpen: boolean) => void; intent?: Intent; title?: string; icon?: ReactNode; content?: VegaTransactionContentMap; } export const VegaTransactionDialog = ({ isOpen, transaction, onChange, intent, title, icon, content, }: VegaTransactionDialogProps) => { const t = useT(); const computedIntent = intent ? intent : getIntent(transaction); const computedTitle = title ? title : getTitle(transaction, t); const computedIcon = icon ? icon : getIcon(transaction); return ( ); }; interface ContentProps { transaction: VegaTxState; content?: VegaTransactionContentMap; } const Content = ({ transaction, content }: ContentProps) => { if (!content) { return ; } if (transaction.status === VegaTxStatus.Default && content.Default) { return content.Default; } if (transaction.status === VegaTxStatus.Requested && content.Requested) { return content.Requested; } if (transaction.status === VegaTxStatus.Pending && content.Pending) { return content.Pending; } if (transaction.status === VegaTxStatus.Error && content.Error) { return content.Error; } if (transaction.status === VegaTxStatus.Complete && content.Complete) { return content.Complete; } return ; }; interface VegaDialogProps { transaction: VegaTxState; } /** * Default dialog content */ export const VegaDialog = ({ transaction }: VegaDialogProps) => { const t = useT(); const { links, network } = useVegaWallet(); let content = null; if (transaction.status === VegaTxStatus.Requested) { content = ( <>

{t( 'Please open your wallet application and confirm or reject the transaction' )}

{network !== 'MAINNET' && (

{t('[This is {{network}} transaction only]', { network })}

)} ); } if (transaction.status === VegaTxStatus.Error) { let messageText = ''; if (transaction.error instanceof WalletClientError) { messageText = `${transaction.error.title}: ${transaction.error.message}`; } else if (transaction.error instanceof Error) { messageText = transaction.error.message; } content =
{messageText}
; } if (transaction.status === VegaTxStatus.Pending) { content = (

{t('Please wait for your transaction to be confirmed')} -   {transaction.txHash && ( {t('View in block explorer')} )}

); } if (transaction.status === VegaTxStatus.Complete) { content = (

{t('Your transaction has been confirmed')} -   {transaction.txHash && ( {t('View in block explorer')} )}

); } return
{content}
; }; const getIntent = (transaction: VegaTxState) => { switch (transaction.status) { case VegaTxStatus.Requested: return Intent.Warning; case VegaTxStatus.Pending: return Intent.None; case VegaTxStatus.Error: return Intent.Danger; case VegaTxStatus.Complete: return Intent.Success; default: return Intent.None; } }; const getTitle = (transaction: VegaTxState, t: ReturnType) => { switch (transaction.status) { case VegaTxStatus.Requested: return t('Confirm transaction in wallet'); case VegaTxStatus.Pending: return t('Awaiting network confirmation'); case VegaTxStatus.Error: return t('Transaction failed'); case VegaTxStatus.Complete: return t('Transaction complete'); default: return ''; } }; const getIcon = (transaction: VegaTxState) => { switch (transaction.status) { case VegaTxStatus.Requested: return ; case VegaTxStatus.Pending: return ( ); case VegaTxStatus.Error: return ; case VegaTxStatus.Complete: return ; default: return ''; } };