@aurora-is-near/intents-swap-widget 3.18.2 → 3.18.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/Accordion.js +31 -32
- package/dist/components/Accordion.js.map +1 -1
- package/dist/components/Button.d.ts +8 -0
- package/dist/components/Button.js +53 -43
- package/dist/components/Button.js.map +1 -1
- package/dist/components/CopyButton.d.ts +5 -2
- package/dist/components/CopyButton.js +11 -7
- package/dist/components/CopyButton.js.map +1 -1
- package/dist/components/Notes.js +1 -1
- package/dist/components/Notes.js.map +1 -1
- package/dist/{config-CgCb5P7j.js → config-BMvXuF1-.js} +164 -165
- package/dist/{config-CgCb5P7j.js.map → config-BMvXuF1-.js.map} +1 -1
- package/dist/config.js +8 -9
- package/dist/config.js.map +1 -1
- package/dist/errors.js +1 -1
- package/dist/ext/alchemy/index.js +1 -1
- package/dist/ext/index.js +1 -1
- package/dist/features/BalanceRpcLoader/TokenBalanceLoader.js +1 -1
- package/dist/features/BalanceRpcLoader/index.js +1 -1
- package/dist/features/BalanceRpcLoader/useTokenBalanceRpc.js +1 -1
- package/dist/features/ChainsDropdown/index.js +1 -1
- package/dist/features/DepositMethodSwitcher.js +1 -1
- package/dist/features/ErrorBoundary.js +1 -1
- package/dist/features/ExternalDeposit.js +1 -1
- package/dist/features/SendAddress/index.js +1 -1
- package/dist/features/SendAddress/useNotification.js +1 -1
- package/dist/features/SubmitButton/index.js +1 -1
- package/dist/features/SuccessScreen/CopyableValue.d.ts +5 -0
- package/dist/features/SuccessScreen/CopyableValue.js +11 -0
- package/dist/features/SuccessScreen/CopyableValue.js.map +1 -0
- package/dist/features/SuccessScreen/TokenRow.d.ts +8 -0
- package/dist/features/SuccessScreen/TokenRow.js +20 -0
- package/dist/features/SuccessScreen/TokenRow.js.map +1 -0
- package/dist/features/SuccessScreen/index.d.ts +5 -4
- package/dist/features/SuccessScreen/index.js +151 -49
- package/dist/features/SuccessScreen/index.js.map +1 -1
- package/dist/features/SuccessScreen/useSummaryItemsCount.d.ts +1 -0
- package/dist/features/SuccessScreen/useSummaryItemsCount.js +14 -0
- package/dist/features/SuccessScreen/useSummaryItemsCount.js.map +1 -0
- package/dist/features/SwapDirectionSwitcher.js +1 -1
- package/dist/features/SwapQuote/SwapQuote.js +1 -1
- package/dist/features/SwapQuote/index.js +1 -1
- package/dist/features/TokenInput/TokenInput.js +1 -1
- package/dist/features/TokenInput/TokenInputEmpty.js +1 -1
- package/dist/features/TokenInput/TokenInputSource.js +1 -1
- package/dist/features/TokenInput/TokenInputTarget.js +2 -2
- package/dist/features/TokenInput/WalletBalance.js +1 -1
- package/dist/features/TokenInput/hooks/index.js +1 -1
- package/dist/features/TokenInput/hooks/useTokenInputBalance.js +1 -1
- package/dist/features/TokenInput/index.js +1 -1
- package/dist/features/TokensList/TokenItem.js +2 -2
- package/dist/features/TokensList/TokensList.js +1 -1
- package/dist/features/TokensList/index.js +1 -1
- package/dist/features/TokensModal.js +1 -1
- package/dist/features/WalletCompatibilityCheck/WalletCompatibilityModal.js +1 -1
- package/dist/features/WalletCompatibilityCheck/index.js +1 -1
- package/dist/features/index.js +1 -1
- package/dist/hooks/index.js +1 -1
- package/dist/hooks/useAllTokens.js +1 -1
- package/dist/hooks/useChains.js +1 -1
- package/dist/hooks/useCompatibilityCheck.js +1 -1
- package/dist/hooks/useDefaultToken.js +1 -1
- package/dist/hooks/useExternalDepositStatus/index.js +1 -1
- package/dist/hooks/useExternalDepositStatus/usePoaExternalDepositStatus.js +1 -1
- package/dist/hooks/useIntentsBalance.js +1 -1
- package/dist/hooks/useIsCompatibilityCheckRequired.js +1 -1
- package/dist/hooks/useMakeDepositAddress.js +1 -1
- package/dist/hooks/useMakeIntentsTransfer.js +1 -1
- package/dist/hooks/useMakeNEARFtTransferCall.js +1 -1
- package/dist/hooks/useMakeQuote.js +1 -1
- package/dist/hooks/useMakeQuoteTransfer.js +1 -1
- package/dist/hooks/useMakeTransfer.js +1 -1
- package/dist/hooks/useMergedBalance.js +1 -1
- package/dist/hooks/useSwitchChain.js +1 -1
- package/dist/hooks/useTheme.js +1 -1
- package/dist/hooks/useTokenInputPair.js +1 -1
- package/dist/hooks/useTokens.js +1 -1
- package/dist/hooks/useTokensFiltered.js +1 -1
- package/dist/hooks/useTokensIntentsUnique.js +1 -1
- package/dist/index.js +1 -1
- package/dist/machine/effects/index.js +1 -1
- package/dist/machine/effects/useAlchemyBalanceEffect.js +1 -1
- package/dist/machine/effects/useBalancesUpdateEffect.js +1 -1
- package/dist/machine/effects/useMakeQuoteEffect.js +1 -1
- package/dist/machine/effects/useSelectedTokensEffect.js +1 -1
- package/dist/machine/effects/useSetTokenBalanceEffect.js +1 -1
- package/dist/machine/effects/useSetTokenIntentsTargetEffect.js +1 -1
- package/dist/machine/effects/useWalletConnEffect.js +1 -1
- package/dist/machine/events/index.js +1 -1
- package/dist/machine/events/reset.d.ts +1 -0
- package/dist/machine/events/reset.js +2 -2
- package/dist/machine/events/reset.js.map +1 -1
- package/dist/machine/events/tokenSelect.js +1 -1
- package/dist/machine/events/validateInputAndMoveTo.js +1 -1
- package/dist/machine/events/validateInputs.js +1 -1
- package/dist/machine/index.js +1 -1
- package/dist/machine/snap.js +1 -1
- package/dist/machine/subscriptions/checkers/isSendAddressAsConnected.js +1 -1
- package/dist/machine/subscriptions/index.js +1 -1
- package/dist/styles.css +1 -1
- package/dist/theme/ThemeProvider.js +1 -1
- package/dist/types/localisation.d.ts +1 -1
- package/dist/utils/intents/signers/near.js +1 -1
- package/dist/utils/intents/signers/privy.js +1 -1
- package/dist/utils/near/getNearNep141StorageBalance.js +1 -1
- package/dist/widgets/WidgetDeposit/WidgetDepositContent.js +73 -72
- package/dist/widgets/WidgetDeposit/WidgetDepositContent.js.map +1 -1
- package/dist/widgets/WidgetDeposit/WidgetDepositSkeleton.js +1 -1
- package/dist/widgets/WidgetSwap/WidgetSwapContent.js +69 -67
- package/dist/widgets/WidgetSwap/WidgetSwapContent.js.map +1 -1
- package/dist/widgets/WidgetSwap/WidgetSwapSkeleton.js +1 -1
- package/dist/widgets/WidgetWithdraw/WidgetWithdrawContent.js +63 -61
- package/dist/widgets/WidgetWithdraw/WidgetWithdrawContent.js.map +1 -1
- package/dist/widgets/WidgetWithdraw/WidgetWithdrawSkeleton.js +1 -1
- package/package.json +1 -1
- package/src/components/Accordion.tsx +5 -6
- package/src/components/Button.tsx +17 -1
- package/src/components/CopyButton.tsx +12 -2
- package/src/components/Notes.tsx +1 -1
- package/src/features/SuccessScreen/CopyableValue.tsx +13 -0
- package/src/features/SuccessScreen/TokenRow.tsx +26 -0
- package/src/features/SuccessScreen/index.tsx +161 -55
- package/src/features/SuccessScreen/useSummaryItemsCount.ts +33 -0
- package/src/machine/events/reset.ts +6 -3
- package/src/types/localisation.ts +10 -3
- package/src/widgets/WidgetDeposit/WidgetDepositContent.tsx +6 -4
- package/src/widgets/WidgetSwap/WidgetSwapContent.tsx +7 -4
- package/src/widgets/WidgetWithdraw/WidgetWithdrawContent.tsx +7 -4
- package/dist/features/SuccessScreen/CheckIcon.d.ts +0 -1
- package/dist/features/SuccessScreen/CheckIcon.js +0 -7
- package/dist/features/SuccessScreen/CheckIcon.js.map +0 -1
- package/dist/features/SuccessScreen/ExternalAction.d.ts +0 -5
- package/dist/features/SuccessScreen/ExternalAction.js +0 -16
- package/dist/features/SuccessScreen/ExternalAction.js.map +0 -1
- package/dist/features/SuccessScreen/SummaryItem.d.ts +0 -8
- package/dist/features/SuccessScreen/SummaryItem.js +0 -21
- package/dist/features/SuccessScreen/SummaryItem.js.map +0 -1
- package/src/features/SuccessScreen/CheckIcon.tsx +0 -7
- package/src/features/SuccessScreen/ExternalAction.tsx +0 -15
- package/src/features/SuccessScreen/SummaryItem.tsx +0 -28
|
@@ -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":"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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-
|
|
4
|
+
import { y as x } from "../../config-BMvXuF1-.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
|
@@ -29,12 +29,11 @@ export const Accordion = ({
|
|
|
29
29
|
const [isExpanded, setIsExpanded] = useState(expandedByDefault);
|
|
30
30
|
|
|
31
31
|
return (
|
|
32
|
-
<Card
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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 ? (
|
|
@@ -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),
|
|
@@ -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
|
-
|
|
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=
|
|
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
|
);
|
package/src/components/Notes.tsx
CHANGED
|
@@ -28,7 +28,7 @@ const NoteItem = ({
|
|
|
28
28
|
|
|
29
29
|
const NotesList = ({ children, className }: Props) => {
|
|
30
30
|
return (
|
|
31
|
-
<ul className={cn('gap-sw-
|
|
31
|
+
<ul className={cn('gap-sw-xl flex flex-col', className)}>{children}</ul>
|
|
32
32
|
);
|
|
33
33
|
};
|
|
34
34
|
|
|
@@ -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
|
+
);
|
|
@@ -1,79 +1,185 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
ArrowDownward,
|
|
3
|
+
Check,
|
|
4
|
+
OpenInNew,
|
|
5
|
+
} from '@material-symbols-svg/react-rounded/w700';
|
|
2
6
|
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
+
import { TokenRow } from './TokenRow';
|
|
8
|
+
import { CopyableValue } from './CopyableValue';
|
|
9
|
+
import { useSummaryItemsCount } from './useSummaryItemsCount';
|
|
10
|
+
|
|
11
|
+
import { Notes } from '@/components/Notes';
|
|
12
|
+
import { Button } from '@/components/Button';
|
|
7
13
|
import { CloseButton } from '@/components/CloseButton';
|
|
8
|
-
import
|
|
14
|
+
import { Accordion } from '@/components/Accordion';
|
|
9
15
|
|
|
10
|
-
import {
|
|
16
|
+
import { guardStates } from '@/machine/guards';
|
|
17
|
+
import { useUnsafeSnapshot } from '@/machine/snap';
|
|
18
|
+
import { formatUsdAmount } from '@/utils/formatters/formatUsdAmount';
|
|
19
|
+
import { formatTinyNumber } from '@/utils/formatters/formatTinyNumber';
|
|
20
|
+
import { formatBigToHuman } from '@/utils/formatters/formatBigToHuman';
|
|
11
21
|
import { useTypedTranslation } from '@/localisation';
|
|
22
|
+
import { useHandleKeyDown } from '@/hooks';
|
|
23
|
+
import { logger } from '@/logger';
|
|
24
|
+
|
|
25
|
+
import type { TransferResult } from '@/types/transfer';
|
|
26
|
+
|
|
27
|
+
const NOTES_ITEM_HEIGHT = 44;
|
|
12
28
|
|
|
13
29
|
type Msg = { type: 'on_dismiss_success' };
|
|
14
30
|
|
|
15
31
|
type Props = TransferResult & {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
32
|
+
title: string;
|
|
33
|
+
message?: string;
|
|
34
|
+
showTargetToken?: boolean;
|
|
35
|
+
onMsg: (msg: Msg) => void;
|
|
19
36
|
};
|
|
20
37
|
|
|
21
38
|
export const SuccessScreen = ({
|
|
22
|
-
|
|
23
|
-
transactionLink,
|
|
24
|
-
hash: txHash,
|
|
39
|
+
title,
|
|
25
40
|
message,
|
|
41
|
+
showTargetToken = true,
|
|
42
|
+
transactionLink,
|
|
26
43
|
onMsg,
|
|
27
|
-
|
|
44
|
+
...transferResult
|
|
28
45
|
}: Props) => {
|
|
29
|
-
const { ctx } = useUnsafeSnapshot();
|
|
30
46
|
const { t } = useTypedTranslation();
|
|
31
|
-
const
|
|
47
|
+
const { ctx } = useUnsafeSnapshot();
|
|
48
|
+
|
|
49
|
+
const isValidState = guardStates(ctx, ['transfer_success']);
|
|
50
|
+
const handleClose = () => onMsg({ type: 'on_dismiss_success' });
|
|
51
|
+
const summaryItemsCount = useSummaryItemsCount(!!transferResult.intent);
|
|
52
|
+
|
|
53
|
+
useHandleKeyDown('Escape', handleClose);
|
|
32
54
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
55
|
+
if (!isValidState) {
|
|
56
|
+
logger.warn(
|
|
57
|
+
'[WIDGET] Success screen can be rendered only in transfer_success state',
|
|
36
58
|
);
|
|
37
|
-
|
|
38
|
-
|
|
59
|
+
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const sourceAmount = formatBigToHuman(
|
|
64
|
+
ctx.quote?.amountIn ?? ctx.sourceTokenAmount,
|
|
65
|
+
ctx.sourceToken.decimals,
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
const targetAmount = formatBigToHuman(
|
|
69
|
+
ctx.quote?.amountOut ?? ctx.targetTokenAmount,
|
|
70
|
+
ctx.targetToken.decimals,
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
const sourceAmountUsd = ctx.quote?.amountInUsd
|
|
74
|
+
? parseFloat(ctx.quote.amountInUsd)
|
|
75
|
+
: ctx.sourceToken.price * parseFloat(sourceAmount);
|
|
76
|
+
|
|
77
|
+
const targetAmountUsd = ctx.quote?.amountOutUsd
|
|
78
|
+
? parseFloat(ctx.quote.amountOutUsd)
|
|
79
|
+
: ctx.targetToken.price * parseFloat(targetAmount);
|
|
80
|
+
|
|
81
|
+
const targetTokenUnitPrice = targetAmountUsd / parseFloat(targetAmount);
|
|
82
|
+
|
|
83
|
+
const sourceTokenUnitAmount = formatTinyNumber(
|
|
84
|
+
targetTokenUnitPrice / (parseFloat(sourceAmount) / sourceAmountUsd),
|
|
85
|
+
);
|
|
39
86
|
|
|
40
87
|
return (
|
|
41
|
-
<
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
<
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
88
|
+
<div className="flex flex-col gap-sw-2xl w-full">
|
|
89
|
+
<header className="flex items-center gap-sw-lg">
|
|
90
|
+
<div className="flex items-center justify-center p-sw-md bg-sw-status-success rounded-sw-md">
|
|
91
|
+
<Check size={20} className="text-sw-gray-900" />
|
|
92
|
+
</div>
|
|
93
|
+
<span className="text-sw-label-lg text-sw-status-success mr-auto">
|
|
94
|
+
{title}
|
|
95
|
+
</span>
|
|
96
|
+
<CloseButton onClick={handleClose} />
|
|
97
|
+
</header>
|
|
98
|
+
|
|
99
|
+
{!!message && (
|
|
100
|
+
<p className="text-sw-body-md text-sw-gray-200">{message}</p>
|
|
52
101
|
)}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
))}
|
|
60
|
-
</p>
|
|
61
|
-
<Hr className="mt-sw-xl mb-sw-md" />
|
|
62
|
-
<ul className="mt-sw-xl flex flex-col">
|
|
63
|
-
<SummaryItem
|
|
64
|
-
hasCopyAction
|
|
65
|
-
value={txHash}
|
|
66
|
-
externalUrl={transactionLink}
|
|
67
|
-
label={t('transfer.success.hash.label', 'Transaction hash')}
|
|
102
|
+
|
|
103
|
+
<div className="flex flex-col">
|
|
104
|
+
<TokenRow
|
|
105
|
+
token={ctx.sourceToken}
|
|
106
|
+
amount={sourceAmount}
|
|
107
|
+
amountUsd={sourceAmountUsd}
|
|
68
108
|
/>
|
|
69
|
-
{
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
109
|
+
{showTargetToken && (
|
|
110
|
+
<>
|
|
111
|
+
<div className="flex items-center justify-center w-full h-[12px] z-1">
|
|
112
|
+
<div className="flex items-center justify-center p-sw-md bg-sw-gray-950 rounded-sw-md w-fit">
|
|
113
|
+
<ArrowDownward size={18} className="text-sw-gray-200" />
|
|
114
|
+
</div>
|
|
115
|
+
</div>
|
|
116
|
+
<TokenRow
|
|
117
|
+
token={ctx.targetToken}
|
|
118
|
+
amount={targetAmount}
|
|
119
|
+
amountUsd={targetAmountUsd}
|
|
120
|
+
/>
|
|
121
|
+
</>
|
|
75
122
|
)}
|
|
76
|
-
</
|
|
77
|
-
|
|
123
|
+
</div>
|
|
124
|
+
|
|
125
|
+
<Accordion
|
|
126
|
+
expandedByDefault={false}
|
|
127
|
+
expandedHeightPx={summaryItemsCount * NOTES_ITEM_HEIGHT}
|
|
128
|
+
title={t('transfer.success.details.label', 'Transaction details')}>
|
|
129
|
+
<Notes>
|
|
130
|
+
{ctx.sourceToken.symbol !== ctx.targetToken.symbol && (
|
|
131
|
+
<Notes.Item
|
|
132
|
+
label={t('transfer.success.details.rate', 'Rate')}
|
|
133
|
+
value={
|
|
134
|
+
<span
|
|
135
|
+
className="text-sw-gray-50"
|
|
136
|
+
style={{ borderBottomWidth: '2px', borderStyle: 'dotted' }}>
|
|
137
|
+
{`1 ${ctx.targetToken.symbol} ≈ `} {sourceTokenUnitAmount}{' '}
|
|
138
|
+
{`${ctx.sourceToken.symbol}`}
|
|
139
|
+
<span>{` (${formatUsdAmount(targetTokenUnitPrice)})`}</span>
|
|
140
|
+
</span>
|
|
141
|
+
}
|
|
142
|
+
/>
|
|
143
|
+
)}
|
|
144
|
+
{/* send address is missing if target token is on intents */}
|
|
145
|
+
{!!ctx.sendAddress && (
|
|
146
|
+
<Notes.Item
|
|
147
|
+
label={t(
|
|
148
|
+
'transfer.success.details.recipient',
|
|
149
|
+
'Recipient address',
|
|
150
|
+
)}
|
|
151
|
+
value={<CopyableValue value={ctx.sendAddress} />}
|
|
152
|
+
/>
|
|
153
|
+
)}
|
|
154
|
+
{!!transferResult.intent && (
|
|
155
|
+
<Notes.Item
|
|
156
|
+
label={t('transfer.success.details.intent', 'Intent hash')}
|
|
157
|
+
value={<CopyableValue value={transferResult.intent} />}
|
|
158
|
+
/>
|
|
159
|
+
)}
|
|
160
|
+
<Notes.Item
|
|
161
|
+
label={t('transfer.success.details.hash', 'Transaction hash')}
|
|
162
|
+
value={<CopyableValue value={transferResult.hash} />}
|
|
163
|
+
/>
|
|
164
|
+
</Notes>
|
|
165
|
+
</Accordion>
|
|
166
|
+
|
|
167
|
+
<div className="flex flex-col gap-sw-lg">
|
|
168
|
+
<Button
|
|
169
|
+
fluid
|
|
170
|
+
as="a"
|
|
171
|
+
size="lg"
|
|
172
|
+
target="_blank"
|
|
173
|
+
variant="primary"
|
|
174
|
+
iconPosition="tail"
|
|
175
|
+
href={transactionLink}
|
|
176
|
+
icon={OpenInNew}>
|
|
177
|
+
{t('transfer.success.action.viewOnExplorer', 'View in explorer')}
|
|
178
|
+
</Button>
|
|
179
|
+
<Button fluid size="lg" variant="outlined" onClick={handleClose}>
|
|
180
|
+
{t('transfer.success.action.backToSwap', 'Back to swap')}
|
|
181
|
+
</Button>
|
|
182
|
+
</div>
|
|
183
|
+
</div>
|
|
78
184
|
);
|
|
79
185
|
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { useMemo } from 'react';
|
|
2
|
+
|
|
3
|
+
import { guardStates } from '@/machine/guards';
|
|
4
|
+
import { useUnsafeSnapshot } from '@/machine/snap';
|
|
5
|
+
|
|
6
|
+
export const useSummaryItemsCount = (hasIntentHash: boolean) => {
|
|
7
|
+
const { ctx } = useUnsafeSnapshot();
|
|
8
|
+
const isValidState = guardStates(ctx, ['transfer_success']);
|
|
9
|
+
|
|
10
|
+
const summaryItemsCount = useMemo(() => {
|
|
11
|
+
let count = 1;
|
|
12
|
+
|
|
13
|
+
if (!isValidState) {
|
|
14
|
+
return 0;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
if (ctx.sourceToken.symbol !== ctx.targetToken.symbol) {
|
|
18
|
+
count += 1;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
if (ctx.sendAddress) {
|
|
22
|
+
count += 1;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
if (hasIntentHash) {
|
|
26
|
+
count += 1;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return count;
|
|
30
|
+
}, [hasIntentHash, ctx.sendAddress, ctx.sourceToken, ctx.targetToken]);
|
|
31
|
+
|
|
32
|
+
return summaryItemsCount;
|
|
33
|
+
};
|
|
@@ -2,15 +2,13 @@ import type { Machine } from '@/machine';
|
|
|
2
2
|
import type { Context } from '@/machine/context';
|
|
3
3
|
|
|
4
4
|
export type ResetPayload = {
|
|
5
|
+
keepSelectedTokens?: boolean;
|
|
5
6
|
clearWalletAddress: boolean;
|
|
6
7
|
};
|
|
7
8
|
|
|
8
9
|
export const reset = (ctx: Context, payload: ResetPayload, m: Machine) => {
|
|
9
|
-
ctx.sourceToken = undefined;
|
|
10
10
|
ctx.sourceTokenBalance = undefined;
|
|
11
11
|
ctx.sourceTokenAmount = '';
|
|
12
|
-
|
|
13
|
-
ctx.targetToken = undefined;
|
|
14
12
|
ctx.targetTokenAmount = '';
|
|
15
13
|
|
|
16
14
|
ctx.sendAddress = undefined;
|
|
@@ -22,6 +20,11 @@ export const reset = (ctx: Context, payload: ResetPayload, m: Machine) => {
|
|
|
22
20
|
ctx.quoteStatus = 'idle';
|
|
23
21
|
ctx.transferStatus = { status: 'idle' };
|
|
24
22
|
|
|
23
|
+
if (!payload.keepSelectedTokens) {
|
|
24
|
+
ctx.sourceToken = undefined;
|
|
25
|
+
ctx.targetToken = undefined;
|
|
26
|
+
}
|
|
27
|
+
|
|
25
28
|
if (payload.clearWalletAddress) {
|
|
26
29
|
ctx.walletAddress = undefined;
|
|
27
30
|
}
|
|
@@ -14,9 +14,16 @@ export type LocalisationKeys =
|
|
|
14
14
|
| 'wallet.recipient.message.receiveFunds'
|
|
15
15
|
| 'wallet.connected.error.notSupportedChain'
|
|
16
16
|
// transfer
|
|
17
|
-
| 'transfer.success.title'
|
|
18
|
-
| 'transfer.success.
|
|
19
|
-
| 'transfer.success.
|
|
17
|
+
| 'transfer.success.swap.title'
|
|
18
|
+
| 'transfer.success.withdrawal.title'
|
|
19
|
+
| 'transfer.success.deposit.title'
|
|
20
|
+
| 'transfer.success.details.label'
|
|
21
|
+
| 'transfer.success.details.hash'
|
|
22
|
+
| 'transfer.success.details.rate'
|
|
23
|
+
| 'transfer.success.details.intent'
|
|
24
|
+
| 'transfer.success.details.recipient'
|
|
25
|
+
| 'transfer.success.action.viewOnExplorer'
|
|
26
|
+
| 'transfer.success.action.backToSwap'
|
|
20
27
|
// quote
|
|
21
28
|
| 'quote.result.maxSlippage.label'
|
|
22
29
|
| 'quote.result.processingTime.label'
|
|
@@ -121,6 +121,10 @@ export const WidgetDepositContent = ({
|
|
|
121
121
|
});
|
|
122
122
|
}, [ctx.isDepositFromExternalWallet]);
|
|
123
123
|
|
|
124
|
+
const onBackToSwap = () => {
|
|
125
|
+
fireEvent('reset', { clearWalletAddress: false, keepSelectedTokens: true });
|
|
126
|
+
};
|
|
127
|
+
|
|
124
128
|
if (!!isLoading || (tokensStatus !== 'error' && !ctx.sourceToken)) {
|
|
125
129
|
return <WidgetDepositSkeleton />;
|
|
126
130
|
}
|
|
@@ -150,14 +154,12 @@ export const WidgetDepositContent = ({
|
|
|
150
154
|
return (
|
|
151
155
|
<SuccessScreen
|
|
152
156
|
{...transferResult}
|
|
153
|
-
|
|
154
|
-
'Your deposit has been successfully completed,',
|
|
155
|
-
'and the funds are now available in your account.',
|
|
156
|
-
]}
|
|
157
|
+
title={t('transfer.success.deposit.title', 'Deposit successful')}
|
|
157
158
|
onMsg={(msg) => {
|
|
158
159
|
switch (msg.type) {
|
|
159
160
|
case 'on_dismiss_success':
|
|
160
161
|
setTransferResult(undefined);
|
|
162
|
+
onBackToSwap();
|
|
161
163
|
break;
|
|
162
164
|
default:
|
|
163
165
|
notReachable(msg.type);
|
|
@@ -83,6 +83,10 @@ export const WidgetSwapContent = ({
|
|
|
83
83
|
fireEvent('reset', { clearWalletAddress: true });
|
|
84
84
|
}, []);
|
|
85
85
|
|
|
86
|
+
const onBackToSwap = () => {
|
|
87
|
+
fireEvent('reset', { clearWalletAddress: false, keepSelectedTokens: true });
|
|
88
|
+
};
|
|
89
|
+
|
|
86
90
|
useStoreSideEffects({
|
|
87
91
|
debug: isDebug(),
|
|
88
92
|
listenTo: [
|
|
@@ -129,15 +133,14 @@ export const WidgetSwapContent = ({
|
|
|
129
133
|
if (ctx.state === 'transfer_success' && !!transferResult) {
|
|
130
134
|
return (
|
|
131
135
|
<SuccessScreen
|
|
136
|
+
showTargetToken
|
|
137
|
+
title={t('transfer.success.swap.title', 'Swap successful')}
|
|
132
138
|
{...transferResult}
|
|
133
|
-
message={[
|
|
134
|
-
'Your swap has been successfully completed,',
|
|
135
|
-
'and the funds are now available in your account.',
|
|
136
|
-
]}
|
|
137
139
|
onMsg={(msg) => {
|
|
138
140
|
switch (msg.type) {
|
|
139
141
|
case 'on_dismiss_success':
|
|
140
142
|
setTransferResult(undefined);
|
|
143
|
+
onBackToSwap();
|
|
141
144
|
break;
|
|
142
145
|
default:
|
|
143
146
|
notReachable(msg.type);
|