UNPKG

@lifi/widget

Version:

LI.FI Widget for cross-chain bridging and swapping. It will drive your multi-chain strategy and attract new users from everywhere.

195 lines 9.35 kB
import { LiFiErrorCode } from '@lifi/sdk'; import { useTranslation } from 'react-i18next'; import { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'; import { formatTokenAmount, wrapLongWords } from '../utils/format.js'; import { useAvailableChains } from './useAvailableChains.js'; export const useProcessMessage = (step, process) => { const { subvariant, subvariantOptions } = useWidgetConfig(); const { t } = useTranslation(); const { getChainById } = useAvailableChains(); if (!step || !process) { return {}; } return getProcessMessage(t, getChainById, step, process, subvariant, subvariantOptions); }; const processStatusMessages = { TOKEN_ALLOWANCE: { STARTED: (t) => t('main.process.tokenAllowance.started'), ACTION_REQUIRED: (t, step) => t('main.process.tokenAllowance.actionRequired', { tokenSymbol: step.action.fromToken.symbol, }), PENDING: (t, step) => t('main.process.tokenAllowance.pending', { tokenSymbol: step.action.fromToken.symbol, }), DONE: (t, step) => t('main.process.tokenAllowance.done', { tokenSymbol: step.action.fromToken.symbol, }), }, SWITCH_CHAIN: { ACTION_REQUIRED: (t) => t('main.process.switchChain.actionRequired'), DONE: (t) => t('main.process.switchChain.done'), }, PERMIT: { STARTED: (t) => t('main.process.permit.started'), ACTION_REQUIRED: (t) => t('main.process.permit.actionRequired'), PENDING: (t) => t('main.process.permit.pending'), DONE: (t) => t('main.process.permit.done'), }, SWAP: { STARTED: (t) => t('main.process.swap.started'), ACTION_REQUIRED: (t) => t('main.process.swap.actionRequired'), PENDING: (t) => t('main.process.swap.pending'), DONE: (t, _, subvariant, subvariantOptions) => subvariant === 'custom' ? t(`main.process.${subvariantOptions?.custom ?? 'checkout'}.done`) : t('main.process.swap.done'), }, CROSS_CHAIN: { STARTED: (t) => t('main.process.bridge.started'), ACTION_REQUIRED: (t) => t('main.process.bridge.actionRequired'), PENDING: (t) => t('main.process.bridge.pending'), DONE: (t) => t('main.process.bridge.done'), }, RECEIVING_CHAIN: { PENDING: (t) => t('main.process.receivingChain.pending'), DONE: (t, _, subvariant, subvariantOptions) => subvariant === 'custom' ? t(`main.process.${subvariantOptions?.custom ?? 'checkout'}.done`) : t('main.process.receivingChain.done'), }, TRANSACTION: {}, }; const processSubstatusMessages = { PENDING: { // BRIDGE_NOT_AVAILABLE: 'Bridge communication is temporarily unavailable.', // CHAIN_NOT_AVAILABLE: 'RPC communication is temporarily unavailable.', // REFUND_IN_PROGRESS: // "The refund has been requested and it's being processed", // WAIT_DESTINATION_TRANSACTION: // 'The bridge off-chain logic is being executed. Wait for the transaction to appear on the destination chain.', // WAIT_SOURCE_CONFIRMATIONS: // 'The bridge deposit has been received. The bridge is waiting for more confirmations to start the off-chain logic.', }, DONE: { // COMPLETED: 'The transfer is complete.', PARTIAL: (t) => t('main.process.receivingChain.partial'), REFUNDED: (t) => t('main.process.receivingChain.partial'), }, FAILED: { // TODO: should be moved to failed status // NOT_PROCESSABLE_REFUND_NEEDED: // 'The transfer cannot be completed successfully. A refund operation is required.', // UNKNOWN_ERROR: // 'An unexpected error occurred. Please seek assistance in the LI.FI discord server.', }, INVALID: {}, NOT_FOUND: {}, }; export function getProcessMessage(t, getChainById, step, process, subvariant, subvariantOptions) { if (process.error && process.status === 'FAILED') { const getDefaultErrorMessage = (key) => `${t(key ?? 'error.message.transactionNotSent')} ${t('error.message.remainInYourWallet', { amount: formatTokenAmount(BigInt(step.action.fromAmount), step.action.fromToken.decimals), tokenSymbol: step.action.fromToken.symbol, chainName: getChainById(step.action.fromChainId)?.name ?? '', })}`; let title = ''; let message = ''; switch (process.error.code) { case LiFiErrorCode.AllowanceRequired: title = t('error.title.allowanceRequired'); message = t('error.message.allowanceRequired', { tokenSymbol: step.action.fromToken.symbol, }); break; case LiFiErrorCode.BalanceError: title = t('error.title.balanceIsTooLow'); message = getDefaultErrorMessage(); break; case LiFiErrorCode.ChainSwitchError: title = t('error.title.chainSwitch'); message = getDefaultErrorMessage(); break; case LiFiErrorCode.GasLimitError: title = t('error.title.gasLimitIsTooLow'); message = getDefaultErrorMessage(); break; case LiFiErrorCode.InsufficientFunds: title = t('error.title.insufficientFunds'); message = `${t('error.message.insufficientFunds')} ${getDefaultErrorMessage()}`; break; case LiFiErrorCode.SlippageError: title = t('error.title.slippageNotMet'); message = t('error.message.slippageThreshold'); break; case LiFiErrorCode.TransactionFailed: title = t('error.title.transactionFailed'); message = t('error.message.transactionFailed'); break; case LiFiErrorCode.TransactionExpired: title = t('error.title.transactionExpired'); message = t('error.message.transactionExpired'); break; case LiFiErrorCode.TransactionSimulationFailed: title = t('error.title.transactionSimulationFailed'); message = t('error.message.transactionSimulationFailed'); break; case LiFiErrorCode.WalletChangedDuringExecution: title = t('error.title.walletMismatch'); message = t('error.message.walletChangedDuringExecution'); break; case LiFiErrorCode.RateLimitExceeded: title = t('error.title.rateLimitExceeded'); message = t('error.message.rateLimitExceeded'); break; case LiFiErrorCode.ThirdPartyError: title = t('error.title.thirdPartyError'); message = t('error.message.thirdPartyError'); break; case LiFiErrorCode.TransactionUnderpriced: title = t('error.title.transactionUnderpriced'); message = getDefaultErrorMessage(); break; case LiFiErrorCode.TransactionUnprepared: title = t('error.title.transactionUnprepared'); message = getDefaultErrorMessage(); break; case LiFiErrorCode.TransactionCanceled: title = t('error.title.transactionCanceled'); message = getDefaultErrorMessage('error.message.transactionCanceled'); break; case LiFiErrorCode.TransactionRejected: title = t('error.title.transactionRejected'); message = getDefaultErrorMessage('error.message.transactionRejected'); break; case LiFiErrorCode.TransactionConflict: title = t('error.title.transactionConflict'); message = getDefaultErrorMessage('error.message.transactionConflict'); break; case LiFiErrorCode.ExchangeRateUpdateCanceled: title = t('error.title.exchangeRateUpdateCanceled'); message = getDefaultErrorMessage(); break; case LiFiErrorCode.SignatureRejected: title = t('error.title.signatureRejected'); message = t('error.message.signatureRejected', { amount: formatTokenAmount(BigInt(step.action.fromAmount), step.action.fromToken.decimals), tokenSymbol: step.action.fromToken.symbol, chainName: getChainById(step.action.fromChainId)?.name ?? '', }); break; default: title = t('error.title.unknown'); if (process.txHash) { message = t('error.message.transactionFailed'); } else { message = process.error.message || t('error.message.unknown'); } break; } message = wrapLongWords(message); return { title, message }; } const title = processSubstatusMessages[process.status]?.[process.substatus]?.(t) ?? processStatusMessages[process.type]?.[process.status]?.(t, step, subvariant, subvariantOptions); return { title }; } //# sourceMappingURL=useProcessMessage.js.map