@tuwaio/nova-transactions 1.0.0-alpha.2.cdce32a → 1.0.0-alpha.4.a67b545
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +81 -84
- package/dist/{TransactionsHistory-Bz0XaDda.d.cts → WalletInfoModal-DP-qlvYl.d.cts} +203 -253
- package/dist/{TransactionsHistory-Bz0XaDda.d.ts → WalletInfoModal-DP-qlvYl.d.ts} +203 -253
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +2 -21
- package/dist/index.d.cts +32 -126
- package/dist/index.d.ts +32 -126
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/providers/index.cjs +1 -1
- package/dist/providers/index.cjs.map +1 -1
- package/dist/providers/index.d.cts +4 -4
- package/dist/providers/index.d.ts +4 -4
- package/dist/providers/index.js +1 -1
- package/dist/providers/index.js.map +1 -1
- package/package.json +13 -15
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../src/i18n/en.ts","../../src/providers/LabelsProvider.tsx","../../src/components/HashLink.tsx","../../src/components/StatusAwareText.tsx","../../src/components/ToastCloseButton.tsx","../../src/components/TransactionKey.tsx","../../src/components/TransactionStatusBadge.tsx","../../src/components/ToastTransaction.tsx","../../src/components/TrackingTxModal/TxErrorBlock.tsx","../../src/components/TrackingTxModal/TxInfoBlock.tsx","../../src/components/TrackingTxModal/TxProgressIndicator.tsx","../../src/components/TrackingTxModal/TxStatusVisual.tsx","../../src/components/TrackingTxModal/TrackingTxModal.tsx","../../src/components/TransactionHistoryItem.tsx","../../src/components/TransactionsHistory.tsx","../../src/components/WalletInfoModal/WalletAddressDisplay.tsx","../../src/components/WalletInfoModal/WalletAvatar.tsx","../../src/components/WalletInfoModal/WalletHeader.tsx","../../src/components/WalletInfoModal/WalletInfoModal.tsx","../../src/providers/NovaProvider.tsx"],"names":["defaultLabels","LabelsContext","createContext","LabelsProvider","labels","children","jsx","useLabels","useContext","HashLink","label","hash","explorerUrl","variant","className","isCopied","copy","useCopyToClipboard","containerClasses","cn","labelClasses","hashContent","textCenterEllipsis","jsxs","ArrowTopRightOnSquareIcon","CheckIcon","DocumentDuplicateIcon","STATUS_MAP","TransactionStatus","StatusAwareText","txStatus","source","fallback","applyColor","baseClasses","config","text","colorClass","ToastCloseButton","closeToast","XMarkIcon","TransactionKey","tx","adapters","transactionsPool","renderHashLink","TransactionAdapter","wasReplaced","renderHash","props","adapter","selectAdapterByKey","TransactionTracker","Fragment","TransactionStatusBadge","STATUS_CONFIG","ArrowPathIcon","CheckCircleIcon","XCircleIcon","statusKey","Icon","badgeClasses","iconClasses","ToastTransaction","openWalletInfoModal","icon","customization","connectedWalletAddress","C","canReplace","handleCancel","handleSpeedUp","getChainName","Web3Icon","TxErrorBlock","error","ExclamationTriangleIcon","InfoRow","value","TxInfoBlock","renderInfoRow","dayjs","Step","status","isFirst","state","colorConfig","TxProgressIndicator","isProcessing","isSucceed","isFailed","isReplaced","StepComponent","getStepStatus","stepIndex","getStepLabel","steps","stepProps","index","TxStatusVisual","ExclamationCircleIcon","ClockIcon","TrackingTxModal","onClose","onOpenWalletInfo","actions","handleTransaction","initialTx","connectedAdapterType","trackedTx","setTrackedTx","useState","useEffect","currentTx","txToDisplay","isInitializing","isPending","isError","canRetry","motionProps","handleRetry","retryParams","isOpen","open","AnimatePresence","motion","relativeTime","TransactionHistoryItem","HistoryPlaceholder","title","message","TransactionsHistory","sortedTransactions","selectAllTransactionsByActiveWallet","a","b","renderPlaceholder","HistoryItemComponent","WalletAddressDisplay","address","explorerLink","WalletAvatar","ensAvatar","bgColor","avatar","setAvatar","makeBlockie","isHex","zeroAddress","WalletHeader","walletAddress","renderAvatar","renderName","renderAddressDisplay","renderNoWalletContent","ensName","setEnsName","setEnsAvatar","isLoading","setIsLoading","name","getName","getAvatar","ensNameAbbreviated","WalletInfoModal","setIsOpen","closeModal","h","STATUS_TO_TOAST_TYPE","NovaProvider","features","closeTxTrackedModal","toastProps","isWalletInfoModalOpen","setIsWalletInfoModalOpen","prevTransactionsRef","useRef","isMobile","useMediaQuery","isTrackingModalOpen","enabledFeatures","useMemo","mergedLabels","deepMerge","showOrUpdateToast","type","content","toast","prevPool","prevTx","statusChanged","hashAppeared","toastType","shouldShowToasts","ToastContainer"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @file This file contains the default English labels for all UI components.\n * It serves as the default language pack for the library.\n */\n\nimport { TuwaLabels } from './types';\n\n/**\n * An object containing the default English text for all labels used in the UI.\n * This object implements the `TuwaLabels` type and can be used as a template\n * for creating other language translations.\n */\nexport const defaultLabels: TuwaLabels = {\n walletModal: {\n title: 'Wallet & Transactions',\n header: {\n notConnected: 'Wallet not connected',\n avatarAlt: 'Avatar for',\n },\n history: {\n title: 'Transactions History',\n connectWalletTitle: 'Connect Wallet',\n connectWalletMessage: 'Please connect your wallet to see your past activity.',\n noTransactionsTitle: 'No Transactions Yet',\n noTransactionsMessage: 'Once you interact with the app, your transaction history will appear here.',\n },\n },\n toast: {\n openWalletInfo: 'Open wallet info',\n },\n statuses: {\n pending: 'Pending',\n success: 'Success',\n failed: 'Failed',\n reverted: 'Reverted',\n replaced: 'Replaced',\n unknown: 'Unknown',\n },\n hashLabels: {\n gelato: 'Gelato Task ID',\n safe: 'Safe Tx Hash',\n original: 'Original Tx Hash',\n replaced: 'Replaced Tx Hash',\n default: 'Tx Hash',\n },\n txInfo: {\n started: 'Started',\n network: 'Network',\n },\n txError: {\n title: 'Error',\n copied: 'Copied!',\n },\n trackingModal: {\n title: 'Transaction Overview',\n processing: 'Processing...',\n close: 'Close',\n walletInfo: 'Wallet Info',\n retry: 'Retry',\n progressIndicator: {\n created: 'Created',\n processing: 'Processing',\n succeed: 'Succeed',\n },\n },\n trackedTxButton: {\n loading: 'Processing...',\n succeed: 'Success',\n failed: 'Failed',\n replaced: 'Replaced',\n },\n actions: {\n copy: 'Copy address',\n viewOnExplorer: 'View on explorer',\n close: 'Close',\n cancel: 'Cancel',\n speedUp: 'Speed up',\n },\n};\n","/**\n * @file This file sets up the React Context for providing i18n labels throughout the UI components.\n * It allows for deep customization of all text displayed by the library.\n */\n\nimport { createContext, ReactNode, useContext } from 'react';\n\nimport { defaultLabels } from '../i18n/en';\nimport { TuwaLabels } from '../i18n/types';\n\n/**\n * React Context for storing and providing the UI labels.\n * It is initialized with the default English labels, ensuring that components\n * work even without an explicit provider.\n */\nconst LabelsContext = createContext<TuwaLabels>(defaultLabels);\n\n/**\n * A React component that provides a custom set of labels to all child components.\n * Wrap your application or component tree with this provider to apply custom translations.\n *\n * @param {object} props - The component props.\n * @param {TuwaLabels} props.labels - An object containing the custom labels.\n * @param {ReactNode} props.children - The child components to render.\n */\nexport const LabelsProvider = ({ labels, children }: { labels: TuwaLabels; children: ReactNode }) => {\n return <LabelsContext.Provider value={labels}>{children}</LabelsContext.Provider>;\n};\n\n/**\n * A custom hook to easily access the i18n labels from any component\n * within the `LabelsProvider` tree.\n *\n * @returns {TuwaLabels} The complete object of UI labels.\n *\n * @example\n * const MyComponent = () => {\n * const labels = useLabels();\n * return <h1>{labels.walletModal.title}</h1>;\n * }\n */\nexport const useLabels = (): TuwaLabels => {\n return useContext(LabelsContext);\n};\n","/**\n * @file This file contains the `HashLink` component, a UI element for displaying hashes with copy and explorer link functionality.\n */\n\nimport { ArrowTopRightOnSquareIcon, CheckIcon, DocumentDuplicateIcon } from '@heroicons/react/24/solid';\nimport { cn, textCenterEllipsis, useCopyToClipboard } from '@tuwaio/nova-core';\n\nimport { useLabels } from '../providers';\n\n/**\n * A component to display a hash string (e.g., transaction hash or address)\n * with an optional label, a link to a block explorer, and a copy-to-clipboard button.\n *\n * @param {object} props - The component props.\n * @param {string} [props.label] - An optional label to display before the hash (e.g., \"Tx Hash\").\n * @param {string} props.hash - The full hash string to display and copy.\n * @param {string} [props.explorerUrl] - An optional URL to a block explorer. If provided, the hash becomes a link.\n * @param {'default' | 'compact'} [props.variant='default'] - The visual style of the component.\n * @param {string} [props.className] - Additional CSS classes to apply to the container element.\n * @returns {JSX.Element} The rendered HashLink component.\n */\nexport function HashLink({\n label,\n hash,\n explorerUrl,\n variant = 'default',\n className,\n}: {\n label?: string;\n hash: string;\n explorerUrl?: string;\n variant?: 'default' | 'compact';\n className?: string;\n}) {\n const { isCopied, copy } = useCopyToClipboard();\n const labels = useLabels();\n\n const containerClasses = cn(\n 'flex items-center justify-between',\n variant === 'default' && 'text-sm',\n variant === 'compact' && 'text-xs',\n className,\n );\n\n const labelClasses = cn(\n 'pr-1',\n variant === 'default' && 'font-bold text-[var(--tuwa-text-primary)]',\n variant === 'compact' && 'font-medium text-[var(--tuwa-text-secondary)]',\n );\n\n const hashContent = <span className=\"font-mono\">{textCenterEllipsis(hash, 5, 5)}</span>;\n\n return (\n <div className={containerClasses}>\n {label && <span className={labelClasses}>{label}:</span>}\n <div className=\"flex items-center gap-x-2\">\n {explorerUrl ? (\n <a\n href={explorerUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center gap-x-1 text-[var(--tuwa-text-accent)] hover:underline\"\n title={labels.actions.viewOnExplorer}\n aria-label={labels.actions.viewOnExplorer}\n >\n {hashContent}\n <ArrowTopRightOnSquareIcon className=\"h-4 w-4\" />\n </a>\n ) : (\n hashContent\n )}\n <button\n type=\"button\"\n onClick={() => copy(hash)}\n className=\"cursor-pointer text-[var(--tuwa-text-tertiary)] transition-colors hover:text-[var(--tuwa-text-secondary)]\"\n title={isCopied ? labels.txError.copied : labels.actions.copy}\n aria-label={isCopied ? labels.txError.copied : labels.actions.copy}\n >\n {isCopied ? (\n <CheckIcon className=\"h-4 w-4 text-[var(--tuwa-success-icon)]\" />\n ) : (\n <DocumentDuplicateIcon className=\"h-4 w-4\" />\n )}\n </button>\n </div>\n </div>\n );\n}\n","/**\n * @file This file contains the `StatusAwareText` component, which displays different text based on a transaction's status.\n */\n\nimport { cn } from '@tuwaio/nova-core';\nimport { TransactionStatus } from '@tuwaio/pulsar-core';\nimport { ReactNode } from 'react';\n\n/**\n * A mapping from transaction status to an index and a color class.\n * The index corresponds to the position in the `source` array prop.\n * Index 0: Pending\n * Index 1: Success\n * Index 2: Failed\n * Index 3: Replaced\n */\nconst STATUS_MAP: Record<TransactionStatus | 'default', { index: number; colorClass: string }> = {\n [TransactionStatus.Success]: { index: 1, colorClass: 'text-[var(--tuwa-success-text)]' },\n [TransactionStatus.Failed]: { index: 2, colorClass: 'text-[var(--tuwa-error-text)]' },\n [TransactionStatus.Replaced]: { index: 3, colorClass: 'text-[var(--tuwa-text-secondary)]' },\n default: { index: 0, colorClass: 'text-[var(--tuwa-text-primary)]' }, // For pending or undefined status\n};\n\ntype StatusAwareTextProps = {\n /** The current status of the transaction. */\n txStatus?: TransactionStatus;\n /**\n * The source for the text. Can be a single string, or an array of strings\n * corresponding to different statuses in the format: `[pending, success, error, replaced]`.\n */\n source?: string | string[];\n /** A fallback string to display if `source` is not provided. */\n fallback?: string;\n /** The visual variant, determines the base text style ('title' or 'description'). */\n variant: 'title' | 'description';\n /** Optional additional CSS classes. */\n className?: string;\n /** If true, applies a status-specific color to the text. */\n applyColor?: boolean;\n};\n\n/**\n * A component that renders text conditionally based on a transaction's status.\n * It's designed to work with the `title` and `description` fields of a transaction,\n * which can be a single string or a status-dependent array of strings.\n *\n * @param {StatusAwareTextProps} props - The component props.\n * @returns {ReactNode} The rendered text element or null.\n */\nexport function StatusAwareText({\n txStatus,\n source,\n fallback,\n variant,\n className,\n applyColor = false,\n}: StatusAwareTextProps): ReactNode {\n const baseClasses =\n variant === 'title'\n ? 'text-sm font-semibold text-[var(--tuwa-text-primary)]'\n : 'mt-1 text-xs text-[var(--tuwa-text-secondary)]';\n\n // Case 1: Source is a simple string.\n if (typeof source === 'string') {\n return <div className={cn(baseClasses, className)}>{source}</div>;\n }\n\n // Case 2: Source is a status-dependent array.\n if (Array.isArray(source)) {\n const statusKey = txStatus || 'default';\n const config = STATUS_MAP[statusKey] || STATUS_MAP['default'];\n const text = source[config.index];\n const colorClass = applyColor ? config.colorClass : '';\n\n return <div className={cn(baseClasses, colorClass, className)}>{text}</div>;\n }\n\n // Case 3: Source is not provided, use the fallback.\n if (fallback) {\n return <div className={cn(baseClasses, className)}>{fallback}</div>;\n }\n\n // Case 4: Nothing to render.\n return null;\n}\n","/**\n * @file This file contains a reusable close button component, typically for toast notifications.\n */\n\nimport { XMarkIcon } from '@heroicons/react/24/solid';\nimport { JSX } from 'react';\n\nimport { useLabels } from '../providers';\n\ntype ToastCloseButtonProps = {\n /**\n * The function to call when the button is clicked.\n * This is typically provided by a toast library to dismiss the notification.\n */\n closeToast?: (e: React.MouseEvent<HTMLElement>) => void;\n};\n\n/**\n * A simple, styled close button component (X icon) designed for use within toast notifications.\n *\n * @param {ToastCloseButtonProps} props - The component props.\n * @returns {JSX.Element} The rendered close button.\n */\nexport function ToastCloseButton({ closeToast }: ToastCloseButtonProps): JSX.Element {\n const labels = useLabels();\n\n return (\n <button\n type=\"button\"\n onClick={closeToast}\n aria-label={labels.actions.close}\n title={labels.actions.close}\n className=\"absolute top-2 right-2 cursor-pointer rounded-full p-1 text-[var(--tuwa-text-tertiary)] transition-colors hover:bg-[var(--tuwa-bg-muted)] hover:text-[var(--tuwa-text-primary)]\"\n >\n <XMarkIcon className=\"h-5 w-5\" />\n </button>\n );\n}\n","/**\n * @file This file contains the `TransactionKey` component, which is responsible for displaying\n * the various identifiers associated with a transaction (e.g., hash, Gelato Task ID).\n */\n\nimport { cn } from '@tuwaio/nova-core';\nimport { selectAdapterByKey, Transaction, TransactionAdapter } from '@tuwaio/pulsar-core';\nimport { TransactionTracker } from '@tuwaio/pulsar-evm';\nimport { ReactNode } from 'react';\n\nimport { NovaProviderProps, useLabels } from '../providers';\nimport { HashLink } from './HashLink';\n\n// Utility type to extract the props of the HashLink component.\ntype CustomHashLinkProps = Parameters<typeof HashLink>[0];\n\nexport interface ToastTransactionKeyProps<TR, T extends Transaction<TR>, A>\n extends Pick<NovaProviderProps<TR, T, A>, 'adapters' | 'transactionsPool'> {\n /** The transaction object to display identifiers for. */\n tx: T;\n /** The visual variant, which applies different container styles. */\n variant?: 'toast' | 'history';\n /** Optional additional CSS classes for the container. */\n className?: string;\n /**\n * An optional render prop to allow for complete customization of how the hash link is rendered.\n * If not provided, the default `HashLink` component will be used.\n */\n renderHashLink?: (props: CustomHashLinkProps) => ReactNode;\n}\n\n/**\n * A component that intelligently displays the relevant keys and hashes for a transaction.\n * It handles different tracker types (EVM, Gelato, Safe) and statuses (e.g., replaced transactions).\n *\n * @param {ToastTransactionKeyProps<TR, T>} props - The component props.\n * @returns {JSX.Element} The rendered component.\n */\nexport function TransactionKey<TR, T extends Transaction<TR>, A>({\n tx,\n adapters,\n transactionsPool,\n variant = 'toast',\n className,\n renderHashLink,\n}: ToastTransactionKeyProps<TR, T, A>) {\n const labels = useLabels();\n\n // TODO: temporary, need fix with logic for multiple adapters\n if (tx?.adapter !== TransactionAdapter.EVM) return null;\n\n const wasReplaced = !!tx.replacedTxHash;\n\n const containerClasses =\n variant === 'toast'\n ? 'mt-2 flex w-full flex-col gap-y-2 border-t border-[var(--tuwa-border-primary)] pt-2'\n : 'flex w-full flex-col gap-y-2';\n\n // Helper to use the render prop if provided, otherwise default to HashLink.\n const renderHash = (props: CustomHashLinkProps) => {\n return renderHashLink ? renderHashLink(props) : <HashLink {...props} />;\n };\n\n const adapter = selectAdapterByKey({ adapterKey: tx.adapter, adapters });\n\n return (\n <div className={cn(containerClasses, className)}>\n {/* Display tracker-specific identifiers (like Gelato Task ID or SafeTxHash) */}\n {tx.tracker === TransactionTracker.Gelato &&\n renderHash({ label: labels.hashLabels.gelato, hash: tx.txKey, variant: 'compact' })}\n {tx.tracker === TransactionTracker.Safe &&\n renderHash({ label: labels.hashLabels.safe, hash: tx.txKey, variant: 'compact' })}\n\n {/* Display on-chain hashes */}\n {wasReplaced ? (\n // Case 1: The transaction was replaced (e.g., sped up).\n <>\n {tx.hash && renderHash({ label: labels.hashLabels.original, hash: tx.hash, variant: 'compact' })}\n {tx.replacedTxHash &&\n adapter?.getExplorerTxUrl &&\n renderHash({\n label: labels.hashLabels.replaced,\n hash: tx.replacedTxHash,\n // The explorer link should point to the NEW (replaced) transaction.\n explorerUrl: adapter.getExplorerTxUrl(transactionsPool, tx.txKey, tx.replacedTxHash),\n })}\n </>\n ) : (\n // Case 2: Standard transaction hash.\n tx.hash &&\n adapter?.getExplorerTxUrl &&\n renderHash({\n label: labels.hashLabels.default,\n hash: tx.hash,\n explorerUrl: adapter?.getExplorerTxUrl(transactionsPool, tx.txKey),\n })\n )}\n </div>\n );\n}\n","/**\n * @file This file contains the `TransactionStatusBadge` component for visually displaying a transaction's status.\n */\n\nimport { ArrowPathIcon, CheckCircleIcon, XCircleIcon } from '@heroicons/react/24/solid';\nimport { cn } from '@tuwaio/nova-core';\nimport { Transaction, TransactionStatus } from '@tuwaio/pulsar-core';\nimport { JSX } from 'react';\n\nimport { useLabels } from '../providers';\n\ntype TransactionStatusBadgeProps<TR, T extends Transaction<TR>> = {\n /** The transaction object whose status will be displayed. */\n tx: T;\n /** Optional additional CSS classes to apply to the badge container. */\n className?: string;\n};\n\n/**\n * A component that displays a transaction's status as a styled badge\n * with a corresponding icon, color, and label.\n *\n * @param {TransactionStatusBadgeProps<TR, T>} props - The component props.\n * @returns {JSX.Element} The rendered status badge.\n */\nexport function TransactionStatusBadge<TR, T extends Transaction<TR>>({\n tx,\n className,\n}: TransactionStatusBadgeProps<TR, T>): JSX.Element {\n const labels = useLabels();\n\n // A configuration map that links a status to its visual representation.\n const STATUS_CONFIG = {\n Pending: {\n label: labels.statuses.pending,\n Icon: ArrowPathIcon,\n badgeClasses: 'bg-[var(--tuwa-pending-bg)] text-[var(--tuwa-pending-text)]',\n iconClasses: 'animate-spin text-[var(--tuwa-pending-icon)]',\n },\n [TransactionStatus.Success]: {\n label: labels.statuses.success,\n Icon: CheckCircleIcon,\n badgeClasses: 'bg-[var(--tuwa-success-bg)] text-[var(--tuwa-success-text)]',\n iconClasses: 'text-[var(--tuwa-success-icon)]',\n },\n [TransactionStatus.Failed]: {\n label: labels.statuses.failed,\n Icon: XCircleIcon,\n badgeClasses: 'bg-[var(--tuwa-error-bg)] text-[var(--tuwa-error-text)]',\n iconClasses: 'text-[var(--tuwa-error-icon)]',\n },\n [TransactionStatus.Replaced]: {\n label: labels.statuses.replaced,\n Icon: ArrowPathIcon,\n badgeClasses: 'bg-[var(--tuwa-info-bg)] text-[var(--tuwa-info-text)]',\n iconClasses: 'text-[var(--tuwa-info-icon)]',\n },\n };\n\n const baseClasses = 'inline-flex items-center gap-x-1.5 rounded-full px-2 py-1 text-xs font-medium';\n\n // Determine the status key: 'Pending' takes precedence, otherwise use the final status.\n const statusKey = tx.pending ? 'Pending' : tx.status;\n const config = statusKey ? STATUS_CONFIG[statusKey as keyof typeof STATUS_CONFIG] : null;\n\n // Fallback for unknown or missing statuses.\n if (!config) {\n return (\n <div className={cn(baseClasses, 'bg-[var(--tuwa-info-bg)] text-[var(--tuwa-info-text)]', className)}>\n {tx.status ?? labels.statuses.unknown}\n </div>\n );\n }\n\n const { label, Icon, badgeClasses, iconClasses } = config;\n\n return (\n <div className={cn(baseClasses, badgeClasses, className)}>\n <Icon className={cn('h-4 w-4', iconClasses)} />\n {label}\n </div>\n );\n}\n","/**\n * @file This file contains the `ToastTransaction` component, which serves as the main body for a transaction notification toast.\n */\n\nimport { Web3Icon } from '@bgd-labs/react-web3-icons';\nimport { getChainName } from '@bgd-labs/react-web3-icons/dist/utils';\nimport { cn } from '@tuwaio/nova-core';\nimport { selectAdapterByKey, Transaction, TransactionAdapter } from '@tuwaio/pulsar-core';\nimport { JSX, ReactNode } from 'react';\nimport { ToastContainerProps, ToastContentProps } from 'react-toastify';\n\nimport { NovaProviderProps, useLabels } from '../providers';\nimport { StatusAwareText } from './StatusAwareText';\nimport { TransactionKey } from './TransactionKey';\nimport { TransactionStatusBadge } from './TransactionStatusBadge';\n\n// --- Prop Types for Customization ---\ntype CustomStatusAwareTextProps = Parameters<typeof StatusAwareText>[0];\ntype CustomTransactionKeyProps<TR, T extends Transaction<TR>, A> = Parameters<typeof TransactionKey<TR, T, A>>[0];\ntype CustomStatusBadgeProps<TR, T extends Transaction<TR>> = Parameters<typeof TransactionStatusBadge<TR, T>>[0];\n/** Props provided to custom action buttons like 'Wallet Info', 'Speed Up', or 'Cancel'. */\ntype CustomActionButtonProps = { onClick: () => void; children: ReactNode };\n\n/**\n * Defines the structure for the `customization` prop, allowing users to override\n * default sub-components with their own implementations.\n */\nexport type ToastTransactionCustomization<TR, T extends Transaction<TR>, A> = {\n components?: {\n /** Override the default title/description component. */\n statusAwareText?: (props: CustomStatusAwareTextProps) => ReactNode;\n /** Override the default component for displaying transaction keys/hashes. */\n transactionKey?: (props: CustomTransactionKeyProps<TR, T, A>) => ReactNode;\n /** Override the default status badge component. */\n statusBadge?: (props: CustomStatusBadgeProps<TR, T>) => ReactNode;\n /** Override the default \"Open wallet info\" button. */\n walletInfoButton?: (props: CustomActionButtonProps) => ReactNode;\n /** Override the default \"Speed Up\" button. */\n speedUpButton?: (props: CustomActionButtonProps) => ReactNode;\n /** Override the default \"Cancel\" button. */\n cancelButton?: (props: CustomActionButtonProps) => ReactNode;\n };\n};\n\nexport type ToastTransactionProps<TR, T extends Transaction<TR>, A> = {\n /** The transaction object to display in the toast. */\n tx: T;\n /** A function to open the main wallet info modal. If not provided, the button will not be rendered. */\n openWalletInfoModal?: (value: boolean) => void;\n /** An optional custom icon to display instead of the default chain icon. */\n icon?: ReactNode;\n /** Optional additional CSS classes for the toast container. */\n className?: string;\n /** An object to customize and override the default internal components. */\n customization?: ToastTransactionCustomization<TR, T, A>;\n\n /** Props from `react-toastify` to control the toast itself. */\n closeToast?: ToastContentProps['closeToast'];\n toastProps?: ToastContainerProps;\n} & Pick<NovaProviderProps<TR, T, A>, 'transactionsPool' | 'adapters' | 'connectedWalletAddress'>;\n\n/**\n * A composite component that renders the content for a transaction toast notification.\n * It is highly customizable and includes actions for speeding up or canceling transactions\n * when they are in a pending state.\n *\n * @template TR The generic type for the transaction tracker registry.\n * @template T The generic type for the transaction object.\n * @param {ToastTransactionProps<TR, T>} props The component props.\n * @returns {JSX.Element} The rendered toast body.\n */\nexport function ToastTransaction<TR, T extends Transaction<TR>, A>({\n openWalletInfoModal,\n tx,\n transactionsPool,\n icon,\n className,\n customization,\n connectedWalletAddress,\n adapters,\n}: ToastTransactionProps<TR, T, A>): JSX.Element {\n const labels = useLabels();\n const C = customization?.components; // Shortcut for customization components\n\n const adapter = selectAdapterByKey({ adapterKey: tx.adapter ?? TransactionAdapter.EVM, adapters });\n\n // A transaction can be replaced when wallet connected and if it's pending, and has the necessary fee info.\n const canReplace =\n connectedWalletAddress &&\n // TODO: need fix with logic for multiple adapters\n tx?.adapter === TransactionAdapter.EVM &&\n tx.nonce !== undefined &&\n tx.pending &&\n tx.maxFeePerGas &&\n tx.maxPriorityFeePerGas;\n\n // --- Action Handlers ---\n const handleCancel = async () => {\n if (canReplace && adapter?.cancelTxAction) await adapter.cancelTxAction(tx);\n };\n\n const handleSpeedUp = async () => {\n if (canReplace && adapter?.speedUpTxAction) await adapter.speedUpTxAction(tx);\n };\n\n return (\n <div className={cn('flex w-full flex-col gap-3 rounded-lg bg-[var(--tuwa-bg-primary)] p-4 shadow-md', className)}>\n {/* --- Header: Icon + Title/Description --- */}\n <div className=\"flex items-start gap-3\">\n <div className=\"w-[40px] flex-shrink-0\" title={getChainName(tx.chainId as number)}>\n {icon ?? <Web3Icon chainId={tx.chainId as number} />}\n </div>\n <div className=\"flex-1\">\n {C?.statusAwareText ? (\n C.statusAwareText({\n txStatus: tx.status,\n source: tx.title,\n fallback: tx.type,\n variant: 'title',\n applyColor: true,\n })\n ) : (\n <StatusAwareText txStatus={tx.status} source={tx.title} fallback={tx.type} variant=\"title\" applyColor />\n )}\n {C?.statusAwareText ? (\n C.statusAwareText({ txStatus: tx.status, source: tx.description, variant: 'description' })\n ) : (\n <StatusAwareText txStatus={tx.status} source={tx.description} variant=\"description\" />\n )}\n </div>\n </div>\n\n {/* --- Body: Hashes + Status/Actions --- */}\n <div>\n {C?.transactionKey ? (\n C.transactionKey({ transactionsPool, adapters, tx, variant: 'toast' })\n ) : (\n <TransactionKey transactionsPool={transactionsPool} adapters={adapters} tx={tx} variant=\"toast\" />\n )}\n <div className=\"mt-3 flex items-center justify-between\">\n {C?.statusBadge ? C.statusBadge({ tx }) : <TransactionStatusBadge tx={tx} />}\n\n {/* Conditionally render Speed Up/Cancel or the Wallet Info button */}\n {canReplace ? (\n <div className=\"flex items-center gap-4\">\n {C?.speedUpButton ? (\n C.speedUpButton({ onClick: handleSpeedUp, children: labels.actions.speedUp })\n ) : (\n <button\n onClick={handleSpeedUp}\n type=\"button\"\n className=\"cursor-pointer text-sm font-medium text-[var(--tuwa-text-accent)] transition-opacity hover:opacity-80\"\n >\n {labels.actions.speedUp}\n </button>\n )}\n {C?.cancelButton ? (\n C.cancelButton({ onClick: handleCancel, children: labels.actions.cancel })\n ) : (\n <button\n onClick={handleCancel}\n type=\"button\"\n className=\"cursor-pointer text-sm font-medium text-[var(--tuwa-text-secondary)] transition-opacity hover:opacity-80\"\n >\n {labels.actions.cancel}\n </button>\n )}\n </div>\n ) : (\n connectedWalletAddress &&\n openWalletInfoModal &&\n (C?.walletInfoButton ? (\n C.walletInfoButton({ onClick: () => openWalletInfoModal(true), children: labels.toast.openWalletInfo })\n ) : (\n <button\n className=\"cursor-pointer bg-gradient-to-r from-[var(--tuwa-button-gradient-from)] to-[var(--tuwa-button-gradient-to)] text-[var(--tuwa-text-on-accent)] font-bold text-xs py-1 px-3 rounded-md shadow-lg hover:shadow-xl hover:from-[var(--tuwa-button-gradient-from-hover)] hover:to-[var(--tuwa-button-gradient-to-hover)] active:scale-95 transition-all duration-200 ease-in-out\"\n onClick={() => openWalletInfoModal(true)}\n type=\"button\"\n >\n {labels.toast.openWalletInfo}\n </button>\n ))\n )}\n </div>\n </div>\n </div>\n );\n}\n","'use client';\n\n/**\n * @file This file contains the `TxErrorBlock` component for displaying transaction error messages.\n */\n\nimport { DocumentDuplicateIcon, ExclamationTriangleIcon } from '@heroicons/react/24/solid';\nimport { cn, useCopyToClipboard } from '@tuwaio/nova-core';\nimport { JSX } from 'react';\n\nimport { useLabels } from '../../providers';\n\nexport type TxErrorBlockProps = {\n /** The error message string to display. If undefined, the component renders nothing. */\n error?: string;\n /** Optional additional CSS classes for the container. */\n className?: string;\n};\n\n/**\n * A component that displays a formatted block for a transaction error message.\n * It includes a title, an icon, the error message in a scrollable area,\n * and a button to copy the message to the clipboard.\n *\n * @param {TxErrorBlockProps} props - The component props.\n * @returns {JSX.Element | null} The rendered error block, or null if no error is provided.\n */\nexport function TxErrorBlock({ error, className }: TxErrorBlockProps): JSX.Element | null {\n const { isCopied, copy } = useCopyToClipboard();\n const labels = useLabels();\n\n // Don't render anything if there is no error message.\n if (!error) {\n return null;\n }\n\n return (\n <div\n className={cn(\n 'rounded-lg border border-[var(--tuwa-error-icon)]/30 bg-[var(--tuwa-error-bg)] p-3 text-sm',\n className,\n )}\n >\n {/* --- Header with Title and Copy Button --- */}\n <div className=\"mb-2 flex items-center justify-between\">\n <div className=\"flex items-center gap-2 font-bold text-[var(--tuwa-error-icon)]\">\n <ExclamationTriangleIcon className=\"h-5 w-5\" />\n <span>{labels.txError.title}</span>\n </div>\n <button\n type=\"button\"\n onClick={() => copy(error)}\n title={labels.actions.copy}\n aria-label={labels.actions.copy}\n className=\"cursor-pointer text-[var(--tuwa-error-icon)]/50 transition-colors hover:text-[var(--tuwa-error-icon)]\"\n >\n <DocumentDuplicateIcon className=\"h-5 w-5\" />\n </button>\n </div>\n\n {/* --- Scrollable Error Message --- */}\n <div className=\"max-h-24 overflow-y-auto rounded bg-[var(--tuwa-bg-primary)] p-2\">\n <p className=\"font-mono text-xs text-[var(--tuwa-error-text)] break-all\">{error}</p>\n </div>\n\n {/* --- \"Copied!\" Feedback Text --- */}\n <div className=\"mt-1 h-5 text-right\">\n <p\n className={cn(\n 'text-xs text-[var(--tuwa-success-icon)] transition-opacity duration-300 ease-in-out',\n isCopied ? 'opacity-100' : 'opacity-0',\n )}\n >\n {labels.txError.copied}\n </p>\n </div>\n </div>\n );\n}\n","/**\n * @file This file contains the `TxInfoBlock` component, which displays key details about a transaction.\n */\n\nimport { Web3Icon } from '@bgd-labs/react-web3-icons';\nimport { getChainName } from '@bgd-labs/react-web3-icons/dist/utils';\nimport { cn } from '@tuwaio/nova-core';\nimport { Transaction } from '@tuwaio/pulsar-core';\nimport dayjs from 'dayjs';\nimport { JSX, ReactNode } from 'react';\n\nimport { NovaProviderProps, useLabels } from '../../providers';\nimport { ToastTransactionKeyProps, TransactionKey } from '../TransactionKey';\n\n// --- Prop Types for Customization ---\ntype CustomInfoRowProps = { label: ReactNode; value: ReactNode };\n\n/**\n * Defines the customization options for the `TxInfoBlock` component.\n */\nexport type TxInfoBlockCustomization<TR, T extends Transaction<TR>, A> = {\n components?: {\n /** A render prop to replace the default label-value row component. */\n infoRow?: (props: CustomInfoRowProps) => ReactNode;\n /**\n * A render prop to customize the rendering of the transaction keys/hashes.\n * This is passed down to the underlying `TransactionKey` component.\n */\n transactionKey?: ToastTransactionKeyProps<TR, T, A>['renderHashLink'];\n };\n};\n\n// A local component for displaying a label-value pair.\nfunction InfoRow({ label, value }: { label: ReactNode; value: ReactNode }) {\n return (\n <div className=\"flex items-center justify-between text-sm\">\n <span className=\"text-[var(--tuwa-text-secondary)]\">{label}</span>\n <span className=\"font-medium text-[var(--tuwa-text-primary)]\">{value}</span>\n </div>\n );\n}\n\nexport type TxInfoBlockProps<TR, T extends Transaction<TR>, A> = {\n tx: T & {\n desiredChainID?: number;\n };\n className?: string;\n customization?: TxInfoBlockCustomization<TR, T, A>;\n} & Pick<NovaProviderProps<TR, T, A>, 'adapters' | 'transactionsPool'>;\n\n/**\n * A component that displays a block of essential transaction details,\n * such as network, start time, and relevant hashes/keys.\n *\n * @param {object} props - The component props.\n * @returns {JSX.Element} The rendered info block.\n */\nexport function TxInfoBlock<TR, T extends Transaction<TR>, A>({\n tx,\n adapters,\n transactionsPool,\n className,\n customization,\n}: TxInfoBlockProps<TR, T, A>): JSX.Element {\n const labels = useLabels();\n\n const renderInfoRow = (props: CustomInfoRowProps) => {\n return customization?.components?.infoRow ? customization.components.infoRow(props) : <InfoRow {...props} />;\n };\n\n return (\n <div\n className={cn(\n 'flex flex-col gap-3 rounded-lg border border-[var(--tuwa-border-primary)] bg-[var(--tuwa-bg-primary)] p-3',\n className,\n )}\n >\n {/* --- Network and Timestamp Info --- */}\n {renderInfoRow({\n label: labels.txInfo.network,\n value: (\n <div className=\"flex items-center justify-end gap-2\">\n <div className=\"h-4 w-4\">\n <Web3Icon chainId={(tx.chainId ?? tx?.desiredChainID ?? 1) as number} />\n </div>\n <span>{getChainName((tx.chainId ?? tx?.desiredChainID ?? 1) as number)}</span>\n </div>\n ),\n })}\n {tx.localTimestamp &&\n renderInfoRow({\n label: labels.txInfo.started,\n value: dayjs.unix(tx.localTimestamp).format('MMM D, HH:mm:ss'),\n })}\n\n {/* --- Transaction Hashes/Keys --- */}\n {/* Reusing the TransactionKey component to avoid code duplication. */}\n <div className=\"border-t border-[var(--tuwa-border-primary)] pt-3\">\n <TransactionKey\n tx={tx}\n adapters={adapters}\n transactionsPool={transactionsPool}\n variant=\"history\" // 'history' variant has suitable styling for this block\n renderHashLink={customization?.components?.transactionKey}\n />\n </div>\n </div>\n );\n}\n","/**\n * @file This file contains the `TxProgressIndicator` component, a visual step-by-step progress bar for transactions.\n */\n\nimport { ArrowPathIcon, CheckIcon, ExclamationTriangleIcon } from '@heroicons/react/24/solid';\nimport { cn } from '@tuwaio/nova-core';\nimport { ComponentType, JSX } from 'react';\n\nimport { useLabels } from '../../providers';\n\n// --- Sub-component: Step ---\n\nexport type StepStatus = 'active' | 'completed' | 'error' | 'inactive' | 'replaced';\nexport type StepProps = { status: StepStatus; label: string; isFirst?: boolean; isLast?: boolean; className?: string };\n\n/**\n * Renders a single step in the progress indicator.\n * This is an internal component but can be replaced via customization.\n */\nfunction Step({ status, label, isFirst = false }: StepProps): JSX.Element {\n const state = {\n isCompleted: status === 'completed',\n isError: status === 'error',\n isReplaced: status === 'replaced',\n isActive: status === 'active',\n };\n\n const colorConfig = {\n line: cn({\n 'bg-[var(--tuwa-success-icon)]': state.isCompleted,\n 'bg-[var(--tuwa-error-icon)]': state.isError,\n 'bg-[var(--tuwa-info-icon)]': state.isReplaced,\n 'bg-[var(--tuwa-pending-icon)]': state.isActive,\n 'bg-[var(--tuwa-border-primary)]': status === 'inactive',\n }),\n border: cn({\n 'border-[var(--tuwa-success-icon)]': state.isCompleted,\n 'border-[var(--tuwa-error-icon)]': state.isError,\n 'border-[var(--tuwa-info-icon)]': state.isReplaced,\n 'border-[var(--tuwa-pending-icon)]': state.isActive,\n 'border-[var(--tuwa-border-primary)]': status === 'inactive',\n }),\n fill: cn({\n 'bg-[var(--tuwa-success-icon)]': state.isCompleted,\n 'bg-[var(--tuwa-error-icon)]': state.isError,\n 'bg-[var(--tuwa-info-icon)]': state.isReplaced,\n }),\n pulse: cn({ 'bg-[var(--tuwa-pending-icon)]': state.isActive }),\n };\n\n return (\n <div className=\"relative flex flex-1 flex-col items-center min-w-[80px]\">\n {/* Connecting line */}\n {!isFirst && <div className={cn('absolute right-1/2 top-[10px] h-0.5 w-full', colorConfig.line)} />}\n\n {/* Circle and Icon */}\n <div\n className={cn(\n 'relative z-10 flex h-5 w-5 items-center justify-center rounded-full border-2',\n colorConfig.border,\n colorConfig.fill,\n )}\n >\n {state.isCompleted && <CheckIcon className=\"h-3 w-3 text-white\" />}\n {state.isError && <ExclamationTriangleIcon className=\"h-3 w-3 text-white\" />}\n {state.isReplaced && <ArrowPathIcon className=\"h-3 w-3 text-white\" />}\n {state.isActive && <div className={cn('h-2 w-2 animate-pulse rounded-full', colorConfig.pulse)} />}\n </div>\n\n {/* Label */}\n <span\n className={cn(\n 'mt-2 text-center text-xs',\n status !== 'inactive' ? 'font-semibold text-[var(--tuwa-text-primary)]' : 'text-[var(--tuwa-text-secondary)]',\n )}\n >\n {label}\n </span>\n </div>\n );\n}\n\n// --- Main Component: TxProgressIndicator ---\n\nexport interface TxProgressIndicatorProps {\n isProcessing?: boolean;\n isSucceed?: boolean;\n isFailed?: boolean;\n isReplaced?: boolean;\n className?: string;\n /** A custom component to use instead of the default `Step`. */\n StepComponent?: ComponentType<StepProps>;\n}\n\n/**\n * A 3-step progress indicator that visually represents the lifecycle of a transaction.\n *\n * @param {TxProgressIndicatorProps} props - The component props.\n * @returns {JSX.Element} The rendered progress indicator.\n */\nexport function TxProgressIndicator({\n isProcessing,\n isSucceed,\n isFailed,\n isReplaced,\n className,\n StepComponent = Step,\n}: TxProgressIndicatorProps): JSX.Element {\n const labels = useLabels();\n\n // This logic determines the status of each of the three steps.\n const getStepStatus = (stepIndex: 1 | 2 | 3): StepStatus => {\n // Step 1: \"Created\" - Always completed once the process starts.\n if (stepIndex === 1) return 'completed';\n\n // Step 2: \"Processing\"\n if (stepIndex === 2) {\n if (isSucceed || isFailed || isReplaced) return 'completed';\n if (isProcessing) return 'active';\n }\n\n // Step 3: \"Final\"\n if (stepIndex === 3) {\n if (isSucceed) return 'completed';\n if (isFailed) return 'error';\n if (isReplaced) return 'replaced';\n if (isProcessing) return 'active';\n }\n\n return 'inactive';\n };\n\n const getStepLabel = (stepIndex: 1 | 2 | 3): string => {\n if (stepIndex === 1) return labels.trackingModal.progressIndicator.created;\n if (stepIndex === 2) return labels.trackingModal.progressIndicator.processing;\n // For step 3, the label changes based on the final status.\n if (isFailed) return labels.statuses.failed;\n if (isReplaced) return labels.statuses.replaced;\n return labels.trackingModal.progressIndicator.succeed;\n };\n\n const steps: StepProps[] = [\n { status: getStepStatus(1), label: getStepLabel(1), isFirst: true },\n { status: getStepStatus(2), label: getStepLabel(2) },\n { status: getStepStatus(3), label: getStepLabel(3), isLast: true },\n ];\n\n return (\n <div className={cn('flex w-full items-start px-4 pt-2 pb-1', className)}>\n {steps.map((stepProps, index) => (\n <StepComponent key={index} {...stepProps} />\n ))}\n </div>\n );\n}\n","/**\n * @file This file contains the `TxStatusVisual` component, which displays a large icon representing the transaction's status.\n */\n\nimport { ArrowPathIcon, CheckCircleIcon, ClockIcon, ExclamationCircleIcon } from '@heroicons/react/24/solid';\nimport { JSX, ReactNode } from 'react';\n\nexport type TxStatusVisualProps = {\n /** True if the transaction is currently being processed (e.g., in the mempool). */\n isProcessing?: boolean;\n /** True if the transaction has successfully completed. */\n isSucceed?: boolean;\n /** True if the transaction has failed or was reverted. */\n isFailed?: boolean;\n /** True if the transaction was replaced (e.g., sped up). */\n isReplaced?: boolean;\n};\n\n/**\n * A component that renders a large, animated icon to visually represent the\n * current state of a transaction within the tracking modal.\n *\n * @param {TxStatusVisualProps} props - The component props.\n * @returns {JSX.Element} The rendered visual status indicator.\n */\nexport function TxStatusVisual({ isProcessing, isSucceed, isFailed, isReplaced }: TxStatusVisualProps): JSX.Element {\n let icon: ReactNode;\n\n // The logic is structured as an if/else if chain to ensure only one icon is selected.\n if (isSucceed) {\n icon = <CheckCircleIcon className=\"h-16 w-16 text-[var(--tuwa-success-icon)]\" />;\n } else if (isFailed) {\n icon = <ExclamationCircleIcon className=\"h-16 w-16 text-[var(--tuwa-error-icon)]\" />;\n } else if (isReplaced) {\n icon = <ArrowPathIcon className=\"h-16 w-16 text-[var(--tuwa-info-icon)]\" />;\n } else if (isProcessing) {\n icon = <ArrowPathIcon className=\"h-16 w-16 animate-spin text-[var(--tuwa-text-accent)]\" />;\n } else {\n // Default state when the transaction is created but not yet processing.\n icon = <ClockIcon className=\"h-16 w-16 animate-pulse text-[var(--tuwa-pending-icon)]\" />;\n }\n\n return <div className=\"flex justify-center py-4\">{icon}</div>;\n}\n","// TODO: need fix with logic for multiple adapters\n\n/**\n * @file This file contains the `TrackingTxModal`, the main UI for displaying the detailed lifecycle of a single transaction.\n * It provides real-time feedback, customization options, and actions like retry, speed up, and cancel.\n */\nimport { XMarkIcon } from '@heroicons/react/24/solid';\nimport * as Dialog from '@radix-ui/react-dialog';\nimport { cn } from '@tuwaio/nova-core';\nimport {\n InitialTransactionParams,\n selectAdapterByKey,\n Transaction,\n TransactionAdapter,\n TransactionStatus,\n} from '@tuwaio/pulsar-core';\nimport { AnimatePresence, motion, MotionProps } from 'framer-motion';\nimport { ComponentPropsWithoutRef, JSX, ReactNode, useEffect, useState } from 'react';\n\nimport { NovaProviderProps, useLabels } from '../../providers';\nimport { StatusAwareText } from '../StatusAwareText';\nimport { TxErrorBlock, TxErrorBlockProps } from './TxErrorBlock';\nimport { TxInfoBlock, TxInfoBlockProps } from './TxInfoBlock';\nimport { TxProgressIndicator, TxProgressIndicatorProps } from './TxProgressIndicator';\nimport { TxStatusVisual, TxStatusVisualProps } from './TxStatusVisual';\n\n// --- Prop Types for Customization ---\n\n/** Props provided to a custom header component. */\ntype CustomHeaderProps = { onClose: (txKey?: string) => void };\n/** Props provided to a custom footer component. */\ntype CustomFooterProps = {\n onClose: (txKey?: string) => void;\n onOpenWalletInfo: () => void;\n onRetry?: () => void;\n onSpeedUp?: () => void;\n onCancel?: () => void;\n isProcessing?: boolean;\n};\n\n/**\n * Defines the customization options for the TrackingTxModal.\n * Allows overriding modal behavior, animations, and individual UI components.\n */\nexport type TrackingTxModalCustomization<TR, T extends Transaction<TR>, A> = {\n /** Custom props to pass to the underlying Radix UI `Dialog.Content` component. */\n modalProps?: Partial<ComponentPropsWithoutRef<typeof Dialog.Content>>;\n /** Custom Framer Motion animation properties for the modal's entrance and exit. */\n motionProps?: MotionProps;\n /** A record of custom components to override parts of the modal's UI. */\n components?: {\n header?: (props: CustomHeaderProps) => ReactNode;\n footer?: (props: CustomFooterProps) => ReactNode;\n statusVisual?: (props: TxStatusVisualProps) => ReactNode;\n progressIndicator?: (props: TxProgressIndicatorProps) => ReactNode;\n infoBlock?: (props: TxInfoBlockProps<TR, T, A>) => ReactNode;\n errorBlock?: (props: TxErrorBlockProps) => ReactNode;\n };\n};\n\nexport interface TrackingTxModalProps<TR, T extends Transaction<TR>, A>\n extends Pick<\n NovaProviderProps<TR, T, A>,\n 'handleTransaction' | 'initialTx' | 'actions' | 'transactionsPool' | 'adapters' | 'connectedAdapterType'\n > {\n /** A function to close the modal. */\n onClose: (txKey?: string) => void;\n /** A function to open the main wallet info modal. */\n onOpenWalletInfo: () => void;\n /** Optional additional CSS classes for the modal's container. */\n className?: string;\n /** An object containing all customization options for the modal. */\n customization?: TrackingTxModalCustomization<TR, T, A>;\n}\n\n/**\n * A detailed modal that displays the real-time status and lifecycle of a transaction.\n * It opens automatically for transactions initiated with `withTrackedModal: true`.\n *\n * @template TR - The generic type for the transaction tracker registry.\n * @template T - The generic type for the transaction object.\n * @param {TrackingTxModalProps<TR, T>} props - The component props.\n * @returns {JSX.Element} The rendered tracking modal.\n */\nexport function TrackingTxModal<TR, T extends Transaction<TR>, A>({\n adapters,\n onClose,\n onOpenWalletInfo,\n className,\n customization,\n transactionsPool,\n actions,\n handleTransaction,\n initialTx,\n connectedAdapterType,\n}: TrackingTxModalProps<TR, T, A>): JSX.Element {\n const labels = useLabels();\n const C = customization?.components;\n\n const [trackedTx, setTrackedTx] = useState<T | undefined>(undefined);\n\n // This effect syncs the modal's internal state (`trackedTx`) with the global `transactionsPool`.\n // It ensures the modal always displays the latest information for the tracked transaction.\n useEffect(() => {\n let currentTx: T | undefined;\n if (transactionsPool) {\n if (initialTx?.lastTxKey) {\n currentTx = transactionsPool[initialTx.lastTxKey];\n } else if (trackedTx) {\n currentTx = transactionsPool[trackedTx.txKey];\n }\n }\n setTrackedTx(currentTx);\n }, [transactionsPool, initialTx, trackedTx]);\n\n // The transaction object to use for displaying information. Prioritizes the tracked transaction.\n const txToDisplay = trackedTx ?? initialTx;\n\n // --- Derived State Constants for Clarity ---\n const txStatus = trackedTx?.status;\n const isInitializing = initialTx?.isInitializing ?? false;\n const isPending = trackedTx?.pending ?? true;\n const isProcessing = isInitializing || isPending;\n const isError = trackedTx?.isError || !!initialTx?.errorMessage;\n const canRetry =\n txToDisplay?.actionKey && actions?.[txToDisplay.actionKey] && handleTransaction && !!connectedAdapterType;\n const canReplace =\n !!connectedAdapterType &&\n trackedTx?.adapter === TransactionAdapter.EVM &&\n trackedTx?.nonce !== undefined &&\n trackedTx.pending &&\n trackedTx.maxFeePerGas &&\n trackedTx.maxPriorityFeePerGas;\n\n const adapter = selectAdapterByKey({ adapterKey: trackedTx?.adapter ?? TransactionAdapter.EVM, adapters });\n\n const motionProps: MotionProps = {\n initial: { opacity: 0, scale: 0.95 },\n animate: { opacity: 1, scale: 1 },\n exit: { opacity: 0, scale: 0.95 },\n transition: { duration: 0.2, ease: 'easeOut' },\n ...customization?.motionProps,\n };\n\n // --- Action Handlers ---\n const handleRetry = async () => {\n if (!canRetry || !txToDisplay?.actionKey) return;\n const retryParams: InitialTransactionParams = {\n adapter: TransactionAdapter.EVM,\n type: txToDisplay.type,\n desiredChainID: trackedTx?.chainId || initialTx?.desiredChainID || 1,\n actionKey: txToDisplay.actionKey,\n title: txToDisplay.title,\n description: txToDisplay.description,\n payload: txToDisplay.payload,\n withTrackedModal: true,\n };\n if (adapter?.retryTxAction) {\n await adapter.retryTxAction({\n tx: retryParams,\n txKey: trackedTx?.txKey ?? '',\n actions,\n onClose,\n handleTransaction,\n });\n }\n };\n\n const handleCancel = async () => {\n if (canReplace && trackedTx && adapter?.cancelTxAction) await adapter.cancelTxAction(trackedTx);\n };\n\n const handleSpeedUp = async () => {\n if (canReplace && trackedTx && adapter?.speedUpTxAction) await adapter.speedUpTxAction(trackedTx);\n };\n\n const isOpen = (trackedTx?.isTrackedModalOpen || initialTx?.withTrackedModal) ?? false;\n\n return (\n <Dialog.Root open={isOpen} onOpenChange={(open) => !open && onClose(trackedTx?.txKey)}>\n <Dialog.Portal>\n <AnimatePresence>\n {isOpen && (\n <>\n <Dialog.Overlay asChild>\n <motion.div\n className=\"fixed inset-0 bg-black/60 z-50\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n />\n </Dialog.Overlay>\n <Dialog.Content\n className=\"fixed left-1/2 top-1/2 w-full max-w-md -translate-x-1/2 -translate-y-1/2 outline-none z-50\"\n onOpenAutoFocus={() => setTrackedTx(undefined)}\n {...customization?.modalProps}\n asChild\n >\n <motion.div {...motionProps}>\n <div\n className={cn(\n 'relative flex flex-col gap-3 rounded-2xl bg-[var(--tuwa-bg-primary)] p-5 pt-0 shadow-2xl max-h-[98dvh] overflow-y-auto',\n className,\n )}\n >\n {/* Header: Title and Close Button */}\n {C?.header ? (\n C.header({ onClose: () => onClose(trackedTx?.txKey) })\n ) : (\n <header className=\"flex items-start justify-between sticky top-0 w-full z-10 pt-5 pb-2 bg-[var(--tuwa-bg-primary)]\">\n <Dialog.Title className=\"text-lg font-bold text-[var(--tuwa-text-primary)]\">\n {labels.trackingModal.title}\n </Dialog.Title>\n <Dialog.Close asChild>\n <button\n type=\"button\"\n onClick={() => onClose(trackedTx?.txKey)}\n aria-label={labels.actions.close}\n className=\"cursor-pointer ml-2 -mt-1 rounded-full p-1 text-[var(--tuwa-text-tertiary)] transition-colors hover:bg-[var(--tuwa-bg-muted)] hover:text-[var(--tuwa-text-primary)]\"\n >\n <XMarkIcon className=\"h-5 w-5\" />\n </button>\n </Dialog.Close>\n </header>\n )}\n\n {/* Main Content: Visuals, Info, and Error Blocks */}\n <main className=\"flex flex-col gap-3\">\n {C?.statusVisual ? (\n C.statusVisual({\n isProcessing,\n isSucceed: txStatus === TransactionStatus.Success,\n isFailed: isError,\n isReplaced: txStatus === TransactionStatus.Replaced,\n })\n ) : (\n <TxStatusVisual\n isProcessing={isProcessing}\n isSucceed={txStatus === TransactionStatus.Success}\n isFailed={isError}\n isReplaced={txStatus === TransactionStatus.Replaced}\n />\n )}\n <div className=\"flex flex-col items-center text-center -mt-2\">\n <StatusAwareText\n txStatus={txStatus}\n source={txToDisplay?.title}\n fallback={txToDisplay?.type}\n variant=\"title\"\n applyColor\n className=\"text-xl\"\n />\n <StatusAwareText\n txStatus={txStatus}\n source={txToDisplay?.description}\n variant=\"description\"\n className=\"mt-0\"\n />\n </div>\n {C?.progressIndicator ? (\n C.progressIndicator({\n isProcessing,\n isSucceed: txStatus === TransactionStatus.Success,\n isFailed: isError,\n isReplaced: txStatus === TransactionStatus.Replaced,\n })\n ) : (\n <TxProgressIndicator\n isProcessing={isProcessing}\n isSucceed={txStatus === TransactionStatus.Success}\n isFailed={isError}\n isReplaced={txStatus === TransactionStatus.Replaced}\n />\n )}\n {C?.infoBlock ? (\n C.infoBlock({ tx: txToDisplay as T, adapters, transactionsPool })\n ) : (\n <TxInfoBlock tx={txToDisplay as T} adapters={adapters} transactionsPool={transactionsPool} />\n )}\n {C?.errorBlock ? (\n C.errorBlock({ error: trackedTx?.errorMessage || initialTx?.errorMessage })\n ) : (\n <TxErrorBlock error={trackedTx?.errorMessage || initialTx?.errorMessage} />\n )}\n </main>\n\n {/* Footer: Action Buttons */}\n {C?.footer ? (\n C.footer({\n onClose: () => onClose(trackedTx?.txKey),\n onOpenWalletInfo,\n isProcessing,\n onRetry: canRetry ? handleRetry : undefined,\n onSpeedUp: canReplace ? handleSpeedUp : undefined,\n onCancel: canReplace ? handleCancel : undefined,\n })\n ) : (\n <footer className=\"mt-2 flex w-full items-center justify-between border-t border-[var(--tuwa-border-primary)] pt-4\">\n <div className=\"flex items-center gap-4\">\n {canReplace && (\n <>\n <button\n type=\"button\"\n onClick={handleSpeedUp}\n className=\"cursor-pointer text-sm font-medium text-[var(--tuwa-text-accent)] transition-opacity hover:opacity-80\"\n >\n {labels.actions.speedUp}\n </button>\n <button\n type=\"button\"\n onClick={handleCancel}\n className=\"cursor-pointer text-sm font-medium text-[var(--tuwa-text-secondary)] transition-opacity hover:opacity-80\"\n >\n {labels.actions.cancel}\n </button>\n </>\n )}\n </div>\n <div className=\"flex items-center gap-3\">\n {isError && canRetry ? (\n <button\n type=\"button\"\n onClick={handleRetry}\n className=\"cursor-pointer rounded-md bg-[var(--tuwa-button-gradient-from)] px-4 py-2 text-sm font-semibold text-[var(--tuwa-text-on-accent)] transition-opacity hover:opacity-90\"\n >\n {labels.trackingModal.retry}\n </button>\n ) : (\n !canReplace && (\n <button\n type=\"button\"\n onClick={onOpenWalletInfo}\n className=\"cursor-pointer rounded-md bg-[var(--tuwa-bg-muted)] px-4 py-2 text-sm font-semibold text-[var(--tuwa-text-primary)] transition-colors hover:bg-[var(--tuwa-border-primary)]\"\n >\n {labels.trackingModal.walletInfo}\n </button>\n )\n )}\n <button\n type=\"button\"\n onClick={() => onClose(trackedTx?.txKey)}\n disabled={isProcessing && !canReplace}\n className=\"cursor-pointer rounded-md bg-[var(--tuwa-bg-muted)] px-4 py-2 text-sm font-semibold text-[var(--tuwa-text-primary)] transition-colors hover:bg-[var(--tuwa-border-primary)] disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {isProcessing && !canReplace ? labels.trackingModal.processing : labels.trackingModal.close}\n </button>\n </div>\n </footer>\n )}\n </div>\n </motion.div>\n </Dialog.Content>\n </>\n )}\n </AnimatePresence>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n","/**\n * @file This file contains the `TransactionHistoryItem` component, which renders a single transaction\n * in a list format for the transaction history view.\n */\n\nimport { Web3Icon } from '@bgd-labs/react-web3-icons';\nimport { cn } from '@tuwaio/nova-core';\nimport { Transaction, TransactionPool } from '@tuwaio/pulsar-core';\nimport dayjs from 'dayjs';\nimport relativeTime from 'dayjs/plugin/relativeTime';\nimport { JSX, ReactNode } from 'react';\n\nimport { NovaProviderProps } from '../providers';\nimport { StatusAwareText } from './StatusAwareText';\nimport { TransactionKey } from './TransactionKey';\nimport { TransactionStatusBadge } from './TransactionStatusBadge';\n\n// Extend dayjs with the relativeTime plugin to format timestamps as \"a few seconds ago\".\ndayjs.extend(relativeTime);\n\n// --- Prop Types for Customization ---\ntype CustomIconProps = { chainId: number };\ntype CustomStatusAwareTextProps = Parameters<typeof StatusAwareText>[0];\ntype CustomTimestampProps = { timestamp?: number };\ntype CustomStatusBadgeProps<TR, T extends Transaction<TR>> = Parameters<typeof TransactionStatusBadge<TR, T>>[0];\ntype CustomTransactionKeyProps<TR, T extends Transaction<TR>, A> = Parameters<typeof TransactionKey<TR, T, A>>[0];\n\n/**\n * Defines the structure for the `customization` prop, allowing users to override\n * default sub-components with their own implementations for a history item.\n */\nexport type TransactionHistoryItemCustomization<TR, T extends Transaction<TR>, A> = {\n components?: {\n /** Override the default chain icon. */\n icon?: (props: CustomIconProps) => ReactNode;\n /** Override the default title component. */\n title?: (props: CustomStatusAwareTextProps) => ReactNode;\n /** Override the default description component. */\n description?: (props: CustomStatusAwareTextProps) => ReactNode;\n /** Override the default timestamp component. */\n timestamp?: (props: CustomTimestampProps) => ReactNode;\n /** Override the default status badge component. */\n statusBadge?: (props: CustomStatusBadgeProps<TR, T>) => ReactNode;\n /** Override the default component for displaying transaction keys/hashes. */\n transactionKey?: (props: CustomTransactionKeyProps<TR, T, A>) => ReactNode;\n };\n};\n\nexport type TransactionHistoryItemProps<TR, T extends Transaction<TR>, A> = {\n /** The transaction object to display. */\n tx: T;\n /** The entire pool of transactions. */\n transactionsPool: TransactionPool<TR, T>;\n /** Optional additional CSS classes for the container. */\n className?: string;\n /** An object to customize and override the default internal components. */\n customization?: TransactionHistoryItemCustomization<TR, T, A>;\n} & Pick<NovaProviderProps<TR, T, A>, 'adapters'>;\n\n/**\n * A component that renders a single row in the transaction history list.\n * It is highly customizable via the `customization` prop.\n *\n * @param {TransactionHistoryItemProps<TR, T>} props - The component props.\n * @returns {JSX.Element} The rendered history item.\n */\nexport function TransactionHistoryItem<TR, T extends Transaction<TR>, A>({\n tx,\n adapters,\n transactionsPool,\n className,\n customization,\n}: TransactionHistoryItemProps<TR, T, A>): JSX.Element {\n const C = customization?.components; // Shortcut for customization components\n\n return (\n <div\n className={cn(\n 'flex flex-col gap-2 border-b border-[var(--tuwa-border-secondary)] p-3 transition-colors hover:bg-[var(--tuwa-bg-secondary)]',\n className,\n )}\n >\n <div className=\"flex items-start justify-between\">\n {/* --- Main Info: Icon, Title, Timestamp, Description --- */}\n <div className=\"flex items-center gap-4\">\n <div className=\"flex h-10 w-10 flex-shrink-0 items-center justify-center rounded-full bg-[var(--tuwa-bg-muted)]\">\n {C?.icon ? (\n C.icon({ chainId: tx.chainId as number })\n ) : (\n <div className=\"h-8 w-8 text-[var(--tuwa-text-secondary)]\">\n <Web3Icon chainId={tx.chainId as number} />\n </div>\n )}\n </div>\n <div>\n {C?.title ? (\n C.title({ txStatus: tx.status, source: tx.title, fallback: tx.type, variant: 'title', applyColor: true })\n ) : (\n <StatusAwareText txStatus={tx.status} source={tx.title} fallback={tx.type} variant=\"title\" applyColor />\n )}\n\n {C?.timestamp ? (\n C.timestamp({ timestamp: tx.localTimestamp })\n ) : (\n <span className=\"mb-1 block text-xs text-[var(--tuwa-text-secondary)]\">\n {tx.localTimestamp ? dayjs.unix(tx.localTimestamp).fromNow() : '...'}\n </span>\n )}\n\n {C?.description ? (\n C.description({ txStatus: tx.status, source: tx.description, variant: 'description' })\n ) : (\n <StatusAwareText txStatus={tx.status} source={tx.description} variant=\"description\" />\n )}\n </div>\n </div>\n\n {/* --- Status Badge --- */}\n {C?.statusBadge ? C.statusBadge({ tx }) : <TransactionStatusBadge tx={tx} />}\n </div>\n\n {/* --- Transaction Keys/Hashes --- */}\n {C?.transactionKey ? (\n C.transactionKey({ tx, adapters, transactionsPool, variant: 'history' })\n ) : (\n <TransactionKey tx={tx} adapters={adapters} transactionsPool={transactionsPool} variant=\"history\" />\n )}\n </div>\n );\n}\n","/**\n * @file This file contains the `TransactionsHistory` component, which displays a list of past and pending transactions.\n */\n\nimport { cn } from '@tuwaio/nova-core';\nimport { selectAllTransactionsByActiveWallet, Transaction } from '@tuwaio/pulsar-core';\nimport { ComponentType, JSX, ReactNode } from 'react';\n\nimport { NovaProviderProps, useLabels } from '../providers';\nimport { TransactionHistoryItem, TransactionHistoryItemProps } from './TransactionHistoryItem';\nimport { WalletInfoModalProps } from './WalletInfoModal';\n\ntype CustomPlaceholderProps = { title: string; message: string };\n\n/**\n * Defines the customization options for the TransactionsHistory component.\n */\nexport type TransactionsHistoryCustomization<TR, T extends Transaction<TR>, A> = {\n classNames?: {\n /** CSS classes for the list's wrapper `div`. */\n listWrapper?: string;\n };\n components?: {\n /**\n * A render prop to replace the default placeholder component\n * (e.g., for \"Connect Wallet\" or \"No Transactions\").\n */\n placeholder?: (props: CustomPlaceholderProps) => ReactNode;\n /**\n * A custom component to use instead of the default `TransactionHistoryItem`.\n * This should be a component type, not a render function.\n */\n HistoryItem?: ComponentType<TransactionHistoryItemProps<TR, T, A>>;\n };\n};\n\n// A local component for displaying placeholder messages.\nfunction HistoryPlaceholder({ title, message, className }: { title: string; message: string; className?: string }) {\n return (\n <div className={cn('rounded-lg bg-[var(--tuwa-bg-muted)] p-8 text-center', className)}>\n <h4 className=\"font-semibold text-[var(--tuwa-text-primary)]\">{title}</h4>\n <p className=\"mt-1 text-sm text-[var(--tuwa-text-secondary)]\">{message}</p>\n </div>\n );\n}\n\n/**\n * A component that displays a scrollable list of transactions for the connected wallet.\n * It handles states for when a wallet is not connected or when there is no history.\n *\n * @param {WalletInfoModalProps<TR, T> & { customization?: TransactionsHistoryCustomization<TR, T> }} props\n * @returns {JSX.Element} The rendered transaction history section.\n */\nexport function TransactionsHistory<TR, T extends Transaction<TR>, A>({\n adapters,\n connectedWalletAddress,\n transactionsPool,\n className,\n customization,\n}: WalletInfoModalProps<TR, T, A> &\n Pick<NovaProviderProps<TR, T, A>, 'adapters'> & {\n className?: string;\n customization?: TransactionsHistoryCustomization<TR, T, A>;\n }): JSX.Element {\n const labels = useLabels();\n const C = customization?.components;\n\n const transactionsByWallet = connectedWalletAddress\n ? selectAllTransactionsByActiveWallet(transactionsPool, connectedWalletAddress)\n : [];\n\n // Sort transactions by timestamp, newest first.\n const sortedTransactions = [...transactionsByWallet].sort(\n (a, b) => (b.localTimestamp ?? 0) - (a.localTimestamp ?? 0),\n );\n\n const renderPlaceholder = (title: string, message: string) => {\n if (C?.placeholder) {\n return C.placeholder({ title, message });\n }\n return <HistoryPlaceholder title={title} message={message} />;\n };\n\n // Use the custom component if provided, otherwise default to TransactionHistoryItem.\n const HistoryItemComponent = C?.HistoryItem || TransactionHistoryItem;\n\n return (\n <div className={cn('flex flex-col gap-y-3', className)}>\n <h3 className=\"text-lg font-bold text-[var(--tuwa-text-primary)]\">{labels.walletModal.history.title}</h3>\n\n {!connectedWalletAddress ? (\n // Case 1: Wallet is not connected.\n renderPlaceholder(\n labels.walletModal.history.connectWalletTitle,\n labels.walletModal.history.connectWalletMessage,\n )\n ) : sortedTransactions.length > 0 ? (\n // Case 2: Wallet is connected and there are transactions.\n <div\n className={cn(\n 'max-h-[400px] overflow-y-auto rounded-lg border border-[var(--tuwa-border-primary)] bg-[var(--tuwa-bg-primary)]',\n customization?.classNames?.listWrapper,\n )}\n >\n {sortedTransactions.map((tx) => (\n <HistoryItemComponent\n key={tx.txKey} // The key is now correctly and safely handled here.\n tx={tx}\n transactionsPool={transactionsPool}\n adapters={adapters}\n />\n ))}\n </div>\n ) : (\n // Case 3: Wallet is connected, but no transactions.\n renderPlaceholder(\n labels.walletModal.history.noTransactionsTitle,\n labels.walletModal.history.noTransactionsMessage,\n )\n )}\n </div>\n );\n}\n","/**\n * @file This file contains the `WalletAddressDisplay` component, a UI element for showing a wallet address.\n */\n\nimport { ArrowTopRightOnSquareIcon, CheckIcon, DocumentDuplicateIcon } from '@heroicons/react/24/solid';\nimport { cn, textCenterEllipsis, useCopyToClipboard } from '@tuwaio/nova-core';\nimport { JSX } from 'react';\n\nimport { useLabels } from '../../providers';\n\nexport type WalletAddressDisplayProps = {\n /** The wallet address to display. */\n address: string;\n explorerUrl: string;\n /** Optional additional CSS classes for the container. */\n className?: string;\n};\n\n/**\n * A component that renders a wallet address in a styled \"pill\" format,\n * including a copy button and a link to the appropriate block explorer.\n *\n * @param {WalletAddressDisplayProps} props - The component props.\n * @returns {JSX.Element} The rendered component.\n */\nexport function WalletAddressDisplay({ address, explorerUrl, className }: WalletAddressDisplayProps): JSX.Element {\n const { isCopied, copy } = useCopyToClipboard();\n const labels = useLabels();\n\n // Dynamically generate the explorer link based on the provided chain.\n const explorerLink = explorerUrl ? `${explorerUrl}/address/${address}` : undefined;\n\n return (\n <div\n className={cn(\n 'flex items-center gap-x-3 rounded-full bg-[var(--tuwa-bg-muted)] px-3 py-1 font-mono text-xs text-[var(--tuwa-text-secondary)]',\n className,\n )}\n >\n <span>{textCenterEllipsis(address, 6, 6)}</span>\n <button\n type=\"button\"\n title={isCopied ? labels.txError.copied : labels.actions.copy}\n aria-label={isCopied ? labels.txError.copied : labels.actions.copy}\n onClick={() => copy(address)}\n className=\"cursor-pointer transition-colors hover:text-[var(--tuwa-text-primary)]\"\n >\n {isCopied ? (\n <CheckIcon className=\"h-4 w-4 text-[var(--tuwa-success-icon)]\" />\n ) : (\n <DocumentDuplicateIcon className=\"h-4 w-4\" />\n )}\n </button>\n\n {/* Only render the explorer link if a URL could be generated */}\n {explorerLink && (\n <a\n href={explorerLink}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"transition-colors hover:text-[var(--tuwa-text-accent)]\"\n title={labels.actions.viewOnExplorer}\n aria-label={labels.actions.viewOnExplorer}\n >\n <ArrowTopRightOnSquareIcon className=\"h-4 w-4\" />\n </a>\n )}\n </div>\n );\n}\n","/**\n * @file This file contains the `WalletAvatar` component for displaying a user's avatar.\n */\n\nimport { cn } from '@tuwaio/nova-core';\nimport makeBlockie from 'ethereum-blockies-base64';\nimport { JSX, useEffect, useState } from 'react';\nimport { isHex, zeroAddress } from 'viem';\n\nimport { useLabels } from '../../providers';\n\nexport type WalletAvatarProps = {\n /** The user's wallet address. Used for the blockie fallback and background color generation. */\n address: string;\n /** An optional URL for the user's ENS avatar image. */\n ensAvatar?: string;\n /** Optional additional CSS classes for the container. */\n className?: string;\n};\n\n/**\n * A component that displays a user's avatar.\n * It prioritizes showing the provided `ensAvatar`. If unavailable, it falls back\n * to a procedurally generated \"blockie\" based on the user's address.\n * It also generates a unique background color from the address as a placeholder.\n *\n * @param {WalletAvatarProps} props - The component props.\n * @returns {JSX.Element} The rendered avatar component.\n */\nexport function WalletAvatar({ address, ensAvatar, className }: WalletAvatarProps): JSX.Element {\n const labels = useLabels();\n\n // Generate a unique, consistent background color from the first 6 hex characters of the address.\n const bgColor = `#${address.slice(2, 8)}`;\n\n const [avatar, setAvatar] = useState<string | undefined>(undefined);\n\n useEffect(() => {\n setAvatar(ensAvatar ?? makeBlockie(isHex(address) ? address : zeroAddress));\n }, [ensAvatar, address]);\n\n return (\n <div className={cn('h-12 w-12 flex-shrink-0 rounded-full', className)} style={{ backgroundColor: bgColor }}>\n <img\n className=\"h-full w-full rounded-full object-cover\"\n // Use the ENS avatar if provided, otherwise generate a blockie as a fallback.\n src={avatar}\n alt={`${labels.walletModal.header.avatarAlt} ${address}`}\n onError={() => setAvatar(makeBlockie(isHex(address) ? address : zeroAddress))}\n />\n </div>\n );\n}\n","// TODO: need add ENS support for multiple chains and adapters\n\n/**\n * @file This file contains the `WalletHeader` component, used to display user avatar, name, and address.\n */\n\nimport { cn, textCenterEllipsis } from '@tuwaio/nova-core';\nimport { getAvatar, getName } from '@tuwaio/pulsar-evm';\nimport { JSX, ReactNode, useEffect, useState } from 'react';\n\nimport { useLabels } from '../../providers';\nimport { WalletAddressDisplay } from './WalletAddressDisplay';\nimport { WalletAvatar } from './WalletAvatar';\n\n// --- Prop Types for Customization ---\ntype AvatarRenderProps = { address: string; ensAvatar?: string };\ntype NameRenderProps = { ensName?: string; isLoading: boolean; address: string };\ntype AddressRenderProps = { address: string; explorerUrl: string };\n\n/**\n * Defines the props for the `WalletHeader` component, including extensive customization options.\n */\nexport interface WalletHeaderProps {\n /** The user's wallet address. If undefined, the 'not connected' state is shown. */\n walletAddress?: string;\n explorerUrl: string;\n /** Optional additional CSS classes for the container. */\n className?: string;\n /** A render prop to replace the default `WalletAvatar` component. */\n renderAvatar?: (props: AvatarRenderProps) => ReactNode;\n /** A render prop to replace the default ENS name display. */\n renderName?: (props: NameRenderProps) => ReactNode;\n /** A render prop to replace the default `WalletAddressDisplay` component. */\n renderAddressDisplay?: (props: AddressRenderProps) => ReactNode;\n /** A render prop to replace the default content shown when no wallet is connected. */\n renderNoWalletContent?: () => ReactNode;\n}\n\n/**\n * A component that displays the header for the wallet modal, including the user's avatar,\n * ENS name (if available), and address. It handles loading states for ENS data and\n * provides a \"not connected\" view.\n *\n * @param {WalletHeaderProps} props - The component props.\n * @returns {JSX.Element} The rendered wallet header.\n */\nexport function WalletHeader({\n walletAddress,\n className,\n renderAvatar,\n renderName,\n renderAddressDisplay,\n renderNoWalletContent,\n explorerUrl,\n}: WalletHeaderProps): JSX.Element {\n const labels = useLabels();\n\n const [ensName, setEnsName] = useState<string | undefined>(undefined);\n const [ensAvatar, setEnsAvatar] = useState<string | undefined>(undefined);\n const [isLoading, setIsLoading] = useState(true);\n\n // Fetch ENS data whenever the wallet address changes.\n useEffect(() => {\n const fetchEnsData = async () => {\n if (walletAddress) {\n setIsLoading(true);\n setEnsName(undefined);\n setEnsAvatar(undefined);\n\n try {\n const name = await getName(walletAddress as `0x${string}`);\n if (name) {\n setEnsName(name);\n const avatar = await getAvatar(name);\n setEnsAvatar(avatar);\n }\n } finally {\n setIsLoading(false);\n }\n }\n };\n\n fetchEnsData();\n }, [walletAddress]);\n\n // --- Render \"Not Connected\" State ---\n if (!walletAddress) {\n if (renderNoWalletContent) {\n return <>{renderNoWalletContent()}</>;\n }\n\n return (\n <div\n className={cn(\n 'flex h-20 items-center justify-center rounded-lg bg-[var(--tuwa-bg-muted)] text-[var(--tuwa-text-secondary)]',\n className,\n )}\n >\n {labels.walletModal.header.notConnected}\n </div>\n );\n }\n\n const ensNameAbbreviated = ensName\n ? ensName.length > 30\n ? textCenterEllipsis(ensName, 12, 12)\n : ensName\n : undefined;\n\n // --- Render \"Connected\" State ---\n return (\n <div className={cn('flex items-center gap-4 min-h-[4rem]', className)}>\n <div>\n {renderAvatar ? (\n renderAvatar({ address: walletAddress, ensAvatar })\n ) : (\n <WalletAvatar address={walletAddress} ensAvatar={ensAvatar} />\n )}\n </div>\n\n <div className=\"flex flex-col justify-center min-h-[3.5rem] min-w-[200px]\">\n {renderName ? (\n renderName({ ensName: ensNameAbbreviated, isLoading, address: walletAddress })\n ) : (\n <div className=\"flex flex-col\">\n {/* Primary content area - ENS name or large address */}\n <div className=\"h-7 flex items-center mb-1.5\">\n {isLoading ? (\n <div className=\"h-full w-48 animate-pulse rounded-md bg-[var(--tuwa-bg-muted)]\" />\n ) : ensNameAbbreviated ? (\n <h2 className=\"text-xl font-bold text-[var(--tuwa-text-primary)]\">{ensNameAbbreviated}</h2>\n ) : (\n <WalletAddressDisplay\n address={walletAddress}\n explorerUrl={explorerUrl}\n className=\"text-xl font-bold text-[var(--tuwa-text-primary)] bg-transparent px-0 py-0 rounded-none\"\n />\n )}\n </div>\n\n {/* Secondary content area - small address display (only when ENS exists) */}\n <div className=\"h-5 flex items-center\">\n {!isLoading &&\n ensNameAbbreviated &&\n (renderAddressDisplay ? (\n renderAddressDisplay({ address: walletAddress, explorerUrl })\n ) : (\n <WalletAddressDisplay address={walletAddress} explorerUrl={explorerUrl} />\n ))}\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}\n","/**\n * @file This file contains the main `WalletInfoModal` component, which serves as the primary UI for viewing wallet details and transaction history.\n */\n\nimport { XMarkIcon } from '@heroicons/react/24/solid';\nimport * as Dialog from '@radix-ui/react-dialog';\nimport { cn } from '@tuwaio/nova-core';\nimport { selectAdapterByKey, Transaction, TransactionAdapter } from '@tuwaio/pulsar-core';\nimport { AnimatePresence, motion, MotionProps } from 'framer-motion';\nimport { ComponentPropsWithoutRef, JSX, ReactNode } from 'react';\n\nimport { NovaProviderProps, useLabels } from '../../providers';\nimport { TransactionsHistory, TransactionsHistoryCustomization } from '../TransactionsHistory';\nimport { WalletHeader } from './WalletHeader';\n\n// --- Prop Types for Customization ---\ntype CustomHeaderProps = { closeModal: () => void };\ntype CustomWalletInfoProps<TR, T extends Transaction<TR>, A> = WalletInfoModalProps<TR, T, A>;\ntype CustomHistoryProps<TR, T extends Transaction<TR>, A> = WalletInfoModalProps<TR, T, A> & {\n customization?: TransactionsHistoryCustomization<TR, T, A>;\n};\n\n/**\n * Defines the customization options for the WalletInfoModal.\n * Allows customization of modal behavior, animations, and individual UI components.\n */\nexport type WalletInfoModalCustomization<TR, T extends Transaction<TR>, A> = {\n /** Custom props to pass to the underlying Radix UI Dialog.Content component */\n modalProps?: Partial<ComponentPropsWithoutRef<typeof Dialog.Content>>;\n /** Custom Framer Motion animation properties */\n motionProps?: MotionProps;\n classNames?: {\n /** CSS classes for the main content wrapper div. */\n contentWrapper?: string;\n };\n /** Custom component overrides for different parts of the modal */\n components?: {\n /** A render prop to replace the entire modal header. */\n header?: (props: CustomHeaderProps) => ReactNode;\n /** A render prop to replace the `WalletHeader` component. */\n walletInfo?: (props: CustomWalletInfoProps<TR, T, A>) => ReactNode;\n /** A render prop to replace the `TransactionsHistory` component. */\n history?: (props: CustomHistoryProps<TR, T, A>) => ReactNode;\n };\n};\n\n/**\n * Defines the core props for the WalletInfoModal and its children.\n */\nexport interface WalletInfoModalProps<TR, T extends Transaction<TR>, A>\n extends Pick<\n NovaProviderProps<TR, T, A>,\n 'adapters' | 'connectedAdapterType' | 'connectedWalletAddress' | 'transactionsPool'\n > {\n isOpen?: boolean;\n setIsOpen?: (value: boolean) => void;\n customization?: WalletInfoModalCustomization<TR, T, A>;\n}\n\n/**\n * The main modal component for displaying wallet information and transaction history.\n * It is highly customizable through the `customization` prop and supports full Radix UI Dialog customization.\n *\n * @param {WalletInfoModalProps<TR, T> & { ... }} props - The component props.\n * @returns {JSX.Element | null} The rendered modal or null if not open.\n */\nexport function WalletInfoModal<TR, T extends Transaction<TR>, A>({\n isOpen,\n setIsOpen,\n customization,\n ...props\n}: WalletInfoModalProps<TR, T, A>): JSX.Element | null {\n const labels = useLabels();\n\n const defaultMotionProps: MotionProps = {\n initial: { opacity: 0, scale: 0.95 },\n animate: { opacity: 1, scale: 1 },\n exit: { opacity: 0, scale: 0.95 },\n transition: { duration: 0.2, ease: 'easeOut' },\n };\n\n const motionProps = { ...defaultMotionProps, ...customization?.motionProps };\n const closeModal = () => setIsOpen && setIsOpen(false);\n\n return (\n <Dialog.Root open={isOpen} onOpenChange={(open) => !open && closeModal()}>\n <Dialog.Portal>\n <AnimatePresence>\n {isOpen && (\n <>\n <Dialog.Overlay asChild>\n <motion.div\n className=\"fixed inset-0 bg-black/45 flex items-center justify-center p-2 z-50\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15 }}\n />\n </Dialog.Overlay>\n <Dialog.Content\n className=\"fixed left-1/2 top-1/2 w-full max-w-2xl -translate-x-1/2 -translate-y-1/2 outline-none z-50\"\n {...customization?.modalProps}\n asChild\n >\n <motion.div {...motionProps}>\n <div\n className={cn(\n 'relative w-full max-w-2xl outline-none rounded-2xl bg-[var(--tuwa-bg-secondary)] shadow-xl max-h-[98dvh] overflow-y-auto',\n customization?.classNames?.contentWrapper,\n )}\n >\n {/* Header */}\n {customization?.components?.header ? (\n customization.components.header({ closeModal })\n ) : (\n <div className=\"flex items-center justify-between border-b border-[var(--tuwa-border-primary)] p-4 sticky top-0 left-0 w-full bg-[var(--tuwa-bg-secondary)] z-10\">\n <Dialog.Title className=\"text-lg font-bold text-[var(--tuwa-text-primary)]\">\n {labels.walletModal.title}\n </Dialog.Title>\n <Dialog.Close asChild>\n <button\n type=\"button\"\n onClick={closeModal}\n aria-label={labels.actions.close}\n className=\"cursor-pointer rounded-full p-1 text-[var(--tuwa-text-tertiary)] transition-colors hover:bg-[var(--tuwa-bg-muted)] hover:text-[var(--tuwa-text-primary)]\"\n >\n <XMarkIcon className=\"h-6 w-6\" />\n </button>\n </Dialog.Close>\n </div>\n )}\n\n {/* Body */}\n <div className=\"flex flex-col gap-4 p-4 sm:p-6 sm:gap-6\">\n {customization?.components?.walletInfo ? (\n customization.components.walletInfo(props)\n ) : (\n <WalletHeader\n explorerUrl={\n selectAdapterByKey({\n adapterKey: props.connectedAdapterType ?? TransactionAdapter.EVM,\n adapters: props.adapters,\n })?.getExplorerUrl() ?? ''\n }\n walletAddress={props.connectedWalletAddress}\n />\n )}\n\n {customization?.components?.history ? (\n customization.components.history(props)\n ) : (\n <TransactionsHistory {...props} />\n )}\n </div>\n </div>\n </motion.div>\n </Dialog.Content>\n </>\n )}\n </AnimatePresence>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n","/**\n * @file This file contains the main `NovaProvider` component, the primary entry point for the UI library.\n */\n\nimport { deepMerge, useMediaQuery } from '@tuwaio/nova-core';\nimport {\n IInitializeTxTrackingStore,\n ITxTrackingStore,\n Transaction,\n TransactionAdapter,\n TransactionPool,\n TransactionStatus,\n TxActions,\n TxAdapter,\n} from '@tuwaio/pulsar-core';\nimport { JSX, useEffect, useMemo, useRef, useState } from 'react';\nimport { toast, ToastContainer, ToastContainerProps, ToastContentProps, TypeOptions } from 'react-toastify';\n\nimport {\n ToastCloseButton,\n ToastTransaction,\n ToastTransactionCustomization,\n TrackingTxModal,\n TrackingTxModalCustomization,\n WalletInfoModal,\n WalletInfoModalCustomization,\n} from '../components';\nimport { defaultLabels } from '../i18n/en';\nimport { TuwaLabels } from '../i18n/types';\nimport { LabelsProvider } from './LabelsProvider';\n\nconst STATUS_TO_TOAST_TYPE: Record<string, TypeOptions> = {\n [TransactionStatus.Success]: 'success',\n [TransactionStatus.Failed]: 'error',\n [TransactionStatus.Replaced]: 'info',\n};\n\nexport type NovaProviderProps<TR, T extends Transaction<TR>, A> = {\n adapters: TxAdapter<TR, T, A>[];\n connectedWalletAddress?: string;\n connectedAdapterType?: TransactionAdapter;\n /** A partial object of labels to override the default English text. */\n labels?: Partial<TuwaLabels>;\n /** An object to enable or disable major UI features. All are enabled by default. */\n features?: {\n toasts?: boolean;\n walletInfoModal?: boolean;\n trackingTxModal?: boolean;\n };\n /** A single object to pass down deep customization options to all child components. */\n customization?: {\n toast?: ToastTransactionCustomization<TR, T, A>;\n walletInfoModal?: WalletInfoModalCustomization<TR, T, A>;\n trackingTxModal?: TrackingTxModalCustomization<TR, T, A>;\n };\n /** A registry of retryable actions, keyed by `actionKey`. */\n actions?: TxActions;\n /** The global transaction pool from the tracking store. */\n transactionsPool: TransactionPool<TR, T>;\n} & Pick<IInitializeTxTrackingStore<TR, T>, 'closeTxTrackedModal'> &\n Partial<Pick<ITxTrackingStore<TR, T, A>, 'handleTransaction' | 'initialTx'>> &\n ToastContainerProps;\n\n/**\n * The main provider for the Nova UI ecosystem.\n * It orchestrates toasts, modals, and the i18n context for the entire application.\n *\n * @param {NovaProviderProps<TR, T>} props - The component props.\n * @returns {JSX.Element} The rendered provider.\n */\nexport function NovaProvider<TR, T extends Transaction<TR>, A>({\n adapters,\n connectedWalletAddress,\n connectedAdapterType,\n labels,\n features,\n customization,\n closeTxTrackedModal,\n actions,\n handleTransaction,\n initialTx,\n transactionsPool,\n ...toastProps\n}: NovaProviderProps<TR, T, A>): JSX.Element {\n const [isWalletInfoModalOpen, setIsWalletInfoModalOpen] = useState(false);\n const prevTransactionsRef = useRef<TransactionPool<TR, T>>(transactionsPool);\n\n const isMobile = useMediaQuery('(max-width: 767px)');\n const isTrackingModalOpen =\n !!initialTx?.withTrackedModal && transactionsPool[initialTx?.lastTxKey ?? '']?.isTrackedModalOpen;\n\n // Memoize feature flags for stability.\n const enabledFeatures = useMemo(\n () => ({\n toasts: features?.toasts ?? true,\n walletInfoModal: features?.walletInfoModal ?? true,\n trackingTxModal: features?.trackingTxModal ?? true,\n }),\n [features],\n );\n\n // Merge default and custom labels.\n const mergedLabels = useMemo(() => deepMerge(defaultLabels, labels || {}), [labels]);\n\n // Effect to handle automatic toast notifications.\n useEffect(() => {\n if (!enabledFeatures.toasts) return;\n\n const showOrUpdateToast = (tx: T, type: TypeOptions) => {\n const content = (props: ToastContentProps) => (\n <ToastTransaction\n {...props}\n tx={tx}\n transactionsPool={transactionsPool}\n openWalletInfoModal={enabledFeatures.walletInfoModal ? () => setIsWalletInfoModalOpen(true) : undefined}\n customization={customization?.toast}\n adapters={adapters}\n connectedWalletAddress={connectedWalletAddress}\n />\n );\n\n if (toast.isActive(tx.txKey)) {\n toast.update(tx.txKey, { render: content, type });\n } else {\n toast(content, { toastId: tx.txKey, type, closeOnClick: false });\n }\n };\n\n const prevPool = prevTransactionsRef.current;\n\n // Compare current pool with the previous one to detect changes.\n Object.values(transactionsPool).forEach((currentTx) => {\n const prevTx = prevPool[currentTx.txKey];\n const statusChanged = prevTx && prevTx.status !== currentTx.status;\n const hashAppeared =\n prevTx &&\n prevTx?.adapter === TransactionAdapter.EVM &&\n !prevTx.hash &&\n currentTx?.adapter === TransactionAdapter.EVM &&\n currentTx.hash;\n\n // Show toast for new pending transactions.\n if (!prevTx && currentTx.pending) {\n showOrUpdateToast(currentTx, 'info');\n }\n // Update toast for pending transactions and nonce changes.\n if (\n (prevTx && prevTx?.adapter === TransactionAdapter.EVM && prevTx.pending ? prevTx.nonce : undefined) !==\n (currentTx?.adapter === TransactionAdapter.EVM && currentTx.pending ? currentTx?.nonce : undefined)\n ) {\n showOrUpdateToast(currentTx, 'info');\n }\n // Update toast when a final status is reached or a hash appears.\n else if (statusChanged || hashAppeared) {\n const toastType = STATUS_TO_TOAST_TYPE[currentTx.status!] ?? 'info';\n showOrUpdateToast(currentTx, toastType);\n }\n });\n\n prevTransactionsRef.current = transactionsPool;\n }, [transactionsPool, customization?.toast, enabledFeatures]);\n\n const shouldShowToasts = enabledFeatures.toasts && (!isMobile || !isTrackingModalOpen || !isWalletInfoModalOpen);\n\n return (\n <LabelsProvider labels={mergedLabels}>\n {shouldShowToasts && (\n <ToastContainer\n position=\"bottom-right\"\n stacked\n autoClose={false}\n hideProgressBar\n closeOnClick={false}\n icon={false}\n closeButton={ToastCloseButton}\n toastClassName=\"!p-0 !bg-transparent !shadow-none !min-h-0\"\n {...toastProps}\n />\n )}\n\n {enabledFeatures.walletInfoModal && (\n <WalletInfoModal\n transactionsPool={transactionsPool}\n connectedWalletAddress={connectedWalletAddress}\n isOpen={isWalletInfoModalOpen}\n setIsOpen={setIsWalletInfoModalOpen}\n customization={customization?.walletInfoModal}\n adapters={adapters}\n connectedAdapterType={connectedAdapterType}\n />\n )}\n\n {enabledFeatures.trackingTxModal && (\n <TrackingTxModal\n initialTx={initialTx}\n onClose={closeTxTrackedModal}\n onOpenWalletInfo={() => setIsWalletInfoModalOpen(true)}\n transactionsPool={transactionsPool}\n customization={customization?.trackingTxModal}\n actions={actions}\n handleTransaction={handleTransaction}\n adapters={adapters}\n connectedAdapterType={connectedAdapterType}\n />\n )}\n </LabelsProvider>\n );\n}\n"]}
|
1
|
+
{"version":3,"sources":["../../src/i18n/en.ts","../../src/providers/LabelsProvider.tsx","../../src/components/HashLink.tsx","../../src/components/StatusAwareText.tsx","../../src/components/ToastCloseButton.tsx","../../src/components/TransactionKey.tsx","../../src/components/TransactionStatusBadge.tsx","../../src/components/ToastTransaction.tsx","../../src/components/TrackingTxModal/TxErrorBlock.tsx","../../src/components/TrackingTxModal/TxInfoBlock.tsx","../../src/components/TrackingTxModal/TxProgressIndicator.tsx","../../src/components/TrackingTxModal/TxStatusVisual.tsx","../../src/components/TrackingTxModal/TrackingTxModal.tsx","../../src/components/TransactionHistoryItem.tsx","../../src/components/TransactionsHistory.tsx","../../src/components/WalletInfoModal/WalletAddressDisplay.tsx","../../src/components/WalletInfoModal/WalletAvatar.tsx","../../src/components/WalletInfoModal/WalletHeader.tsx","../../src/components/WalletInfoModal/WalletInfoModal.tsx","../../src/providers/NovaProvider.tsx"],"names":["defaultLabels","LabelsContext","createContext","LabelsProvider","labels","children","jsx","useLabels","useContext","HashLink","label","hash","explorerUrl","variant","className","isCopied","copy","useCopyToClipboard","actions","txError","containerClasses","cn","labelClasses","hashContent","textCenterEllipsis","jsxs","ArrowTopRightOnSquareIcon","CheckIcon","DocumentDuplicateIcon","STATUS_CONFIG","TransactionStatus","StatusAwareText","txStatus","source","fallback","applyColor","displayText","colorClass","config","ToastCloseButton","closeToast","XMarkIcon","TransactionKey","tx","adapters","transactionsPool","renderHashLink","hashLabels","adapter","selectAdapterByKey","renderHash","props","trackerLabel","trackerKeyElement","onChainHashesElement","onChainHash","replacedHash","Fragment","shouldShowTrackerKey","getStatusConfig","ArrowPathIcon","CheckCircleIcon","XCircleIcon","TransactionStatusBadge","statuses","statusConfig","useMemo","baseClasses","statusKey","Icon","badgeClasses","iconClasses","DefaultSpeedUpButton","onClick","DefaultCancelButton","DefaultWalletInfoButton","ToastTransaction","openWalletInfoModal","icon","customization","connectedWalletAddress","toast","canBeReplaced","handleCancel","handleSpeedUp","CStatusAwareText","CTransactionKey","CStatusBadge","SpeedUpButton","CancelButton","WalletInfoButton","getChainName","Web3Icon","TxErrorBlock","error","ExclamationTriangleIcon","DefaultInfoRow","value","TxInfoBlock","txInfo","InfoRow","chainId","dayjs","STEP_STYLE_CONFIG","Step","status","isFirst","styles","renderIcon","TxProgressIndicator","isProcessing","isSucceed","isFailed","isReplaced","StepComponent","trackingModal","steps","getStepStatus","stepIndex","getStepLabel","stepProps","index","STATUS_VISUAL_CONFIG","ExclamationCircleIcon","ClockIcon","TxStatusVisual","TrackingTxModal","onClose","onOpenWalletInfo","handleTransaction","initialTx","activeTx","txToDisplay","isOpen","isInitializing","isPending","canRetry","canReplace","handleRetry","retryParams","CustomHeader","CustomFooter","CustomStatusVisual","CustomProgressIndicator","CustomInfoBlock","CustomErrorBlock","motionProps","open","AnimatePresence","motion","DefaultHeaderTitle","DefaultHeader","DefaultFooter","title","onRetry","onSpeedUp","onCancel","MainActionButton","relativeTime","DefaultIcon","DefaultTimestamp","timestamp","TransactionHistoryItem","Title","Description","Timestamp","StatusBadge","TxKey","HistoryPlaceholder","message","TransactionsHistory","walletModal","sortedTransactions","selectAllTransactionsByActiveWallet","a","b","Placeholder","HistoryItem","renderContent","WalletAddressDisplay","address","fullExplorerLink","WalletAvatar","ensAvatar","imageSrc","setImageSrc","useState","blockie","makeBlockie","isHex","zeroAddress","bgColor","useEffect","handleError","DefaultNameDisplay","isLoading","ensName","walletAddress","renderAddressDisplay","WalletHeader","connectedAdapterType","renderAvatar","renderName","renderNoWalletContent","setEnsName","setEnsAvatar","setIsLoading","hasNameResolver","hasAvatarResolver","name","avatar","ensNameAbbreviated","closeModal","N","WalletInfoModal","setIsOpen","CustomWalletInfo","CustomHistory","STATUS_TO_TOAST_TYPE","NovaProvider","closeTxTrackedModal","features","toastProps","isWalletInfoModalOpen","setIsWalletInfoModalOpen","prevTransactionsRef","useRef","isMobile","useMediaQuery","enabledFeatures","mergedLabels","deepMerge","showOrUpdateToast","type","content","prevPool","currentTx","prevTx","isTrackingModalOpen","shouldShowToasts","ToastContainer"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @file This file contains the default English labels for all UI components.\n * It serves as the default language pack for the library.\n */\n\nimport { TuwaLabels } from './types';\n\n/**\n * An object containing the default English text for all labels used in the UI.\n * This object implements the `TuwaLabels` type and can be used as a template\n * for creating other language translations.\n */\nexport const defaultLabels: TuwaLabels = {\n walletModal: {\n title: 'Wallet & Transactions',\n header: {\n notConnected: 'Wallet not connected',\n avatarAlt: 'Avatar for',\n },\n history: {\n title: 'Transactions History',\n connectWalletTitle: 'Connect Wallet',\n connectWalletMessage: 'Please connect your wallet to see your past activity.',\n noTransactionsTitle: 'No Transactions Yet',\n noTransactionsMessage: 'Once you interact with the app, your transaction history will appear here.',\n },\n },\n toast: {\n openWalletInfo: 'Open wallet info',\n },\n statuses: {\n pending: 'Pending',\n success: 'Success',\n failed: 'Failed',\n reverted: 'Reverted',\n replaced: 'Replaced',\n unknown: 'Unknown',\n },\n hashLabels: {\n gelato: 'Gelato Task ID',\n safe: 'Safe Tx Hash',\n original: 'Original Tx Hash',\n replaced: 'Replaced Tx Hash',\n default: 'Tx Hash',\n },\n txInfo: {\n started: 'Started',\n network: 'Network',\n },\n txError: {\n title: 'Error',\n copied: 'Copied!',\n },\n trackingModal: {\n title: 'Transaction Overview',\n processing: 'Processing...',\n close: 'Close',\n walletInfo: 'Wallet Info',\n retry: 'Retry',\n progressIndicator: {\n created: 'Created',\n processing: 'Processing',\n succeed: 'Succeed',\n },\n },\n trackedTxButton: {\n loading: 'Processing...',\n succeed: 'Success',\n failed: 'Failed',\n replaced: 'Replaced',\n },\n actions: {\n copy: 'Copy address',\n viewOnExplorer: 'View on explorer',\n close: 'Close',\n cancel: 'Cancel',\n speedUp: 'Speed up',\n },\n};\n","/**\n * @file This file sets up the React Context for providing i18n labels throughout the UI components.\n * It allows for deep customization of all text displayed by the library.\n */\n\nimport { createContext, ReactNode, useContext } from 'react';\n\nimport { defaultLabels } from '../i18n/en';\nimport { TuwaLabels } from '../i18n/types';\n\n/**\n * React Context for storing and providing the UI labels.\n * It is initialized with the default English labels, ensuring that components\n * work even without an explicit provider.\n */\nconst LabelsContext = createContext<TuwaLabels>(defaultLabels);\n\n/**\n * A React component that provides a custom set of labels to all child components.\n * Wrap your application or component tree with this provider to apply custom translations.\n *\n * @param {object} props - The component props.\n * @param {TuwaLabels} props.labels - An object containing the custom labels.\n * @param {ReactNode} props.children - The child components to render.\n */\nexport const LabelsProvider = ({ labels, children }: { labels: TuwaLabels; children: ReactNode }) => {\n return <LabelsContext.Provider value={labels}>{children}</LabelsContext.Provider>;\n};\n\n/**\n * A custom hook to easily access the i18n labels from any component\n * within the `LabelsProvider` tree.\n *\n * @returns {TuwaLabels} The complete object of UI labels.\n *\n * @example\n * const MyComponent = () => {\n * const labels = useLabels();\n * return <h1>{labels.walletModal.title}</h1>;\n * }\n */\nexport const useLabels = (): TuwaLabels => {\n return useContext(LabelsContext);\n};\n","/**\n * @file This file contains the `HashLink` component, a UI element for displaying\n * blockchain hashes with copy-to-clipboard and block explorer link functionality.\n */\n\nimport { ArrowTopRightOnSquareIcon, CheckIcon, DocumentDuplicateIcon } from '@heroicons/react/24/solid';\nimport { cn, textCenterEllipsis, useCopyToClipboard } from '@tuwaio/nova-core';\n\nimport { useLabels } from '../providers';\n\n/**\n * Defines the props for the HashLink component.\n */\nexport type HashLinkProps = {\n /** The full hash string to display and copy (e.g., a transaction hash or wallet address). */\n hash: string;\n /** An optional label to display before the hash (e.g., \"From\", \"Tx Hash\"). */\n label?: string;\n /** An optional URL to a block explorer. If provided, the hash becomes a clickable link. */\n explorerUrl?: string;\n /** The visual style of the component. 'default' is larger, 'compact' is smaller. */\n variant?: 'default' | 'compact';\n /** Additional CSS classes to apply to the container element for custom styling. */\n className?: string;\n};\n\n/**\n * A component to display a hash string with an optional label, a link to a block explorer,\n * and a copy-to-clipboard button. It automatically ellipsizes the hash for readability.\n */\nexport function HashLink({ label, hash, explorerUrl, variant = 'default', className }: HashLinkProps) {\n const { isCopied, copy } = useCopyToClipboard();\n const { actions, txError } = useLabels();\n\n const containerClasses = cn(\n 'flex items-center justify-between',\n {\n 'text-sm': variant === 'default',\n 'text-xs': variant === 'compact',\n },\n className,\n );\n\n const labelClasses = cn('pr-1', {\n 'font-bold text-[var(--tuwa-text-primary)]': variant === 'default',\n 'font-medium text-[var(--tuwa-text-secondary)]': variant === 'compact',\n });\n\n // The ellipsized hash content, memoized for clarity.\n const hashContent = <span className=\"font-mono\">{textCenterEllipsis(hash, 5, 5)}</span>;\n\n return (\n <div className={containerClasses}>\n {label && <span className={labelClasses}>{label}:</span>}\n <div className=\"flex items-center gap-x-2\">\n {explorerUrl ? (\n <a\n href={explorerUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center gap-x-1 text-[var(--tuwa-text-accent)] transition-colors hover:underline\"\n title={actions.viewOnExplorer}\n aria-label={actions.viewOnExplorer}\n >\n {hashContent}\n <ArrowTopRightOnSquareIcon className=\"h-4 w-4\" />\n </a>\n ) : (\n <span className=\"text-[var(--tuwa-text-primary)]\">{hashContent}</span>\n )}\n <button\n type=\"button\"\n onClick={() => copy(hash)}\n className=\"cursor-pointer text-[var(--tuwa-text-tertiary)] transition-colors hover:text-[var(--tuwa-text-secondary)]\"\n title={isCopied ? txError.copied : actions.copy}\n aria-label={isCopied ? txError.copied : actions.copy}\n >\n {isCopied ? (\n <CheckIcon className=\"h-4 w-4 text-[var(--tuwa-success-icon)]\" />\n ) : (\n <DocumentDuplicateIcon className=\"h-4 w-4\" />\n )}\n </button>\n </div>\n </div>\n );\n}\n","/**\n * @file This file contains the `StatusAwareText` component, which displays different text based on a transaction's status.\n */\n\nimport { cn } from '@tuwaio/nova-core';\nimport { TransactionStatus } from '@tuwaio/pulsar-core';\nimport { ReactNode } from 'react';\n\n/**\n * A mapping from transaction status to an array index and a theme-aware color class.\n * The index corresponds to the position in the `source` array prop: `[pending, success, error, replaced]`.\n */\nconst STATUS_CONFIG = {\n [TransactionStatus.Success]: { index: 1, colorClass: 'text-[var(--tuwa-success-text)]' },\n [TransactionStatus.Failed]: { index: 2, colorClass: 'text-[var(--tuwa-error-text)]' },\n [TransactionStatus.Replaced]: { index: 3, colorClass: 'text-[var(--tuwa-text-secondary)]' },\n default: { index: 0, colorClass: 'text-[var(--tuwa-text-primary)]' }, // For pending or undefined status\n} as const;\n\nexport type StatusAwareTextProps = {\n /** The current status of the transaction, used to select the correct text and color. */\n txStatus?: TransactionStatus;\n /**\n * The source for the text. Can be a single string for static text, or an array of strings\n * for dynamic text based on status. The array format must be: `[pending, success, error, replaced]`.\n */\n source?: string | readonly string[];\n /** A fallback string to display if `source` is not provided or is invalid. */\n fallback?: string;\n /** The visual variant, which determines the base text style ('title' or 'description'). */\n variant: 'title' | 'description';\n /** If true, applies a status-specific color to the text. Defaults to false. */\n applyColor?: boolean;\n /** Optional additional CSS classes for custom styling. */\n className?: string;\n};\n\n/**\n * A component that renders text conditionally based on a transaction's status.\n * It's designed to work with the `title` and `description` fields of a transaction object.\n */\nexport function StatusAwareText({\n txStatus,\n source,\n fallback,\n variant,\n className,\n applyColor = false,\n}: StatusAwareTextProps): ReactNode {\n let displayText: string | undefined;\n let colorClass = '';\n\n // 1. Determine the text to display based on the source type.\n if (typeof source === 'string') {\n displayText = source;\n } else if (Array.isArray(source)) {\n const statusKey = txStatus || 'default';\n const config = STATUS_CONFIG[statusKey] ?? STATUS_CONFIG.default;\n displayText = source[config.index];\n if (applyColor) {\n colorClass = config.colorClass;\n }\n } else {\n displayText = fallback;\n }\n\n // If no text could be determined, render nothing.\n if (!displayText) {\n return null;\n }\n\n // 2. Determine the base styling based on the variant.\n const baseClasses =\n variant === 'title'\n ? 'text-sm font-semibold text-[var(--tuwa-text-primary)]'\n : 'mt-1 text-xs text-[var(--tuwa-text-secondary)]';\n\n // 3. Combine classes and render the final output.\n return <div className={cn(baseClasses, colorClass, className)}>{displayText}</div>;\n}\n","/**\n * @file This file contains a reusable close button component, designed primarily for toast notifications.\n */\n\nimport { XMarkIcon } from '@heroicons/react/24/solid';\nimport { cn } from '@tuwaio/nova-core';\n\nimport { useLabels } from '../providers';\n\n/**\n * Defines the props for the ToastCloseButton component.\n */\nexport type ToastCloseButtonProps = {\n /**\n * The function to call when the button is clicked. This is typically provided by the\n * toast library (e.g., react-toastify) to dismiss the notification.\n */\n closeToast?: (e: React.MouseEvent<HTMLElement>) => void;\n};\n\n/**\n * A simple, styled close button component ('X' icon) intended for use within toast notifications.\n * It uses theme-aware CSS variables for styling and i18n labels for accessibility.\n */\nexport function ToastCloseButton({ closeToast }: ToastCloseButtonProps) {\n const { actions } = useLabels();\n\n return (\n <button\n type=\"button\"\n onClick={closeToast}\n aria-label={actions.close}\n title={actions.close}\n className={cn(\n 'absolute top-2 right-2 cursor-pointer rounded-full p-1',\n 'text-[var(--tuwa-text-tertiary)] transition-colors',\n 'hover:bg-[var(--tuwa-bg-muted)] hover:text-[var(--tuwa-text-primary)]',\n )}\n >\n <XMarkIcon className=\"h-5 w-5\" />\n </button>\n );\n}\n","/**\n * @file This file contains the `TransactionKey` component, which is responsible for displaying\n * the various identifiers associated with a transaction (e.g., hash, Gelato Task ID).\n */\n\nimport { cn } from '@tuwaio/nova-core';\nimport { selectAdapterByKey, Transaction } from '@tuwaio/pulsar-core';\nimport { ReactNode } from 'react';\n\nimport { NovaProviderProps, useLabels } from '../providers';\nimport { HashLink, HashLinkProps } from './HashLink';\n\n/**\n * Defines the props for the TransactionKey component.\n * @template TR - The type of the tracker identifier.\n * @template T - The transaction type.\n * @template A - The type of the key returned by an action function.\n */\nexport type TransactionKeyProps<TR, T extends Transaction<TR>, A> = Pick<\n NovaProviderProps<TR, T, A>,\n 'adapters' | 'transactionsPool'\n> & {\n /** The transaction object to display identifiers for. */\n tx: T;\n /** The visual variant, which applies different container styles. */\n variant?: 'toast' | 'history';\n /** Optional additional CSS classes for the container. */\n className?: string;\n /**\n * An optional render prop to allow for complete customization of how the hash link is rendered.\n * If not provided, the default `HashLink` component will be used.\n */\n renderHashLink?: (props: HashLinkProps) => ReactNode;\n};\n\n/**\n * A component that intelligently displays the relevant keys and hashes for a transaction.\n * It leverages the adapter system to show chain-specific identifiers and explorer links.\n */\nexport function TransactionKey<TR, T extends Transaction<TR>, A>({\n tx,\n adapters,\n transactionsPool,\n variant = 'toast',\n className,\n renderHashLink,\n}: TransactionKeyProps<TR, T, A>) {\n const { hashLabels } = useLabels();\n\n // Select the correct adapter for the given transaction.\n const adapter = selectAdapterByKey({ adapterKey: tx.adapter, adapters });\n\n if (!adapter) return null;\n\n // Helper to use the render prop if provided, otherwise default to HashLink.\n const renderHash = (props: HashLinkProps) => {\n return renderHashLink ? renderHashLink(props) : <HashLink {...props} />;\n };\n\n const containerClasses =\n variant === 'toast'\n ? 'mt-2 flex w-full flex-col gap-y-2 border-t border-[var(--tuwa-border-primary)] pt-2'\n : 'flex w-full flex-col gap-y-2';\n\n // The primary key of the transaction (e.g., taskId, safeTxHash).\n // @ts-expect-error - TODO: a better way to get tracker label from i18n\n const trackerLabel = hashLabels[tx.tracker as string];\n const trackerKeyElement = trackerLabel\n ? renderHash({ label: trackerLabel, hash: tx.txKey, variant: 'compact' })\n : null;\n\n // The on-chain hash elements, handling normal and replaced transactions.\n const onChainHashesElement = (() => {\n const onChainHash = (tx as any).hash;\n const replacedHash = (tx as any).replacedTxHash;\n\n if (!onChainHash && !replacedHash) return null;\n\n if (replacedHash) {\n return (\n <>\n {onChainHash &&\n renderHash({\n label: hashLabels.original,\n hash: onChainHash,\n variant: 'compact',\n })}\n {adapter.getExplorerTxUrl &&\n renderHash({\n label: hashLabels.replaced,\n hash: replacedHash,\n explorerUrl: adapter.getExplorerTxUrl(transactionsPool, tx.txKey, replacedHash),\n })}\n </>\n );\n }\n\n return (\n onChainHash &&\n adapter.getExplorerTxUrl &&\n renderHash({\n label: hashLabels.default,\n hash: onChainHash,\n explorerUrl: adapter.getExplorerTxUrl(transactionsPool, tx.txKey),\n })\n );\n })();\n\n // Avoid showing the tracker key if it's the same as the on-chain hash.\n const shouldShowTrackerKey = trackerLabel && trackerLabel !== hashLabels.default && tx.txKey !== (tx as any).hash;\n\n return (\n <div className={cn(containerClasses, className)}>\n {shouldShowTrackerKey && trackerKeyElement}\n {onChainHashesElement}\n </div>\n );\n}\n","/**\n * @file This file contains the `TransactionStatusBadge` component for visually displaying a transaction's status.\n */\n\nimport { ArrowPathIcon, CheckCircleIcon, XCircleIcon } from '@heroicons/react/24/solid';\nimport { cn } from '@tuwaio/nova-core';\nimport { Transaction, TransactionStatus } from '@tuwaio/pulsar-core';\nimport { useMemo } from 'react';\n\nimport { TuwaLabels } from '../i18n/types';\nimport { useLabels } from '../providers';\n\n/**\n * A factory function to create the status configuration object.\n * This is defined outside the component to avoid re-creation on every render.\n * It depends on the `labels` object for internationalization.\n */\nconst getStatusConfig = (labels: TuwaLabels['statuses']) => ({\n Pending: {\n label: labels.pending,\n Icon: ArrowPathIcon,\n badgeClasses: 'bg-[var(--tuwa-pending-bg)] text-[var(--tuwa-pending-text)]',\n iconClasses: 'animate-spin text-[var(--tuwa-pending-icon)]',\n },\n [TransactionStatus.Success]: {\n label: labels.success,\n Icon: CheckCircleIcon,\n badgeClasses: 'bg-[var(--tuwa-success-bg)] text-[var(--tuwa-success-text)]',\n iconClasses: 'text-[var(--tuwa-success-icon)]',\n },\n [TransactionStatus.Failed]: {\n label: labels.failed,\n Icon: XCircleIcon,\n badgeClasses: 'bg-[var(--tuwa-error-bg)] text-[var(--tuwa-error-text)]',\n iconClasses: 'text-[var(--tuwa-error-icon)]',\n },\n [TransactionStatus.Replaced]: {\n label: labels.replaced,\n Icon: ArrowPathIcon,\n badgeClasses: 'bg-[var(--tuwa-info-bg)] text-[var(--tuwa-info-text)]',\n iconClasses: 'text-[var(--tuwa-info-icon)]',\n },\n});\n\n/**\n * Defines the props for the TransactionStatusBadge component.\n * @template TR - The type of the tracker identifier.\n * @template T - The transaction type.\n */\nexport type TransactionStatusBadgeProps<TR, T extends Transaction<TR>> = {\n /** The transaction object whose status will be displayed. */\n tx: T;\n /** Optional additional CSS classes to apply to the badge container. */\n className?: string;\n};\n\n/**\n * A component that displays a transaction's status as a styled badge\n * with a corresponding icon, color, and label.\n */\nexport function TransactionStatusBadge<TR, T extends Transaction<TR>>({\n tx,\n className,\n}: TransactionStatusBadgeProps<TR, T>) {\n const { statuses } = useLabels();\n\n // Memoize the configuration object so it's not re-created on every render.\n // It will only be re-calculated if the labels change (e.g., language switch).\n const statusConfig = useMemo(() => getStatusConfig(statuses), [statuses]);\n\n const baseClasses = 'inline-flex items-center gap-x-1.5 rounded-full px-2 py-1 text-xs font-medium';\n\n // Determine the status key: 'Pending' if the transaction is pending, otherwise use its final status.\n const statusKey = tx.pending ? 'Pending' : tx.status;\n const config = statusKey ? statusConfig[statusKey as keyof typeof statusConfig] : null;\n\n // Fallback for unknown or missing statuses.\n if (!config) {\n return (\n <div className={cn(baseClasses, 'bg-[var(--tuwa-info-bg)] text-[var(--tuwa-info-text)]', className)}>\n {tx.status ?? statuses.unknown}\n </div>\n );\n }\n\n const { label, Icon, badgeClasses, iconClasses } = config;\n\n return (\n <div className={cn(baseClasses, badgeClasses, className)}>\n <Icon className={cn('h-4 w-4', iconClasses)} />\n {label}\n </div>\n );\n}\n","/**\n * @file This file contains the `ToastTransaction` component, which serves as the main body for a transaction notification toast.\n */\n\nimport { Web3Icon } from '@bgd-labs/react-web3-icons';\nimport { getChainName } from '@bgd-labs/react-web3-icons/dist/utils';\nimport { cn } from '@tuwaio/nova-core';\nimport { selectAdapterByKey, Transaction } from '@tuwaio/pulsar-core';\nimport { ComponentType, JSX, ReactNode } from 'react';\nimport { ToastContainerProps, ToastContentProps } from 'react-toastify';\n\nimport { NovaProviderProps, useLabels } from '../providers';\nimport { StatusAwareText, StatusAwareTextProps } from './StatusAwareText';\nimport { TransactionKey, TransactionKeyProps } from './TransactionKey';\nimport { TransactionStatusBadge, TransactionStatusBadgeProps } from './TransactionStatusBadge';\n\n// --- Prop Types for Customization ---\ntype CustomActionButtonProps = { onClick: () => void; children: ReactNode };\n\nexport type ToastTransactionCustomization<TR, T extends Transaction<TR>, A> = {\n components?: {\n StatusAwareText?: ComponentType<StatusAwareTextProps>;\n TransactionKey?: ComponentType<TransactionKeyProps<TR, T, A>>;\n StatusBadge?: ComponentType<TransactionStatusBadgeProps<TR, T>>;\n WalletInfoButton?: ComponentType<CustomActionButtonProps>;\n SpeedUpButton?: ComponentType<CustomActionButtonProps>;\n CancelButton?: ComponentType<CustomActionButtonProps>;\n };\n};\n\nexport type ToastTransactionProps<TR, T extends Transaction<TR>, A> = {\n tx: T;\n openWalletInfoModal?: () => void;\n icon?: ReactNode;\n className?: string;\n customization?: ToastTransactionCustomization<TR, T, A>;\n closeToast?: ToastContentProps['closeToast'];\n toastProps?: ToastContainerProps;\n} & Pick<NovaProviderProps<TR, T, A>, 'transactionsPool' | 'adapters' | 'connectedWalletAddress'>;\n\n// --- Default Sub-Components ---\n\nconst DefaultSpeedUpButton = ({ onClick, children }: CustomActionButtonProps) => (\n <button\n onClick={onClick}\n type=\"button\"\n className=\"cursor-pointer text-sm font-medium text-[var(--tuwa-text-accent)] transition-opacity hover:opacity-80\"\n >\n {children}\n </button>\n);\n\nconst DefaultCancelButton = ({ onClick, children }: CustomActionButtonProps) => (\n <button\n onClick={onClick}\n type=\"button\"\n className=\"cursor-pointer text-sm font-medium text-[var(--tuwa-text-secondary)] transition-opacity hover:opacity-80\"\n >\n {children}\n </button>\n);\n\nconst DefaultWalletInfoButton = ({ onClick, children }: CustomActionButtonProps) => (\n <button\n className=\"cursor-pointer rounded-md bg-gradient-to-r from-[var(--tuwa-button-gradient-from)] to-[var(--tuwa-button-gradient-to)] px-3 py-1 text-xs font-bold text-[var(--tuwa-text-on-accent)] shadow-lg transition-all duration-200 ease-in-out hover:shadow-xl hover:from-[var(--tuwa-button-gradient-from-hover)] hover:to-[var(--tuwa-button-gradient-to-hover)] active:scale-95\"\n onClick={onClick}\n type=\"button\"\n >\n {children}\n </button>\n);\n\n/**\n * A composite component that renders the content for a transaction toast notification.\n * It is highly customizable and leverages the adapter to show relevant actions like \"Speed Up\".\n */\nexport function ToastTransaction<TR, T extends Transaction<TR>, A>({\n openWalletInfoModal,\n tx,\n transactionsPool,\n icon,\n className,\n customization,\n connectedWalletAddress,\n adapters,\n}: ToastTransactionProps<TR, T, A>): JSX.Element {\n const { actions, toast } = useLabels();\n\n const adapter = selectAdapterByKey({ adapterKey: tx.adapter, adapters });\n\n // Let the adapter decide if the transaction can be replaced.\n // We only check if the transaction is pending and if the adapter provides the necessary action handlers.\n const canBeReplaced = !!(\n tx.pending &&\n adapter?.speedUpTxAction &&\n adapter?.cancelTxAction &&\n tx.from.toLowerCase() === connectedWalletAddress?.toLowerCase()\n );\n\n // --- Action Handlers ---\n const handleCancel = () => {\n if (canBeReplaced) adapter.cancelTxAction!(tx);\n };\n\n const handleSpeedUp = () => {\n if (canBeReplaced) adapter.speedUpTxAction!(tx);\n };\n\n // --- Component Overrides ---\n const {\n StatusAwareText: CStatusAwareText = StatusAwareText,\n TransactionKey: CTransactionKey = TransactionKey,\n StatusBadge: CStatusBadge = TransactionStatusBadge,\n SpeedUpButton = DefaultSpeedUpButton,\n CancelButton = DefaultCancelButton,\n WalletInfoButton = DefaultWalletInfoButton,\n } = customization?.components ?? {};\n\n return (\n <div className={cn('flex w-full flex-col gap-3 rounded-lg bg-[var(--tuwa-bg-primary)] p-4 shadow-md', className)}>\n {/* --- Header: Icon + Title/Description --- */}\n <div className=\"flex items-start gap-3\">\n <div className=\"w-[40px] flex-shrink-0\" title={getChainName(tx.chainId as number)}>\n {icon ?? <Web3Icon chainId={tx.chainId as number} />}\n </div>\n <div className=\"flex-1\">\n <CStatusAwareText txStatus={tx.status} source={tx.title} fallback={tx.type} variant=\"title\" applyColor />\n <CStatusAwareText txStatus={tx.status} source={tx.description} variant=\"description\" />\n </div>\n </div>\n\n {/* --- Body: Hashes + Status/Actions --- */}\n <div>\n <CTransactionKey transactionsPool={transactionsPool} adapters={adapters} tx={tx} variant=\"toast\" />\n <div className=\"mt-3 flex items-center justify-between\">\n <CStatusBadge tx={tx} />\n\n {canBeReplaced ? (\n <div className=\"flex items-center gap-4\">\n <SpeedUpButton onClick={handleSpeedUp}>{actions.speedUp}</SpeedUpButton>\n <CancelButton onClick={handleCancel}>{actions.cancel}</CancelButton>\n </div>\n ) : (\n openWalletInfoModal && (\n <WalletInfoButton onClick={openWalletInfoModal}>{toast.openWalletInfo}</WalletInfoButton>\n )\n )}\n </div>\n </div>\n </div>\n );\n}\n","/**\n * @file This file contains the `TxErrorBlock` component for displaying transaction error messages.\n */\n\nimport { CheckIcon, DocumentDuplicateIcon, ExclamationTriangleIcon } from '@heroicons/react/24/solid';\nimport { cn, useCopyToClipboard } from '@tuwaio/nova-core';\n\nimport { useLabels } from '../../providers';\n\nexport type TxErrorBlockProps = {\n /** The error message string to display. If undefined or empty, the component renders nothing. */\n error?: string;\n /** Optional additional CSS classes for the container. */\n className?: string;\n};\n\n/**\n * A component that displays a formatted block for a transaction error message.\n * It includes a title, an icon, the error message in a scrollable area,\n * and a button to copy the message to the clipboard.\n */\nexport function TxErrorBlock({ error, className }: TxErrorBlockProps) {\n const { isCopied, copy } = useCopyToClipboard();\n const { actions, txError } = useLabels();\n\n // Don't render anything if there is no error message.\n if (!error) {\n return null;\n }\n\n return (\n <div\n className={cn(\n 'rounded-lg border border-[var(--tuwa-error-icon)]/30 bg-[var(--tuwa-error-bg)] p-3 text-sm',\n className,\n )}\n >\n {/* --- Header with Title and Copy Button --- */}\n <div className=\"mb-2 flex items-center justify-between\">\n <div className=\"flex items-center gap-2 font-bold text-[var(--tuwa-error-icon)]\">\n <ExclamationTriangleIcon className=\"h-5 w-5\" />\n <span>{txError.title}</span>\n </div>\n <button\n type=\"button\"\n onClick={() => copy(error)}\n title={isCopied ? txError.copied : actions.copy}\n aria-label={isCopied ? txError.copied : `${actions.copy} error message`}\n className=\"cursor-pointer text-[var(--tuwa-error-icon)]/50 transition-colors hover:text-[var(--tuwa-error-icon)]\"\n >\n {isCopied ? (\n <CheckIcon className=\"h-5 w-5 text-[var(--tuwa-success-icon)]\" />\n ) : (\n <DocumentDuplicateIcon className=\"h-5 w-5\" />\n )}\n </button>\n </div>\n\n {/* --- Scrollable Error Message --- */}\n <div className=\"max-h-24 overflow-y-auto rounded bg-[var(--tuwa-bg-primary)] p-2\">\n <p className=\"font-mono text-xs text-[var(--tuwa-error-text)] break-all\">{error}</p>\n </div>\n </div>\n );\n}\n","/**\n * @file This file contains the `TxInfoBlock` component, which displays key details about a transaction.\n */\n\nimport { Web3Icon } from '@bgd-labs/react-web3-icons';\nimport { getChainName } from '@bgd-labs/react-web3-icons/dist/utils';\nimport { cn } from '@tuwaio/nova-core';\nimport { InitialTransaction, Transaction } from '@tuwaio/pulsar-core';\nimport dayjs from 'dayjs';\nimport { ComponentType, ReactNode } from 'react';\n\nimport { NovaProviderProps, useLabels } from '../../providers';\nimport { TransactionKey, TransactionKeyProps } from '../TransactionKey';\n\n// --- Types for Customization & Props ---\ntype CustomInfoRowProps = { label: ReactNode; value: ReactNode };\n\nexport type TxInfoBlockCustomization<TR, T extends Transaction<TR>, A> = {\n components?: {\n InfoRow?: ComponentType<CustomInfoRowProps>;\n transactionKey?: TransactionKeyProps<TR, T, A>['renderHashLink'];\n };\n};\n\nexport type TxInfoBlockProps<TR, T extends Transaction<TR>, A> = {\n /** The transaction object to display, which can be a full transaction or an initial one. */\n tx: T | InitialTransaction;\n className?: string;\n customization?: TxInfoBlockCustomization<TR, T, A>;\n} & Pick<NovaProviderProps<TR, T, A>, 'adapters' | 'transactionsPool'>;\n\n// --- Default Sub-Component ---\nfunction DefaultInfoRow({ label, value }: CustomInfoRowProps) {\n return (\n <div className=\"flex items-center justify-between text-sm\">\n <span className=\"text-[var(--tuwa-text-secondary)]\">{label}</span>\n <span className=\"font-medium text-[var(--tuwa-text-primary)]\">{value}</span>\n </div>\n );\n}\n\n/**\n * A component that displays a block of essential transaction details,\n * such as network, start time, and relevant hashes/keys.\n */\nexport function TxInfoBlock<TR, T extends Transaction<TR>, A>({\n tx,\n adapters,\n transactionsPool,\n className,\n customization,\n}: TxInfoBlockProps<TR, T, A>) {\n const { txInfo } = useLabels();\n\n // Use the custom InfoRow component if provided, otherwise fall back to the default.\n const { InfoRow = DefaultInfoRow } = customization?.components ?? {};\n\n // Determine the chain ID, falling back from the final chainId to the desiredChainID for initial transactions.\n const chainId = ('chainId' in tx ? tx.chainId : tx.desiredChainID) as number;\n\n return (\n <div\n className={cn(\n 'flex flex-col gap-3 rounded-lg border border-[var(--tuwa-border-primary)] bg-[var(--tuwa-bg-primary)] p-3',\n className,\n )}\n >\n {/* --- Network and Timestamp Info --- */}\n <InfoRow\n label={txInfo.network}\n value={\n <div className=\"flex items-center justify-end gap-2\">\n <div className=\"h-4 w-4\">\n <Web3Icon chainId={chainId} />\n </div>\n <span>{getChainName(chainId)}</span>\n </div>\n }\n />\n {tx.localTimestamp && (\n <InfoRow label={txInfo.started} value={dayjs.unix(tx.localTimestamp).format('MMM D, HH:mm:ss')} />\n )}\n\n {/* --- Transaction Hashes/Keys --- */}\n {'txKey' in tx && tx.txKey && (\n <div className=\"border-t border-[var(--tuwa-border-primary)] pt-3\">\n <TransactionKey\n tx={tx as T}\n adapters={adapters}\n transactionsPool={transactionsPool}\n variant=\"history\" // 'history' variant provides suitable styling for this block\n renderHashLink={customization?.components?.transactionKey}\n />\n </div>\n )}\n </div>\n );\n}\n","/**\n * @file This file contains the `TxProgressIndicator` component, a visual step-by-step progress bar for transactions.\n */\n\nimport { ArrowPathIcon, CheckIcon, ExclamationTriangleIcon } from '@heroicons/react/24/solid';\nimport { cn } from '@tuwaio/nova-core';\nimport { ComponentType, useMemo } from 'react';\n\nimport { useLabels } from '../../providers';\n\n// --- Sub-component: Step ---\n\nexport type StepStatus = 'active' | 'completed' | 'error' | 'inactive' | 'replaced';\nexport type StepProps = { status: StepStatus; label: string; isFirst?: boolean; isLast?: boolean };\n\n/**\n * A configuration map for styling each step based on its status.\n * Defined outside the component to prevent re-creation.\n */\nconst STEP_STYLE_CONFIG: Record<StepStatus, { line: string; border: string; fill: string; pulse?: string }> = {\n completed: {\n line: 'bg-[var(--tuwa-success-icon)]',\n border: 'border-[var(--tuwa-success-icon)]',\n fill: 'bg-[var(--tuwa-success-icon)]',\n },\n error: {\n line: 'bg-[var(--tuwa-error-icon)]',\n border: 'border-[var(--tuwa-error-icon)]',\n fill: 'bg-[var(--tuwa-error-icon)]',\n },\n replaced: {\n line: 'bg-[var(--tuwa-info-icon)]',\n border: 'border-[var(--tuwa-info-icon)]',\n fill: 'bg-[var(--tuwa-info-icon)]',\n },\n active: {\n line: 'bg-[var(--tuwa-pending-icon)]',\n border: 'border-[var(--tuwa-pending-icon)]',\n fill: 'bg-transparent',\n pulse: 'bg-[var(--tuwa-pending-icon)]',\n },\n inactive: {\n line: 'bg-[var(--tuwa-border-primary)]',\n border: 'border-[var(--tuwa-border-primary)]',\n fill: 'bg-transparent',\n },\n};\n\n/**\n * Renders a single step in the progress indicator.\n */\nfunction Step({ status, label, isFirst = false }: StepProps) {\n const styles = STEP_STYLE_CONFIG[status];\n\n const renderIcon = () => {\n switch (status) {\n case 'completed':\n return <CheckIcon className=\"h-3 w-3 text-white\" />;\n case 'error':\n return <ExclamationTriangleIcon className=\"h-3 w-3 text-white\" />;\n case 'replaced':\n return <ArrowPathIcon className=\"h-3 w-3 text-white\" />;\n case 'active':\n return <div className={cn('h-2 w-2 animate-pulse rounded-full', styles.pulse)} />;\n default:\n return null;\n }\n };\n\n return (\n <div className=\"relative flex min-w-[80px] flex-1 flex-col items-center\">\n {/* Connecting line */}\n {!isFirst && <div className={cn('absolute right-1/2 top-[10px] h-0.5 w-full', styles.line)} />}\n\n {/* Circle and Icon */}\n <div\n className={cn(\n 'relative z-10 flex h-5 w-5 items-center justify-center rounded-full border-2',\n styles.border,\n styles.fill,\n )}\n >\n {renderIcon()}\n </div>\n\n {/* Label */}\n <span\n className={cn(\n 'mt-2 text-center text-xs',\n status !== 'inactive' ? 'font-semibold text-[var(--tuwa-text-primary)]' : 'text-[var(--tuwa-text-secondary)]',\n )}\n >\n {label}\n </span>\n </div>\n );\n}\n\n// --- Main Component: TxProgressIndicator ---\n\nexport interface TxProgressIndicatorProps {\n isProcessing?: boolean;\n isSucceed?: boolean;\n isFailed?: boolean;\n isReplaced?: boolean;\n className?: string;\n StepComponent?: ComponentType<StepProps>;\n}\n\n/**\n * A 3-step progress indicator that visually represents the lifecycle of a transaction.\n */\nexport function TxProgressIndicator({\n isProcessing,\n isSucceed,\n isFailed,\n isReplaced,\n className,\n StepComponent = Step,\n}: TxProgressIndicatorProps) {\n const { trackingModal, statuses } = useLabels();\n\n // Memoize the steps array to avoid re-calculating on every render.\n const steps = useMemo((): StepProps[] => {\n const getStepStatus = (stepIndex: 1 | 2 | 3): StepStatus => {\n if (stepIndex === 1) return 'completed'; // \"Created\" is always complete\n if (stepIndex === 2) {\n // \"Processing\"\n if (isSucceed || isFailed || isReplaced) return 'completed';\n if (isProcessing) return 'active';\n }\n if (stepIndex === 3) {\n // \"Final\"\n if (isSucceed) return 'completed';\n if (isFailed) return 'error';\n if (isReplaced) return 'replaced';\n if (isProcessing) return 'active';\n }\n return 'inactive';\n };\n\n const getStepLabel = (stepIndex: 1 | 2 | 3): string => {\n if (stepIndex === 1) return trackingModal.progressIndicator.created;\n if (stepIndex === 2) return trackingModal.progressIndicator.processing;\n if (isFailed) return statuses.failed;\n if (isReplaced) return statuses.replaced;\n return trackingModal.progressIndicator.succeed;\n };\n\n return [\n { status: getStepStatus(1), label: getStepLabel(1), isFirst: true },\n { status: getStepStatus(2), label: getStepLabel(2) },\n { status: getStepStatus(3), label: getStepLabel(3), isLast: true },\n ];\n }, [isProcessing, isSucceed, isFailed, isReplaced, trackingModal, statuses]);\n\n return (\n <div className={cn('flex w-full items-start px-4 pt-2 pb-1', className)}>\n {steps.map((stepProps, index) => (\n <StepComponent key={index} {...stepProps} />\n ))}\n </div>\n );\n}\n","/**\n * @file This file contains the `TxStatusVisual` component, which displays a large icon representing the transaction's status.\n */\n\nimport { ArrowPathIcon, CheckCircleIcon, ClockIcon, ExclamationCircleIcon } from '@heroicons/react/24/solid';\nimport { cn } from '@tuwaio/nova-core';\nimport { ComponentType } from 'react';\n\nexport type TxStatusVisualProps = {\n /** True if the transaction is currently being processed (e.g., in the mempool). */\n isProcessing?: boolean;\n /** True if the transaction has successfully completed. */\n isSucceed?: boolean;\n /** True if the transaction has failed or was reverted. */\n isFailed?: boolean;\n /** True if the transaction was replaced (e.g., sped up). */\n isReplaced?: boolean;\n};\n\n// A configuration map that links a status to its corresponding icon and styles.\n// Defined outside the component to prevent re-creation on every render.\nconst STATUS_VISUAL_CONFIG: Record<\n 'succeed' | 'failed' | 'replaced' | 'processing' | 'initializing',\n { Icon: ComponentType<{ className?: string }>; className: string }\n> = {\n succeed: {\n Icon: CheckCircleIcon,\n className: 'text-[var(--tuwa-success-icon)]',\n },\n failed: {\n Icon: ExclamationCircleIcon,\n className: 'text-[var(--tuwa-error-icon)]',\n },\n replaced: {\n Icon: ArrowPathIcon,\n className: 'text-[var(--tuwa-info-icon)]',\n },\n processing: {\n Icon: ArrowPathIcon,\n className: 'animate-spin text-[var(--tuwa-text-accent)]',\n },\n initializing: {\n Icon: ClockIcon,\n className: 'animate-pulse text-[var(--tuwa-pending-icon)]',\n },\n};\n\n/**\n * A component that renders a large, animated icon to visually represent the\n * current state of a transaction within the tracking modal.\n */\nexport function TxStatusVisual({ isProcessing, isSucceed, isFailed, isReplaced }: TxStatusVisualProps) {\n // Determine the current status key based on the props.\n const statusKey =\n (isSucceed && 'succeed') ||\n (isFailed && 'failed') ||\n (isReplaced && 'replaced') ||\n (isProcessing && 'processing') ||\n 'initializing';\n\n const { Icon, className } = STATUS_VISUAL_CONFIG[statusKey];\n\n return (\n <div className=\"flex justify-center py-4\">\n <Icon className={cn('h-16 w-16', className)} />\n </div>\n );\n}\n","'use client';\n\n/**\n * @file This file contains the `TrackingTxModal`, the main UI for displaying the detailed lifecycle of a single transaction.\n */\nimport { XMarkIcon } from '@heroicons/react/24/solid';\nimport * as Dialog from '@radix-ui/react-dialog';\nimport { cn } from '@tuwaio/nova-core';\nimport {\n InitialTransaction,\n InitialTransactionParams,\n selectAdapterByKey,\n Transaction,\n TransactionStatus,\n} from '@tuwaio/pulsar-core';\nimport { AnimatePresence, motion, MotionProps } from 'framer-motion';\nimport { ComponentPropsWithoutRef, ComponentType, ReactNode, useMemo } from 'react';\n\nimport { NovaProviderProps, useLabels } from '../../providers';\nimport { StatusAwareText } from '../StatusAwareText';\nimport { TxErrorBlock, TxErrorBlockProps } from './TxErrorBlock';\nimport { TxInfoBlock, TxInfoBlockProps } from './TxInfoBlock';\nimport { TxProgressIndicator, TxProgressIndicatorProps } from './TxProgressIndicator';\nimport { TxStatusVisual, TxStatusVisualProps } from './TxStatusVisual';\n\n// --- Prop Types for Customization ---\ntype CustomHeaderProps = { onClose: () => void; title: ReactNode };\ntype CustomFooterProps = {\n onClose: () => void;\n onOpenWalletInfo: () => void;\n onRetry?: () => void;\n onSpeedUp?: () => void;\n onCancel?: () => void;\n isProcessing?: boolean;\n isFailed?: boolean;\n canReplace?: boolean;\n};\n\nexport type TrackingTxModalCustomization<TR, T extends Transaction<TR>, A> = {\n modalProps?: Partial<ComponentPropsWithoutRef<typeof Dialog.Content>>;\n motionProps?: MotionProps;\n components?: {\n Header?: ComponentType<CustomHeaderProps>;\n Footer?: ComponentType<CustomFooterProps>;\n StatusVisual?: ComponentType<TxStatusVisualProps>;\n ProgressIndicator?: ComponentType<TxProgressIndicatorProps>;\n InfoBlock?: ComponentType<TxInfoBlockProps<TR, T, A>>;\n ErrorBlock?: ComponentType<TxErrorBlockProps>;\n };\n};\n\nexport type TrackingTxModalProps<TR, T extends Transaction<TR>, A> = Pick<\n NovaProviderProps<TR, T, A>,\n 'handleTransaction' | 'initialTx' | 'actions' | 'transactionsPool' | 'adapters'\n> & {\n onClose: (txKey?: string) => void;\n onOpenWalletInfo: () => void;\n className?: string;\n customization?: TrackingTxModalCustomization<TR, T, A>;\n};\n\n/**\n * A detailed modal that displays the real-time status and lifecycle of a transaction.\n * It opens automatically for transactions initiated with `withTrackedModal: true`.\n */\nexport function TrackingTxModal<TR, T extends Transaction<TR>, A>({\n adapters,\n onClose,\n onOpenWalletInfo,\n className,\n customization,\n transactionsPool,\n actions,\n handleTransaction,\n initialTx,\n}: TrackingTxModalProps<TR, T, A>) {\n // --- State Derivation ---\n const activeTx = useMemo(\n () => (initialTx?.lastTxKey ? transactionsPool[initialTx.lastTxKey] : undefined),\n [transactionsPool, initialTx],\n );\n\n const txToDisplay = activeTx ?? initialTx;\n\n const isOpen = (initialTx?.withTrackedModal && !activeTx) || (activeTx?.isTrackedModalOpen ?? false);\n\n // --- Derived Status Flags ---\n const { isProcessing, isSucceed, isFailed, isReplaced } = useMemo(() => {\n const txStatus = activeTx?.status;\n const isInitializing = initialTx?.isInitializing ?? false;\n const isPending = activeTx?.pending ?? false;\n return {\n isProcessing: isInitializing || isPending,\n isSucceed: txStatus === TransactionStatus.Success,\n isFailed: activeTx?.isError || !!initialTx?.errorMessage,\n isReplaced: txStatus === TransactionStatus.Replaced,\n };\n }, [activeTx, initialTx]);\n\n // --- Adapter and Action Logic ---\n const adapter = useMemo(\n () => (txToDisplay ? selectAdapterByKey({ adapterKey: txToDisplay.adapter, adapters }) : undefined),\n [txToDisplay, adapters],\n );\n\n const canRetry = !!(isFailed && txToDisplay?.actionKey && actions?.[txToDisplay.actionKey] && handleTransaction);\n const canReplace = !!(adapter?.speedUpTxAction && adapter?.cancelTxAction && activeTx?.pending);\n\n // --- Action Handlers ---\n const handleRetry = () => {\n if (!canRetry || !txToDisplay?.actionKey || !adapter?.retryTxAction) return;\n\n const retryParams: InitialTransactionParams = {\n adapter: txToDisplay.adapter,\n type: txToDisplay.type,\n desiredChainID: 'desiredChainID' in txToDisplay ? txToDisplay.desiredChainID : txToDisplay.chainId,\n actionKey: txToDisplay.actionKey,\n title: txToDisplay.title,\n description: txToDisplay.description,\n payload: txToDisplay.payload,\n withTrackedModal: true,\n };\n adapter.retryTxAction({ tx: retryParams, txKey: activeTx?.txKey ?? '', actions, onClose, handleTransaction });\n };\n const handleCancel = () => {\n if (canReplace && activeTx) adapter.cancelTxAction!(activeTx);\n };\n const handleSpeedUp = () => {\n if (canReplace && activeTx) adapter.speedUpTxAction!(activeTx);\n };\n\n // --- Customization & Rendering ---\n const CustomHeader = customization?.components?.Header;\n const CustomFooter = customization?.components?.Footer;\n const CustomStatusVisual = customization?.components?.StatusVisual;\n const CustomProgressIndicator = customization?.components?.ProgressIndicator;\n const CustomInfoBlock = customization?.components?.InfoBlock;\n const CustomErrorBlock = customization?.components?.ErrorBlock;\n\n const motionProps: MotionProps = {\n initial: { opacity: 0, scale: 0.95 },\n animate: { opacity: 1, scale: 1 },\n exit: { opacity: 0, scale: 0.95 },\n transition: { duration: 0.2, ease: 'easeOut' },\n ...customization?.motionProps,\n };\n\n if (!txToDisplay) return null;\n\n return (\n <Dialog.Root open={isOpen} onOpenChange={(open) => !open && onClose(activeTx?.txKey)}>\n <Dialog.Portal>\n <AnimatePresence>\n {isOpen && (\n <>\n <Dialog.Overlay asChild>\n <motion.div\n className=\"fixed inset-0 z-50 bg-black/60\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n />\n </Dialog.Overlay>\n <Dialog.Content\n className=\"fixed left-1/2 top-1/2 z-50 w-full max-w-md -translate-x-1/2 -translate-y-1/2 outline-none\"\n {...customization?.modalProps}\n asChild\n >\n <motion.div {...motionProps}>\n <div\n className={cn(\n 'relative flex max-h-[98dvh] w-full flex-col gap-3 overflow-y-auto rounded-2xl bg-[var(--tuwa-bg-primary)] p-5 pt-0 shadow-2xl',\n className,\n )}\n >\n {CustomHeader ? (\n <CustomHeader\n onClose={() => onClose(activeTx?.txKey)}\n title={<DefaultHeaderTitle tx={txToDisplay} />}\n />\n ) : (\n <DefaultHeader\n onClose={() => onClose(activeTx?.txKey)}\n title={<DefaultHeaderTitle tx={txToDisplay} />}\n />\n )}\n\n <main className=\"flex flex-col gap-3\">\n {CustomStatusVisual ? (\n <CustomStatusVisual\n isProcessing={isProcessing}\n isSucceed={isSucceed}\n isFailed={isFailed}\n isReplaced={isReplaced}\n />\n ) : (\n <TxStatusVisual\n isProcessing={isProcessing}\n isSucceed={isSucceed}\n isFailed={isFailed}\n isReplaced={isReplaced}\n />\n )}\n {CustomProgressIndicator ? (\n <CustomProgressIndicator\n isProcessing={isProcessing}\n isSucceed={isSucceed}\n isFailed={isFailed}\n isReplaced={isReplaced}\n />\n ) : (\n <TxProgressIndicator\n isProcessing={isProcessing}\n isSucceed={isSucceed}\n isFailed={isFailed}\n isReplaced={isReplaced}\n />\n )}\n {CustomInfoBlock ? (\n <CustomInfoBlock tx={txToDisplay} adapters={adapters} transactionsPool={transactionsPool} />\n ) : (\n <TxInfoBlock tx={txToDisplay} adapters={adapters} transactionsPool={transactionsPool} />\n )}\n {CustomErrorBlock ? (\n <CustomErrorBlock error={activeTx?.errorMessage || initialTx?.errorMessage} />\n ) : (\n <TxErrorBlock error={activeTx?.errorMessage || initialTx?.errorMessage} />\n )}\n </main>\n\n {CustomFooter ? (\n <CustomFooter\n onClose={() => onClose(activeTx?.txKey)}\n onOpenWalletInfo={onOpenWalletInfo}\n isProcessing={isProcessing}\n isFailed={isFailed}\n canReplace={canReplace}\n onRetry={canRetry ? handleRetry : undefined}\n onSpeedUp={canReplace ? handleSpeedUp : undefined}\n onCancel={canReplace ? handleCancel : undefined}\n />\n ) : (\n <DefaultFooter\n onClose={() => onClose(activeTx?.txKey)}\n onOpenWalletInfo={onOpenWalletInfo}\n isProcessing={isProcessing}\n isFailed={isFailed}\n canReplace={canReplace}\n onRetry={canRetry ? handleRetry : undefined}\n onSpeedUp={canReplace ? handleSpeedUp : undefined}\n onCancel={canReplace ? handleCancel : undefined}\n />\n )}\n </div>\n </motion.div>\n </Dialog.Content>\n </>\n )}\n </AnimatePresence>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n\n// --- Default Sub-Components ---\n\nconst DefaultHeaderTitle = ({ tx }: { tx: Transaction<any> | InitialTransaction }) => (\n <StatusAwareText\n txStatus={'status' in tx ? tx.status : undefined}\n source={tx.title}\n fallback={tx.type}\n variant=\"title\"\n className=\"text-lg\"\n />\n);\n\nconst DefaultHeader = ({ onClose, title }: CustomHeaderProps) => {\n const { actions } = useLabels();\n return (\n <header className=\"sticky top-0 z-10 flex w-full items-start justify-between bg-[var(--tuwa-bg-primary)] pt-5 pb-2\">\n <Dialog.Title asChild>{title}</Dialog.Title>\n <Dialog.Close asChild>\n <button\n type=\"button\"\n onClick={() => onClose()}\n aria-label={actions.close}\n className=\"cursor-pointer -mt-1 ml-2 rounded-full p-1 text-[var(--tuwa-text-tertiary)] transition-colors hover:bg-[var(--tuwa-bg-muted)] hover:text-[var(--tuwa-text-primary)]\"\n >\n <XMarkIcon className=\"h-5 w-5\" />\n </button>\n </Dialog.Close>\n </header>\n );\n};\n\nconst DefaultFooter = ({\n onClose,\n onOpenWalletInfo,\n isProcessing,\n onRetry,\n onSpeedUp,\n onCancel,\n canReplace,\n isFailed,\n}: CustomFooterProps) => {\n const { trackingModal, actions } = useLabels();\n\n const MainActionButton = () => {\n if (isFailed && onRetry) {\n return (\n <button\n type=\"button\"\n onClick={onRetry}\n className=\"cursor-pointer rounded-md bg-[var(--tuwa-button-gradient-from)] px-4 py-2 text-sm font-semibold text-[var(--tuwa-text-on-accent)] transition-opacity hover:opacity-90\"\n >\n {trackingModal.retry}\n </button>\n );\n }\n if (!isProcessing && !canReplace) {\n return (\n <button\n type=\"button\"\n onClick={onOpenWalletInfo}\n className=\"cursor-pointer rounded-md bg-[var(--tuwa-bg-muted)] px-4 py-2 text-sm font-semibold text-[var(--tuwa-text-primary)] transition-colors hover:bg-[var(--tuwa-border-primary)]\"\n >\n {trackingModal.walletInfo}\n </button>\n );\n }\n return null;\n };\n\n return (\n <footer className=\"mt-2 flex w-full items-center justify-between border-t border-[var(--tuwa-border-primary)] pt-4\">\n <div className=\"flex items-center gap-4\">\n {canReplace && onSpeedUp && onCancel && (\n <>\n <button\n type=\"button\"\n onClick={onSpeedUp}\n className=\"cursor-pointer text-sm font-medium text-[var(--tuwa-text-accent)] transition-opacity hover:opacity-80\"\n >\n {actions.speedUp}\n </button>\n <button\n type=\"button\"\n onClick={onCancel}\n className=\"cursor-pointer text-sm font-medium text-[var(--tuwa-text-secondary)] transition-opacity hover:opacity-80\"\n >\n {actions.cancel}\n </button>\n </>\n )}\n </div>\n <div className=\"flex items-center gap-3\">\n <MainActionButton />\n <button\n type=\"button\"\n onClick={onClose}\n disabled={isProcessing && !canReplace}\n className=\"cursor-pointer rounded-md bg-[var(--tuwa-bg-muted)] px-4 py-2 text-sm font-semibold text-[var(--tuwa-text-primary)] transition-colors hover:bg-[var(--tuwa-border-primary)] disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {isProcessing && !canReplace ? trackingModal.processing : trackingModal.close}\n </button>\n </div>\n </footer>\n );\n};\n","/**\n * @file This file contains the `TransactionHistoryItem` component, which renders a single transaction\n * in a list format for the transaction history view.\n */\n\nimport { Web3Icon } from '@bgd-labs/react-web3-icons';\nimport { cn } from '@tuwaio/nova-core';\nimport { Transaction } from '@tuwaio/pulsar-core';\nimport dayjs from 'dayjs';\nimport relativeTime from 'dayjs/plugin/relativeTime';\nimport { ComponentType, JSX } from 'react';\n\nimport { NovaProviderProps } from '../providers';\nimport { StatusAwareText, StatusAwareTextProps } from './StatusAwareText';\nimport { TransactionKey, TransactionKeyProps } from './TransactionKey';\nimport { TransactionStatusBadge, TransactionStatusBadgeProps } from './TransactionStatusBadge';\n\n// Extend dayjs with the relativeTime plugin to format timestamps as \"a few seconds ago\".\ndayjs.extend(relativeTime);\n\n// --- Prop Types for Customization ---\ntype CustomIconProps = { chainId: number };\ntype CustomTimestampProps = { timestamp?: number };\n\n/**\n * Defines the structure for the `customization` prop, allowing users to override\n * default sub-components with their own implementations for a history item.\n */\nexport type TransactionHistoryItemCustomization<TR, T extends Transaction<TR>, A> = {\n components?: {\n Icon?: ComponentType<CustomIconProps>;\n Title?: ComponentType<StatusAwareTextProps>;\n Description?: ComponentType<StatusAwareTextProps>;\n Timestamp?: ComponentType<CustomTimestampProps>;\n StatusBadge?: ComponentType<TransactionStatusBadgeProps<TR, T>>;\n TransactionKey?: ComponentType<TransactionKeyProps<TR, T, A>>;\n };\n};\n\nexport type TransactionHistoryItemProps<TR, T extends Transaction<TR>, A> = {\n /** The transaction object to display. */\n tx: T;\n /** An object to customize and override the default internal components. */\n customization?: TransactionHistoryItemCustomization<TR, T, A>;\n /** Optional additional CSS classes for the container. */\n className?: string;\n} & Pick<NovaProviderProps<TR, T, A>, 'adapters' | 'transactionsPool'>;\n\n// --- Default Sub-Components ---\n\nconst DefaultIcon = ({ chainId }: CustomIconProps) => (\n <div className=\"h-8 w-8 text-[var(--tuwa-text-secondary)]\">\n <Web3Icon chainId={chainId} />\n </div>\n);\nconst DefaultTimestamp = ({ timestamp }: CustomTimestampProps) => (\n <span className=\"mb-1 block text-xs text-[var(--tuwa-text-secondary)]\">\n {timestamp ? dayjs.unix(timestamp).fromNow() : '...'}\n </span>\n);\n\n/**\n * A component that renders a single row in the transaction history list.\n * It is highly customizable via the `customization` prop, allowing developers\n * to override any of its internal parts with their own components.\n */\nexport function TransactionHistoryItem<TR, T extends Transaction<TR>, A>({\n tx,\n adapters,\n transactionsPool,\n className,\n customization,\n}: TransactionHistoryItemProps<TR, T, A>): JSX.Element {\n // Use the provided custom components, or fall back to the defaults.\n const {\n Icon = DefaultIcon,\n Title = StatusAwareText,\n Description = StatusAwareText,\n Timestamp = DefaultTimestamp,\n StatusBadge = TransactionStatusBadge,\n TransactionKey: TxKey = TransactionKey,\n } = customization?.components ?? {};\n\n return (\n <div\n className={cn(\n 'flex flex-col gap-2 border-b border-[var(--tuwa-border-secondary)] p-3 transition-colors hover:bg-[var(--tuwa-bg-secondary)]',\n className,\n )}\n >\n <div className=\"flex items-start justify-between\">\n {/* --- Main Info: Icon, Title, Timestamp, Description --- */}\n <div className=\"flex items-center gap-4\">\n <div className=\"flex h-10 w-10 flex-shrink-0 items-center justify-center rounded-full bg-[var(--tuwa-bg-muted)]\">\n <Icon chainId={tx.chainId as number} />\n </div>\n <div>\n <Title txStatus={tx.status} source={tx.title} fallback={tx.type} variant=\"title\" applyColor />\n <Timestamp timestamp={tx.localTimestamp} />\n <Description txStatus={tx.status} source={tx.description} variant=\"description\" />\n </div>\n </div>\n\n {/* --- Status Badge --- */}\n <StatusBadge tx={tx} />\n </div>\n\n {/* --- Transaction Keys/Hashes --- */}\n <TxKey tx={tx} adapters={adapters} transactionsPool={transactionsPool} variant=\"history\" />\n </div>\n );\n}\n","/**\n * @file This file contains the `TransactionsHistory` component, which displays a list of past and pending transactions.\n */\n\nimport { cn } from '@tuwaio/nova-core';\nimport { selectAllTransactionsByActiveWallet, Transaction } from '@tuwaio/pulsar-core';\nimport { ComponentType, useMemo } from 'react';\n\nimport { NovaProviderProps, useLabels } from '../providers';\nimport { TransactionHistoryItem, TransactionHistoryItemProps } from './TransactionHistoryItem';\n\n// --- Types for Customization & Props ---\n\ntype CustomPlaceholderProps = { title: string; message: string };\n\n/**\n * Defines the customization options for the TransactionsHistory component.\n */\nexport type TransactionsHistoryCustomization<TR, T extends Transaction<TR>, A> = {\n classNames?: {\n listWrapper?: string;\n };\n components?: {\n Placeholder?: ComponentType<CustomPlaceholderProps>;\n HistoryItem?: ComponentType<TransactionHistoryItemProps<TR, T, A>>;\n };\n};\n\n/**\n * Defines the props for the TransactionsHistory component.\n * @template TR - The type of the tracker identifier.\n * @template T - The transaction type.\n * @template A - The type of the key returned by an action function.\n */\nexport type TransactionsHistoryProps<TR, T extends Transaction<TR>, A> = Pick<\n NovaProviderProps<TR, T, A>,\n 'adapters' | 'transactionsPool' | 'connectedWalletAddress'\n> & {\n className?: string;\n customization?: TransactionsHistoryCustomization<TR, T, A>;\n};\n\n// --- Default Sub-Components ---\n\nfunction HistoryPlaceholder({ title, message, className }: CustomPlaceholderProps & { className?: string }) {\n return (\n <div className={cn('rounded-lg bg-[var(--tuwa-bg-muted)] p-8 text-center', className)}>\n <h4 className=\"font-semibold text-[var(--tuwa-text-primary)]\">{title}</h4>\n <p className=\"mt-1 text-sm text-[var(--tuwa-text-secondary)]\">{message}</p>\n </div>\n );\n}\n\n/**\n * A component that displays a scrollable list of transactions for the connected wallet.\n * It handles states for when a wallet is not connected or when the history is empty.\n */\nexport function TransactionsHistory<TR, T extends Transaction<TR>, A>({\n adapters,\n connectedWalletAddress,\n transactionsPool,\n className,\n customization,\n}: TransactionsHistoryProps<TR, T, A>) {\n const { walletModal } = useLabels();\n\n // Memoize the filtered and sorted transactions to prevent re-computation on every render.\n const sortedTransactions = useMemo(() => {\n if (!connectedWalletAddress) return [];\n const transactions = selectAllTransactionsByActiveWallet(transactionsPool, connectedWalletAddress);\n // Sort by timestamp, newest first.\n return transactions.sort((a, b) => (b.localTimestamp ?? 0) - (a.localTimestamp ?? 0));\n }, [transactionsPool, connectedWalletAddress]);\n\n // Use custom components if provided, otherwise fall back to the defaults.\n const { Placeholder = HistoryPlaceholder, HistoryItem = TransactionHistoryItem } = customization?.components ?? {};\n\n const renderContent = () => {\n if (!connectedWalletAddress) {\n return (\n <Placeholder\n title={walletModal.history.connectWalletTitle}\n message={walletModal.history.connectWalletMessage}\n />\n );\n }\n\n if (sortedTransactions.length > 0) {\n return (\n <div\n className={cn(\n 'max-h-[400px] overflow-y-auto rounded-lg border border-[var(--tuwa-border-primary)] bg-[var(--tuwa-bg-primary)]',\n customization?.classNames?.listWrapper,\n )}\n >\n {sortedTransactions.map((tx) => (\n <HistoryItem key={tx.txKey} tx={tx} transactionsPool={transactionsPool} adapters={adapters} />\n ))}\n </div>\n );\n }\n\n return (\n <Placeholder\n title={walletModal.history.noTransactionsTitle}\n message={walletModal.history.noTransactionsMessage}\n />\n );\n };\n\n return (\n <div className={cn('flex flex-col gap-y-3', className)}>\n <h3 className=\"text-lg font-bold text-[var(--tuwa-text-primary)]\">{walletModal.history.title}</h3>\n {renderContent()}\n </div>\n );\n}\n","/**\n * @file This file contains the `WalletAddressDisplay` component, a UI element for showing a wallet address.\n */\n\nimport { ArrowTopRightOnSquareIcon, CheckIcon, DocumentDuplicateIcon } from '@heroicons/react/24/solid';\nimport { cn, textCenterEllipsis, useCopyToClipboard } from '@tuwaio/nova-core';\nimport { useMemo } from 'react';\n\nimport { useLabels } from '../../providers';\n\nexport type WalletAddressDisplayProps = {\n /** The full wallet address to display. */\n address: string;\n /** The base URL for the block explorer. If not provided, the explorer link will not be rendered. */\n explorerUrl?: string;\n /** Optional additional CSS classes for the container. */\n className?: string;\n};\n\n/**\n * A component that renders a wallet address in a styled \"pill\" format,\n * including a copy button and an optional link to the appropriate block explorer.\n */\nexport function WalletAddressDisplay({ address, explorerUrl, className }: WalletAddressDisplayProps) {\n const { isCopied, copy } = useCopyToClipboard();\n const { actions, txError } = useLabels();\n\n // Memoize the full explorer link to avoid re-calculating it on every render.\n const fullExplorerLink = useMemo(\n () => (explorerUrl && address ? `${explorerUrl}/address/${address}` : undefined),\n [explorerUrl, address],\n );\n\n return (\n <div\n className={cn(\n 'flex items-center gap-x-3 rounded-full bg-[var(--tuwa-bg-muted)] px-3 py-1 font-mono text-xs text-[var(--tuwa-text-secondary)]',\n className,\n )}\n >\n <span>{textCenterEllipsis(address, 6, 6)}</span>\n <button\n type=\"button\"\n title={isCopied ? txError.copied : actions.copy}\n aria-label={isCopied ? txError.copied : `${actions.copy} address`}\n onClick={() => copy(address)}\n className=\"cursor-pointer transition-colors hover:text-[var(--tuwa-text-primary)]\"\n >\n {isCopied ? (\n <CheckIcon className=\"h-4 w-4 text-[var(--tuwa-success-icon)]\" />\n ) : (\n <DocumentDuplicateIcon className=\"h-4 w-4\" />\n )}\n </button>\n\n {fullExplorerLink && (\n <a\n href={fullExplorerLink}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"transition-colors hover:text-[var(--tuwa-text-accent)]\"\n title={actions.viewOnExplorer}\n aria-label={actions.viewOnExplorer}\n >\n <ArrowTopRightOnSquareIcon className=\"h-4 w-4\" />\n </a>\n )}\n </div>\n );\n}\n","/**\n * @file This file contains the `WalletAvatar` component for displaying a user's avatar.\n */\n\nimport { cn } from '@tuwaio/nova-core';\nimport makeBlockie from 'ethereum-blockies-base64';\nimport { useEffect, useMemo, useState } from 'react';\nimport { isHex, zeroAddress } from 'viem';\n\nimport { useLabels } from '../../providers';\n\nexport type WalletAvatarProps = {\n /** The user's wallet address, used for the blockie fallback and background color. */\n address: string;\n /** An optional URL for the user's ENS avatar image. */\n ensAvatar?: string | null;\n /** Optional additional CSS classes for the container. */\n className?: string;\n};\n\n/**\n * A component that displays a user's avatar.\n *\n * It prioritizes showing the provided `ensAvatar`. If unavailable or if the image fails to load,\n * it falls back to a procedurally generated \"blockie\" based on the user's address.\n * It also generates a unique background color from the address as a placeholder.\n */\nexport function WalletAvatar({ address, ensAvatar, className }: WalletAvatarProps) {\n const { walletModal } = useLabels();\n\n // The source URL for the image, which can change if the ENS avatar fails to load.\n const [imageSrc, setImageSrc] = useState(ensAvatar);\n\n // Memoize the generated blockie to avoid re-creating it on every render.\n const blockie = useMemo(() => makeBlockie(isHex(address) ? address : zeroAddress), [address]);\n\n // Memoize the background color to avoid re-calculating it on every render.\n const bgColor = useMemo(() => `#${address.slice(2, 8)}`, [address]);\n\n // This effect resets the image source whenever the `ensAvatar` prop changes.\n useEffect(() => {\n setImageSrc(ensAvatar);\n }, [ensAvatar]);\n\n // If the ENS avatar URL is invalid, this handler will set the image source to the blockie fallback.\n const handleError = () => {\n setImageSrc(blockie);\n };\n\n return (\n <div className={cn('h-12 w-12 flex-shrink-0 rounded-full', className)} style={{ backgroundColor: bgColor }}>\n <img\n key={ensAvatar} // Force re-mount of img tag when ensAvatar changes\n className=\"h-full w-full rounded-full object-cover\"\n src={imageSrc || blockie}\n alt={`${walletModal.header.avatarAlt} ${address}`}\n onError={handleError}\n />\n </div>\n );\n}\n","/**\n * @file This file contains the `WalletHeader` component, used to display user avatar, name, and address.\n */\n\nimport { cn, textCenterEllipsis } from '@tuwaio/nova-core';\nimport { selectAdapterByKey, Transaction } from '@tuwaio/pulsar-core';\nimport { ReactNode, useEffect, useState } from 'react';\n\nimport { NovaProviderProps, useLabels } from '../../providers';\nimport { WalletAddressDisplay, WalletAddressDisplayProps } from './WalletAddressDisplay';\nimport { WalletAvatar, WalletAvatarProps } from './WalletAvatar';\n\n// --- Prop Types for Customization ---\ntype NameRenderProps = { ensName?: string; isLoading: boolean; address: string };\n\n/**\n * Defines the props for the `WalletHeader` component, including extensive customization options.\n */\nexport type WalletHeaderProps<TR, T extends Transaction<TR>, A> = Pick<\n NovaProviderProps<TR, T, A>,\n 'adapters' | 'connectedAdapterType'\n> & {\n walletAddress?: string;\n explorerUrl?: string;\n className?: string;\n renderAvatar?: (props: WalletAvatarProps) => ReactNode;\n renderName?: (props: NameRenderProps) => ReactNode;\n renderAddressDisplay?: (props: WalletAddressDisplayProps) => ReactNode;\n renderNoWalletContent?: () => ReactNode;\n};\n\n// --- Default Sub-Components ---\n\nconst DefaultNameDisplay = ({\n isLoading,\n ensName,\n walletAddress,\n explorerUrl,\n renderAddressDisplay,\n}: {\n isLoading: boolean;\n ensName?: string;\n walletAddress: string;\n explorerUrl?: string;\n renderAddressDisplay?: (props: WalletAddressDisplayProps) => ReactNode;\n}) => (\n <div className=\"flex flex-col\">\n {/* Primary content area - ENS name or large address */}\n <div className=\"mb-1.5 flex h-7 items-center\">\n {isLoading ? (\n <div className=\"h-full w-48 animate-pulse rounded-md bg-[var(--tuwa-bg-muted)]\" />\n ) : ensName ? (\n <h2 className=\"text-xl font-bold text-[var(--tuwa-text-primary)]\">{ensName}</h2>\n ) : (\n <WalletAddressDisplay\n address={walletAddress}\n explorerUrl={explorerUrl}\n className=\"rounded-none bg-transparent px-0 py-0 text-xl font-bold text-[var(--tuwa-text-primary)]\"\n />\n )}\n </div>\n\n {/* Secondary content area - small address display (only when ENS exists) */}\n <div className=\"flex h-5 items-center\">\n {!isLoading &&\n ensName &&\n (renderAddressDisplay ? (\n renderAddressDisplay({ address: walletAddress, explorerUrl })\n ) : (\n <WalletAddressDisplay address={walletAddress} explorerUrl={explorerUrl} />\n ))}\n </div>\n </div>\n);\n\n/**\n * A component that displays the header for the wallet modal, including the user's avatar,\n * name (if available), and address. It leverages the active adapter to fetch name service data.\n */\nexport function WalletHeader<TR, T extends Transaction<TR>, A>({\n walletAddress,\n adapters,\n connectedAdapterType,\n className,\n renderAvatar,\n renderName,\n renderAddressDisplay,\n renderNoWalletContent,\n explorerUrl,\n}: WalletHeaderProps<TR, T, A>) {\n const { walletModal } = useLabels();\n const [ensName, setEnsName] = useState<string | null>(null);\n const [ensAvatar, setEnsAvatar] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n\n // Fetch Name Service data whenever the wallet address or active adapter changes.\n useEffect(() => {\n const fetchNameData = async () => {\n if (!walletAddress || !connectedAdapterType) {\n setIsLoading(false);\n return;\n }\n\n // Select the currently active adapter.\n const adapter = selectAdapterByKey({ adapterKey: connectedAdapterType, adapters });\n\n // Check if the adapter supports name and avatar resolution.\n const hasNameResolver = adapter && 'getName' in adapter && typeof adapter.getName === 'function';\n const hasAvatarResolver = adapter && 'getAvatar' in adapter && typeof adapter.getAvatar === 'function';\n\n if (!hasNameResolver) {\n setIsLoading(false);\n return; // This adapter doesn't support ENS or equivalent.\n }\n\n setIsLoading(true);\n setEnsName(null);\n setEnsAvatar(null);\n\n try {\n const name = adapter?.getName ? await adapter.getName(walletAddress) : null;\n if (name) {\n setEnsName(name);\n if (hasAvatarResolver) {\n const avatar = adapter?.getAvatar ? await adapter.getAvatar(name) : null;\n setEnsAvatar(avatar);\n }\n }\n } catch (error) {\n console.error('Failed to fetch name service data:', error);\n } finally {\n setIsLoading(false);\n }\n };\n\n fetchNameData();\n }, [walletAddress, adapters, connectedAdapterType]);\n\n // --- Render \"Not Connected\" State ---\n if (!walletAddress) {\n if (renderNoWalletContent) return <>{renderNoWalletContent()}</>;\n return (\n <div\n className={cn(\n 'flex h-20 items-center justify-center rounded-lg bg-[var(--tuwa-bg-muted)] text-[var(--tuwa-text-secondary)]',\n className,\n )}\n >\n {walletModal.header.notConnected}\n </div>\n );\n }\n\n const ensNameAbbreviated = ensName\n ? ensName.length > 30\n ? textCenterEllipsis(ensName, 12, 12)\n : ensName\n : undefined;\n\n // --- Render \"Connected\" State ---\n return (\n <div className={cn('flex min-h-[4rem] items-center gap-4', className)}>\n <div>\n {renderAvatar ? (\n renderAvatar({ address: walletAddress, ensAvatar })\n ) : (\n <WalletAvatar address={walletAddress} ensAvatar={ensAvatar} />\n )}\n </div>\n\n <div className=\"flex min-h-[3.5rem] min-w-[200px] flex-col justify-center\">\n {renderName ? (\n renderName({ ensName: ensNameAbbreviated, isLoading, address: walletAddress })\n ) : (\n <DefaultNameDisplay\n isLoading={isLoading}\n ensName={ensNameAbbreviated}\n walletAddress={walletAddress}\n explorerUrl={explorerUrl}\n renderAddressDisplay={renderAddressDisplay}\n />\n )}\n </div>\n </div>\n );\n}\n","/**\n * @file This file contains the main `WalletInfoModal` component, which serves as the primary UI\n * for viewing wallet details and transaction history.\n */\n\nimport { XMarkIcon } from '@heroicons/react/24/solid';\nimport * as Dialog from '@radix-ui/react-dialog';\nimport { cn } from '@tuwaio/nova-core';\nimport { selectAdapterByKey, Transaction } from '@tuwaio/pulsar-core';\nimport { AnimatePresence, motion, MotionProps } from 'framer-motion';\nimport { ComponentPropsWithoutRef, ComponentType, useMemo } from 'react';\n\nimport { NovaProviderProps, useLabels } from '../../providers';\nimport { TransactionsHistory, TransactionsHistoryProps } from '../TransactionsHistory';\nimport { WalletHeader, WalletHeaderProps } from './WalletHeader';\n\n// --- Prop Types for Customization ---\ntype CustomHeaderProps = { closeModal: () => void };\n\n/**\n * Defines the customization options for the WalletInfoModal.\n */\nexport type WalletInfoModalCustomization<TR, T extends Transaction<TR>, A> = {\n modalProps?: Partial<ComponentPropsWithoutRef<typeof Dialog.Content>>;\n motionProps?: MotionProps;\n classNames?: {\n contentWrapper?: string;\n };\n components?: {\n Header?: ComponentType<CustomHeaderProps>;\n WalletInfo?: ComponentType<WalletHeaderProps<TR, T, A>>;\n History?: ComponentType<TransactionsHistoryProps<TR, T, A>>;\n };\n};\n\n/**\n * Defines the core props for the WalletInfoModal.\n */\nexport type WalletInfoModalProps<TR, T extends Transaction<TR>, A> = Pick<\n NovaProviderProps<TR, T, A>,\n 'adapters' | 'connectedAdapterType' | 'connectedWalletAddress' | 'transactionsPool'\n> & {\n isOpen?: boolean;\n setIsOpen: (value: boolean) => void;\n customization?: WalletInfoModalCustomization<TR, T, A>;\n};\n\n/**\n * The default header component, can be overridden via customization.\n */\nconst DefaultHeader = ({ closeModal, title }: CustomHeaderProps & { title: string }) => {\n const { actions } = useLabels();\n return (\n <div className=\"sticky top-0 left-0 z-10 flex w-full items-center justify-between border-b border-[var(--tuwa-border-primary)] bg-[var(--tuwa-bg-secondary)] p-4\">\n <Dialog.Title className=\"text-lg font-bold text-[var(--tuwa-text-primary)]\">{title}</Dialog.Title>\n <Dialog.Close asChild>\n <button\n type=\"button\"\n onClick={closeModal}\n aria-label={actions.close}\n className=\"cursor-pointer rounded-full p-1 text-[var(--tuwa-text-tertiary)] transition-colors hover:bg-[var(--tuwa-bg-muted)] hover:text-[var(--tuwa-text-primary)]\"\n >\n <XMarkIcon className=\"h-6 w-6\" />\n </button>\n </Dialog.Close>\n </div>\n );\n};\n\n/**\n * The main modal component for displaying wallet information and transaction history.\n * It is highly customizable and built with accessibility in mind using Radix UI.\n */\nexport function WalletInfoModal<TR, T extends Transaction<TR>, A>({\n isOpen,\n setIsOpen,\n customization,\n adapters,\n connectedAdapterType,\n connectedWalletAddress,\n transactionsPool,\n}: WalletInfoModalProps<TR, T, A>) {\n const { walletModal } = useLabels();\n\n const { explorerUrl } = useMemo(() => {\n if (!connectedAdapterType) return { explorerUrl: undefined };\n const adapter = selectAdapterByKey({ adapterKey: connectedAdapterType, adapters });\n return { explorerUrl: adapter?.getExplorerUrl() };\n }, [connectedAdapterType, adapters]);\n\n const closeModal = () => setIsOpen(false);\n\n const defaultMotionProps: MotionProps = {\n initial: { opacity: 0, scale: 0.95 },\n animate: { opacity: 1, scale: 1 },\n exit: { opacity: 0, scale: 0.95 },\n transition: { duration: 0.2, ease: 'easeOut' },\n };\n const motionProps = { ...defaultMotionProps, ...customization?.motionProps };\n\n const CustomHeader = customization?.components?.Header;\n const CustomWalletInfo = customization?.components?.WalletInfo;\n const CustomHistory = customization?.components?.History;\n\n return (\n <Dialog.Root open={isOpen} onOpenChange={(open) => !open && closeModal()}>\n <Dialog.Portal>\n <AnimatePresence>\n {isOpen && (\n <>\n <Dialog.Overlay asChild>\n <motion.div\n className=\"fixed inset-0 z-50 bg-black/45\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15 }}\n />\n </Dialog.Overlay>\n <Dialog.Content\n className=\"fixed left-1/2 top-1/2 z-50 w-full max-w-2xl -translate-x-1/2 -translate-y-1/2 outline-none\"\n {...customization?.modalProps}\n asChild\n >\n <motion.div {...motionProps}>\n <div\n className={cn(\n 'relative max-h-[98dvh] w-full max-w-2xl overflow-y-auto rounded-2xl bg-[var(--tuwa-bg-secondary)] shadow-xl outline-none',\n customization?.classNames?.contentWrapper,\n )}\n >\n {/* Header */}\n {CustomHeader ? (\n <CustomHeader closeModal={closeModal} />\n ) : (\n <DefaultHeader closeModal={closeModal} title={walletModal.title} />\n )}\n\n {/* Body */}\n <div className=\"flex flex-col gap-4 p-4 sm:gap-6 sm:p-6\">\n {CustomWalletInfo ? (\n <CustomWalletInfo\n adapters={adapters}\n connectedAdapterType={connectedAdapterType}\n walletAddress={connectedWalletAddress}\n explorerUrl={explorerUrl}\n />\n ) : (\n <WalletHeader\n adapters={adapters}\n connectedAdapterType={connectedAdapterType}\n walletAddress={connectedWalletAddress}\n explorerUrl={explorerUrl}\n />\n )}\n\n {CustomHistory ? (\n <CustomHistory\n adapters={adapters}\n transactionsPool={transactionsPool}\n connectedWalletAddress={connectedWalletAddress}\n />\n ) : (\n <TransactionsHistory\n adapters={adapters}\n transactionsPool={transactionsPool}\n connectedWalletAddress={connectedWalletAddress}\n />\n )}\n </div>\n </div>\n </motion.div>\n </Dialog.Content>\n </>\n )}\n </AnimatePresence>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n","/**\n * @file This file contains the main `NovaProvider` component, which is the root\n * for the Nova UI library. It should be placed at the top level of your application\n * to orchestrate modals, toasts, and internationalization.\n */\n\nimport { deepMerge, useMediaQuery } from '@tuwaio/nova-core';\nimport {\n ITxTrackingStore,\n Transaction,\n TransactionAdapter,\n TransactionPool,\n TransactionStatus,\n TxActions,\n TxAdapter,\n} from '@tuwaio/pulsar-core';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport { toast, ToastContainer, ToastContainerProps, ToastContentProps, TypeOptions } from 'react-toastify';\n\nimport {\n ToastCloseButton,\n ToastTransaction,\n ToastTransactionCustomization,\n TrackingTxModal,\n TrackingTxModalCustomization,\n WalletInfoModal,\n WalletInfoModalCustomization,\n} from '../components';\nimport { defaultLabels } from '../i18n/en';\nimport { TuwaLabels } from '../i18n/types';\nimport { LabelsProvider } from './LabelsProvider';\n\n/**\n * Maps a transaction's final status to the corresponding toast type for visual feedback.\n */\nconst STATUS_TO_TOAST_TYPE: Record<string, TypeOptions> = {\n [TransactionStatus.Success]: 'success',\n [TransactionStatus.Failed]: 'error',\n [TransactionStatus.Replaced]: 'info',\n};\n\n/**\n * Defines the props for the NovaProvider component.\n * @template TR - The type of the tracker identifier.\n * @template T - The transaction type.\n * @template A - The type of the key returned by an action function.\n */\nexport type NovaProviderProps<TR, T extends Transaction<TR>, A> = {\n /** An array of configured adapters for different blockchain ecosystems. */\n adapters: TxAdapter<TR, T, A>[];\n /** The address of the currently connected wallet. */\n connectedWalletAddress?: string;\n /** The adapter type of the currently connected wallet. */\n connectedAdapterType?: TransactionAdapter;\n /** The global transaction pool from the Pulsar store. */\n transactionsPool: TransactionPool<TR, T>;\n /** A registry of retryable actions, keyed by `actionKey`. */\n actions?: TxActions;\n /** A partial object of labels to override the default English text. */\n labels?: Partial<TuwaLabels>;\n /** An object to enable or disable major UI features. All are enabled by default. */\n features?: {\n toasts?: boolean;\n walletInfoModal?: boolean;\n trackingTxModal?: boolean;\n };\n /** A single object to pass down deep customization options to all child components. */\n customization?: {\n toast?: ToastTransactionCustomization<TR, T, A>;\n walletInfoModal?: WalletInfoModalCustomization<TR, T, A>;\n trackingTxModal?: TrackingTxModalCustomization<TR, T, A>;\n };\n} & Pick<ITxTrackingStore<TR, T, A>, 'closeTxTrackedModal' | 'handleTransaction' | 'initialTx'> &\n ToastContainerProps;\n\n/**\n * The main component for the Nova UI ecosystem. It renders and orchestrates all\n * UI elements like toasts and modals, and provides the i18n context.\n * This component does not wrap any children.\n */\nexport function NovaProvider<TR, T extends Transaction<TR>, A>({\n adapters,\n connectedWalletAddress,\n connectedAdapterType,\n transactionsPool,\n initialTx,\n handleTransaction,\n closeTxTrackedModal,\n actions,\n labels,\n features,\n customization,\n ...toastProps\n}: NovaProviderProps<TR, T, A>) {\n const [isWalletInfoModalOpen, setIsWalletInfoModalOpen] = useState(false);\n const prevTransactionsRef = useRef<TransactionPool<TR, T>>(transactionsPool);\n\n const isMobile = useMediaQuery('(max-width: 767px)');\n\n const enabledFeatures = useMemo(\n () => ({\n toasts: features?.toasts ?? true,\n walletInfoModal: features?.walletInfoModal ?? true,\n trackingTxModal: features?.trackingTxModal ?? true,\n }),\n [features],\n );\n\n const mergedLabels = useMemo(() => deepMerge(defaultLabels, labels || {}), [labels]);\n\n useEffect(() => {\n if (!enabledFeatures.toasts) return;\n\n const showOrUpdateToast = (tx: T) => {\n const type = tx.pending ? 'info' : (STATUS_TO_TOAST_TYPE[tx.status!] ?? 'info');\n\n const content = (props: ToastContentProps) => (\n <ToastTransaction\n {...props}\n transactionsPool={transactionsPool}\n tx={tx}\n openWalletInfoModal={enabledFeatures.walletInfoModal ? () => setIsWalletInfoModalOpen(true) : undefined}\n customization={customization?.toast}\n adapters={adapters}\n connectedWalletAddress={connectedWalletAddress}\n />\n );\n\n if (toast.isActive(tx.txKey)) {\n toast.update(tx.txKey, { render: content, type });\n } else {\n toast(content, { toastId: tx.txKey, type, closeOnClick: false });\n }\n };\n\n const prevPool = prevTransactionsRef.current;\n\n Object.values(transactionsPool).forEach((currentTx) => {\n const prevTx = prevPool[currentTx.txKey];\n\n if (!prevTx) {\n if (currentTx.pending) {\n showOrUpdateToast(currentTx);\n }\n return;\n }\n\n if (JSON.stringify(prevTx) !== JSON.stringify(currentTx)) {\n showOrUpdateToast(currentTx);\n }\n });\n\n prevTransactionsRef.current = transactionsPool;\n }, [transactionsPool, adapters, customization?.toast, enabledFeatures, connectedWalletAddress]);\n\n const isTrackingModalOpen =\n !!initialTx?.withTrackedModal && transactionsPool[initialTx?.lastTxKey ?? '']?.isTrackedModalOpen;\n\n const shouldShowToasts = enabledFeatures.toasts && (!isMobile || (!isTrackingModalOpen && !isWalletInfoModalOpen));\n\n return (\n <LabelsProvider labels={mergedLabels}>\n {shouldShowToasts && (\n <ToastContainer\n position=\"bottom-right\"\n stacked\n autoClose={false}\n hideProgressBar\n closeOnClick={false}\n icon={false}\n closeButton={ToastCloseButton}\n toastClassName=\"!p-0 !bg-transparent !shadow-none !min-h-0\"\n {...toastProps}\n />\n )}\n\n {enabledFeatures.walletInfoModal && (\n <WalletInfoModal\n transactionsPool={transactionsPool}\n isOpen={isWalletInfoModalOpen}\n setIsOpen={setIsWalletInfoModalOpen}\n customization={customization?.walletInfoModal}\n adapters={adapters}\n connectedWalletAddress={connectedWalletAddress}\n connectedAdapterType={connectedAdapterType}\n />\n )}\n\n {enabledFeatures.trackingTxModal && (\n <TrackingTxModal\n initialTx={initialTx}\n onClose={closeTxTrackedModal}\n onOpenWalletInfo={() => setIsWalletInfoModalOpen(true)}\n transactionsPool={transactionsPool}\n customization={customization?.trackingTxModal}\n actions={actions}\n handleTransaction={handleTransaction}\n adapters={adapters}\n />\n )}\n </LabelsProvider>\n );\n}\n"]}
|