@aurora-is-near/intents-swap-widget 3.15.1 → 3.15.2

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 (107) hide show
  1. package/dist/{config-DCXH00Br.js → config-CJfcVohD.js} +419 -417
  2. package/dist/{config-DCXH00Br.js.map → config-CJfcVohD.js.map} +1 -1
  3. package/dist/config.js +5 -4
  4. package/dist/config.js.map +1 -1
  5. package/dist/errors.js +1 -1
  6. package/dist/ext/alchemy/index.js +1 -1
  7. package/dist/ext/index.js +1 -1
  8. package/dist/features/BalanceRpcLoader/TokenBalanceLoader.js +1 -1
  9. package/dist/features/BalanceRpcLoader/index.js +1 -1
  10. package/dist/features/BalanceRpcLoader/useTokenBalanceRpc.js +1 -1
  11. package/dist/features/ChainsDropdown/ChainItem.d.ts +4 -1
  12. package/dist/features/ChainsDropdown/ChainItem.js +28 -21
  13. package/dist/features/ChainsDropdown/ChainItem.js.map +1 -1
  14. package/dist/features/ChainsDropdown/index.js +65 -62
  15. package/dist/features/ChainsDropdown/index.js.map +1 -1
  16. package/dist/features/DepositMethodSwitcher.js +1 -1
  17. package/dist/features/ErrorBoundary.js +1 -1
  18. package/dist/features/ExternalDeposit.js +1 -1
  19. package/dist/features/SendAddress/index.js +1 -1
  20. package/dist/features/SendAddress/useNotification.js +1 -1
  21. package/dist/features/SubmitButton/index.js +1 -1
  22. package/dist/features/SuccessScreen/index.js +1 -1
  23. package/dist/features/SwapDirectionSwitcher.js +1 -1
  24. package/dist/features/SwapQuote/SwapQuote.js +1 -1
  25. package/dist/features/SwapQuote/index.js +1 -1
  26. package/dist/features/TokenInput/TokenInput.js +1 -1
  27. package/dist/features/TokenInput/TokenInputEmpty.js +1 -1
  28. package/dist/features/TokenInput/TokenInputSource.js +1 -1
  29. package/dist/features/TokenInput/TokenInputTarget.js +1 -1
  30. package/dist/features/TokenInput/WalletBalance.js +1 -1
  31. package/dist/features/TokenInput/hooks/index.js +1 -1
  32. package/dist/features/TokenInput/hooks/useTokenInputBalance.js +1 -1
  33. package/dist/features/TokenInput/index.js +1 -1
  34. package/dist/features/TokensList/TokenItem.js +1 -1
  35. package/dist/features/TokensList/TokensList.js +1 -1
  36. package/dist/features/TokensList/index.js +1 -1
  37. package/dist/features/TokensModal.js +37 -39
  38. package/dist/features/TokensModal.js.map +1 -1
  39. package/dist/features/WalletCompatibilityCheck/WalletCompatibilityModal.js +20 -4
  40. package/dist/features/WalletCompatibilityCheck/WalletCompatibilityModal.js.map +1 -1
  41. package/dist/features/WalletCompatibilityCheck/index.js +1 -1
  42. package/dist/features/index.js +1 -1
  43. package/dist/hooks/index.d.ts +1 -0
  44. package/dist/hooks/index.js +10 -8
  45. package/dist/hooks/index.js.map +1 -1
  46. package/dist/hooks/useAllTokens.js +1 -1
  47. package/dist/hooks/useChains.js +1 -1
  48. package/dist/hooks/useCompatibilityCheck.js +1 -1
  49. package/dist/hooks/useDefaultToken.js +1 -1
  50. package/dist/hooks/useExternalDepositStatus/index.js +1 -1
  51. package/dist/hooks/useExternalDepositStatus/usePoaExternalDepositStatus.js +1 -1
  52. package/dist/hooks/useHandleKeyDown.d.ts +1 -0
  53. package/dist/hooks/useHandleKeyDown.js +15 -0
  54. package/dist/hooks/useHandleKeyDown.js.map +1 -0
  55. package/dist/hooks/useIntentsBalance.js +1 -1
  56. package/dist/hooks/useIsCompatibilityCheckRequired.js +1 -1
  57. package/dist/hooks/useMakeDepositAddress.js +1 -1
  58. package/dist/hooks/useMakeIntentsTransfer.js +1 -1
  59. package/dist/hooks/useMakeNEARFtTransferCall.js +1 -1
  60. package/dist/hooks/useMakeQuote.js +1 -1
  61. package/dist/hooks/useMakeQuoteTransfer.js +1 -1
  62. package/dist/hooks/useMakeTransfer.js +1 -1
  63. package/dist/hooks/useMergedBalance.js +1 -1
  64. package/dist/hooks/useSwitchChain.js +1 -1
  65. package/dist/hooks/useTheme.js +1 -1
  66. package/dist/hooks/useTokenInputPair.js +1 -1
  67. package/dist/hooks/useTokens.js +1 -1
  68. package/dist/hooks/useTokensFiltered.js +1 -1
  69. package/dist/hooks/useTokensIntentsUnique.js +1 -1
  70. package/dist/index.js +42 -40
  71. package/dist/index.js.map +1 -1
  72. package/dist/machine/effects/index.js +1 -1
  73. package/dist/machine/effects/useAlchemyBalanceEffect.js +1 -1
  74. package/dist/machine/effects/useBalancesUpdateEffect.js +1 -1
  75. package/dist/machine/effects/useMakeQuoteEffect.js +1 -1
  76. package/dist/machine/effects/useSelectedTokensEffect.js +1 -1
  77. package/dist/machine/effects/useSetTokenBalanceEffect.js +1 -1
  78. package/dist/machine/effects/useSetTokenIntentsTargetEffect.js +1 -1
  79. package/dist/machine/effects/useWalletConnEffect.js +1 -1
  80. package/dist/machine/events/index.js +1 -1
  81. package/dist/machine/events/tokenSelect.js +1 -1
  82. package/dist/machine/events/validateInputAndMoveTo.js +1 -1
  83. package/dist/machine/events/validateInputs.js +1 -1
  84. package/dist/machine/index.js +1 -1
  85. package/dist/machine/snap.js +1 -1
  86. package/dist/machine/subscriptions/checkers/isSendAddressAsConnected.js +1 -1
  87. package/dist/machine/subscriptions/index.js +1 -1
  88. package/dist/theme/ThemeProvider.js +1 -1
  89. package/dist/utils/intents/signers/near.js +1 -1
  90. package/dist/utils/intents/signers/privy.js +1 -1
  91. package/dist/utils/near/getNearNep141StorageBalance.js +1 -1
  92. package/dist/widgets/WidgetDeposit/WidgetDepositContent.js +10 -9
  93. package/dist/widgets/WidgetDeposit/WidgetDepositContent.js.map +1 -1
  94. package/dist/widgets/WidgetDeposit/WidgetDepositSkeleton.js +1 -1
  95. package/dist/widgets/WidgetSwap/WidgetSwapContent.js +4 -3
  96. package/dist/widgets/WidgetSwap/WidgetSwapContent.js.map +1 -1
  97. package/dist/widgets/WidgetSwap/WidgetSwapSkeleton.js +1 -1
  98. package/dist/widgets/WidgetWithdraw/WidgetWithdrawContent.js +4 -3
  99. package/dist/widgets/WidgetWithdraw/WidgetWithdrawContent.js.map +1 -1
  100. package/dist/widgets/WidgetWithdraw/WidgetWithdrawSkeleton.js +1 -1
  101. package/package.json +1 -1
  102. package/src/features/ChainsDropdown/ChainItem.tsx +14 -6
  103. package/src/features/ChainsDropdown/index.tsx +56 -47
  104. package/src/features/TokensModal.tsx +6 -3
  105. package/src/features/WalletCompatibilityCheck/WalletCompatibilityModal.tsx +10 -5
  106. package/src/hooks/index.ts +1 -0
  107. package/src/hooks/useHandleKeyDown.ts +17 -0
@@ -3,11 +3,12 @@ import { useState as w, useEffect as b } from "react";
3
3
  import { useTokenModal as B } from "../../hooks/useTokenModal.js";
4
4
  import { WidgetWithdrawSkeleton as y } from "./WidgetWithdrawSkeleton.js";
5
5
  import { useTypedTranslation as D } from "../../localisation.js";
6
- import { b as N, u as O, y as Q, n as j, c as q, p as S, o as F, S as U } from "../../config-DCXH00Br.js";
6
+ import { b as N, u as O, y as Q, n as j, c as q, p as S, o as F, S as U } from "../../config-CJfcVohD.js";
7
7
  import "@tanstack/react-query";
8
8
  import "@headlessui/react";
9
9
  import "framer-motion";
10
10
  import "lucide-react";
11
+ import "../../features/ChainsDropdown/ChainItem.js";
11
12
  import "../../utils/cn.js";
12
13
  import "../../constants/chains.js";
13
14
  import { notReachable as r } from "../../utils/notReachable.js";
@@ -42,7 +43,7 @@ import "copy-text-to-clipboard";
42
43
  import "../../components/InputAmount.js";
43
44
  import "../../components/Notes.js";
44
45
  import { WalletCompatibilityCheck as X } from "../../features/WalletCompatibilityCheck/index.js";
45
- const Ke = ({
46
+ const Pe = ({
46
47
  providers: u,
47
48
  makeTransfer: T,
48
49
  onMsg: a,
@@ -242,6 +243,6 @@ const Ke = ({
242
243
  }
243
244
  };
244
245
  export {
245
- Ke as WidgetWithdrawContent
246
+ Pe as WidgetWithdrawContent
246
247
  };
247
248
  //# sourceMappingURL=WidgetWithdrawContent.js.map
@@ -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 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,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-DCXH00Br.js";
4
+ import { y as x } from "../../config-CJfcVohD.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.15.1",
3
+ "version": "3.15.2",
4
4
  "description": "Provides components and hooks to build your own Intents swap widget",
5
5
  "author": "Maksim Vashchuk",
6
6
  "license": "MIT",
@@ -1,3 +1,4 @@
1
+ import React from 'react';
1
2
  import * as Icons from 'lucide-react';
2
3
 
3
4
  import { cn } from '@/utils/cn';
@@ -8,25 +9,32 @@ type Msg = { type: 'on_click_chain'; chain: 'intents' | 'all' | Chains };
8
9
 
9
10
  type Props = {
10
11
  label: string;
12
+ isFocused: boolean;
11
13
  isSelected: boolean;
12
14
  chain: 'intents' | 'all' | Chains;
13
15
  icon: string | React.ReactElement;
16
+ className?: string;
14
17
  onMsg: (msg: Msg) => void;
15
18
  };
16
19
 
17
- export const ChainItem = ({ chain, label, icon, isSelected, onMsg }: Props) => {
18
- return (
20
+ export const ChainItem = React.forwardRef<HTMLButtonElement, Props>(
21
+ ({ chain, label, icon, isFocused, isSelected, className, onMsg }, ref) => (
19
22
  <button
23
+ ref={ref}
20
24
  type="button"
21
25
  onClick={() => onMsg({ type: 'on_click_chain', chain })}
22
26
  className={cn(
23
27
  'gap-sw-md px-sw-lg py-sw-sm text-sw-gray-50 flex cursor-pointer items-center justify-between rounded-sw-md transition-colors',
24
- { 'hover:text-sw-accent-200 hover:bg-sw-gray-700': !isSelected },
25
- { 'bg-sw-gray-700': isSelected },
28
+ { 'bg-sw-gray-700': isSelected || isFocused },
29
+ {
30
+ 'hover:text-sw-accent-200 hover:bg-sw-gray-700':
31
+ !isSelected && !isFocused,
32
+ },
33
+ className,
26
34
  )}>
27
35
  <Icon radius={10} label={label} icon={icon} />
28
36
  <span className="text-sw-label-md mr-auto">{label}</span>
29
37
  {isSelected && <Icons.Check size={16} />}
30
38
  </button>
31
- );
32
- };
39
+ ),
40
+ );
@@ -98,59 +98,37 @@ export const ChainsDropdown = ({
98
98
  className="hide-scrollbar gap-sw-xxs p-sw-md z-10 flex max-h-[400px] min-w-[200px] flex-col rounded-sw-lg bg-sw-gray-800 shadow-[0_6px_48px_0_rgba(36,38,45,0.3)] ring-1 ring-inset ring-sw-gray-700 outline-none">
99
99
  {chains.length > 1 && (
100
100
  <MenuItem>
101
- <ChainItem
102
- chain="all"
103
- label="All networks"
104
- isSelected={selected === 'all'}
105
- icon={<AllNetworksIcon />}
106
- onMsg={(msg) => {
107
- switch (msg.type) {
108
- case 'on_click_chain':
109
- close();
110
- onMsg(msg);
111
- break;
112
- default:
113
- notReachable(msg.type, { throwError: false });
114
- }
115
- }}
116
- />
101
+ {({ focus }) => (
102
+ <ChainItem
103
+ chain="all"
104
+ label="All networks"
105
+ isSelected={selected === 'all'}
106
+ isFocused={focus}
107
+ icon={<AllNetworksIcon />}
108
+ onMsg={(msg) => {
109
+ switch (msg.type) {
110
+ case 'on_click_chain':
111
+ close();
112
+ onMsg(msg);
113
+ break;
114
+ default:
115
+ notReachable(msg.type, { throwError: false });
116
+ }
117
+ }}
118
+ />
119
+ )}
117
120
  </MenuItem>
118
121
  )}
119
122
 
120
123
  {hasIntentsAccountMenuItem && (
121
124
  <MenuItem>
122
- <ChainItem
123
- chain="intents"
124
- label={`${appName} account`}
125
- isSelected={selected === 'intents'}
126
- icon={appIcon}
127
- onMsg={(msg) => {
128
- switch (msg.type) {
129
- case 'on_click_chain':
130
- close();
131
- onMsg(msg);
132
- break;
133
- default:
134
- notReachable(msg.type, { throwError: false });
135
- }
136
- }}
137
- />
138
- </MenuItem>
139
- )}
140
-
141
- {!!chains.length &&
142
- !!(chains.length > 1 || hasIntentsAccountMenuItem) && (
143
- <Hr className="shrink-0 my-sw-sm bg-sw-gray-700" />
144
- )}
145
-
146
- {chains.map((chain) => {
147
- return (
148
- <MenuItem key={chain.id}>
125
+ {({ focus }) => (
149
126
  <ChainItem
150
- chain={chain.id}
151
- label={chain.label}
152
- icon={CHAINS_LIST[chain.id].icon}
153
- isSelected={selected === chain.id}
127
+ chain="intents"
128
+ label={`${appName} account`}
129
+ isSelected={selected === 'intents'}
130
+ isFocused={focus}
131
+ icon={appIcon}
154
132
  onMsg={(msg) => {
155
133
  switch (msg.type) {
156
134
  case 'on_click_chain':
@@ -162,6 +140,37 @@ export const ChainsDropdown = ({
162
140
  }
163
141
  }}
164
142
  />
143
+ )}
144
+ </MenuItem>
145
+ )}
146
+
147
+ {!!chains.length &&
148
+ !!(chains.length > 1 || hasIntentsAccountMenuItem) && (
149
+ <Hr className="shrink-0 my-sw-sm bg-sw-gray-700" />
150
+ )}
151
+
152
+ {chains.map((chain) => {
153
+ return (
154
+ <MenuItem key={chain.id}>
155
+ {({ focus }) => (
156
+ <ChainItem
157
+ chain={chain.id}
158
+ label={chain.label}
159
+ icon={CHAINS_LIST[chain.id].icon}
160
+ isSelected={selected === chain.id}
161
+ isFocused={focus}
162
+ onMsg={(msg) => {
163
+ switch (msg.type) {
164
+ case 'on_click_chain':
165
+ close();
166
+ onMsg(msg);
167
+ break;
168
+ default:
169
+ notReachable(msg.type, { throwError: false });
170
+ }
171
+ }}
172
+ />
173
+ )}
165
174
  </MenuItem>
166
175
  );
167
176
  })}
@@ -12,6 +12,7 @@ import { CloseButton } from '@/components/CloseButton';
12
12
 
13
13
  import { cn } from '@/utils/cn';
14
14
  import { useConfig } from '@/config';
15
+ import { useHandleKeyDown } from '@/hooks';
15
16
  import { useUnsafeSnapshot } from '@/machine/snap';
16
17
  import { notReachable } from '@/utils/notReachable';
17
18
  import { useTypedTranslation } from '@/localisation';
@@ -48,6 +49,10 @@ export const TokensModal = ({
48
49
  const [search, setSearch] = useState('');
49
50
  const chains = useChains(variant);
50
51
 
52
+ const handleClose = () => onMsg({ type: 'on_dismiss_tokens_modal' });
53
+
54
+ useHandleKeyDown('Escape', handleClose);
55
+
51
56
  // If there is only one chain available, select it by default
52
57
  const defaultChain =
53
58
  chains.length === 1 && chains[0]?.id ? chains[0]?.id : 'all';
@@ -72,9 +77,7 @@ export const TokensModal = ({
72
77
  )}>
73
78
  <header className="flex items-center justify-between">
74
79
  <h2 className="text-sw-label-lg text-sw-gray-50">Select token</h2>
75
- <CloseButton
76
- onClick={() => onMsg({ type: 'on_dismiss_tokens_modal' })}
77
- />
80
+ <CloseButton onClick={handleClose} />
78
81
  </header>
79
82
 
80
83
  <div className="gap-sw-xl flex items-center">
@@ -13,6 +13,7 @@ import { useEffect } from 'react';
13
13
  import { useTypedTranslation } from '@/localisation';
14
14
 
15
15
  import { cn } from '@/utils';
16
+ import { useHandleKeyDown } from '@/hooks';
16
17
  import { Button, Card, CloseButton } from '@/components';
17
18
 
18
19
  type Msg = { type: 'on_close' | 'on_check_compatibility' | 'on_sign_out' };
@@ -58,15 +59,16 @@ const FakeButton = ({
58
59
 
59
60
  export const Initial = ({ isSigned, isSigning, onMsg }: Props) => {
60
61
  const { t } = useTypedTranslation();
62
+ const handleClose = () => onMsg({ type: 'on_close' });
63
+
64
+ useHandleKeyDown('Escape', handleClose);
61
65
 
62
66
  const showTimer = useTimer({
63
67
  endTime: 0,
64
68
  autostart: false,
65
69
  timerType: 'DECREMENTAL',
66
70
  initialTime: 7,
67
- onTimeOver: () => {
68
- onMsg({ type: 'on_close' });
69
- },
71
+ onTimeOver: handleClose,
70
72
  });
71
73
 
72
74
  useEffect(() => {
@@ -80,7 +82,7 @@ export const Initial = ({ isSigned, isSigning, onMsg }: Props) => {
80
82
  return (
81
83
  <Card className="relative w-full gap-sw-2xl flex flex-col">
82
84
  <CloseButton
83
- onClick={() => onMsg({ type: 'on_close' })}
85
+ onClick={handleClose}
84
86
  className="absolute top-sw-2xl right-sw-2xl"
85
87
  />
86
88
  <ArmingCountdownFill size={48} className="text-sw-status-warning" />
@@ -176,11 +178,14 @@ interface ErrorProps {
176
178
 
177
179
  export const ErrorView = ({ onMsg }: ErrorProps) => {
178
180
  const { t } = useTypedTranslation();
181
+ const handleClose = () => onMsg({ type: 'on_close' });
182
+
183
+ useHandleKeyDown('Escape', handleClose);
179
184
 
180
185
  return (
181
186
  <Card className="relative w-full gap-sw-2xl flex flex-col">
182
187
  <CloseButton
183
- onClick={() => onMsg({ type: 'on_close' })}
188
+ onClick={handleClose}
184
189
  className="absolute top-sw-2xl right-sw-2xl"
185
190
  />
186
191
  <GppBadFill size={48} className="text-sw-status-error" />
@@ -16,3 +16,4 @@ export { useWalletBalance } from './useWalletBalance';
16
16
  export { useExternalDepositStatus } from './useExternalDepositStatus';
17
17
  export { useIsCompatibilityCheckRequired } from './useIsCompatibilityCheckRequired';
18
18
  export { useToggleTheme } from './useToggleTheme';
19
+ export { useHandleKeyDown } from './useHandleKeyDown';
@@ -0,0 +1,17 @@
1
+ import { useEffect } from 'react';
2
+
3
+ export const useHandleKeyDown = (key: string, onKeyPress: () => void) => {
4
+ useEffect(() => {
5
+ const handleKeyDown = (event: KeyboardEvent) => {
6
+ if (event.key === key) {
7
+ onKeyPress();
8
+ }
9
+ };
10
+
11
+ window.addEventListener('keydown', handleKeyDown);
12
+
13
+ return () => {
14
+ window.removeEventListener('keydown', handleKeyDown);
15
+ };
16
+ }, [key]);
17
+ };