@aurora-is-near/intents-swap-widget 3.18.2 → 3.19.0

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.
Files changed (182) hide show
  1. package/dist/components/Accordion.js +31 -32
  2. package/dist/components/Accordion.js.map +1 -1
  3. package/dist/components/AllNetworksIcon.js +11 -0
  4. package/dist/components/AllNetworksIcon.js.map +1 -0
  5. package/dist/components/Button.d.ts +8 -0
  6. package/dist/components/Button.js +53 -43
  7. package/dist/components/Button.js.map +1 -1
  8. package/dist/components/ChainShortcut.d.ts +15 -0
  9. package/dist/components/ChainShortcut.js +57 -0
  10. package/dist/components/ChainShortcut.js.map +1 -0
  11. package/dist/components/CopyButton.d.ts +5 -2
  12. package/dist/components/CopyButton.js +11 -7
  13. package/dist/components/CopyButton.js.map +1 -1
  14. package/dist/components/Notes.js +1 -1
  15. package/dist/components/Notes.js.map +1 -1
  16. package/dist/components/index.d.ts +2 -0
  17. package/dist/components/index.js +21 -17
  18. package/dist/components/index.js.map +1 -1
  19. package/dist/{config-CgCb5P7j.js → config-C47AYcMK.js} +1006 -992
  20. package/dist/config-C47AYcMK.js.map +1 -0
  21. package/dist/config.d.ts +2 -0
  22. package/dist/config.js +9 -10
  23. package/dist/config.js.map +1 -1
  24. package/dist/errors.js +1 -1
  25. package/dist/ext/alchemy/index.js +1 -1
  26. package/dist/ext/index.js +1 -1
  27. package/dist/features/BalanceRpcLoader/TokenBalanceLoader.js +1 -1
  28. package/dist/features/BalanceRpcLoader/index.js +1 -1
  29. package/dist/features/BalanceRpcLoader/useTokenBalanceRpc.js +1 -1
  30. package/dist/features/ChainsDropdown/ChainItem.d.ts +1 -0
  31. package/dist/features/ChainsDropdown/ChainItem.js +23 -14
  32. package/dist/features/ChainsDropdown/ChainItem.js.map +1 -1
  33. package/dist/features/ChainsDropdown/index.js +61 -94
  34. package/dist/features/ChainsDropdown/index.js.map +1 -1
  35. package/dist/features/ChainsSelector/index.d.ts +15 -0
  36. package/dist/features/ChainsSelector/index.js +108 -0
  37. package/dist/features/ChainsSelector/index.js.map +1 -0
  38. package/dist/features/DepositMethodSwitcher.js +1 -1
  39. package/dist/features/ErrorBoundary.js +1 -1
  40. package/dist/features/ExternalDeposit.js +4 -3
  41. package/dist/features/ExternalDeposit.js.map +1 -1
  42. package/dist/features/SendAddress/index.js +1 -1
  43. package/dist/features/SendAddress/useNotification.js +1 -1
  44. package/dist/features/SubmitButton/index.js +1 -1
  45. package/dist/features/SuccessScreen/CopyableValue.d.ts +5 -0
  46. package/dist/features/SuccessScreen/CopyableValue.js +11 -0
  47. package/dist/features/SuccessScreen/CopyableValue.js.map +1 -0
  48. package/dist/features/SuccessScreen/TokenRow.d.ts +8 -0
  49. package/dist/features/SuccessScreen/TokenRow.js +20 -0
  50. package/dist/features/SuccessScreen/TokenRow.js.map +1 -0
  51. package/dist/features/SuccessScreen/index.d.ts +5 -4
  52. package/dist/features/SuccessScreen/index.js +151 -49
  53. package/dist/features/SuccessScreen/index.js.map +1 -1
  54. package/dist/features/SuccessScreen/useSummaryItemsCount.d.ts +1 -0
  55. package/dist/features/SuccessScreen/useSummaryItemsCount.js +14 -0
  56. package/dist/features/SuccessScreen/useSummaryItemsCount.js.map +1 -0
  57. package/dist/features/SwapDirectionSwitcher.js +1 -1
  58. package/dist/features/SwapQuote/SwapQuote.js +1 -1
  59. package/dist/features/SwapQuote/index.js +1 -1
  60. package/dist/features/TokenInput/TokenInput.js +1 -1
  61. package/dist/features/TokenInput/TokenInputEmpty.js +1 -1
  62. package/dist/features/TokenInput/TokenInputSource.js +1 -1
  63. package/dist/features/TokenInput/TokenInputTarget.js +2 -2
  64. package/dist/features/TokenInput/WalletBalance.js +1 -1
  65. package/dist/features/TokenInput/hooks/index.js +1 -1
  66. package/dist/features/TokenInput/hooks/useTokenInputBalance.js +1 -1
  67. package/dist/features/TokenInput/index.js +1 -1
  68. package/dist/features/TokensList/TokenItem.js +2 -2
  69. package/dist/features/TokensList/TokensList.js +1 -1
  70. package/dist/features/TokensList/index.js +1 -1
  71. package/dist/features/TokensModal.js +62 -64
  72. package/dist/features/TokensModal.js.map +1 -1
  73. package/dist/features/WalletCompatibilityCheck/WalletCompatibilityModal.js +5 -4
  74. package/dist/features/WalletCompatibilityCheck/WalletCompatibilityModal.js.map +1 -1
  75. package/dist/features/WalletCompatibilityCheck/index.js +1 -1
  76. package/dist/features/index.js +1 -1
  77. package/dist/hooks/index.js +1 -1
  78. package/dist/hooks/useAllTokens.js +1 -1
  79. package/dist/hooks/useChains.js +1 -1
  80. package/dist/hooks/useCompatibilityCheck.js +1 -1
  81. package/dist/hooks/useDefaultToken.js +1 -1
  82. package/dist/hooks/useExternalDepositStatus/index.js +1 -1
  83. package/dist/hooks/useExternalDepositStatus/usePoaExternalDepositStatus.js +1 -1
  84. package/dist/hooks/useIntentsBalance.js +1 -1
  85. package/dist/hooks/useIsCompatibilityCheckRequired.js +1 -1
  86. package/dist/hooks/useMakeDepositAddress.js +1 -1
  87. package/dist/hooks/useMakeIntentsTransfer.js +1 -1
  88. package/dist/hooks/useMakeNEARFtTransferCall.js +1 -1
  89. package/dist/hooks/useMakeQuote.js +1 -1
  90. package/dist/hooks/useMakeQuoteTransfer.js +1 -1
  91. package/dist/hooks/useMakeTransfer.js +1 -1
  92. package/dist/hooks/useMergedBalance.js +1 -1
  93. package/dist/hooks/useSwitchChain.js +1 -1
  94. package/dist/hooks/useTheme.js +1 -1
  95. package/dist/hooks/useTokenInputPair.js +1 -1
  96. package/dist/hooks/useTokens.js +1 -1
  97. package/dist/hooks/useTokensFiltered.d.ts +3 -1
  98. package/dist/hooks/useTokensFiltered.js +1 -1
  99. package/dist/hooks/useTokensIntentsUnique.js +1 -1
  100. package/dist/index.js +74 -70
  101. package/dist/index.js.map +1 -1
  102. package/dist/machine/effects/index.js +1 -1
  103. package/dist/machine/effects/useAlchemyBalanceEffect.js +1 -1
  104. package/dist/machine/effects/useBalancesUpdateEffect.js +1 -1
  105. package/dist/machine/effects/useMakeQuoteEffect.js +1 -1
  106. package/dist/machine/effects/useSelectedTokensEffect.js +1 -1
  107. package/dist/machine/effects/useSetTokenBalanceEffect.js +1 -1
  108. package/dist/machine/effects/useSetTokenIntentsTargetEffect.js +1 -1
  109. package/dist/machine/effects/useWalletConnEffect.js +1 -1
  110. package/dist/machine/events/index.js +1 -1
  111. package/dist/machine/events/reset.d.ts +1 -0
  112. package/dist/machine/events/reset.js +2 -2
  113. package/dist/machine/events/reset.js.map +1 -1
  114. package/dist/machine/events/tokenSelect.js +1 -1
  115. package/dist/machine/events/validateInputAndMoveTo.js +1 -1
  116. package/dist/machine/events/validateInputs.js +1 -1
  117. package/dist/machine/index.js +1 -1
  118. package/dist/machine/snap.js +1 -1
  119. package/dist/machine/subscriptions/checkers/isSendAddressAsConnected.js +1 -1
  120. package/dist/machine/subscriptions/index.js +1 -1
  121. package/dist/styles.css +1 -1
  122. package/dist/theme/ThemeProvider.js +1 -1
  123. package/dist/types/config.d.ts +3 -0
  124. package/dist/types/localisation.d.ts +1 -1
  125. package/dist/utils/intents/signers/near.js +1 -1
  126. package/dist/utils/intents/signers/privy.js +1 -1
  127. package/dist/utils/near/getNearNep141StorageBalance.js +1 -1
  128. package/dist/utils/tokens/sort.d.ts +2 -1
  129. package/dist/utils/tokens/sort.js +55 -24
  130. package/dist/utils/tokens/sort.js.map +1 -1
  131. package/dist/widgets/WidgetDeposit/WidgetDepositContent.js +74 -73
  132. package/dist/widgets/WidgetDeposit/WidgetDepositContent.js.map +1 -1
  133. package/dist/widgets/WidgetDeposit/WidgetDepositSkeleton.js +1 -1
  134. package/dist/widgets/WidgetSwap/WidgetSwapContent.js +70 -68
  135. package/dist/widgets/WidgetSwap/WidgetSwapContent.js.map +1 -1
  136. package/dist/widgets/WidgetSwap/WidgetSwapSkeleton.js +1 -1
  137. package/dist/widgets/WidgetWithdraw/WidgetWithdrawContent.js +64 -62
  138. package/dist/widgets/WidgetWithdraw/WidgetWithdrawContent.js.map +1 -1
  139. package/dist/widgets/WidgetWithdraw/WidgetWithdrawSkeleton.js +1 -1
  140. package/package.json +1 -1
  141. package/src/components/Accordion.tsx +5 -6
  142. package/src/components/AllNetworksIcon.tsx +8 -0
  143. package/src/components/Button.tsx +17 -1
  144. package/src/components/ChainShortcut.tsx +67 -0
  145. package/src/components/CopyButton.tsx +12 -2
  146. package/src/components/Notes.tsx +1 -1
  147. package/src/components/index.ts +2 -0
  148. package/src/config.tsx +13 -0
  149. package/src/features/ChainsDropdown/ChainItem.tsx +17 -4
  150. package/src/features/ChainsDropdown/index.tsx +10 -41
  151. package/src/features/ChainsSelector/index.tsx +113 -0
  152. package/src/features/SuccessScreen/CopyableValue.tsx +13 -0
  153. package/src/features/SuccessScreen/TokenRow.tsx +26 -0
  154. package/src/features/SuccessScreen/index.tsx +161 -55
  155. package/src/features/SuccessScreen/useSummaryItemsCount.ts +33 -0
  156. package/src/features/TokensList/TokensList.tsx +2 -1
  157. package/src/features/TokensModal.tsx +29 -29
  158. package/src/hooks/useTokensFiltered.ts +4 -0
  159. package/src/machine/events/reset.ts +6 -3
  160. package/src/types/config.ts +8 -0
  161. package/src/types/localisation.ts +11 -3
  162. package/src/utils/tokens/sort.ts +107 -20
  163. package/src/widgets/WidgetDeposit/WidgetDepositContent.tsx +6 -4
  164. package/src/widgets/WidgetSwap/WidgetSwapContent.tsx +7 -4
  165. package/src/widgets/WidgetWithdraw/WidgetWithdrawContent.tsx +7 -4
  166. package/dist/config-CgCb5P7j.js.map +0 -1
  167. package/dist/features/ChainsDropdown/AllNetworksIcon.js +0 -7
  168. package/dist/features/ChainsDropdown/AllNetworksIcon.js.map +0 -1
  169. package/dist/features/SuccessScreen/CheckIcon.d.ts +0 -1
  170. package/dist/features/SuccessScreen/CheckIcon.js +0 -7
  171. package/dist/features/SuccessScreen/CheckIcon.js.map +0 -1
  172. package/dist/features/SuccessScreen/ExternalAction.d.ts +0 -5
  173. package/dist/features/SuccessScreen/ExternalAction.js +0 -16
  174. package/dist/features/SuccessScreen/ExternalAction.js.map +0 -1
  175. package/dist/features/SuccessScreen/SummaryItem.d.ts +0 -8
  176. package/dist/features/SuccessScreen/SummaryItem.js +0 -21
  177. package/dist/features/SuccessScreen/SummaryItem.js.map +0 -1
  178. package/src/features/ChainsDropdown/AllNetworksIcon.tsx +0 -7
  179. package/src/features/SuccessScreen/CheckIcon.tsx +0 -7
  180. package/src/features/SuccessScreen/ExternalAction.tsx +0 -15
  181. package/src/features/SuccessScreen/SummaryItem.tsx +0 -28
  182. /package/dist/{features/ChainsDropdown → components}/AllNetworksIcon.d.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"WidgetWithdrawContent.js","sources":["../../../src/widgets/WidgetWithdraw/WidgetWithdrawContent.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nimport type { CommonWidgetProps, TokenInputType } from '../types';\nimport { useTokenModal } from '../../hooks/useTokenModal';\nimport { WidgetWithdrawSkeleton } from './WidgetWithdrawSkeleton';\nimport { useTypedTranslation } from '../../localisation';\nimport {\n SendAddress,\n SubmitButton,\n SuccessScreen,\n SwapQuote,\n TokenInput,\n TokensModal,\n} from '@/features';\n\nimport { BlockingError, Card, DirectionSwitcher } from '@/components';\nimport { WalletCompatibilityCheck } from '@/features/WalletCompatibilityCheck';\n\nimport { useStoreSideEffects } from '@/machine/effects';\nimport { useComputedSnapshot, useUnsafeSnapshot } from '@/machine/snap';\nimport { fireEvent } from '@/machine/events/utils/fireEvent';\n\nimport {\n useIsCompatibilityCheckRequired,\n useTokenInputPair,\n useTokens,\n} from '@/hooks';\nimport { useConfig } from '@/config';\n\nimport { isDebug, notReachable } from '@/utils';\n\nimport type { Token, TransferResult } from '@/types';\n\ntype Msg =\n | { type: 'on_select_token'; token: Token; variant: TokenInputType }\n | { type: 'on_transfer_success' }\n | { type: 'on_tokens_modal_toggled'; isOpen: boolean };\n\nexport type Props = CommonWidgetProps<Msg>;\n\nexport const WidgetWithdrawContent = ({\n providers,\n makeTransfer,\n onMsg,\n isLoading,\n}: Props) => {\n const { t } = useTypedTranslation();\n const { ctx } = useUnsafeSnapshot();\n const { isDirectNearTokenWithdrawal } = useComputedSnapshot();\n const {\n chainsFilter,\n alchemyApiKey,\n refetchQuoteInterval,\n intentsAccountType,\n onWalletSignout,\n } = useConfig();\n\n const { status: tokensStatus, refetch: refetchTokens } = useTokens();\n const { tokenModalOpen, updateTokenModalState } = useTokenModal({ onMsg });\n const { onChangeAmount, onChangeToken, lastChangedInput } =\n useTokenInputPair();\n\n const isCompatibilityCheckRequired = useIsCompatibilityCheckRequired();\n const [isCompatibilityOpen, setIsCompatibilityOpen] = useState(false);\n\n useEffect(() => {\n if (isCompatibilityCheckRequired) {\n setIsCompatibilityOpen(true);\n }\n }, [isCompatibilityCheckRequired]);\n\n const [transferResult, setTransferResult] = useState<\n TransferResult | undefined\n >();\n\n useEffect(() => {\n fireEvent('reset', { clearWalletAddress: true });\n }, []);\n\n useStoreSideEffects({\n debug: isDebug(),\n listenTo: [\n 'checkWalletConnection',\n 'setSourceTokenBalance',\n [\n 'setDefaultSelectedTokens',\n { skipIntents: false, target: 'same-asset' },\n ],\n [\n 'makeQuote',\n {\n message: undefined,\n type: lastChangedInput === 'target' ? 'exact_out' : 'exact_in',\n refetchQuoteInterval,\n },\n ],\n ['setBalancesUsingAlchemyExt', { alchemyApiKey }],\n ],\n });\n\n if (!!isLoading || (tokensStatus !== 'error' && !ctx.sourceToken)) {\n return <WidgetWithdrawSkeleton />;\n }\n\n if (isCompatibilityOpen) {\n return (\n <WalletCompatibilityCheck\n providers={providers}\n onMsg={(msg) => {\n switch (msg.type) {\n case 'on_sign_out':\n onWalletSignout?.(intentsAccountType);\n setIsCompatibilityOpen(false);\n break;\n case 'on_close':\n setIsCompatibilityOpen(false);\n break;\n default:\n notReachable(msg.type);\n }\n }}\n />\n );\n }\n\n if (ctx.state === 'transfer_success' && !!transferResult) {\n return (\n <SuccessScreen\n {...transferResult}\n message={[\n 'Your withdrawal has been successfully completed,',\n 'and the funds have been sent to the specified destination.',\n ]}\n onMsg={(msg) => {\n switch (msg.type) {\n case 'on_dismiss_success':\n setTransferResult(undefined);\n break;\n default:\n notReachable(msg.type);\n }\n }}\n />\n );\n }\n\n switch (tokensStatus) {\n case 'error':\n return (\n <BlockingError\n message=\"Couldn't load tokens list.\"\n onClickRetry={refetchTokens}\n />\n );\n\n case 'success': {\n if (tokenModalOpen !== 'none') {\n return (\n <TokensModal\n showBalances\n variant={tokenModalOpen}\n showChainsSelector={tokenModalOpen === 'target'}\n groupTokens={false}\n chainsFilter={\n tokenModalOpen === 'source'\n ? chainsFilter.source\n : chainsFilter.target\n }\n onMsg={(msg) => {\n switch (msg.type) {\n case 'on_select_token':\n onChangeToken(tokenModalOpen, msg.token);\n updateTokenModalState('none');\n onMsg?.({\n type: msg.type,\n token: msg.token,\n variant: tokenModalOpen,\n });\n break;\n case 'on_dismiss_tokens_modal':\n updateTokenModalState('none');\n break;\n default:\n notReachable(msg);\n }\n }}\n />\n );\n }\n\n return (\n <div className=\"gap-sw-2xl relative flex flex-col\">\n <div className=\"gap-[10px] relative flex flex-col\">\n <Card padding=\"none\">\n <TokenInput.Source\n heading={t(\n 'tokenInput.heading.source.withdraw',\n 'Withdraw token',\n )}\n isChanging={lastChangedInput === 'source'}\n onMsg={(msg) => {\n switch (msg.type) {\n case 'on_select_token':\n onChangeToken('source', msg.token);\n break;\n case 'on_change_amount':\n onChangeAmount('source', msg.amount);\n break;\n case 'on_click_select_token':\n updateTokenModalState('source');\n break;\n default:\n notReachable(msg);\n }\n }}\n />\n </Card>\n\n <DirectionSwitcher isEnabled={false} />\n\n <Card padding=\"none\">\n <TokenInput.Target\n heading={t(\n 'tokenInput.heading.target.withdraw',\n 'Receive token',\n )}\n isChanging={lastChangedInput === 'target'}\n onMsg={(msg) => {\n switch (msg.type) {\n case 'on_select_token':\n onChangeToken('target', msg.token);\n break;\n case 'on_change_amount':\n onChangeAmount('target', msg.amount);\n break;\n case 'on_click_select_token':\n updateTokenModalState('target');\n break;\n default:\n notReachable(msg);\n }\n }}\n />\n </Card>\n </div>\n\n {!!ctx.walletAddress &&\n ctx.targetToken &&\n !ctx.targetToken.isIntent && (\n <SendAddress\n onMsg={(msg) => {\n switch (msg.type) {\n case 'on_change_send_address':\n break;\n default:\n notReachable(msg.type, { throwError: false });\n }\n }}\n />\n )}\n\n {!isDirectNearTokenWithdrawal && <SwapQuote />}\n\n <SubmitButton\n providers={providers}\n makeTransfer={makeTransfer}\n label={t('submit.active.withdraw', 'Swap & withdraw')}\n onSuccess={(transfer) => {\n setTransferResult(transfer);\n onMsg?.({ type: 'on_transfer_success' });\n }}\n />\n </div>\n );\n }\n\n case 'pending':\n default:\n return <WidgetWithdrawSkeleton />;\n }\n};\n"],"names":["WidgetWithdrawContent","providers","makeTransfer","onMsg","isLoading","t","useTypedTranslation","ctx","useUnsafeSnapshot","isDirectNearTokenWithdrawal","useComputedSnapshot","chainsFilter","alchemyApiKey","refetchQuoteInterval","intentsAccountType","onWalletSignout","useConfig","tokensStatus","refetchTokens","useTokens","tokenModalOpen","updateTokenModalState","useTokenModal","onChangeAmount","onChangeToken","lastChangedInput","useTokenInputPair","isCompatibilityCheckRequired","useIsCompatibilityCheckRequired","isCompatibilityOpen","setIsCompatibilityOpen","useState","useEffect","transferResult","setTransferResult","fireEvent","useStoreSideEffects","isDebug","WidgetWithdrawSkeleton","jsx","WalletCompatibilityCheck","msg","notReachable","SuccessScreen","BlockingError","TokensModal","jsxs","Card","TokenInput","DirectionSwitcher","SendAddress","SwapQuote","SubmitButton","transfer"],"mappings":"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"}
1
+ {"version":3,"file":"WidgetWithdrawContent.js","sources":["../../../src/widgets/WidgetWithdraw/WidgetWithdrawContent.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nimport type { CommonWidgetProps, TokenInputType } from '../types';\nimport { useTokenModal } from '../../hooks/useTokenModal';\nimport { WidgetWithdrawSkeleton } from './WidgetWithdrawSkeleton';\nimport { useTypedTranslation } from '../../localisation';\nimport {\n SendAddress,\n SubmitButton,\n SuccessScreen,\n SwapQuote,\n TokenInput,\n TokensModal,\n} from '@/features';\n\nimport { BlockingError, Card, DirectionSwitcher } from '@/components';\nimport { WalletCompatibilityCheck } from '@/features/WalletCompatibilityCheck';\n\nimport { useStoreSideEffects } from '@/machine/effects';\nimport { useComputedSnapshot, useUnsafeSnapshot } from '@/machine/snap';\nimport { fireEvent } from '@/machine/events/utils/fireEvent';\n\nimport {\n useIsCompatibilityCheckRequired,\n useTokenInputPair,\n useTokens,\n} from '@/hooks';\nimport { useConfig } from '@/config';\n\nimport { isDebug, notReachable } from '@/utils';\n\nimport type { Token, TransferResult } from '@/types';\n\ntype Msg =\n | { type: 'on_select_token'; token: Token; variant: TokenInputType }\n | { type: 'on_transfer_success' }\n | { type: 'on_tokens_modal_toggled'; isOpen: boolean };\n\nexport type Props = CommonWidgetProps<Msg>;\n\nexport const WidgetWithdrawContent = ({\n providers,\n makeTransfer,\n onMsg,\n isLoading,\n}: Props) => {\n const { t } = useTypedTranslation();\n const { ctx } = useUnsafeSnapshot();\n const { isDirectNearTokenWithdrawal } = useComputedSnapshot();\n const {\n chainsFilter,\n alchemyApiKey,\n refetchQuoteInterval,\n intentsAccountType,\n onWalletSignout,\n } = useConfig();\n\n const { status: tokensStatus, refetch: refetchTokens } = useTokens();\n const { tokenModalOpen, updateTokenModalState } = useTokenModal({ onMsg });\n const { onChangeAmount, onChangeToken, lastChangedInput } =\n useTokenInputPair();\n\n const isCompatibilityCheckRequired = useIsCompatibilityCheckRequired();\n const [isCompatibilityOpen, setIsCompatibilityOpen] = useState(false);\n\n useEffect(() => {\n if (isCompatibilityCheckRequired) {\n setIsCompatibilityOpen(true);\n }\n }, [isCompatibilityCheckRequired]);\n\n const [transferResult, setTransferResult] = useState<\n TransferResult | undefined\n >();\n\n useEffect(() => {\n fireEvent('reset', { clearWalletAddress: true });\n }, []);\n\n useStoreSideEffects({\n debug: isDebug(),\n listenTo: [\n 'checkWalletConnection',\n 'setSourceTokenBalance',\n [\n 'setDefaultSelectedTokens',\n { skipIntents: false, target: 'same-asset' },\n ],\n [\n 'makeQuote',\n {\n message: undefined,\n type: lastChangedInput === 'target' ? 'exact_out' : 'exact_in',\n refetchQuoteInterval,\n },\n ],\n ['setBalancesUsingAlchemyExt', { alchemyApiKey }],\n ],\n });\n\n const onBackToSwap = () => {\n fireEvent('reset', { clearWalletAddress: false, keepSelectedTokens: true });\n };\n\n if (!!isLoading || (tokensStatus !== 'error' && !ctx.sourceToken)) {\n return <WidgetWithdrawSkeleton />;\n }\n\n if (isCompatibilityOpen) {\n return (\n <WalletCompatibilityCheck\n providers={providers}\n onMsg={(msg) => {\n switch (msg.type) {\n case 'on_sign_out':\n onWalletSignout?.(intentsAccountType);\n setIsCompatibilityOpen(false);\n break;\n case 'on_close':\n setIsCompatibilityOpen(false);\n break;\n default:\n notReachable(msg.type);\n }\n }}\n />\n );\n }\n\n if (ctx.state === 'transfer_success' && !!transferResult) {\n return (\n <SuccessScreen\n showTargetToken\n title={t('transfer.success.withdrawal.title', 'Withdrawal successful')}\n {...transferResult}\n onMsg={(msg) => {\n switch (msg.type) {\n case 'on_dismiss_success':\n setTransferResult(undefined);\n onBackToSwap();\n break;\n default:\n notReachable(msg.type);\n }\n }}\n />\n );\n }\n\n switch (tokensStatus) {\n case 'error':\n return (\n <BlockingError\n message=\"Couldn't load tokens list.\"\n onClickRetry={refetchTokens}\n />\n );\n\n case 'success': {\n if (tokenModalOpen !== 'none') {\n return (\n <TokensModal\n showBalances\n variant={tokenModalOpen}\n showChainsSelector={tokenModalOpen === 'target'}\n groupTokens={false}\n chainsFilter={\n tokenModalOpen === 'source'\n ? chainsFilter.source\n : chainsFilter.target\n }\n onMsg={(msg) => {\n switch (msg.type) {\n case 'on_select_token':\n onChangeToken(tokenModalOpen, msg.token);\n updateTokenModalState('none');\n onMsg?.({\n type: msg.type,\n token: msg.token,\n variant: tokenModalOpen,\n });\n break;\n case 'on_dismiss_tokens_modal':\n updateTokenModalState('none');\n break;\n default:\n notReachable(msg);\n }\n }}\n />\n );\n }\n\n return (\n <div className=\"gap-sw-2xl relative flex flex-col\">\n <div className=\"gap-[10px] relative flex flex-col\">\n <Card padding=\"none\">\n <TokenInput.Source\n heading={t(\n 'tokenInput.heading.source.withdraw',\n 'Withdraw token',\n )}\n isChanging={lastChangedInput === 'source'}\n onMsg={(msg) => {\n switch (msg.type) {\n case 'on_select_token':\n onChangeToken('source', msg.token);\n break;\n case 'on_change_amount':\n onChangeAmount('source', msg.amount);\n break;\n case 'on_click_select_token':\n updateTokenModalState('source');\n break;\n default:\n notReachable(msg);\n }\n }}\n />\n </Card>\n\n <DirectionSwitcher isEnabled={false} />\n\n <Card padding=\"none\">\n <TokenInput.Target\n heading={t(\n 'tokenInput.heading.target.withdraw',\n 'Receive token',\n )}\n isChanging={lastChangedInput === 'target'}\n onMsg={(msg) => {\n switch (msg.type) {\n case 'on_select_token':\n onChangeToken('target', msg.token);\n break;\n case 'on_change_amount':\n onChangeAmount('target', msg.amount);\n break;\n case 'on_click_select_token':\n updateTokenModalState('target');\n break;\n default:\n notReachable(msg);\n }\n }}\n />\n </Card>\n </div>\n\n {!!ctx.walletAddress &&\n ctx.targetToken &&\n !ctx.targetToken.isIntent && (\n <SendAddress\n onMsg={(msg) => {\n switch (msg.type) {\n case 'on_change_send_address':\n break;\n default:\n notReachable(msg.type, { throwError: false });\n }\n }}\n />\n )}\n\n {!isDirectNearTokenWithdrawal && <SwapQuote />}\n\n <SubmitButton\n providers={providers}\n makeTransfer={makeTransfer}\n label={t('submit.active.withdraw', 'Swap & withdraw')}\n onSuccess={(transfer) => {\n setTransferResult(transfer);\n onMsg?.({ type: 'on_transfer_success' });\n }}\n />\n </div>\n );\n }\n\n case 'pending':\n default:\n return <WidgetWithdrawSkeleton />;\n }\n};\n"],"names":["WidgetWithdrawContent","providers","makeTransfer","onMsg","isLoading","t","useTypedTranslation","ctx","useUnsafeSnapshot","isDirectNearTokenWithdrawal","useComputedSnapshot","chainsFilter","alchemyApiKey","refetchQuoteInterval","intentsAccountType","onWalletSignout","useConfig","tokensStatus","refetchTokens","useTokens","tokenModalOpen","updateTokenModalState","useTokenModal","onChangeAmount","onChangeToken","lastChangedInput","useTokenInputPair","isCompatibilityCheckRequired","useIsCompatibilityCheckRequired","isCompatibilityOpen","setIsCompatibilityOpen","useState","useEffect","transferResult","setTransferResult","fireEvent","useStoreSideEffects","isDebug","onBackToSwap","WidgetWithdrawSkeleton","jsx","WalletCompatibilityCheck","msg","notReachable","SuccessScreen","BlockingError","TokensModal","jsxs","Card","TokenInput","DirectionSwitcher","SendAddress","SwapQuote","SubmitButton","transfer"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCO,MAAMA,KAAwB,CAAC;AAAA,EACpC,WAAAC;AAAA,EACA,cAAAC;AAAA,EACA,OAAAC;AAAA,EACA,WAAAC;AACF,MAAa;AACX,QAAM,EAAE,GAAAC,EAAA,IAAMC,EAAA,GACR,EAAE,KAAAC,EAAA,IAAQC,EAAA,GACV,EAAE,6BAAAC,EAAA,IAAgCC,EAAA,GAClC;AAAA,IACJ,cAAAC;AAAA,IACA,eAAAC;AAAA,IACA,sBAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,iBAAAC;AAAA,EAAA,IACEC,EAAA,GAEE,EAAE,QAAQC,GAAc,SAASC,EAAA,IAAkBC,EAAA,GACnD,EAAE,gBAAAC,GAAgB,uBAAAC,EAAA,IAA0BC,EAAc,EAAE,OAAAnB,GAAO,GACnE,EAAE,gBAAAoB,GAAgB,eAAAC,GAAe,kBAAAC,EAAA,IACrCC,EAAA,GAEIC,IAA+BC,EAAA,GAC/B,CAACC,GAAqBC,CAAsB,IAAIC,EAAS,EAAK;AAEpE,EAAAC,EAAU,MAAM;AACd,IAAIL,KACFG,EAAuB,EAAI;AAAA,EAE/B,GAAG,CAACH,CAA4B,CAAC;AAEjC,QAAM,CAACM,GAAgBC,CAAiB,IAAIH,EAAA;AAI5C,EAAAC,EAAU,MAAM;AACd,IAAAG,EAAU,SAAS,EAAE,oBAAoB,GAAA,CAAM;AAAA,EACjD,GAAG,CAAA,CAAE,GAELC,EAAoB;AAAA,IAClB,OAAOC,EAAA;AAAA,IACP,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,QACE;AAAA,QACA,EAAE,aAAa,IAAO,QAAQ,aAAA;AAAA,MAAa;AAAA,MAE7C;AAAA,QACE;AAAA,QACA;AAAA,UACE,SAAS;AAAA,UACT,MAAMZ,MAAqB,WAAW,cAAc;AAAA,UACpD,sBAAAZ;AAAA,QAAA;AAAA,MACF;AAAA,MAEF,CAAC,8BAA8B,EAAE,eAAAD,EAAA,CAAe;AAAA,IAAA;AAAA,EAClD,CACD;AAED,QAAM0B,IAAe,MAAM;AACzB,IAAAH,EAAU,SAAS,EAAE,oBAAoB,IAAO,oBAAoB,IAAM;AAAA,EAC5E;AAEA,MAAM/B,KAAca,MAAiB,WAAW,CAACV,EAAI;AACnD,6BAAQgC,GAAA,EAAuB;AAGjC,MAAIV;AACF,WACE,gBAAAW;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,WAAAxC;AAAA,QACA,OAAO,CAACyC,MAAQ;AACd,kBAAQA,EAAI,MAAA;AAAA,YACV,KAAK;AACH,cAAA3B,IAAkBD,CAAkB,GACpCgB,EAAuB,EAAK;AAC5B;AAAA,YACF,KAAK;AACH,cAAAA,EAAuB,EAAK;AAC5B;AAAA,YACF;AACE,cAAAa,EAAaD,EAAI,IAAI;AAAA,UAAA;AAAA,QAE3B;AAAA,MAAA;AAAA,IAAA;AAKN,MAAInC,EAAI,UAAU,sBAAwB0B;AACxC,WACE,gBAAAO;AAAA,MAACI;AAAA,MAAA;AAAA,QACC,iBAAe;AAAA,QACf,OAAOvC,EAAE,qCAAqC,uBAAuB;AAAA,QACpE,GAAG4B;AAAA,QACJ,OAAO,CAACS,MAAQ;AACd,kBAAQA,EAAI,MAAA;AAAA,YACV,KAAK;AACH,cAAAR,EAAkB,MAAS,GAC3BI,EAAA;AACA;AAAA,YACF;AACE,cAAAK,EAAaD,EAAI,IAAI;AAAA,UAAA;AAAA,QAE3B;AAAA,MAAA;AAAA,IAAA;AAKN,UAAQzB,GAAA;AAAA,IACN,KAAK;AACH,aACE,gBAAAuB;AAAA,QAACK;AAAA,QAAA;AAAA,UACC,SAAQ;AAAA,UACR,cAAc3B;AAAA,QAAA;AAAA,MAAA;AAAA,IAIpB,KAAK;AACH,aAAIE,MAAmB,SAEnB,gBAAAoB;AAAA,QAACM;AAAA,QAAA;AAAA,UACC,cAAY;AAAA,UACZ,SAAS1B;AAAA,UACT,oBAAoBA,MAAmB;AAAA,UACvC,aAAa;AAAA,UACb,cACEA,MAAmB,WACfT,EAAa,SACbA,EAAa;AAAA,UAEnB,OAAO,CAAC+B,MAAQ;AACd,oBAAQA,EAAI,MAAA;AAAA,cACV,KAAK;AACH,gBAAAlB,EAAcJ,GAAgBsB,EAAI,KAAK,GACvCrB,EAAsB,MAAM,GAC5BlB,IAAQ;AAAA,kBACN,MAAMuC,EAAI;AAAA,kBACV,OAAOA,EAAI;AAAA,kBACX,SAAStB;AAAA,gBAAA,CACV;AACD;AAAA,cACF,KAAK;AACH,gBAAAC,EAAsB,MAAM;AAC5B;AAAA,cACF;AACE,gBAAAsB,EAAaD,CAAG;AAAA,YAAA;AAAA,UAEtB;AAAA,QAAA;AAAA,MAAA,IAMJ,gBAAAK,EAAC,OAAA,EAAI,WAAU,qCACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,qCACb,UAAA;AAAA,UAAA,gBAAAP,EAACQ,GAAA,EAAK,SAAQ,QACZ,UAAA,gBAAAR;AAAA,YAACS,EAAW;AAAA,YAAX;AAAA,cACC,SAAS5C;AAAA,gBACP;AAAA,gBACA;AAAA,cAAA;AAAA,cAEF,YAAYoB,MAAqB;AAAA,cACjC,OAAO,CAACiB,MAAQ;AACd,wBAAQA,EAAI,MAAA;AAAA,kBACV,KAAK;AACH,oBAAAlB,EAAc,UAAUkB,EAAI,KAAK;AACjC;AAAA,kBACF,KAAK;AACH,oBAAAnB,EAAe,UAAUmB,EAAI,MAAM;AACnC;AAAA,kBACF,KAAK;AACH,oBAAArB,EAAsB,QAAQ;AAC9B;AAAA,kBACF;AACE,oBAAAsB,EAAaD,CAAG;AAAA,gBAAA;AAAA,cAEtB;AAAA,YAAA;AAAA,UAAA,GAEJ;AAAA,UAEA,gBAAAF,EAACU,GAAA,EAAkB,WAAW,GAAA,CAAO;AAAA,UAErC,gBAAAV,EAACQ,GAAA,EAAK,SAAQ,QACZ,UAAA,gBAAAR;AAAA,YAACS,EAAW;AAAA,YAAX;AAAA,cACC,SAAS5C;AAAA,gBACP;AAAA,gBACA;AAAA,cAAA;AAAA,cAEF,YAAYoB,MAAqB;AAAA,cACjC,OAAO,CAACiB,MAAQ;AACd,wBAAQA,EAAI,MAAA;AAAA,kBACV,KAAK;AACH,oBAAAlB,EAAc,UAAUkB,EAAI,KAAK;AACjC;AAAA,kBACF,KAAK;AACH,oBAAAnB,EAAe,UAAUmB,EAAI,MAAM;AACnC;AAAA,kBACF,KAAK;AACH,oBAAArB,EAAsB,QAAQ;AAC9B;AAAA,kBACF;AACE,oBAAAsB,EAAaD,CAAG;AAAA,gBAAA;AAAA,cAEtB;AAAA,YAAA;AAAA,UAAA,EACF,CACF;AAAA,QAAA,GACF;AAAA,QAEC,CAAC,CAACnC,EAAI,iBACLA,EAAI,eACJ,CAACA,EAAI,YAAY,YACf,gBAAAiC;AAAA,UAACW;AAAA,UAAA;AAAA,YACC,OAAO,CAACT,MAAQ;AACd,sBAAQA,EAAI,MAAA;AAAA,gBACV,KAAK;AACH;AAAA,gBACF;AACE,kBAAAC,EAAaD,EAAI,MAAM,EAAE,YAAY,IAAO;AAAA,cAAA;AAAA,YAElD;AAAA,UAAA;AAAA,QAAA;AAAA,QAIL,CAACjC,KAA+B,gBAAA+B,EAACY,GAAA,EAAU;AAAA,QAE5C,gBAAAZ;AAAA,UAACa;AAAA,UAAA;AAAA,YACC,WAAApD;AAAA,YACA,cAAAC;AAAA,YACA,OAAOG,EAAE,0BAA0B,iBAAiB;AAAA,YACpD,WAAW,CAACiD,MAAa;AACvB,cAAApB,EAAkBoB,CAAQ,GAC1BnD,IAAQ,EAAE,MAAM,uBAAuB;AAAA,YACzC;AAAA,UAAA;AAAA,QAAA;AAAA,MACF,GACF;AAAA,IAIJ,KAAK;AAAA,IACL;AACE,+BAAQoC,GAAA,EAAuB;AAAA,EAAA;AAErC;"}
@@ -1,7 +1,7 @@
1
1
  import { jsxs as a, jsx as e } from "react/jsx-runtime";
2
2
  import o from "clsx";
3
3
  import { SkeletonBox as l } from "../../components/SkeletonBox.js";
4
- import { y as x } from "../../config-CgCb5P7j.js";
4
+ import { y as x } from "../../config-C47AYcMK.js";
5
5
  const p = () => {
6
6
  const { hideTokenInputHeadings: s } = x();
7
7
  return /* @__PURE__ */ a("div", { className: "w-full gap-sw-xl relative flex flex-col", children: [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aurora-is-near/intents-swap-widget",
3
- "version": "3.18.2",
3
+ "version": "3.19.0",
4
4
  "description": "Provides components and hooks to build your own Intents swap widget",
5
5
  "author": "Maksim Vashchuk",
6
6
  "license": "MIT",
@@ -29,12 +29,11 @@ export const Accordion = ({
29
29
  const [isExpanded, setIsExpanded] = useState(expandedByDefault);
30
30
 
31
31
  return (
32
- <Card
33
- isClickable
34
- className={cn('py-sw-lg', className)}
35
- onClick={() => setIsExpanded((p) => !p)}>
36
- <header className="align-center flex w-full justify-between">
37
- <span className="gap-sw-xs text-sw-label-md mt-sw-xs flex text-center text-sw-gray-200">
32
+ <Card className={cn('py-sw-xl', className)}>
33
+ <header
34
+ onClick={() => setIsExpanded((p) => !p)}
35
+ className="items-center flex w-full justify-between cursor-pointer">
36
+ <span className="gap-sw-xs text-sw-label-md flex text-center text-sw-gray-200">
38
37
  {title}
39
38
  </span>
40
39
  {isBadgeLoading ? (
@@ -0,0 +1,8 @@
1
+ export const AllNetworksIcon = () => (
2
+ <div className="flex flex-wrap gap-y-0 gap-x-[2px] h-[17px] w-[16px]">
3
+ <div className="w-[7px] h-[7px] rounded-[2px] shrink-0 bg-sw-gray-900" />
4
+ <div className="w-[7px] h-[7px] rounded-[2px] shrink-0 bg-sw-gray-600" />
5
+ <div className="w-[7px] h-[7px] rounded-[2px] shrink-0 bg-sw-gray-600" />
6
+ <div className="w-[7px] h-[7px] rounded-[2px] shrink-0 bg-sw-gray-900" />
7
+ </div>
8
+ );
@@ -22,7 +22,11 @@ type Props = {
22
22
  } & (
23
23
  | { icon: MaterialSymbolsComponent; iconPosition?: 'head' | 'tail' }
24
24
  | { icon?: never; iconPosition?: never }
25
- );
25
+ ) &
26
+ (
27
+ | { as?: 'button'; href?: never; target?: never }
28
+ | { as: 'a'; href: string; target?: '_blank' | '_self' }
29
+ );
26
30
 
27
31
  const styles = {
28
32
  icon: 'h-sw-xl w-sw-xl',
@@ -76,20 +80,26 @@ const ButtonPrimary = ({
76
80
  size,
77
81
  className,
78
82
  children,
83
+ as = 'button',
79
84
  state = 'default',
80
85
  onClick,
81
86
  fluid,
87
+ href,
88
+ target,
82
89
  ...props
83
90
  }: Omit<Props, 'variant'>) => {
91
+ const anchorProps = as === 'a' ? { href, target } : {};
84
92
  const isDisabled = ['disabled', 'loading', 'error'].includes(state)
85
93
  ? true
86
94
  : undefined;
87
95
 
88
96
  return (
89
97
  <UIButton
98
+ as={as}
90
99
  disabled={isDisabled}
91
100
  data-active={state === 'active' ? true : undefined}
92
101
  onClick={() => state === 'default' && onClick?.()}
102
+ {...anchorProps}
93
103
  className={clsx(
94
104
  styles.common,
95
105
  styles.width(fluid),
@@ -115,20 +125,26 @@ const ButtonOutlined = ({
115
125
  size,
116
126
  className,
117
127
  children,
128
+ as = 'button',
118
129
  state = 'default',
119
130
  onClick,
120
131
  fluid,
132
+ href,
133
+ target,
121
134
  ...props
122
135
  }: Omit<Props, 'variant'>) => {
136
+ const anchorProps = as === 'a' ? { href, target } : {};
123
137
  const isDisabled = ['disabled', 'loading', 'error'].includes(state)
124
138
  ? true
125
139
  : undefined;
126
140
 
127
141
  return (
128
142
  <UIButton
143
+ as={as}
129
144
  disabled={isDisabled}
130
145
  data-active={state === 'active' ? true : undefined}
131
146
  onClick={() => state === 'default' && onClick?.()}
147
+ {...anchorProps}
132
148
  className={clsx(
133
149
  styles.common,
134
150
  styles.width(fluid),
@@ -0,0 +1,67 @@
1
+ import type { ComponentProps } from 'react';
2
+
3
+ import { AllNetworksIcon } from './AllNetworksIcon';
4
+
5
+ import { cn } from '@/utils/cn';
6
+ import { UNKNOWN_ICON } from '@/icons';
7
+ import { Icon } from '@/components/Icon';
8
+ import { useTypedTranslation } from '@/localisation';
9
+
10
+ type Props = {
11
+ label: string;
12
+ isSelected: boolean;
13
+ icon: ComponentProps<typeof Icon>['icon'];
14
+ onClick: () => void;
15
+ };
16
+
17
+ const Shortcut = ({ icon, label, isSelected, onClick }: Props) => {
18
+ return (
19
+ <li
20
+ onClick={onClick}
21
+ className={cn(
22
+ 'w-[36px] h-[36px] p-sw-md rounded-sw-md cursor-pointer items-center justify-center flex transition-colors',
23
+ {
24
+ 'bg-sw-gray-50': isSelected,
25
+ 'bg-sw-gray-800 hover:bg-sw-gray-700': !isSelected,
26
+ },
27
+ )}>
28
+ <Icon
29
+ size={20}
30
+ radius={6}
31
+ label={label}
32
+ icon={icon ?? UNKNOWN_ICON}
33
+ className="bg-transparent"
34
+ />
35
+ </li>
36
+ );
37
+ };
38
+
39
+ const AllChainsShortcut = ({
40
+ isSelected,
41
+ onClick,
42
+ }: {
43
+ isSelected: boolean;
44
+ onClick: () => void;
45
+ }) => {
46
+ const { t } = useTypedTranslation();
47
+
48
+ return (
49
+ <div
50
+ onClick={onClick}
51
+ className={cn(
52
+ 'px-sw-lg gap-sw-sm flex h-[36px] cursor-pointer items-center rounded-sw-md text-sw-label-md transition-colors',
53
+ {
54
+ 'bg-sw-gray-50 text-sw-gray-950': isSelected,
55
+ 'bg-sw-gray-800 text-sw-gray-50 bg-sw-gray-800 hover:bg-sw-gray-700':
56
+ !isSelected,
57
+ },
58
+ )}>
59
+ <AllNetworksIcon />
60
+ {t('chain.all.label', 'All')}
61
+ </div>
62
+ );
63
+ };
64
+
65
+ export const ChainShortcut = Object.assign(Shortcut, {
66
+ All: AllChainsShortcut,
67
+ });
@@ -1,11 +1,21 @@
1
1
  import copy from 'copy-text-to-clipboard';
2
2
  import { ContentCopyW700 as ContentCopy } from '@material-symbols-svg/react-rounded/icons/content-copy';
3
3
 
4
- export const CopyButton = ({ value }: { value: string }) => (
4
+ import { cn } from '@/utils/cn';
5
+
6
+ type Props = {
7
+ value: string;
8
+ className?: string;
9
+ };
10
+
11
+ export const CopyButton = ({ value, className }: Props) => (
5
12
  <button
6
13
  type="button"
7
14
  onClick={() => copy(value)}
8
- className="text-sw-gray-200 hover:text-sw-gray-50 cursor-pointer transition-all duration-300 [transition-timing-function:cubic-bezier(0.175,0.885,0.32,1.275)] active:-translate-y-1 active:scale-x-90 active:scale-y-110">
15
+ className={cn(
16
+ 'text-sw-gray-200 hover:text-sw-gray-50 cursor-pointer transition-all duration-300 [transition-timing-function:cubic-bezier(0.175,0.885,0.32,1.275)] active:-translate-y-1 active:scale-x-90 active:scale-y-110',
17
+ className,
18
+ )}>
9
19
  <ContentCopy size={16} />
10
20
  </button>
11
21
  );
@@ -28,7 +28,7 @@ const NoteItem = ({
28
28
 
29
29
  const NotesList = ({ children, className }: Props) => {
30
30
  return (
31
- <ul className={cn('gap-sw-2xl flex flex-col', className)}>{children}</ul>
31
+ <ul className={cn('gap-sw-xl flex flex-col', className)}>{children}</ul>
32
32
  );
33
33
  };
34
34
 
@@ -18,3 +18,5 @@ export * from './TokenIcon';
18
18
  export * from './StatusWidget';
19
19
  export * from './WidgetContainer';
20
20
  export * from './CloseButton';
21
+ export * from './ChainShortcut';
22
+ export * from './AllNetworksIcon';
package/src/config.tsx CHANGED
@@ -50,6 +50,19 @@ const DEFAULT_CONFIG: WidgetConfig = {
50
50
  source: { external: 'wallet-supported', intents: 'none' },
51
51
  target: { external: 'all', intents: 'none' },
52
52
  },
53
+
54
+ topChainShortcuts: (intentsAccountType) => {
55
+ switch (intentsAccountType) {
56
+ case 'evm':
57
+ return ['eth', 'arb', 'avax', 'base'] as const;
58
+ case 'sol':
59
+ return ['sol', 'eth', 'btc', 'near'] as const;
60
+ case 'near':
61
+ return ['near', 'sol', 'eth', 'btc'] as const;
62
+ default:
63
+ return ['eth', 'btc', 'sol', 'near'] as const;
64
+ }
65
+ },
53
66
  };
54
67
 
55
68
  type WidgetConfigContextType = { config: WidgetConfig };
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { CheckW700 as Check } from '@material-symbols-svg/react-rounded/icons/check';
2
+ import { CheckFillW700 as Check } from '@material-symbols-svg/react-rounded/icons/check';
3
3
 
4
4
  import { cn } from '@/utils/cn';
5
5
  import { Icon } from '@/components/Icon';
@@ -13,12 +13,25 @@ type Props = {
13
13
  isSelected: boolean;
14
14
  chain: 'intents' | 'all' | Chains;
15
15
  icon: string | React.ReactElement;
16
+ iconClassName?: string;
16
17
  className?: string;
17
18
  onMsg: (msg: Msg) => void;
18
19
  };
19
20
 
20
21
  export const ChainItem = React.forwardRef<HTMLButtonElement, Props>(
21
- ({ chain, label, icon, isFocused, isSelected, className, onMsg }, ref) => (
22
+ (
23
+ {
24
+ chain,
25
+ label,
26
+ icon,
27
+ iconClassName,
28
+ isFocused,
29
+ isSelected,
30
+ className,
31
+ onMsg,
32
+ },
33
+ ref,
34
+ ) => (
22
35
  <button
23
36
  ref={ref}
24
37
  type="button"
@@ -32,9 +45,9 @@ export const ChainItem = React.forwardRef<HTMLButtonElement, Props>(
32
45
  },
33
46
  className,
34
47
  )}>
35
- <Icon radius={10} label={label} icon={icon} />
48
+ <Icon radius={10} label={label} icon={icon} className={iconClassName} />
36
49
  <span className="text-sw-label-md mr-auto">{label}</span>
37
- {isSelected && <Check size={16} />}
50
+ {isSelected && <Check size={16} className="text-sw-status-success" />}
38
51
  </button>
39
52
  ),
40
53
  );
@@ -1,17 +1,16 @@
1
- import { Fragment, useMemo } from 'react';
1
+ import { Fragment } from 'react';
2
2
  import { Menu, MenuButton, MenuItem, MenuItems } from '@headlessui/react';
3
3
  import { ChevronLeftW700 as ChevronLeft } from '@material-symbols-svg/react-rounded/icons/chevron-left';
4
4
  import { AnimatePresence, motion } from 'framer-motion';
5
5
 
6
6
  import { ChainItem } from './ChainItem';
7
- import { AllNetworksIcon } from './AllNetworksIcon';
8
7
  import { useConfig } from '@/config';
9
8
  import { Hr } from '@/components/Hr';
10
- import { Icon } from '@/components/Icon';
9
+ import { AllNetworksIcon } from '@/components/AllNetworksIcon';
11
10
  import { useChains } from '@/hooks/useChains';
12
11
  import { notReachable } from '@/utils/notReachable';
13
12
  import { useTypedTranslation } from '@/localisation';
14
- import { ASSET_ICONS, UNKNOWN_ICON } from '@/icons';
13
+ import { CHAIN_ICONS, UNKNOWN_ICON } from '@/icons';
15
14
  import type { Chains, ChainsFilter } from '@/types/chain';
16
15
 
17
16
  type Msg = { type: 'on_click_chain'; chain: 'all' | 'intents' | Chains };
@@ -32,11 +31,7 @@ export const ChainsDropdown = ({
32
31
  const { t } = useTypedTranslation();
33
32
 
34
33
  const chains = useChains(variant);
35
- const { appIcon, appName, showIntentTokens } = useConfig();
36
- const selectedChain = useMemo(
37
- () => chains.find((item) => item.id === selected),
38
- [chains, selected],
39
- );
34
+ const { appIcon, appName } = useConfig();
40
35
 
41
36
  const hasIntentsAccountMenuItem = chainsFilter.intents !== 'none';
42
37
 
@@ -46,37 +41,10 @@ export const ChainsDropdown = ({
46
41
  <div>
47
42
  <MenuButton as={Fragment}>
48
43
  {({ open: isOpen }) => (
49
- <div className="py-sw-sm px-sw-md gap-sw-md flex h-[40px] cursor-pointer items-center rounded-sw-md bg-sw-gray-800 hover:bg-sw-gray-700">
50
- {(() => {
51
- switch (selected) {
52
- case 'all':
53
- return (
54
- <Icon
55
- radius={10}
56
- icon={<AllNetworksIcon />}
57
- label="All networks"
58
- />
59
- );
60
- case 'intents':
61
- return showIntentTokens ? (
62
- <Icon radius={10} icon={appIcon} label={appName} />
63
- ) : null;
64
- default:
65
- return !selectedChain ? (
66
- <Icon
67
- radius={10}
68
- icon={<AllNetworksIcon />}
69
- label={t('chain.all.label', 'All networks')}
70
- />
71
- ) : (
72
- <Icon
73
- radius={10}
74
- label={selectedChain.label}
75
- icon={ASSET_ICONS[selected] ?? UNKNOWN_ICON}
76
- />
77
- );
78
- }
79
- })()}
44
+ <div className="py-sw-sm pr-sw-md pl-sw-lg gap-sw-xs flex h-[36px] cursor-pointer items-center rounded-sw-md bg-sw-gray-800 hover:bg-sw-gray-700">
45
+ <span className="text-sw-label-md text-sw-gray-50">
46
+ {t('chain.more.label', 'More')}
47
+ </span>
80
48
 
81
49
  {isOpen ? (
82
50
  <ChevronLeft
@@ -111,6 +79,7 @@ export const ChainsDropdown = ({
111
79
  isSelected={selected === 'all'}
112
80
  isFocused={focus}
113
81
  icon={<AllNetworksIcon />}
82
+ iconClassName="bg-sw-gray-50"
114
83
  onMsg={(msg) => {
115
84
  switch (msg.type) {
116
85
  case 'on_click_chain':
@@ -162,7 +131,7 @@ export const ChainsDropdown = ({
162
131
  <ChainItem
163
132
  chain={chain.id}
164
133
  label={chain.label}
165
- icon={ASSET_ICONS[chain.id] ?? UNKNOWN_ICON}
134
+ icon={CHAIN_ICONS[chain.id] ?? UNKNOWN_ICON}
166
135
  isSelected={selected === chain.id}
167
136
  isFocused={focus}
168
137
  onMsg={(msg) => {
@@ -0,0 +1,113 @@
1
+ import { ChainsDropdown } from '../ChainsDropdown';
2
+
3
+ import { CHAIN_ICONS } from '@/icons';
4
+ import { ChainShortcut } from '@/components/ChainShortcut';
5
+
6
+ import { cn } from '@/utils/cn';
7
+ import { useChains } from '@/hooks';
8
+ import { useConfig } from '@/config';
9
+ import { noop } from '@/utils/noop';
10
+ import { notReachable } from '@/utils/notReachable';
11
+ import type { Chains, ChainsFilter } from '@/types/chain';
12
+
13
+ type SelectedChain = 'all' | 'intents' | Chains;
14
+
15
+ type Msg = { type: 'on_select_chain'; chain: SelectedChain };
16
+
17
+ type Props = {
18
+ variant: 'source' | 'target';
19
+ chainsFilter: ChainsFilter;
20
+ selectedChain: SelectedChain;
21
+ className?: string;
22
+ onMsg: (msg: Msg) => void;
23
+ };
24
+
25
+ export const ChainsSelector = ({
26
+ variant,
27
+ chainsFilter,
28
+ selectedChain,
29
+ className,
30
+ onMsg,
31
+ }: Props) => {
32
+ const chains = useChains(variant);
33
+ const {
34
+ appIcon,
35
+ appName,
36
+ topChainShortcuts,
37
+ intentsAccountType,
38
+ showIntentTokens,
39
+ } = useConfig();
40
+
41
+ const topChains =
42
+ topChainShortcuts?.(intentsAccountType) ??
43
+ (['eth', 'btc', 'sol', 'near'] as const);
44
+
45
+ return (
46
+ <div
47
+ className={cn('flex items-center justify-between gap-sw-md', className)}>
48
+ <ChainShortcut.All
49
+ isSelected={selectedChain === 'all'}
50
+ onClick={() => onMsg({ type: 'on_select_chain', chain: 'all' })}
51
+ />
52
+
53
+ <ul className="flex items-center gap-sw-md">
54
+ {showIntentTokens && (
55
+ <ChainShortcut
56
+ icon={appIcon}
57
+ label={appName}
58
+ isSelected={selectedChain === 'intents'}
59
+ onClick={() => onMsg({ type: 'on_select_chain', chain: 'intents' })}
60
+ />
61
+ )}
62
+
63
+ {topChains.map((chain, index) => {
64
+ // last shortcut reserved for the selected chain
65
+ if (
66
+ index === topChains.length - 1 &&
67
+ ![...topChains, 'all', 'intents'].includes(selectedChain)
68
+ ) {
69
+ return (
70
+ <ChainShortcut
71
+ isSelected
72
+ key={selectedChain}
73
+ icon={CHAIN_ICONS[selectedChain as Chains]}
74
+ label={chains.find((c) => c.id === selectedChain)?.label ?? ''}
75
+ onClick={noop}
76
+ />
77
+ );
78
+ }
79
+
80
+ // check it here to respect global chain filters
81
+ if (chains.some((c) => c.id === chain)) {
82
+ return (
83
+ <ChainShortcut
84
+ key={chain}
85
+ icon={CHAIN_ICONS[chain]}
86
+ isSelected={selectedChain === chain}
87
+ label={chains.find((c) => c.id === chain)?.label ?? ''}
88
+ onClick={() => onMsg({ type: 'on_select_chain', chain })}
89
+ />
90
+ );
91
+ }
92
+
93
+ return null;
94
+ })}
95
+ </ul>
96
+
97
+ <ChainsDropdown
98
+ variant={variant}
99
+ selected={selectedChain}
100
+ chainsFilter={chainsFilter}
101
+ onMsg={(msg) => {
102
+ switch (msg.type) {
103
+ case 'on_click_chain':
104
+ onMsg({ type: 'on_select_chain', chain: msg.chain });
105
+ break;
106
+ default:
107
+ notReachable(msg.type, { throwError: false });
108
+ }
109
+ }}
110
+ />
111
+ </div>
112
+ );
113
+ };
@@ -0,0 +1,13 @@
1
+ import { formatAddressTruncate } from '@/utils/formatters/formatAddressTruncate';
2
+ import { CopyButton } from '@/components/CopyButton';
3
+
4
+ type Props = {
5
+ value: string;
6
+ };
7
+
8
+ export const CopyableValue = ({ value }: Props) => (
9
+ <span className="text-sw-gray-50 flex items-center gap-sw-xs bg-sw-gray-800 rounded-full px-sw-sm py-sw-xs">
10
+ {formatAddressTruncate(value, 16)}
11
+ <CopyButton className="scale-80" value={value} />
12
+ </span>
13
+ );
@@ -0,0 +1,26 @@
1
+ import { Card } from '@/components/Card';
2
+ import { TokenIcon } from '@/components/TokenIcon';
3
+ import { formatUsdAmount } from '@/utils/formatters/formatUsdAmount';
4
+ import type { Token } from '@/types/token';
5
+
6
+ type Props = {
7
+ token: Token;
8
+ amount: string;
9
+ amountUsd: number | bigint;
10
+ };
11
+
12
+ export const TokenRow = ({ token, amount, amountUsd }: Props) => (
13
+ <Card className="flex items-center justify-between gap-sw-md pl-sw-2xl py-sw-lg">
14
+ <TokenIcon
15
+ token={token}
16
+ chainShowIcon={!token.isIntent}
17
+ className="border-sw-gray-900"
18
+ />
19
+ <div className="text-sw-label-md text-sw-gray-50 mr-auto">
20
+ {`${amount} ${token.symbol}`}
21
+ </div>
22
+ <span className="text-sw-label-sm text-sw-gray-200">
23
+ {formatUsdAmount(amountUsd)}
24
+ </span>
25
+ </Card>
26
+ );