UNPKG

@tuwaio/nova-transactions

Version:

A React component library that provides the UI for @tuwaio/pulsar-core. Includes components, providers, and i18n support for transaction tracking.

16 lines 28.8 kB
import {createContext,useContext,useState,useRef,useMemo,useCallback,useEffect}from'react';import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {useMediaQuery,deepMerge,ToastCloseButton,Dialog,DialogContent,cn,DialogHeader,DialogTitle,DialogClose,CloseIcon,useCopyToClipboard,textCenterEllipsis}from'@tuwaio/nova-core';import {TransactionStatus,selectAllTransactionsByActiveWallet,TransactionTracker}from'@tuwaio/pulsar-core';import {toast,ToastContainer}from'react-toastify';import {ClockIcon,ArrowPathIcon,ExclamationCircleIcon,CheckCircleIcon,ExclamationTriangleIcon,CheckIcon,DocumentDuplicateIcon,XCircleIcon,ArrowTopRightOnSquareIcon}from'@heroicons/react/24/solid';import {Web3Icon}from'@bgd-labs/react-web3-icons';import {getChainName}from'@bgd-labs/react-web3-icons/dist/utils';import {selectAdapterByKey,setChainId,OrbitAdapter}from'@tuwaio/orbit-core';import kt from'dayjs';import qo from'dayjs/plugin/relativeTime';var z={transactionsModal:{history:{title:"Transactions History",connectWalletTitle:"Connect Wallet",connectWalletMessage:"Please connect your wallet to see your past activity.",noTransactionsTitle:"No Transactions Yet",noTransactionsMessage:"Once you interact with the app, your transaction history will appear here."}},toast:{openTransactionsInfo:"Open transactions"},statuses:{pending:"Pending",success:"Success",failed:"Failed",reverted:"Reverted",replaced:"Replaced",unknown:"Unknown",confirmationsLabel:"Confirmations"},hashLabels:{gelato:"Gelato Task ID",safe:"Safe Tx Hash",original:"Original Tx Hash",replaced:"Replaced Tx Hash",default:"Tx Hash",recentBlockhash:"Recent Blockhash",solana:"Signature"},txInfo:{started:"Started",network:"Network",slot:"Slot"},txError:{title:"Error",copied:"Copied!"},trackingModal:{title:"Transaction Overview",processing:"Processing...",close:"Close",allTransactions:"All transactions",retry:"Retry",progressIndicator:{created:"Created",processing:"Processing",succeed:"Succeed"}},trackedTxButton:{loading:"Processing...",succeed:"Success",failed:"Failed",replaced:"Replaced"},actions:{copy:"Copy address",viewOnExplorer:"View on explorer",close:"Close",cancel:"Cancel",speedUp:"Speed up"}};var it=createContext(z),ct=({labels:t,children:o})=>jsx(it.Provider,{value:t,children:o}),v=()=>useContext(it);function E({label:t,hash:o,explorerUrl:n,variant:r="default",className:s}){let{isCopied:l,copy:c}=useCopyToClipboard(),{actions:i,txError:p}=v(),a=cn("novatx:flex novatx:items-center novatx:justify-between",{"novatx:text-sm":r==="default","novatx:text-xs":r==="compact"},s),e=cn("novatx:pr-1",{"novatx:font-bold novatx:text-[var(--tuwa-text-primary)]":r==="default","novatx:font-medium novatx:text-[var(--tuwa-text-secondary)]":r==="compact"}),x=jsx("span",{className:"novatx:font-mono",children:textCenterEllipsis(o,5,5)});return jsxs("div",{className:a,children:[t&&jsxs("span",{className:e,children:[t,":"]}),jsxs("div",{className:"novatx:flex novatx:items-center novatx:gap-x-2",children:[n?jsxs("a",{href:n,target:"_blank",rel:"noopener noreferrer",className:"novatx:flex novatx:items-center novatx:gap-x-1 novatx:text-[var(--tuwa-text-accent)] novatx:transition-colors novatx:hover:underline",title:i.viewOnExplorer,"aria-label":i.viewOnExplorer,children:[x,jsx(ArrowTopRightOnSquareIcon,{className:"novatx:h-4 novatx:w-4"})]}):jsx("span",{className:"novatx:text-[var(--tuwa-text-primary)]",children:x}),jsx("button",{type:"button",onClick:()=>c(o),className:"novatx:cursor-pointer novatx:text-[var(--tuwa-text-tertiary)] novatx:transition-colors novatx:hover:text-[var(--tuwa-text-secondary)]",title:l?p.copied:i.copy,"aria-label":l?p.copied:i.copy,children:l?jsx(CheckIcon,{className:"novatx:h-4 novatx:w-4 novatx:text-[var(--tuwa-success-icon)]"}):jsx(DocumentDuplicateIcon,{className:"novatx:h-4 novatx:w-4"})})]})]})}var pt={[TransactionStatus.Success]:{index:1,colorClass:"novatx:text-[var(--tuwa-success-text)]"},[TransactionStatus.Failed]:{index:2,colorClass:"novatx:text-[var(--tuwa-error-text)]"},[TransactionStatus.Replaced]:{index:3,colorClass:"novatx:text-[var(--tuwa-text-secondary)]"},default:{index:0,colorClass:"novatx:text-[var(--tuwa-text-primary)]"}};function B({txStatus:t,source:o,fallback:n,variant:r,className:s,applyColor:l=false}){let c,i="";if(typeof o=="string")c=o;else if(Array.isArray(o)){let e=pt[t||"default"]??pt.default;c=o[e.index],l&&(i=e.colorClass);}else c=n;return c?jsx("div",{className:cn(r==="title"?"novatx:text-sm novatx:font-semibold novatx:text-[var(--tuwa-text-primary)]":"novatx:mt-1 novatx:text-xs novatx:text-[var(--tuwa-text-secondary)]",i,s),children:c}):null}function K({tx:t,adapter:o,variant:n="toast",className:r,renderHashLink:s,confirmations:l}){let{hashLabels:c,statuses:i}=v(),p=selectAdapterByKey({adapterKey:t.adapter,adapter:o});if(!p)return null;let a=m=>s?s(m):jsx(E,{...m}),e=n==="toast"?"novatx:mt-2 novatx:flex novatx:w-full novatx:flex-col novatx:gap-y-2 novatx:border-t novatx:border-[var(--tuwa-border-primary)] novatx:pt-2":"novatx:flex novatx:w-full novatx:flex-col novatx:gap-y-2",x=c[String(t.tracker)],f=x?a({label:x,hash:t.txKey,variant:t.tracker!==TransactionTracker.Solana?"compact":"default",explorerUrl:p.getExplorerTxUrl&&t.tracker===TransactionTracker.Solana?p?.getExplorerTxUrl(t):void 0}):null,b=(()=>{let m=t.hash,u=t.replacedTxHash;return !m&&!u?null:u?jsxs(Fragment,{children:[m&&a({label:c.original,hash:m,variant:"compact"}),typeof p.getExplorerTxUrl<"u"&&a({label:c.replaced,hash:u,explorerUrl:p.getExplorerTxUrl(t)})]}):m&&typeof p.getExplorerTxUrl<"u"&&a({label:c.default,hash:m,explorerUrl:p.getExplorerTxUrl(t)})})(),T=x&&x!==c.default&&t.txKey!==t.hash;return jsxs("div",{className:cn(e,r),children:[T&&f,b,typeof l=="number"&&jsxs("p",{className:"novatx:text-xs novatx:text-[var(--tuwa-text-tertiary)]",children:[i.confirmationsLabel,": ",l]})]})}var oo=t=>({Pending:{label:t.pending,Icon:ArrowPathIcon,badgeClasses:"novatx:bg-[var(--tuwa-pending-bg)] novatx:text-[var(--tuwa-pending-text)]",iconClasses:"novatx:animate-spin novatx:text-[var(--tuwa-pending-icon)]"},[TransactionStatus.Success]:{label:t.success,Icon:CheckCircleIcon,badgeClasses:"novatx:bg-[var(--tuwa-success-bg)] novatx:text-[var(--tuwa-success-text)]",iconClasses:"novatx:text-[var(--tuwa-success-icon)]"},[TransactionStatus.Failed]:{label:t.failed,Icon:XCircleIcon,badgeClasses:"novatx:bg-[var(--tuwa-error-bg)] novatx:text-[var(--tuwa-error-text)]",iconClasses:"novatx:text-[var(--tuwa-error-icon)]"},[TransactionStatus.Replaced]:{label:t.replaced,Icon:ArrowPathIcon,badgeClasses:"novatx:bg-[var(--tuwa-info-bg)] novatx:text-[var(--tuwa-info-text)]",iconClasses:"novatx:text-[var(--tuwa-info-icon)]"}});function _({tx:t,className:o}){let{statuses:n}=v(),r=useMemo(()=>oo(n),[n]),s="novatx:inline-flex novatx:items-center novatx:gap-x-1.5 novatx:rounded-full novatx:px-2 novatx:py-1 novatx:text-xs novatx:font-medium",l=t.pending?"Pending":t.status,c=l?r[l]:null;if(!c)return jsx("div",{className:cn(s,"novatx:bg-[var(--tuwa-info-bg)] novatx:text-[var(--tuwa-info-text)]",o),children:t.status??n.unknown});let{label:i,Icon:p,badgeClasses:a,iconClasses:e}=c;return jsxs("div",{className:cn(s,a,o),children:[jsx(p,{className:cn("novatx:h-4 novatx:w-4",e)}),i]})}var io=({onClick:t,children:o})=>jsx("button",{onClick:t,type:"button",className:"novatx:cursor-pointer novatx:text-sm novatx:font-medium novatx:text-[var(--tuwa-text-accent)] novatx:transition-opacity novatx:hover:opacity-80",children:o}),co=({onClick:t,children:o})=>jsx("button",{onClick:t,type:"button",className:"novatx:cursor-pointer novatx:text-sm novatx:font-medium novatx:text-[var(--tuwa-text-secondary)] novatx:transition-opacity novatx:hover:opacity-80",children:o}),lo=({onClick:t,children:o})=>jsx("button",{className:"novatx:cursor-pointer novatx:rounded-md novatx:bg-gradient-to-r novatx:from-[var(--tuwa-button-gradient-from)] novatx:to-[var(--tuwa-button-gradient-to)] novatx:px-3 novatx:py-1 novatx:text-xs novatx:font-bold novatx:text-[var(--tuwa-text-on-accent)] novatx:shadow-lg novatx:transition-all novatx:duration-200 novatx:ease-in-out novatx:hover:shadow-xl novatx:hover:from-[var(--tuwa-button-gradient-from-hover)] novatx:hover:to-[var(--tuwa-button-gradient-to-hover)] novatx:active:scale-95",onClick:t,type:"button",children:o});function mt({openTxInfoModal:t,tx:o,icon:n,className:r,customization:s,connectedWalletAddress:l,adapter:c}){let{actions:i,toast:p}=v(),a=selectAdapterByKey({adapterKey:o.adapter,adapter:c}),e=!!(o.tracker==="ethereum"&&o.pending&&a?.speedUpTxAction&&a?.cancelTxAction&&o.from.toLowerCase()===l?.toLowerCase()&&["metamask"].includes(o.connectorType.split(":")[1])),x=()=>{e&&a.cancelTxAction(o);},f=()=>{e&&a.speedUpTxAction(o);},{StatusAwareText:b=B,TransactionKey:T=K,StatusBadge:m=_,SpeedUpButton:u=io,CancelButton:A=co,TxInfoButton:w=lo}=s?.components??{};return jsxs("div",{className:cn("novatx:flex novatx:w-full novatx:flex-col novatx:gap-3 novatx:rounded-lg novatx:bg-[var(--tuwa-bg-primary)] novatx:p-4 novatx:shadow-md",r),children:[jsxs("div",{className:"novatx:flex novatx:items-center novatx:gap-3",children:[jsx("div",{className:"novatx:w-[40px] novatx:flex-shrink-0 [&>img]:novatx:w-full [&>img]:novatx:h-auto",title:getChainName(setChainId(o.chainId)),children:n??jsx(Web3Icon,{chainId:setChainId(o.chainId)})}),jsxs("div",{className:"novatx:flex-1",children:[jsx(b,{txStatus:o.status,source:o.title,fallback:o.type,variant:"title",applyColor:true}),jsx(b,{txStatus:o.status,source:o.description,variant:"description"})]})]}),jsxs("div",{children:[jsx(T,{adapter:c,tx:o,variant:"toast"}),jsxs("div",{className:"novatx:mt-3 novatx:flex novatx:items-center novatx:justify-between",children:[jsx(m,{tx:o}),e?jsxs("div",{className:"novatx:flex novatx:items-center novatx:gap-4",children:[jsx(u,{onClick:f,children:i.speedUp}),jsx(A,{onClick:x,children:i.cancel})]}):t&&!!l&&jsx(w,{onClick:t,children:p.openTransactionsInfo})]})]})]})}function yt({adapter:t,onClose:o,onOpenAllTransactions:n,className:r,customization:s,transactionsPool:l,executeTxAction:c,initialTx:i,connectedWalletAddress:p}){let a=useMemo(()=>i?.lastTxKey?l[i.lastTxKey]:void 0,[l,i]),e=a??i,x=i?.withTrackedModal&&!a||(a?.isTrackedModalOpen??false),{isProcessing:f,isSucceed:b,isFailed:T,isReplaced:m}=useMemo(()=>{let R=a?.status,Dt=i?.isInitializing??false,Ot=a?.pending??false;return {isProcessing:Dt||Ot,isSucceed:R===TransactionStatus.Success,isFailed:a?.isError||!!i?.errorMessage,isReplaced:R===TransactionStatus.Replaced}},[a,i]),u=useMemo(()=>e?selectAdapterByKey({adapterKey:e.adapter,adapter:t}):void 0,[e,t]),A=!!(T&&e&&i?.actionFunction&&c),w=!!(u?.speedUpTxAction&&u?.cancelTxAction&&a?.pending&&a.tracker==="ethereum"),F=()=>{if(!A||!u?.retryTxAction)return;let R={adapter:e.adapter,type:e.type,desiredChainID:"desiredChainID"in e?e.desiredChainID:e.chainId,actionFunction:i?.actionFunction,title:e.title,description:e.description,payload:e.payload,rpcUrl:"rpcUrl"in e?e?.rpcUrl:"desiredChainID"in e?e.desiredChainID:e.chainId.split(":")[1],withTrackedModal:"withTrackedModal"in e?e.withTrackedModal:false};u.retryTxAction({tx:R,txKey:a?.txKey??"",onClose:o,executeTxAction:c});},S=w&&a&&["metamask"].includes(a?.connectorType.split(":")[1]),g=()=>{S&&u.cancelTxAction(a);},h=()=>{S&&u.speedUpTxAction(a);},I=s?.components?.Header,W=s?.components?.Footer,et=s?.components?.StatusVisual,nt=s?.components?.ProgressIndicator,rt=s?.components?.InfoBlock,st=s?.components?.ErrorBlock;return e?jsx(Dialog,{open:x,onOpenChange:R=>!R&&o(a?.txKey),children:jsx(DialogContent,{className:cn("novatx:w-full novatx:sm:max-w-md",s?.modalProps?.className),...s?.modalProps,children:jsxs("div",{className:cn("novatx:relative novatx:flex novatx:w-full novatx:flex-col",r),children:[I?jsx(I,{onClose:()=>o(a?.txKey),title:jsx(gt,{tx:e})}):jsx(go,{onClose:()=>o(a?.txKey),title:jsx(gt,{tx:e})}),jsxs("main",{className:"novatx:flex novatx:flex-col novatx:gap-4 novatx:p-4",children:[et?jsx(et,{isProcessing:f,isSucceed:b,isFailed:T,isReplaced:m}):jsx(ht,{isProcessing:f,isSucceed:b,isFailed:T,isReplaced:m}),nt?jsx(nt,{isProcessing:f,isSucceed:b,isFailed:T,isReplaced:m}):jsx(wt,{isProcessing:f,isSucceed:b,isFailed:T,isReplaced:m}),rt?jsx(rt,{tx:e,adapter:t}):jsx(Ct,{tx:e,adapter:t}),st?jsx(st,{error:a?.errorMessage||i?.errorMessage}):jsx(bt,{error:a?.errorMessage||i?.errorMessage})]}),W?jsx(W,{onClose:()=>o(a?.txKey),onOpenAllTransactions:n,isProcessing:f,isFailed:T,canReplace:w,onRetry:A?F:void 0,onSpeedUp:S?h:void 0,onCancel:S?g:void 0,connectedWalletAddress:p}):jsx(bo,{onClose:()=>o(a?.txKey),onOpenAllTransactions:n,isProcessing:f,isFailed:T,canReplace:w,onRetry:A?F:void 0,onSpeedUp:S?h:void 0,onCancel:S?g:void 0,connectedWalletAddress:p})]})})}):null}function gt({tx:t}){return jsx(B,{txStatus:"status"in t?t.status:void 0,source:t.title,fallback:t.type,variant:"title",className:"novatx:text-lg"})}var go=({onClose:t,title:o})=>{let{actions:n}=v();return jsxs(DialogHeader,{children:[jsx(DialogTitle,{children:o}),jsx(DialogClose,{asChild:true,children:jsx("button",{type:"button",onClick:()=>t(),"aria-label":n.close,className:`novatx:cursor-pointer novatx:rounded-full novatx:p-1 novatx:text-[var(--tuwa-text-tertiary)] novatx:transition-colors novatx:hover:bg-[var(--tuwa-bg-muted)] novatx:hover:text-[var(--tuwa-text-primary)]`,children:jsx(CloseIcon,{})})})]})},yo=({isFailed:t,onRetry:o,isProcessing:n,canReplace:r,connectedWalletAddress:s,onOpenAllTransactions:l})=>{let{trackingModal:c}=v();return t&&o?jsx("button",{type:"button",onClick:o,className:`novatx:cursor-pointer novatx:rounded-t-md novatx:sm:rounded-md novatx:bg-gradient-to-r novatx:from-[var(--tuwa-button-gradient-from)] novatx:to-[var(--tuwa-button-gradient-to)] novatx:px-4 novatx:py-2 novatx:text-sm novatx:font-semibold novatx:text-[var(--tuwa-text-on-accent)] novatx:transition-opacity novatx:hover:from-[var(--tuwa-button-gradient-from-hover)] novatx:hover:to-[var(--tuwa-button-gradient-to-hover)]`,children:c.retry}):!n&&!r&&s?jsx("button",{type:"button",onClick:l,className:`novatx:cursor-pointer novatx:rounded-md novatx:bg-[var(--tuwa-bg-muted)] novatx:px-4 novatx:py-2 novatx:text-sm novatx:font-semibold novatx:text-[var(--tuwa-text-primary)] novatx:transition-colors novatx:hover:bg-[var(--tuwa-border-primary)]`,children:c.allTransactions}):null},bo=({onClose:t,onOpenAllTransactions:o,isProcessing:n,onRetry:r,onSpeedUp:s,onCancel:l,canReplace:c,isFailed:i,connectedWalletAddress:p})=>{let{trackingModal:a,actions:e}=v();return jsxs("footer",{className:`novatx:flex novatx:w-full novatx:items-center novatx:justify-between novatx:border-t novatx:border-[var(--tuwa-border-primary)] novatx:p-4`,children:[jsx("div",{className:"novatx:flex novatx:items-center novatx:gap-4",children:c&&s&&l&&jsxs(Fragment,{children:[jsx("button",{type:"button",onClick:s,className:`novatx:cursor-pointer novatx:text-sm novatx:font-medium novatx:text-[var(--tuwa-text-accent)] novatx:transition-opacity novatx:hover:opacity-80`,children:e.speedUp}),jsx("button",{type:"button",onClick:l,className:`novatx:cursor-pointer novatx:text-sm novatx:font-medium novatx:text-[var(--tuwa-text-secondary)] novatx:transition-opacity novatx:hover:opacity-80`,children:e.cancel})]})}),jsxs("div",{className:"novatx:flex novatx:items-center novatx:gap-3",children:[jsx(yo,{isFailed:i,onRetry:r,isProcessing:n,canReplace:c,connectedWalletAddress:p,onOpenAllTransactions:o}),jsx("button",{type:"button",onClick:t,disabled:n&&!c,className:`novatx:cursor-pointer novatx:rounded-md novatx:bg-[var(--tuwa-bg-muted)] novatx:px-4 novatx:py-2 novatx:text-sm novatx:font-semibold novatx:text-[var(--tuwa-text-primary)] novatx:transition-colors novatx:hover:bg-[var(--tuwa-border-primary)] novatx:disabled:cursor-not-allowed novatx:disabled:opacity-50`,children:n&&!c?a.processing:a.close})]})]})};function bt({error:t,className:o}){let{isCopied:n,copy:r}=useCopyToClipboard(),{actions:s,txError:l}=v();return t?jsxs("div",{className:cn("novatx:rounded-lg novatx:border novatx:border-[var(--tuwa-error-icon)]/30 novatx:bg-[var(--tuwa-error-bg)] novatx:p-3 novatx:text-sm",o),children:[jsxs("div",{className:"novatx:mb-2 novatx:flex novatx:items-center novatx:justify-between",children:[jsxs("div",{className:"novatx:flex novatx:items-center novatx:gap-2 novatx:font-bold novatx:text-[var(--tuwa-error-icon)]",children:[jsx(ExclamationTriangleIcon,{className:"novatx:h-5 novatx:w-5"}),jsx("span",{children:l.title})]}),jsx("button",{type:"button",onClick:()=>r(t),title:n?l.copied:s.copy,"aria-label":n?l.copied:`${s.copy} error message`,className:"novatx:cursor-pointer novatx:text-[var(--tuwa-error-icon)]/50 novatx:transition-colors novatx:hover:text-[var(--tuwa-error-icon)]",children:n?jsx(CheckIcon,{className:"novatx:h-5 novatx:w-5 novatx:text-[var(--tuwa-success-icon)]"}):jsx(DocumentDuplicateIcon,{className:"novatx:h-5 novatx:w-5"})})]}),jsx("div",{className:"novatx:max-h-24 novatx:overflow-y-auto novatx:rounded novatx:bg-[var(--tuwa-bg-primary)] novatx:p-2",children:jsx("p",{className:"novatx:font-mono novatx:text-xs novatx:text-[var(--tuwa-error-text)] novatx:break-all",children:t})})]}):null}function Ro({label:t,value:o}){return jsxs("div",{className:"novatx:flex novatx:items-center novatx:justify-between novatx:text-sm",children:[jsx("span",{className:"novatx:text-[var(--tuwa-text-secondary)]",children:t}),jsx("span",{className:"novatx:font-medium novatx:text-[var(--tuwa-text-primary)]",children:o})]})}function Ct({tx:t,adapter:o,className:n,customization:r}){let{txInfo:s,statuses:l,hashLabels:c}=v(),i=selectAdapterByKey({adapterKey:t.adapter,adapter:o});if(!i)return null;let{InfoRow:p=Ro}=r?.components??{},a="chainId"in t?t.chainId:t.desiredChainID,e=t.adapter===OrbitAdapter.SOLANA,x=e?t:void 0;return jsxs("div",{className:cn("novatx:flex novatx:flex-col novatx:gap-3 novatx:rounded-lg novatx:border novatx:border-[var(--tuwa-border-primary)] novatx:bg-[var(--tuwa-bg-primary)] novatx:p-3",n),children:[jsx(p,{label:s.network,value:jsxs("div",{className:"novatx:flex novatx:items-center novatx:justify-end novatx:gap-2",children:[jsx("div",{className:"novatx:h-4 novatx:w-4",children:jsx(Web3Icon,{chainId:setChainId(a)})}),jsx("span",{children:getChainName(setChainId(a))})]})}),t.localTimestamp&&jsx(p,{label:s.started,value:kt.unix(t.localTimestamp).format("MMM D, HH:mm:ss")}),e&&jsxs(Fragment,{children:[x?.slot&&jsx(p,{label:s.slot,value:jsx(E,{hash:x.slot.toString(),explorerUrl:i?.getExplorerUrl?`${i?.getExplorerUrl(`/block/${x.slot}`)}`:void 0})}),(typeof x?.confirmations=="number"||typeof x?.confirmations=="string")&&jsx(p,{label:l.confirmationsLabel,value:x.confirmations}),x?.recentBlockhash&&jsx(p,{label:c.recentBlockhash,value:jsx(E,{hash:x.recentBlockhash})})]}),"txKey"in t&&t.txKey&&jsx("div",{className:"novatx:border-t novatx:border-[var(--tuwa-border-primary)] novatx:pt-3",children:jsx(K,{tx:t,adapter:o,variant:"history",renderHashLink:r?.components?.transactionKey})})]})}var Uo={completed:{line:"novatx:bg-[var(--tuwa-success-icon)]",border:"novatx:border-[var(--tuwa-success-icon)]",fill:"novatx:bg-[var(--tuwa-success-icon)]"},error:{line:"novatx:bg-[var(--tuwa-error-icon)]",border:"novatx:border-[var(--tuwa-error-icon)]",fill:"novatx:bg-[var(--tuwa-error-icon)]"},replaced:{line:"novatx:bg-[var(--tuwa-info-icon)]",border:"novatx:border-[var(--tuwa-info-icon)]",fill:"novatx:bg-[var(--tuwa-info-icon)]"},active:{line:"novatx:bg-[var(--tuwa-pending-icon)]",border:"novatx:border-[var(--tuwa-pending-icon)]",fill:"novatx:bg-transparent",pulse:"novatx:bg-[var(--tuwa-pending-icon)]"},inactive:{line:"novatx:bg-[var(--tuwa-border-primary)]",border:"novatx:border-[var(--tuwa-border-primary)]",fill:"novatx:bg-transparent"}};function Fo({status:t,label:o,isFirst:n=false}){let r=Uo[t],s=()=>{switch(t){case "completed":return jsx(CheckIcon,{className:"novatx:h-3 novatx:w-3 novatx:text-white"});case "error":return jsx(ExclamationTriangleIcon,{className:"novatx:h-3 novatx:w-3 novatx:text-white"});case "replaced":return jsx(ArrowPathIcon,{className:"novatx:h-3 novatx:w-3 novatx:text-white"});case "active":return jsx("div",{className:cn("novatx:h-2 novatx:w-2 novatx:animate-pulse novatx:rounded-full",r.pulse)});default:return null}};return jsxs("div",{className:"novatx:relative novatx:flex novatx:min-w-[80px] novatx:flex-1 novatx:flex-col novatx:items-center",children:[!n&&jsx("div",{className:cn("novatx:absolute novatx:right-1/2 novatx:top-[10px] novatx:h-0.5 novatx:w-full",r.line)}),jsx("div",{className:cn("novatx:relative novatx:z-10 novatx:flex novatx:h-5 novatx:w-5 novatx:items-center novatx:justify-center novatx:rounded-full novatx:border-2",r.border,r.fill),children:s()}),jsx("span",{className:cn("novatx:mt-2 novatx:text-center novatx:text-xs",t!=="inactive"?"novatx:font-semibold novatx:text-[var(--tuwa-text-primary)]":"novatx:text-[var(--tuwa-text-secondary)]"),children:o})]})}function wt({isProcessing:t,isSucceed:o,isFailed:n,isReplaced:r,className:s,StepComponent:l=Fo}){let{trackingModal:c,statuses:i}=v(),p=useMemo(()=>{let a=x=>{if(x===1)return "completed";if(x===2){if(o||n||r)return "completed";if(t)return "active"}if(x===3){if(o)return "completed";if(n)return "error";if(r)return "replaced";if(t)return "active"}return "inactive"},e=x=>x===1?c.progressIndicator.created:x===2?c.progressIndicator.processing:n?i.failed:r?i.replaced:c.progressIndicator.succeed;return [{status:a(1),label:e(1),isFirst:true},{status:a(2),label:e(2)},{status:a(3),label:e(3),isLast:true}]},[t,o,n,r,c,i]);return jsx("div",{className:cn("novatx:flex novatx:w-full novatx:items-start novatx:px-4 novatx:pt-2 novatx:pb-1",s),children:p.map((a,e)=>jsx(l,{...a},e))})}var Xo={succeed:{Icon:CheckCircleIcon,className:"novatx:text-[var(--tuwa-success-icon)]"},failed:{Icon:ExclamationCircleIcon,className:"novatx:text-[var(--tuwa-error-icon)]"},replaced:{Icon:ArrowPathIcon,className:"novatx:text-[var(--tuwa-info-icon)]"},processing:{Icon:ArrowPathIcon,className:"novatx:animate-spin novatx:text-[var(--tuwa-text-accent)]"},initializing:{Icon:ClockIcon,className:"novatx:animate-pulse novatx:text-[var(--tuwa-pending-icon)]"}};function ht({isProcessing:t,isSucceed:o,isFailed:n,isReplaced:r}){let s=o&&"succeed"||n&&"failed"||r&&"replaced"||t&&"processing"||"initializing",{Icon:l,className:c}=Xo[s];return jsx("div",{className:"novatx:flex novatx:justify-center novatx:py-4",children:jsx(l,{className:cn("novatx:h-16 novatx:w-16",c)})})}kt.extend(qo);var Qo=({chainId:t})=>jsx("div",{className:"novatx:h-8 novatx:w-8 novatx:text-[var(--tuwa-text-secondary)]",children:jsx(Web3Icon,{chainId:setChainId(t)})}),Zo=({timestamp:t})=>jsx("span",{className:"novatx:mb-1 novatx:block novatx:text-xs novatx:text-[var(--tuwa-text-secondary)]",children:t?kt.unix(t).fromNow():"..."});function St({tx:t,adapter:o,className:n,customization:r}){let{Icon:s=Qo,Title:l=B,Description:c=B,Timestamp:i=Zo,StatusBadge:p=_,TransactionKey:a=K}=r?.components??{};return jsxs("div",{className:cn("novatx:flex novatx:flex-col novatx:gap-2 novatx:border-b novatx:border-[var(--tuwa-border-secondary)] novatx:p-3 novatx:transition-colors novatx:hover:bg-[var(--tuwa-bg-secondary)]",n),children:[jsxs("div",{className:"novatx:flex novatx:items-start novatx:justify-between",children:[jsxs("div",{className:"novatx:flex novatx:items-center novatx:gap-4",children:[jsx("div",{className:"novatx:flex novatx:h-10 novatx:w-10 novatx:flex-shrink-0 novatx:items-center novatx:justify-center novatx:rounded-full novatx:bg-[var(--tuwa-bg-muted)]",children:jsx(s,{chainId:t.chainId})}),jsxs("div",{children:[jsx(l,{txStatus:t.status,source:t.title,fallback:t.type,variant:"title",applyColor:true}),jsx(i,{timestamp:t.localTimestamp}),jsx(c,{txStatus:t.status,source:t.description,variant:"description"})]})]}),jsx(p,{tx:t})]}),jsx(a,{tx:t,adapter:o,variant:"history"})]})}function oa({title:t,message:o,className:n}){return jsxs("div",{className:cn("novatx:rounded-lg novatx:bg-[var(--tuwa-bg-muted)] novatx:p-8 novatx:text-center",n),children:[jsx("h4",{className:"novatx:font-semibold novatx:text-[var(--tuwa-text-primary)]",children:t}),jsx("p",{className:"novatx:mt-1 novatx:text-sm novatx:text-[var(--tuwa-text-secondary)]",children:o})]})}function At({adapter:t,connectedWalletAddress:o,transactionsPool:n,className:r,customization:s}){let{transactionsModal:l}=v(),c=useMemo(()=>o?selectAllTransactionsByActiveWallet(n,o).sort((x,f)=>(f.localTimestamp??0)-(x.localTimestamp??0)):[],[n,o]),{Placeholder:i=oa,HistoryItem:p=St}=s?.components??{},a=()=>o?c.length>0?jsx("div",{className:cn("NovaCustomScroll novatx:max-h-[400px] novatx:overflow-y-auto novatx:rounded-lg novatx:border novatx:border-[var(--tuwa-border-primary)] novatx:bg-[var(--tuwa-bg-primary)]",s?.classNames?.listWrapper),children:c.map(e=>jsx(p,{tx:e,adapter:t},e.txKey))}):jsx(i,{title:l.history.noTransactionsTitle,message:l.history.noTransactionsMessage}):jsx(i,{title:l.history.connectWalletTitle,message:l.history.connectWalletMessage});return jsxs("div",{className:cn("novatx:flex novatx:flex-col novatx:gap-y-3",r),children:[s?.title&&jsx("h3",{className:"novatx:text-lg novatx:font-bold novatx:text-[var(--tuwa-text-primary)]",children:s?.title}),a()]})}var ca=({closeModal:t,title:o})=>{let{actions:n}=v();return jsxs(DialogHeader,{children:[jsx(DialogTitle,{children:o}),jsx(DialogClose,{asChild:true,children:jsx("button",{type:"button",onClick:t,"aria-label":n.close,className:`novatx:cursor-pointer novatx:rounded-full novatx:p-1 novatx:text-[var(--tuwa-text-tertiary)] novatx:transition-colors novatx:hover:bg-[var(--tuwa-bg-muted)] novatx:hover:text-[var(--tuwa-text-primary)]`,children:jsx(CloseIcon,{})})})]})};function Ht({isOpen:t,setIsOpen:o,customization:n,adapter:r,connectedWalletAddress:s,transactionsPool:l}){let{transactionsModal:c}=v(),i=()=>o(false),p=n?.components?.Header,a=n?.components?.History;return jsx(Dialog,{open:t,onOpenChange:e=>!e&&i(),children:jsx(DialogContent,{className:cn("novatx:w-full novatx:sm:max-w-2xl",n?.modalProps?.className),...n?.modalProps,children:jsxs("div",{className:cn("novatx:relative novatx:max-h-[95dvh] novatx:w-full novatx:flex novatx:flex-col",n?.classNames?.contentWrapper),children:[p?jsx(p,{closeModal:i}):jsx(ca,{closeModal:i,title:c.history.title}),a?jsx(a,{adapter:r,transactionsPool:l,connectedWalletAddress:s}):jsx(At,{adapter:r,transactionsPool:l,connectedWalletAddress:s})]})})})}var fa={[TransactionStatus.Success]:"success",[TransactionStatus.Failed]:"error",[TransactionStatus.Replaced]:"info"};function Ur({adapter:t,connectedWalletAddress:o,connectedAdapterType:n,transactionsPool:r,initialTx:s,executeTxAction:l,closeTxTrackedModal:c,labels:i,features:p,customization:a,...e}){let[x,f]=useState(false),b=useRef(r),T="nova-transactions",m=useMediaQuery("(max-width: 767px)"),u=useMemo(()=>({toasts:p?.toasts??true,transactionsModal:p?.transactionsModal??true,trackingTxModal:p?.trackingTxModal??true}),[p]),A=useMemo(()=>deepMerge(z,i||{}),[i]),w=useCallback(g=>{if(!u.toasts)return;let h=g.pending?"info":fa[g.status]??"info",I=W=>jsx(mt,{...W,tx:g,openTxInfoModal:u.transactionsModal?()=>f(true):void 0,customization:a?.toast,adapter:t,connectedWalletAddress:o});toast.isActive(g.txKey)?toast.update(g.txKey,{render:I,type:h,containerId:T}):toast(I,{toastId:g.txKey,type:h,closeOnClick:false,containerId:T});},[r,u,a?.toast,t,o]);useEffect(()=>{let g=b.current;Object.values(r).forEach(h=>{let I=g[h.txKey];if(!I&&h.pending){w(h);return}I&&JSON.stringify(I)!==JSON.stringify(h)&&w(h);}),b.current=r;},[r,w]),useEffect(()=>{Object.values(r).forEach(g=>{toast.isActive(g.txKey,T)&&w(g);});},[o,w,r]);let F=!!s?.withTrackedModal&&r[s?.lastTxKey??""]?.isTrackedModalOpen,S=u.toasts&&(!m||!F&&!x);return jsxs(ct,{labels:A,children:[S&&jsx(ToastContainer,{position:"bottom-right",stacked:true,autoClose:false,hideProgressBar:true,closeOnClick:false,icon:false,closeButton:ToastCloseButton,containerId:T,toastClassName:"novatx:!p-0 novatx:!bg-transparent novatx:!shadow-none novatx:!min-h-0",...e}),u.transactionsModal&&jsx(Ht,{isOpen:x,setIsOpen:f,customization:a?.transactionsInfoModal,adapter:t,connectedWalletAddress:o,connectedAdapterType:n,transactionsPool:r}),u.trackingTxModal&&jsx(yt,{initialTx:s,onClose:c,onOpenAllTransactions:()=>f(true),transactionsPool:r,customization:a?.trackingTxModal,executeTxAction:l,adapter:t,connectedWalletAddress:o})]})}export{ct as NovaTransactionsLabelsProvider,Ur as NovaTransactionsProvider,v as useLabels};//# sourceMappingURL=index.js.map //# sourceMappingURL=index.js.map