@tuwaio/nova-transactions 1.0.0-fix-explorer-link-alpha.1.611ff3c → 1.0.0-fix-integrate-orbit-alpha.1.64ac306
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 +89 -58
- package/dist/{WalletInfoModal-BeE6SSek.d.cts → WalletInfoModal-CWCY7Pwm.d.cts} +4 -3
- package/dist/{WalletInfoModal-BeE6SSek.d.ts → WalletInfoModal-CWCY7Pwm.d.ts} +4 -3
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -2
- package/dist/index.d.ts +3 -2
- 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 +3 -2
- package/dist/providers/index.d.ts +3 -2
- package/dist/providers/index.js +1 -1
- package/dist/providers/index.js.map +1 -1
- package/package.json +8 -16
package/dist/index.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../src/i18n/en.ts","../src/providers/LabelsProvider.tsx","../src/providers/NovaProvider.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/TxActionButton.tsx","../src/components/WalletInfoModal/WalletAddressDisplay.tsx","../src/components/WalletInfoModal/WalletAvatar.tsx","../src/components/WalletInfoModal/WalletHeader.tsx","../src/components/WalletInfoModal/WalletInfoModal.tsx"],"names":["defaultLabels","LabelsContext","createContext","useLabels","useContext","TransactionStatus","HashLink","label","hash","explorerUrl","variant","className","isCopied","copy","useCopyToClipboard","actions","txError","containerClasses","cn","labelClasses","hashContent","jsx","textCenterEllipsis","jsxs","ArrowTopRightOnSquareIcon","CheckIcon","DocumentDuplicateIcon","STATUS_CONFIG","StatusAwareText","txStatus","source","fallback","applyColor","displayText","colorClass","config","ToastCloseButton","closeToast","XMarkIcon","TransactionKey","tx","adapter","renderHashLink","confirmations","hashLabels","statuses","foundAdapter","selectAdapterByKey","renderHash","props","trackerLabel","trackerKeyElement","TransactionTracker","onChainHashesElement","onChainHash","replacedHash","Fragment","shouldShowTrackerKey","getStatusConfig","labels","ArrowPathIcon","CheckCircleIcon","XCircleIcon","TransactionStatusBadge","statusConfig","useMemo","baseClasses","statusKey","Icon","badgeClasses","iconClasses","DefaultSpeedUpButton","onClick","children","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","isSolanaTransaction","TransactionAdapter","solanaTx","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","transactionsPool","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","getDefaultContent","TxActionButton","action","getLastTxKey","walletAddress","loadingContent","succeedContent","failedContent","replacedContent","resetTimeout","trackedTxButton","setStatus","useState","trackedTxKey","setTrackedTxKey","defaultContent","useEffect","trackedTx","timer","handleClick","WalletAddressDisplay","address","fullExplorerLink","WalletAvatar","ensAvatar","imageSrc","setImageSrc","blockie","makeBlockie","isHex","zeroAddress","bgColor","handleError","DefaultNameDisplay","isLoading","ensName","renderAddressDisplay","WalletHeader","connectedAdapterType","renderAvatar","renderName","renderNoWalletContent","setEnsName","setEnsAvatar","setIsLoading","hasNameResolver","hasAvatarResolver","name","avatar","ensNameAbbreviated","closeModal","N","WalletInfoModal","setIsOpen","CustomWalletInfo","CustomHistory"],"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 confirmationsLabel: 'Confirmations',\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 recentBlockhash: 'Recent Blockhash',\n solana: 'Signature',\n },\n txInfo: {\n started: 'Started',\n network: 'Network',\n slot: 'Slot',\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 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 TxAdapter,\n} from '@tuwaio/pulsar-core';\nimport { useCallback, 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 */\nexport type NovaProviderProps<T extends Transaction> = {\n adapter: TxAdapter<T> | TxAdapter<T>[];\n connectedWalletAddress?: string;\n connectedAdapterType?: TransactionAdapter;\n transactionsPool: TransactionPool<T>;\n labels?: Partial<TuwaLabels>;\n features?: {\n toasts?: boolean;\n walletInfoModal?: boolean;\n trackingTxModal?: boolean;\n };\n customization?: {\n toast?: ToastTransactionCustomization<T>;\n walletInfoModal?: WalletInfoModalCustomization<T>;\n trackingTxModal?: TrackingTxModalCustomization<T>;\n };\n} & Pick<ITxTrackingStore<T>, '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 */\nexport function NovaProvider<T extends Transaction>({\n adapter,\n connectedWalletAddress,\n connectedAdapterType,\n transactionsPool,\n initialTx,\n handleTransaction,\n closeTxTrackedModal,\n labels,\n features,\n customization,\n ...toastProps\n}: NovaProviderProps<T>) {\n const [isWalletInfoModalOpen, setIsWalletInfoModalOpen] = useState(false);\n const prevTransactionsRef = useRef<TransactionPool<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 // Memoized function to show or update a toast.\n const showOrUpdateToast = useCallback(\n (tx: T) => {\n if (!enabledFeatures.toasts) return;\n\n const type = tx.pending ? 'info' : (STATUS_TO_TOAST_TYPE[tx.status!] ?? 'info');\n\n const content = (props: ToastContentProps) => (\n <ToastTransaction\n {...props}\n tx={tx}\n openWalletInfoModal={enabledFeatures.walletInfoModal ? () => setIsWalletInfoModalOpen(true) : undefined}\n customization={customization?.toast}\n adapter={adapter}\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 [transactionsPool, enabledFeatures, customization?.toast, adapter, connectedWalletAddress],\n );\n\n // Effect 1: Handles toasts for NEW or CHANGED transactions.\n useEffect(() => {\n const prevPool = prevTransactionsRef.current;\n\n Object.values(transactionsPool).forEach((currentTx) => {\n const prevTx = prevPool[currentTx.txKey];\n\n // Case 1: A new transaction is added and is pending.\n if (!prevTx && currentTx.pending) {\n showOrUpdateToast(currentTx);\n return;\n }\n\n // Case 2: An existing transaction has been updated.\n if (prevTx && JSON.stringify(prevTx) !== JSON.stringify(currentTx)) {\n showOrUpdateToast(currentTx);\n }\n });\n\n prevTransactionsRef.current = transactionsPool;\n }, [transactionsPool, showOrUpdateToast]);\n\n // Effect 2: Handles toast UPDATES when the connected wallet address changes.\n useEffect(() => {\n // This ensures that visible toasts re-render to show/hide wallet-specific actions\n // like \"Speed Up\", even for completed transactions.\n Object.values(transactionsPool).forEach((tx) => {\n if (toast.isActive(tx.txKey)) {\n showOrUpdateToast(tx);\n }\n });\n }, [connectedWalletAddress, showOrUpdateToast, transactionsPool]);\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 isOpen={isWalletInfoModalOpen}\n setIsOpen={setIsWalletInfoModalOpen}\n customization={customization?.walletInfoModal}\n adapter={adapter}\n connectedWalletAddress={connectedWalletAddress}\n connectedAdapterType={connectedAdapterType}\n transactionsPool={transactionsPool}\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 handleTransaction={handleTransaction}\n adapter={adapter}\n connectedWalletAddress={connectedWalletAddress}\n />\n )}\n </LabelsProvider>\n );\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, TransactionTracker } 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<T extends Transaction> = Pick<NovaProviderProps<T>, 'adapter'> & {\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 /** Optional number of confirmations for a transaction. */\n confirmations?: number;\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<T extends Transaction>({\n tx,\n adapter,\n variant = 'toast',\n className,\n renderHashLink,\n confirmations,\n}: TransactionKeyProps<T>) {\n const { hashLabels, statuses } = useLabels();\n\n // Select the correct adapter for the given transaction.\n const foundAdapter = selectAdapterByKey({ adapterKey: tx.adapter, adapter });\n\n if (!foundAdapter) 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 // This removes the need for `@ts-expect-error` by using a type assertion to key into hashLabels.\n const trackerLabel = (hashLabels as Record<string, string>)[String(tx.tracker)];\n const trackerKeyElement = trackerLabel\n ? renderHash({\n label: trackerLabel,\n hash: tx.txKey,\n variant: tx.tracker !== TransactionTracker.Solana ? 'compact' : 'default',\n explorerUrl:\n foundAdapter.getExplorerTxUrl && tx.tracker === TransactionTracker.Solana\n ? foundAdapter?.getExplorerTxUrl(tx)\n : undefined,\n })\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 {typeof foundAdapter.getExplorerTxUrl !== 'undefined' &&\n renderHash({\n label: hashLabels.replaced,\n hash: replacedHash,\n explorerUrl: foundAdapter.getExplorerTxUrl(tx),\n })}\n </>\n );\n }\n\n return (\n onChainHash &&\n typeof foundAdapter.getExplorerTxUrl !== 'undefined' &&\n renderHash({\n label: hashLabels.default,\n hash: onChainHash,\n explorerUrl: foundAdapter.getExplorerTxUrl(tx),\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 {typeof confirmations === 'number' && (\n <p className=\"text-xs text-[var(--tuwa-text-tertiary)]\">\n {statuses.confirmationsLabel}: {confirmations}\n </p>\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 { 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<T extends Transaction> = {\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<T extends Transaction>({ tx, className }: TransactionStatusBadgeProps<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<T extends Transaction> = {\n components?: {\n StatusAwareText?: ComponentType<StatusAwareTextProps>;\n TransactionKey?: ComponentType<TransactionKeyProps<T>>;\n StatusBadge?: ComponentType<TransactionStatusBadgeProps<T>>;\n WalletInfoButton?: ComponentType<CustomActionButtonProps>;\n SpeedUpButton?: ComponentType<CustomActionButtonProps>;\n CancelButton?: ComponentType<CustomActionButtonProps>;\n };\n};\n\nexport type ToastTransactionProps<T extends Transaction> = {\n tx: T;\n openWalletInfoModal?: () => void;\n icon?: ReactNode;\n className?: string;\n customization?: ToastTransactionCustomization<T>;\n closeToast?: ToastContentProps['closeToast'];\n toastProps?: ToastContainerProps;\n} & Pick<NovaProviderProps<T>, 'adapter' | '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<T extends Transaction>({\n openWalletInfoModal,\n tx,\n icon,\n className,\n customization,\n connectedWalletAddress,\n adapter,\n}: ToastTransactionProps<T>): JSX.Element {\n const { actions, toast } = useLabels();\n\n const foundAdapter = selectAdapterByKey({ adapterKey: tx.adapter, adapter });\n\n // A transaction can be replaced only if it's a standard on-chain transaction (not Safe or Gelato),\n // is pending, the adapter supports the actions, and it belongs to the connected wallet.\n const canBeReplaced = !!(\n tx.tracker === 'ethereum' &&\n tx.pending &&\n foundAdapter?.speedUpTxAction &&\n foundAdapter?.cancelTxAction &&\n tx.from.toLowerCase() === connectedWalletAddress?.toLowerCase()\n );\n\n // --- Action Handlers ---\n const handleCancel = () => {\n if (canBeReplaced) foundAdapter.cancelTxAction!(tx);\n };\n\n const handleSpeedUp = () => {\n if (canBeReplaced) foundAdapter.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 adapter={adapter} 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 !!connectedWalletAddress && (\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 * It also supports Solana-specific functionality to display slot, confirmations, and recentBlockhash details.\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 {\n InitialTransaction,\n selectAdapterByKey,\n SolanaTransaction,\n Transaction,\n TransactionAdapter,\n} from '@tuwaio/pulsar-core';\nimport dayjs from 'dayjs';\nimport { ComponentType, ReactNode } from 'react';\n\nimport { NovaProviderProps, useLabels } from '../../providers';\nimport { HashLink } from '../HashLink';\nimport { TransactionKey, TransactionKeyProps } from '../TransactionKey';\n\n// --- Types for Customization & Props ---\ntype CustomInfoRowProps = { label: ReactNode; value: ReactNode };\n\nexport type TxInfoBlockCustomization<T extends Transaction> = {\n components?: {\n InfoRow?: ComponentType<CustomInfoRowProps>;\n transactionKey?: TransactionKeyProps<T>['renderHashLink'];\n };\n};\n\nexport type TxInfoBlockProps<T extends Transaction> = {\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<T>;\n} & Pick<NovaProviderProps<T>, 'adapter'>;\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, timestamps, Solana-specific details, and relevant hashes/keys.\n */\nexport function TxInfoBlock<T extends Transaction>({ tx, adapter, className, customization }: TxInfoBlockProps<T>) {\n const { txInfo, statuses, hashLabels } = useLabels();\n\n // Select the correct adapter for the given transaction.\n const foundAdapter = selectAdapterByKey({ adapterKey: tx.adapter, adapter });\n\n if (!foundAdapter) return null;\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 const isSolanaTransaction = tx.adapter === TransactionAdapter.SOLANA;\n const solanaTx = isSolanaTransaction ? (tx as SolanaTransaction) : undefined;\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 {/* --- Solana-specific Details (if applicable) --- */}\n {isSolanaTransaction && (\n <>\n {solanaTx?.slot && (\n <InfoRow\n label={txInfo.slot}\n value={\n <HashLink\n hash={solanaTx.slot.toString()}\n explorerUrl={\n foundAdapter?.getExplorerUrl\n ? `${foundAdapter?.getExplorerUrl(`/block/${solanaTx.slot}`)}`\n : undefined\n }\n />\n }\n />\n )}\n {typeof solanaTx?.confirmations === 'number' && (\n <InfoRow label={statuses.confirmationsLabel} value={solanaTx.confirmations} />\n )}\n {solanaTx?.recentBlockhash && (\n <InfoRow label={hashLabels.recentBlockhash} value={<HashLink hash={solanaTx.recentBlockhash} />} />\n )}\n </>\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 adapter={adapter}\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 connectedWalletAddress?: string;\n};\n\nexport type TrackingTxModalCustomization<T extends Transaction> = {\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<T>>;\n ErrorBlock?: ComponentType<TxErrorBlockProps>;\n };\n};\n\nexport type TrackingTxModalProps<T extends Transaction> = Pick<\n NovaProviderProps<T>,\n 'handleTransaction' | 'initialTx' | 'transactionsPool' | 'adapter' | 'connectedWalletAddress'\n> & {\n onClose: (txKey?: string) => void;\n onOpenWalletInfo: () => void;\n className?: string;\n customization?: TrackingTxModalCustomization<T>;\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<T extends Transaction>({\n adapter,\n onClose,\n onOpenWalletInfo,\n className,\n customization,\n transactionsPool,\n handleTransaction,\n initialTx,\n connectedWalletAddress,\n}: TrackingTxModalProps<T>) {\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 foundAdapter = useMemo(\n () => (txToDisplay ? selectAdapterByKey({ adapterKey: txToDisplay.adapter, adapter }) : undefined),\n [txToDisplay, adapter],\n );\n\n const canRetry = !!(isFailed && txToDisplay && initialTx?.actionFunction && handleTransaction);\n const canReplace = !!(\n foundAdapter?.speedUpTxAction &&\n foundAdapter?.cancelTxAction &&\n activeTx?.pending &&\n activeTx.tracker === 'ethereum'\n );\n\n // --- Action Handlers ---\n const handleRetry = () => {\n if (!canRetry || !foundAdapter?.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 actionFunction: initialTx?.actionFunction,\n title: txToDisplay.title,\n description: txToDisplay.description,\n payload: txToDisplay.payload,\n withTrackedModal: true,\n };\n foundAdapter.retryTxAction({ tx: retryParams, txKey: activeTx?.txKey ?? '', onClose, handleTransaction });\n };\n const handleCancel = () => {\n if (canReplace && activeTx) foundAdapter.cancelTxAction!(activeTx);\n };\n const handleSpeedUp = () => {\n if (canReplace && activeTx) foundAdapter.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} adapter={adapter} />\n ) : (\n <TxInfoBlock tx={txToDisplay} adapter={adapter} />\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 connectedWalletAddress={connectedWalletAddress}\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 connectedWalletAddress={connectedWalletAddress}\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\nfunction DefaultHeaderTitle({ tx }: { tx: Transaction | InitialTransaction }) {\n return (\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}\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>{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 connectedWalletAddress,\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 && !!connectedWalletAddress) {\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<T extends Transaction> = {\n components?: {\n Icon?: ComponentType<CustomIconProps>;\n Title?: ComponentType<StatusAwareTextProps>;\n Description?: ComponentType<StatusAwareTextProps>;\n Timestamp?: ComponentType<CustomTimestampProps>;\n StatusBadge?: ComponentType<TransactionStatusBadgeProps<T>>;\n TransactionKey?: ComponentType<TransactionKeyProps<T>>;\n };\n};\n\nexport type TransactionHistoryItemProps<T extends Transaction> = {\n /** The transaction object to display. */\n tx: T;\n /** An object to customize and override the default internal components. */\n customization?: TransactionHistoryItemCustomization<T>;\n /** Optional additional CSS classes for the container. */\n className?: string;\n} & Pick<NovaProviderProps<T>, 'adapter'>;\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<T extends Transaction>({\n tx,\n adapter,\n className,\n customization,\n}: TransactionHistoryItemProps<T>): 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} adapter={adapter} 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<T extends Transaction> = {\n classNames?: {\n listWrapper?: string;\n };\n components?: {\n Placeholder?: ComponentType<CustomPlaceholderProps>;\n HistoryItem?: ComponentType<TransactionHistoryItemProps<T>>;\n };\n};\n\n/**\n * Defines the props for the TransactionsHistory component.\n * @template T - The transaction type.\n */\nexport type TransactionsHistoryProps<T extends Transaction> = Pick<\n NovaProviderProps<T>,\n 'adapter' | 'transactionsPool' | 'connectedWalletAddress'\n> & {\n className?: string;\n customization?: TransactionsHistoryCustomization<T>;\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<T extends Transaction>({\n adapter,\n connectedWalletAddress,\n transactionsPool,\n className,\n customization,\n}: TransactionsHistoryProps<T>) {\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} adapter={adapter} />\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 `TxActionButton`, a stateful button for initiating and tracking transactions.\n * It provides users with immediate visual feedback throughout the lifecycle of a transaction.\n */\n\nimport { ArrowPathIcon, CheckCircleIcon, ExclamationCircleIcon } from '@heroicons/react/24/solid';\nimport { cn } from '@tuwaio/nova-core';\nimport { Transaction, TransactionPool, TransactionStatus } from '@tuwaio/pulsar-core';\nimport { ButtonHTMLAttributes, ReactNode, useEffect, useMemo, useState } from 'react';\n\nimport { TuwaLabels } from '../i18n/types';\nimport { useLabels } from '../providers';\n\n/**\n * Defines the possible visual states of the button.\n */\ntype ButtonStatus = 'idle' | 'loading' | 'succeed' | 'failed' | 'replaced';\n\n/**\n * A factory function to create the default content for each button state.\n * Defined outside the component to prevent re-creation on every render.\n */\nconst getDefaultContent = (labels: TuwaLabels['trackedTxButton']) => ({\n replaced: (\n <>\n <ArrowPathIcon className=\"h-4 w-4\" />\n <span>{labels.replaced}</span>\n </>\n ),\n loading: (\n <>\n <ArrowPathIcon className=\"h-4 w-4 animate-spin\" />\n <span>{labels.loading}</span>\n </>\n ),\n succeed: (\n <>\n <CheckCircleIcon className=\"h-4 w-4\" />\n <span>{labels.succeed}</span>\n </>\n ),\n failed: (\n <>\n <ExclamationCircleIcon className=\"h-4 w-4\" />\n <span>{labels.failed}</span>\n </>\n ),\n});\n\nexport type TxActionButtonProps<T extends Transaction> = Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'onClick'> & {\n /** The default content to display when the button is 'idle'. */\n children: ReactNode;\n /** The async function to execute when the button is clicked to initiate the transaction. */\n action: () => Promise<void>;\n /** A function that returns the unique key of the most recently initiated transaction. */\n getLastTxKey: () => string | undefined;\n /** The global transaction pool from the Pulsar store. */\n transactionsPool: TransactionPool<T>;\n /** Optional active wallet address. If provided, the button will only track transactions from this address. */\n walletAddress?: string;\n /** Optional custom content for the 'loading' state. */\n loadingContent?: ReactNode;\n /** Optional custom content for the 'succeed' state. */\n succeedContent?: ReactNode;\n /** Optional custom content for the 'failed' state. */\n failedContent?: ReactNode;\n /** Optional custom content for the 'replaced' state. */\n replacedContent?: ReactNode;\n /** The duration (in ms) to display a final state before resetting to 'idle'. Defaults to 2500ms. */\n resetTimeout?: number;\n};\n\n/**\n * A stateful button that provides real-time feedback for a transaction's lifecycle.\n * It listens for changes in `transactionsPool` to automatically update its visual state.\n */\nexport function TxActionButton<T extends Transaction>({\n children,\n action,\n getLastTxKey,\n transactionsPool,\n walletAddress,\n loadingContent,\n succeedContent,\n failedContent,\n replacedContent,\n resetTimeout = 2500,\n className,\n ...props\n}: TxActionButtonProps<T>) {\n const { trackedTxButton } = useLabels();\n const [status, setStatus] = useState<ButtonStatus>('idle');\n const [trackedTxKey, setTrackedTxKey] = useState<string | undefined>(undefined);\n\n // Memoize default content to avoid re-creating it on every render.\n const defaultContent = useMemo(() => getDefaultContent(trackedTxButton), [trackedTxButton]);\n\n // Effect 1: Reset the button's state if the connected wallet changes.\n useEffect(() => {\n setStatus('idle');\n setTrackedTxKey(undefined);\n }, [walletAddress]);\n\n // Effect 2: Monitor the transaction pool for status updates.\n useEffect(() => {\n if (!trackedTxKey) return;\n\n const trackedTx = transactionsPool[trackedTxKey];\n\n if (trackedTx) {\n switch (trackedTx.status) {\n case TransactionStatus.Success:\n setStatus('succeed');\n break;\n case TransactionStatus.Replaced:\n setStatus('replaced');\n break;\n case TransactionStatus.Failed:\n setStatus('failed');\n break;\n }\n }\n }, [transactionsPool, trackedTxKey, walletAddress]);\n\n // Effect 3: Automatically reset the button to 'idle' after a final state is shown.\n useEffect(() => {\n if (['succeed', 'failed', 'replaced'].includes(status)) {\n const timer = setTimeout(() => {\n setStatus('idle');\n setTrackedTxKey(undefined); // Unlink from the completed transaction.\n }, resetTimeout);\n return () => clearTimeout(timer); // Cleanup timer.\n }\n }, [status, resetTimeout]);\n\n const handleClick = async () => {\n setStatus('loading');\n try {\n await action();\n // After the action resolves, get the key to start tracking this specific transaction.\n setTrackedTxKey(getLastTxKey());\n } catch (error) {\n console.error('Transaction initiation failed:', error);\n setStatus('failed');\n }\n };\n\n const renderContent = () => {\n switch (status) {\n case 'loading':\n return loadingContent ?? defaultContent.loading;\n case 'succeed':\n return succeedContent ?? defaultContent.succeed;\n case 'failed':\n return failedContent ?? defaultContent.failed;\n case 'replaced':\n return replacedContent ?? defaultContent.replaced;\n default:\n return children;\n }\n };\n\n return (\n <button\n {...props}\n disabled={status !== 'idle' || props.disabled}\n onClick={handleClick}\n className={cn(\n 'flex cursor-pointer items-center justify-center gap-1.5 rounded-md px-3 py-1.5 text-sm font-medium transition-all duration-200 disabled:cursor-not-allowed disabled:opacity-70',\n {\n 'bg-gradient-to-r from-[var(--tuwa-button-gradient-from)] to-[var(--tuwa-button-gradient-to)] text-[var(--tuwa-text-on-accent)] hover:opacity-90':\n status === 'idle',\n 'bg-gray-400 text-white': status === 'loading',\n 'bg-gray-500 text-white': status === 'replaced',\n 'bg-[var(--tuwa-success-bg)] text-[var(--tuwa-success-text)]': status === 'succeed',\n 'bg-[var(--tuwa-error-bg)] text-[var(--tuwa-error-text)]': status === 'failed',\n },\n className,\n )}\n >\n {renderContent()}\n </button>\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<T extends Transaction> = Pick<\n NovaProviderProps<T>,\n 'adapter' | '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<T extends Transaction>({\n walletAddress,\n adapter,\n connectedAdapterType,\n className,\n renderAvatar,\n renderName,\n renderAddressDisplay,\n renderNoWalletContent,\n explorerUrl,\n}: WalletHeaderProps<T>) {\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 foundAdapter = selectAdapterByKey({ adapterKey: connectedAdapterType, adapter });\n\n // Check if the adapter supports name and avatar resolution.\n const hasNameResolver = foundAdapter && 'getName' in foundAdapter && typeof foundAdapter.getName === 'function';\n const hasAvatarResolver =\n foundAdapter && 'getAvatar' in foundAdapter && typeof foundAdapter.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 = foundAdapter?.getName ? await foundAdapter.getName(walletAddress) : null;\n if (name) {\n setEnsName(name);\n if (hasAvatarResolver) {\n const avatar = foundAdapter?.getAvatar ? await foundAdapter.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, adapter, 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<T extends Transaction> = {\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<T>>;\n History?: ComponentType<TransactionsHistoryProps<T>>;\n };\n};\n\n/**\n * Defines the core props for the WalletInfoModal.\n */\nexport type WalletInfoModalProps<T extends Transaction> = Pick<\n NovaProviderProps<T>,\n 'adapter' | 'connectedAdapterType' | 'connectedWalletAddress' | 'transactionsPool'\n> & {\n isOpen?: boolean;\n setIsOpen: (value: boolean) => void;\n customization?: WalletInfoModalCustomization<T>;\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<T extends Transaction>({\n isOpen,\n setIsOpen,\n customization,\n adapter,\n connectedAdapterType,\n connectedWalletAddress,\n transactionsPool,\n}: WalletInfoModalProps<T>) {\n const { walletModal } = useLabels();\n\n const { explorerUrl } = useMemo(() => {\n if (!connectedAdapterType) return { explorerUrl: undefined };\n const foundAdapter = selectAdapterByKey({ adapterKey: connectedAdapterType, adapter });\n return { explorerUrl: foundAdapter?.getExplorerUrl() };\n }, [connectedAdapterType, adapter]);\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 adapter={adapter}\n connectedAdapterType={connectedAdapterType}\n walletAddress={connectedWalletAddress}\n explorerUrl={explorerUrl}\n />\n ) : (\n <WalletHeader\n adapter={adapter}\n connectedAdapterType={connectedAdapterType}\n walletAddress={connectedWalletAddress}\n explorerUrl={explorerUrl}\n />\n )}\n\n {CustomHistory ? (\n <CustomHistory\n adapter={adapter}\n transactionsPool={transactionsPool}\n connectedWalletAddress={connectedWalletAddress}\n />\n ) : (\n <TransactionsHistory\n adapter={adapter}\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"]}
|
1
|
+
{"version":3,"sources":["../src/i18n/en.ts","../src/providers/LabelsProvider.tsx","../src/providers/NovaProvider.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/TxActionButton.tsx","../src/components/WalletInfoModal/WalletAddressDisplay.tsx","../src/components/WalletInfoModal/WalletAvatar.tsx","../src/components/WalletInfoModal/WalletHeader.tsx","../src/components/WalletInfoModal/WalletInfoModal.tsx"],"names":["defaultLabels","LabelsContext","createContext","useLabels","useContext","TransactionStatus","HashLink","label","hash","explorerUrl","variant","className","isCopied","copy","useCopyToClipboard","actions","txError","containerClasses","cn","labelClasses","hashContent","jsx","textCenterEllipsis","jsxs","ArrowTopRightOnSquareIcon","CheckIcon","DocumentDuplicateIcon","STATUS_CONFIG","StatusAwareText","txStatus","source","fallback","applyColor","displayText","colorClass","config","ToastCloseButton","closeToast","XMarkIcon","TransactionKey","tx","adapter","renderHashLink","confirmations","hashLabels","statuses","foundAdapter","selectAdapterByKey","renderHash","props","trackerLabel","trackerKeyElement","TransactionTracker","onChainHashesElement","onChainHash","replacedHash","Fragment","shouldShowTrackerKey","getStatusConfig","labels","ArrowPathIcon","CheckCircleIcon","XCircleIcon","TransactionStatusBadge","statusConfig","useMemo","baseClasses","statusKey","Icon","badgeClasses","iconClasses","DefaultSpeedUpButton","onClick","children","DefaultCancelButton","DefaultWalletInfoButton","ToastTransaction","openWalletInfoModal","icon","customization","connectedWalletAddress","toast","canBeReplaced","handleCancel","handleSpeedUp","CStatusAwareText","CTransactionKey","CStatusBadge","SpeedUpButton","CancelButton","WalletInfoButton","getChainName","setChainId","Web3Icon","TxErrorBlock","error","ExclamationTriangleIcon","DefaultInfoRow","value","TxInfoBlock","txInfo","InfoRow","chainId","isSolanaTransaction","OrbitAdapter","solanaTx","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","transactionsPool","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","getDefaultContent","TxActionButton","action","getLastTxKey","walletAddress","loadingContent","succeedContent","failedContent","replacedContent","resetTimeout","trackedTxButton","setStatus","useState","trackedTxKey","setTrackedTxKey","defaultContent","useEffect","trackedTx","timer","handleClick","WalletAddressDisplay","address","isHex","strict","zeroAddress","WalletAvatar","ensAvatar","imageSrc","setImageSrc","blockie","makeBlockie","bgColor","handleError","DefaultNameDisplay","isLoading","ensName","renderAddressDisplay","WalletHeader","connectedAdapterType","renderAvatar","renderName","renderNoWalletContent","setEnsName","setEnsAvatar","setIsLoading","hasNameResolver","hasAvatarResolver","name","avatar","ensNameAbbreviated","closeModal","N","WalletInfoModal","setIsOpen","CustomWalletInfo","CustomHistory"],"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 confirmationsLabel: 'Confirmations',\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 recentBlockhash: 'Recent Blockhash',\n solana: 'Signature',\n },\n txInfo: {\n started: 'Started',\n network: 'Network',\n slot: 'Slot',\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 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 { OrbitAdapter } from '@tuwaio/orbit-core';\nimport { ITxTrackingStore, Transaction, TransactionPool, TransactionStatus, TxAdapter } from '@tuwaio/pulsar-core';\nimport { useCallback, 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 */\nexport type NovaProviderProps<T extends Transaction> = {\n adapter: TxAdapter<T> | TxAdapter<T>[];\n connectedWalletAddress?: string;\n connectedAdapterType?: OrbitAdapter;\n transactionsPool: TransactionPool<T>;\n labels?: Partial<TuwaLabels>;\n features?: {\n toasts?: boolean;\n walletInfoModal?: boolean;\n trackingTxModal?: boolean;\n };\n customization?: {\n toast?: ToastTransactionCustomization<T>;\n walletInfoModal?: WalletInfoModalCustomization<T>;\n trackingTxModal?: TrackingTxModalCustomization<T>;\n };\n} & Pick<ITxTrackingStore<T>, '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 */\nexport function NovaProvider<T extends Transaction>({\n adapter,\n connectedWalletAddress,\n connectedAdapterType,\n transactionsPool,\n initialTx,\n handleTransaction,\n closeTxTrackedModal,\n labels,\n features,\n customization,\n ...toastProps\n}: NovaProviderProps<T>) {\n const [isWalletInfoModalOpen, setIsWalletInfoModalOpen] = useState(false);\n const prevTransactionsRef = useRef<TransactionPool<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 // Memoized function to show or update a toast.\n const showOrUpdateToast = useCallback(\n (tx: T) => {\n if (!enabledFeatures.toasts) return;\n\n const type = tx.pending ? 'info' : (STATUS_TO_TOAST_TYPE[tx.status!] ?? 'info');\n\n const content = (props: ToastContentProps) => (\n <ToastTransaction\n {...props}\n tx={tx}\n openWalletInfoModal={enabledFeatures.walletInfoModal ? () => setIsWalletInfoModalOpen(true) : undefined}\n customization={customization?.toast}\n adapter={adapter}\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 [transactionsPool, enabledFeatures, customization?.toast, adapter, connectedWalletAddress],\n );\n\n // Effect 1: Handles toasts for NEW or CHANGED transactions.\n useEffect(() => {\n const prevPool = prevTransactionsRef.current;\n\n Object.values(transactionsPool).forEach((currentTx) => {\n const prevTx = prevPool[currentTx.txKey];\n\n // Case 1: A new transaction is added and is pending.\n if (!prevTx && currentTx.pending) {\n showOrUpdateToast(currentTx);\n return;\n }\n\n // Case 2: An existing transaction has been updated.\n if (prevTx && JSON.stringify(prevTx) !== JSON.stringify(currentTx)) {\n showOrUpdateToast(currentTx);\n }\n });\n\n prevTransactionsRef.current = transactionsPool;\n }, [transactionsPool, showOrUpdateToast]);\n\n // Effect 2: Handles toast UPDATES when the connected wallet address changes.\n useEffect(() => {\n // This ensures that visible toasts re-render to show/hide wallet-specific actions\n // like \"Speed Up\", even for completed transactions.\n Object.values(transactionsPool).forEach((tx) => {\n if (toast.isActive(tx.txKey)) {\n showOrUpdateToast(tx);\n }\n });\n }, [connectedWalletAddress, showOrUpdateToast, transactionsPool]);\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 isOpen={isWalletInfoModalOpen}\n setIsOpen={setIsWalletInfoModalOpen}\n customization={customization?.walletInfoModal}\n adapter={adapter}\n connectedWalletAddress={connectedWalletAddress}\n connectedAdapterType={connectedAdapterType}\n transactionsPool={transactionsPool}\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 handleTransaction={handleTransaction}\n adapter={adapter}\n connectedWalletAddress={connectedWalletAddress}\n />\n )}\n </LabelsProvider>\n );\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 } from '@tuwaio/orbit-core';\nimport { Transaction, TransactionTracker } 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<T extends Transaction> = Pick<NovaProviderProps<T>, 'adapter'> & {\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 /** Optional number of confirmations for a transaction. */\n confirmations?: number;\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<T extends Transaction>({\n tx,\n adapter,\n variant = 'toast',\n className,\n renderHashLink,\n confirmations,\n}: TransactionKeyProps<T>) {\n const { hashLabels, statuses } = useLabels();\n\n // Select the correct adapter for the given transaction.\n const foundAdapter = selectAdapterByKey({ adapterKey: tx.adapter, adapter });\n\n if (!foundAdapter) 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 // This removes the need for `@ts-expect-error` by using a type assertion to key into hashLabels.\n const trackerLabel = (hashLabels as Record<string, string>)[String(tx.tracker)];\n const trackerKeyElement = trackerLabel\n ? renderHash({\n label: trackerLabel,\n hash: tx.txKey,\n variant: tx.tracker !== TransactionTracker.Solana ? 'compact' : 'default',\n explorerUrl:\n foundAdapter.getExplorerTxUrl && tx.tracker === TransactionTracker.Solana\n ? foundAdapter?.getExplorerTxUrl(tx)\n : undefined,\n })\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 {typeof foundAdapter.getExplorerTxUrl !== 'undefined' &&\n renderHash({\n label: hashLabels.replaced,\n hash: replacedHash,\n explorerUrl: foundAdapter.getExplorerTxUrl(tx),\n })}\n </>\n );\n }\n\n return (\n onChainHash &&\n typeof foundAdapter.getExplorerTxUrl !== 'undefined' &&\n renderHash({\n label: hashLabels.default,\n hash: onChainHash,\n explorerUrl: foundAdapter.getExplorerTxUrl(tx),\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 {typeof confirmations === 'number' && (\n <p className=\"text-xs text-[var(--tuwa-text-tertiary)]\">\n {statuses.confirmationsLabel}: {confirmations}\n </p>\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 { 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<T extends Transaction> = {\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<T extends Transaction>({ tx, className }: TransactionStatusBadgeProps<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, setChainId } from '@tuwaio/orbit-core';\nimport { 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<T extends Transaction> = {\n components?: {\n StatusAwareText?: ComponentType<StatusAwareTextProps>;\n TransactionKey?: ComponentType<TransactionKeyProps<T>>;\n StatusBadge?: ComponentType<TransactionStatusBadgeProps<T>>;\n WalletInfoButton?: ComponentType<CustomActionButtonProps>;\n SpeedUpButton?: ComponentType<CustomActionButtonProps>;\n CancelButton?: ComponentType<CustomActionButtonProps>;\n };\n};\n\nexport type ToastTransactionProps<T extends Transaction> = {\n tx: T;\n openWalletInfoModal?: () => void;\n icon?: ReactNode;\n className?: string;\n customization?: ToastTransactionCustomization<T>;\n closeToast?: ToastContentProps['closeToast'];\n toastProps?: ToastContainerProps;\n} & Pick<NovaProviderProps<T>, 'adapter' | '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<T extends Transaction>({\n openWalletInfoModal,\n tx,\n icon,\n className,\n customization,\n connectedWalletAddress,\n adapter,\n}: ToastTransactionProps<T>): JSX.Element {\n const { actions, toast } = useLabels();\n\n const foundAdapter = selectAdapterByKey({ adapterKey: tx.adapter, adapter });\n\n // A transaction can be replaced only if it's a standard on-chain transaction (not Safe or Gelato),\n // is pending, the adapter supports the actions, and it belongs to the connected wallet.\n const canBeReplaced = !!(\n tx.tracker === 'ethereum' &&\n tx.pending &&\n foundAdapter?.speedUpTxAction &&\n foundAdapter?.cancelTxAction &&\n tx.from.toLowerCase() === connectedWalletAddress?.toLowerCase()\n );\n\n // --- Action Handlers ---\n const handleCancel = () => {\n if (canBeReplaced) foundAdapter.cancelTxAction!(tx);\n };\n\n const handleSpeedUp = () => {\n if (canBeReplaced) foundAdapter.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(setChainId(tx.chainId))}>\n {icon ?? <Web3Icon chainId={setChainId(tx.chainId)} />}\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 adapter={adapter} 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 !!connectedWalletAddress && (\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 * It also supports Solana-specific functionality to display slot, confirmations, and recentBlockhash details.\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 { OrbitAdapter, selectAdapterByKey, setChainId } from '@tuwaio/orbit-core';\nimport { InitialTransaction, SolanaTransaction, Transaction } from '@tuwaio/pulsar-core';\nimport dayjs from 'dayjs';\nimport { ComponentType, ReactNode } from 'react';\n\nimport { NovaProviderProps, useLabels } from '../../providers';\nimport { HashLink } from '../HashLink';\nimport { TransactionKey, TransactionKeyProps } from '../TransactionKey';\n\n// --- Types for Customization & Props ---\ntype CustomInfoRowProps = { label: ReactNode; value: ReactNode };\n\nexport type TxInfoBlockCustomization<T extends Transaction> = {\n components?: {\n InfoRow?: ComponentType<CustomInfoRowProps>;\n transactionKey?: TransactionKeyProps<T>['renderHashLink'];\n };\n};\n\nexport type TxInfoBlockProps<T extends Transaction> = {\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<T>;\n} & Pick<NovaProviderProps<T>, 'adapter'>;\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, timestamps, Solana-specific details, and relevant hashes/keys.\n */\nexport function TxInfoBlock<T extends Transaction>({ tx, adapter, className, customization }: TxInfoBlockProps<T>) {\n const { txInfo, statuses, hashLabels } = useLabels();\n\n // Select the correct adapter for the given transaction.\n const foundAdapter = selectAdapterByKey({ adapterKey: tx.adapter, adapter });\n\n if (!foundAdapter) return null;\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;\n\n const isSolanaTransaction = tx.adapter === OrbitAdapter.SOLANA;\n const solanaTx = isSolanaTransaction ? (tx as SolanaTransaction) : undefined;\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={setChainId(chainId)} />\n </div>\n <span>{getChainName(setChainId(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 {/* --- Solana-specific Details (if applicable) --- */}\n {isSolanaTransaction && (\n <>\n {solanaTx?.slot && (\n <InfoRow\n label={txInfo.slot}\n value={\n <HashLink\n hash={solanaTx.slot.toString()}\n explorerUrl={\n foundAdapter?.getExplorerUrl\n ? `${foundAdapter?.getExplorerUrl(`/block/${solanaTx.slot}`)}`\n : undefined\n }\n />\n }\n />\n )}\n {(typeof solanaTx?.confirmations === 'number' || typeof solanaTx?.confirmations === 'string') && (\n <InfoRow label={statuses.confirmationsLabel} value={solanaTx.confirmations} />\n )}\n {solanaTx?.recentBlockhash && (\n <InfoRow label={hashLabels.recentBlockhash} value={<HashLink hash={solanaTx.recentBlockhash} />} />\n )}\n </>\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 adapter={adapter}\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 { selectAdapterByKey } from '@tuwaio/orbit-core';\nimport { InitialTransaction, InitialTransactionParams, Transaction, TransactionStatus } 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 connectedWalletAddress?: string;\n};\n\nexport type TrackingTxModalCustomization<T extends Transaction> = {\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<T>>;\n ErrorBlock?: ComponentType<TxErrorBlockProps>;\n };\n};\n\nexport type TrackingTxModalProps<T extends Transaction> = Pick<\n NovaProviderProps<T>,\n 'handleTransaction' | 'initialTx' | 'transactionsPool' | 'adapter' | 'connectedWalletAddress'\n> & {\n onClose: (txKey?: string) => void;\n onOpenWalletInfo: () => void;\n className?: string;\n customization?: TrackingTxModalCustomization<T>;\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<T extends Transaction>({\n adapter,\n onClose,\n onOpenWalletInfo,\n className,\n customization,\n transactionsPool,\n handleTransaction,\n initialTx,\n connectedWalletAddress,\n}: TrackingTxModalProps<T>) {\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 foundAdapter = useMemo(\n () => (txToDisplay ? selectAdapterByKey({ adapterKey: txToDisplay.adapter, adapter }) : undefined),\n [txToDisplay, adapter],\n );\n\n const canRetry = !!(isFailed && txToDisplay && initialTx?.actionFunction && handleTransaction);\n const canReplace = !!(\n foundAdapter?.speedUpTxAction &&\n foundAdapter?.cancelTxAction &&\n activeTx?.pending &&\n activeTx.tracker === 'ethereum'\n );\n\n // --- Action Handlers ---\n const handleRetry = () => {\n if (!canRetry || !foundAdapter?.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 actionFunction: initialTx?.actionFunction,\n title: txToDisplay.title,\n description: txToDisplay.description,\n payload: txToDisplay.payload,\n withTrackedModal: true,\n };\n foundAdapter.retryTxAction({ tx: retryParams, txKey: activeTx?.txKey ?? '', onClose, handleTransaction });\n };\n const handleCancel = () => {\n if (canReplace && activeTx) foundAdapter.cancelTxAction!(activeTx);\n };\n const handleSpeedUp = () => {\n if (canReplace && activeTx) foundAdapter.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} adapter={adapter} />\n ) : (\n <TxInfoBlock tx={txToDisplay} adapter={adapter} />\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 connectedWalletAddress={connectedWalletAddress}\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 connectedWalletAddress={connectedWalletAddress}\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\nfunction DefaultHeaderTitle({ tx }: { tx: Transaction | InitialTransaction }) {\n return (\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}\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>{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 connectedWalletAddress,\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 && !!connectedWalletAddress) {\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 { setChainId } from '@tuwaio/orbit-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 | string };\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<T extends Transaction> = {\n components?: {\n Icon?: ComponentType<CustomIconProps>;\n Title?: ComponentType<StatusAwareTextProps>;\n Description?: ComponentType<StatusAwareTextProps>;\n Timestamp?: ComponentType<CustomTimestampProps>;\n StatusBadge?: ComponentType<TransactionStatusBadgeProps<T>>;\n TransactionKey?: ComponentType<TransactionKeyProps<T>>;\n };\n};\n\nexport type TransactionHistoryItemProps<T extends Transaction> = {\n /** The transaction object to display. */\n tx: T;\n /** An object to customize and override the default internal components. */\n customization?: TransactionHistoryItemCustomization<T>;\n /** Optional additional CSS classes for the container. */\n className?: string;\n} & Pick<NovaProviderProps<T>, 'adapter'>;\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={setChainId(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<T extends Transaction>({\n tx,\n adapter,\n className,\n customization,\n}: TransactionHistoryItemProps<T>): 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} />\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} adapter={adapter} 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<T extends Transaction> = {\n classNames?: {\n listWrapper?: string;\n };\n components?: {\n Placeholder?: ComponentType<CustomPlaceholderProps>;\n HistoryItem?: ComponentType<TransactionHistoryItemProps<T>>;\n };\n};\n\n/**\n * Defines the props for the TransactionsHistory component.\n * @template T - The transaction type.\n */\nexport type TransactionsHistoryProps<T extends Transaction> = Pick<\n NovaProviderProps<T>,\n 'adapter' | 'transactionsPool' | 'connectedWalletAddress'\n> & {\n className?: string;\n customization?: TransactionsHistoryCustomization<T>;\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<T extends Transaction>({\n adapter,\n connectedWalletAddress,\n transactionsPool,\n className,\n customization,\n}: TransactionsHistoryProps<T>) {\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} adapter={adapter} />\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 `TxActionButton`, a stateful button for initiating and tracking transactions.\n * It provides users with immediate visual feedback throughout the lifecycle of a transaction.\n */\n\nimport { ArrowPathIcon, CheckCircleIcon, ExclamationCircleIcon } from '@heroicons/react/24/solid';\nimport { cn } from '@tuwaio/nova-core';\nimport { Transaction, TransactionPool, TransactionStatus } from '@tuwaio/pulsar-core';\nimport { ButtonHTMLAttributes, ReactNode, useEffect, useMemo, useState } from 'react';\n\nimport { TuwaLabels } from '../i18n/types';\nimport { useLabels } from '../providers';\n\n/**\n * Defines the possible visual states of the button.\n */\ntype ButtonStatus = 'idle' | 'loading' | 'succeed' | 'failed' | 'replaced';\n\n/**\n * A factory function to create the default content for each button state.\n * Defined outside the component to prevent re-creation on every render.\n */\nconst getDefaultContent = (labels: TuwaLabels['trackedTxButton']) => ({\n replaced: (\n <>\n <ArrowPathIcon className=\"h-4 w-4\" />\n <span>{labels.replaced}</span>\n </>\n ),\n loading: (\n <>\n <ArrowPathIcon className=\"h-4 w-4 animate-spin\" />\n <span>{labels.loading}</span>\n </>\n ),\n succeed: (\n <>\n <CheckCircleIcon className=\"h-4 w-4\" />\n <span>{labels.succeed}</span>\n </>\n ),\n failed: (\n <>\n <ExclamationCircleIcon className=\"h-4 w-4\" />\n <span>{labels.failed}</span>\n </>\n ),\n});\n\nexport type TxActionButtonProps<T extends Transaction> = Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'onClick'> & {\n /** The default content to display when the button is 'idle'. */\n children: ReactNode;\n /** The async function to execute when the button is clicked to initiate the transaction. */\n action: () => Promise<void>;\n /** A function that returns the unique key of the most recently initiated transaction. */\n getLastTxKey: () => string | undefined;\n /** The global transaction pool from the Pulsar store. */\n transactionsPool: TransactionPool<T>;\n /** Optional active wallet address. If provided, the button will only track transactions from this address. */\n walletAddress?: string;\n /** Optional custom content for the 'loading' state. */\n loadingContent?: ReactNode;\n /** Optional custom content for the 'succeed' state. */\n succeedContent?: ReactNode;\n /** Optional custom content for the 'failed' state. */\n failedContent?: ReactNode;\n /** Optional custom content for the 'replaced' state. */\n replacedContent?: ReactNode;\n /** The duration (in ms) to display a final state before resetting to 'idle'. Defaults to 2500ms. */\n resetTimeout?: number;\n};\n\n/**\n * A stateful button that provides real-time feedback for a transaction's lifecycle.\n * It listens for changes in `transactionsPool` to automatically update its visual state.\n */\nexport function TxActionButton<T extends Transaction>({\n children,\n action,\n getLastTxKey,\n transactionsPool,\n walletAddress,\n loadingContent,\n succeedContent,\n failedContent,\n replacedContent,\n resetTimeout = 2500,\n className,\n ...props\n}: TxActionButtonProps<T>) {\n const { trackedTxButton } = useLabels();\n const [status, setStatus] = useState<ButtonStatus>('idle');\n const [trackedTxKey, setTrackedTxKey] = useState<string | undefined>(undefined);\n\n // Memoize default content to avoid re-creating it on every render.\n const defaultContent = useMemo(() => getDefaultContent(trackedTxButton), [trackedTxButton]);\n\n // Effect 1: Reset the button's state if the connected wallet changes.\n useEffect(() => {\n setStatus('idle');\n setTrackedTxKey(undefined);\n }, [walletAddress]);\n\n // Effect 2: Monitor the transaction pool for status updates.\n useEffect(() => {\n if (!trackedTxKey) return;\n\n const trackedTx = transactionsPool[trackedTxKey];\n\n if (trackedTx) {\n switch (trackedTx.status) {\n case TransactionStatus.Success:\n setStatus('succeed');\n break;\n case TransactionStatus.Replaced:\n setStatus('replaced');\n break;\n case TransactionStatus.Failed:\n setStatus('failed');\n break;\n }\n }\n }, [transactionsPool, trackedTxKey, walletAddress]);\n\n // Effect 3: Automatically reset the button to 'idle' after a final state is shown.\n useEffect(() => {\n if (['succeed', 'failed', 'replaced'].includes(status)) {\n const timer = setTimeout(() => {\n setStatus('idle');\n setTrackedTxKey(undefined); // Unlink from the completed transaction.\n }, resetTimeout);\n return () => clearTimeout(timer); // Cleanup timer.\n }\n }, [status, resetTimeout]);\n\n const handleClick = async () => {\n setStatus('loading');\n try {\n await action();\n // After the action resolves, get the key to start tracking this specific transaction.\n setTrackedTxKey(getLastTxKey());\n } catch (error) {\n console.error('Transaction initiation failed:', error);\n setStatus('failed');\n }\n };\n\n const renderContent = () => {\n switch (status) {\n case 'loading':\n return loadingContent ?? defaultContent.loading;\n case 'succeed':\n return succeedContent ?? defaultContent.succeed;\n case 'failed':\n return failedContent ?? defaultContent.failed;\n case 'replaced':\n return replacedContent ?? defaultContent.replaced;\n default:\n return children;\n }\n };\n\n return (\n <button\n {...props}\n disabled={status !== 'idle' || props.disabled}\n onClick={handleClick}\n className={cn(\n 'flex cursor-pointer items-center justify-center gap-1.5 rounded-md px-3 py-1.5 text-sm font-medium transition-all duration-200 disabled:cursor-not-allowed disabled:opacity-70',\n {\n 'bg-gradient-to-r from-[var(--tuwa-button-gradient-from)] to-[var(--tuwa-button-gradient-to)] text-[var(--tuwa-text-on-accent)] hover:opacity-90':\n status === 'idle',\n 'bg-gray-400 text-white': status === 'loading',\n 'bg-gray-500 text-white': status === 'replaced',\n 'bg-[var(--tuwa-success-bg)] text-[var(--tuwa-success-text)]': status === 'succeed',\n 'bg-[var(--tuwa-error-bg)] text-[var(--tuwa-error-text)]': status === 'failed',\n },\n className,\n )}\n >\n {renderContent()}\n </button>\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';\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 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 {explorerUrl && (\n <a\n href={explorerUrl}\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';\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\nfunction isHex(value: unknown, { strict = true }: { strict?: boolean | undefined } = {}): value is `0x${string}` {\n if (!value) return false;\n if (typeof value !== 'string') return false;\n return strict ? /^0x[0-9a-fA-F]*$/.test(value) : value.startsWith('0x');\n}\nconst zeroAddress = '0x0000000000000000000000000000000000000000';\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 } from '@tuwaio/orbit-core';\nimport { 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<T extends Transaction> = Pick<\n NovaProviderProps<T>,\n 'adapter' | '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<T extends Transaction>({\n walletAddress,\n adapter,\n connectedAdapterType,\n className,\n renderAvatar,\n renderName,\n renderAddressDisplay,\n renderNoWalletContent,\n explorerUrl,\n}: WalletHeaderProps<T>) {\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 foundAdapter = selectAdapterByKey({ adapterKey: connectedAdapterType, adapter });\n\n // Check if the adapter supports name and avatar resolution.\n const hasNameResolver = foundAdapter && 'getName' in foundAdapter && typeof foundAdapter.getName === 'function';\n const hasAvatarResolver =\n foundAdapter && 'getAvatar' in foundAdapter && typeof foundAdapter.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 = foundAdapter?.getName ? await foundAdapter.getName(walletAddress) : null;\n if (name) {\n setEnsName(name);\n if (hasAvatarResolver) {\n const avatar = foundAdapter?.getAvatar ? await foundAdapter.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, adapter, 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 } from '@tuwaio/orbit-core';\nimport { 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<T extends Transaction> = {\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<T>>;\n History?: ComponentType<TransactionsHistoryProps<T>>;\n };\n};\n\n/**\n * Defines the core props for the WalletInfoModal.\n */\nexport type WalletInfoModalProps<T extends Transaction> = Pick<\n NovaProviderProps<T>,\n 'adapter' | 'connectedAdapterType' | 'connectedWalletAddress' | 'transactionsPool'\n> & {\n isOpen?: boolean;\n setIsOpen: (value: boolean) => void;\n customization?: WalletInfoModalCustomization<T>;\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<T extends Transaction>({\n isOpen,\n setIsOpen,\n customization,\n adapter,\n connectedAdapterType,\n connectedWalletAddress,\n transactionsPool,\n}: WalletInfoModalProps<T>) {\n const { walletModal } = useLabels();\n\n const { explorerUrl } = useMemo(() => {\n if (!connectedAdapterType) return { explorerUrl: undefined };\n const foundAdapter = selectAdapterByKey({ adapterKey: connectedAdapterType, adapter });\n return { explorerUrl: foundAdapter?.getExplorerUrl(`/address/${connectedWalletAddress}`) };\n }, [connectedAdapterType, adapter, connectedWalletAddress]);\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 adapter={adapter}\n connectedAdapterType={connectedAdapterType}\n walletAddress={connectedWalletAddress}\n explorerUrl={explorerUrl}\n />\n ) : (\n <WalletHeader\n adapter={adapter}\n connectedAdapterType={connectedAdapterType}\n walletAddress={connectedWalletAddress}\n explorerUrl={explorerUrl}\n />\n )}\n\n {CustomHistory ? (\n <CustomHistory\n adapter={adapter}\n transactionsPool={transactionsPool}\n connectedWalletAddress={connectedWalletAddress}\n />\n ) : (\n <TransactionsHistory\n adapter={adapter}\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"]}
|