From cffde05dead946d66f4613d4e8698f5e7a4c4f31 Mon Sep 17 00:00:00 2001 From: Maxim Voloshinskii Date: Mon, 26 Dec 2022 15:23:36 +0900 Subject: [PATCH 1/3] fix: correctly set favorite recipient --- src/core/Send/steps/AddressStep/AddressStep.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/Send/steps/AddressStep/AddressStep.tsx b/src/core/Send/steps/AddressStep/AddressStep.tsx index eaeb9d82c..ade4cb87a 100644 --- a/src/core/Send/steps/AddressStep/AddressStep.tsx +++ b/src/core/Send/steps/AddressStep/AddressStep.tsx @@ -136,7 +136,7 @@ const AddressStepComponent: FC = (props) => { const domain = value.toLowerCase(); - if (!TonWeb.Address.isValid(domain) && domain.includes('.')) { + if (!favorite && !TonWeb.Address.isValid(domain) && domain.includes('.')) { setDnsLoading(true); const resolvedDomain = await getAddressByDomain(domain); From f812f9d58b85457c0bdef04e4fcc5cb15595eee0 Mon Sep 17 00:00:00 2001 From: Maxim Voloshinskii Date: Fri, 20 Jan 2023 19:50:02 +0900 Subject: [PATCH 2/3] fix: add abort signal to address resolving --- .../Send/steps/AddressStep/AddressStep.tsx | 124 +++++++++++------- src/libs/Tonapi/Tonapi.ts | 6 +- 2 files changed, 79 insertions(+), 51 deletions(-) diff --git a/src/core/Send/steps/AddressStep/AddressStep.tsx b/src/core/Send/steps/AddressStep/AddressStep.tsx index ade4cb87a..f86f1a4e8 100644 --- a/src/core/Send/steps/AddressStep/AddressStep.tsx +++ b/src/core/Send/steps/AddressStep/AddressStep.tsx @@ -28,6 +28,7 @@ import { AddressStepProps } from './AddressStep.interface'; import { getServerConfig } from '$shared/constants'; import { AccountRepr } from 'tonapi-sdk-js'; import { Tonapi } from '$libs/Tonapi'; +import { reject } from 'lodash'; const TonWeb = require('tonweb'); @@ -49,6 +50,7 @@ const AddressStepComponent: FC = (props) => { const t = useTranslator(); const { keyboardHeightStyle } = useReanimatedKeyboardHeight(); + const [dnsAbortController, setDnsAbortController] = useState(null); const { indexedFavoriteAddresses, favoriteAddresses, suggestedAddresses } = useSuggestedAddresses(); @@ -74,12 +76,15 @@ const AddressStepComponent: FC = (props) => { const getAddressByDomain = useMemo( () => - asyncDebounce(async (value: string) => { + asyncDebounce(async (value: string, signal: AbortSignal) => { try { const domain = value.toLowerCase(); - const resolvedDomain = await Tonapi.resolveDns(domain); + const resolvedDomain = await Tonapi.resolveDns(domain, signal); - if (resolvedDomain?.wallet?.address) { + if (resolvedDomain === 'aborted') { + return 'aborted'; + } + else if (resolvedDomain?.wallet?.address) { return new TonWeb.Address(resolvedDomain.wallet.address).toString( true, true, @@ -99,71 +104,89 @@ const AddressStepComponent: FC = (props) => { const updateRecipient = useCallback( async (value: string, accountInfo?: Partial) => { - const link = parseTonLink(value); - - if (link.match && link.operation === 'transfer' && isValidAddress(link.address)) { - if (link.query.amount && !Number.isNaN(Number(link.query.amount))) { - const parsedAmount = Ton.fromNano(new TonWeb.utils.BN(link.query.amount)); - setAmount({ value: formatInputAmount(parsedAmount, decimals), all: false }); + try { + const link = parseTonLink(value); + + if (dnsAbortController) { + dnsAbortController.abort(); + setDnsAbortController(null); + setDnsLoading(false); } - if (link.query.text) { - setComment(link.query.text as string); - } + if (link.match && link.operation === 'transfer' && isValidAddress(link.address)) { + if (link.query.amount && !Number.isNaN(Number(link.query.amount))) { + const parsedAmount = Ton.fromNano(new TonWeb.utils.BN(link.query.amount)); + setAmount({ value: formatInputAmount(parsedAmount, decimals), all: false }); + } - if (link.query.bin) { - return false; - } + if (link.query.text) { + setComment(link.query.text as string); + } - value = link.address; - } + if (link.query.bin) { + return false; + } - const favorite = favoriteAddresses.find( - (item) => - item.name?.toLowerCase() === value.toLowerCase() || - item.address?.toLowerCase() === value.toLowerCase(), - ); + value = link.address; + } - if (favorite) { - setRecipient({ - address: favorite.address, - name: favorite.name, - domain: favorite.domain, - }); + const favorite = favoriteAddresses.find( + (item) => + item.name?.toLowerCase() === value.toLowerCase() || + item.address?.toLowerCase() === value.toLowerCase(), + ); - return true; - } + if (favorite) { + setRecipient({ + address: favorite.address, + name: favorite.name, + domain: favorite.domain, + }); - const domain = value.toLowerCase(); + return true; + } - if (!favorite && !TonWeb.Address.isValid(domain) && domain.includes('.')) { - setDnsLoading(true); + const domain = value.toLowerCase(); - const resolvedDomain = await getAddressByDomain(domain); + if (!favorite && !TonWeb.Address.isValid(domain) && domain.includes('.')) { + setDnsLoading(true); + const dnsAbortController = new AbortController(); + setDnsAbortController(dnsAbortController); - if (resolvedDomain) { - setRecipient({ address: resolvedDomain, domain }); - setDnsLoading(false); + const resolvedDomain = await getAddressByDomain(domain, dnsAbortController.signal); - return true; - } else { - setDnsLoading(false); + if (resolvedDomain === 'aborted') { + setDnsLoading(false); + setDnsAbortController(null); + return true; + } + else if (resolvedDomain) { + setRecipient({ address: resolvedDomain, domain }); + setDnsLoading(false); + setDnsAbortController(null); + return true; + } else { + setDnsLoading(false); + setDnsAbortController(null); + } } - } - if (isValidAddress(value)) { - if (accountInfo) { - setRecipientAccountInfo(accountInfo as AccountRepr); - } + if (isValidAddress(value)) { + if (accountInfo) { + setRecipientAccountInfo(accountInfo as AccountRepr); + } - setRecipient({ address: value }); + setRecipient({ address: value }); - return true; - } + return true; + } - setRecipient(null); + setRecipient(null); - return false; + return false; + } catch (e) { + return false; + } }, [ decimals, @@ -173,6 +196,7 @@ const AddressStepComponent: FC = (props) => { setComment, setRecipient, setRecipientAccountInfo, + dnsAbortController, ], ); diff --git a/src/libs/Tonapi/Tonapi.ts b/src/libs/Tonapi/Tonapi.ts index c9c8b3b05..95652c625 100644 --- a/src/libs/Tonapi/Tonapi.ts +++ b/src/libs/Tonapi/Tonapi.ts @@ -63,7 +63,7 @@ type Balances = { version: string; }; -async function resolveDns(domain: string) { +async function resolveDns(domain: string, signal?: AbortSignal) { try { const endpoint = getServerConfig('tonapiIOEndpoint'); const response: any = await axios.get(`${endpoint}/v1/dns/resolve`, { @@ -73,9 +73,13 @@ async function resolveDns(domain: string) { params: { name: domain, }, + signal, }); return response.data; } catch (e) { + if (axios.isCancel(e)) { + return 'aborted'; + } return false; } } From 53f8e7fb0aa91ad12dae36a1109b1f9979a53be9 Mon Sep 17 00:00:00 2001 From: Maxim Voloshinskii Date: Fri, 20 Jan 2023 20:28:19 +0900 Subject: [PATCH 3/3] fix signal --- .../Send/steps/AddressStep/AddressStep.tsx | 25 ++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/src/core/Send/steps/AddressStep/AddressStep.tsx b/src/core/Send/steps/AddressStep/AddressStep.tsx index f86f1a4e8..8a2b10b02 100644 --- a/src/core/Send/steps/AddressStep/AddressStep.tsx +++ b/src/core/Send/steps/AddressStep/AddressStep.tsx @@ -25,13 +25,12 @@ import { WordHintsPopupRef, } from '$shared/components/ImportWalletForm/WordHintsPopup'; import { AddressStepProps } from './AddressStep.interface'; -import { getServerConfig } from '$shared/constants'; import { AccountRepr } from 'tonapi-sdk-js'; import { Tonapi } from '$libs/Tonapi'; -import { reject } from 'lodash'; const TonWeb = require('tonweb'); +let dnsAbortController: null | AbortController = null; const AddressStepComponent: FC = (props) => { const { recipient, @@ -50,7 +49,6 @@ const AddressStepComponent: FC = (props) => { const t = useTranslator(); const { keyboardHeightStyle } = useReanimatedKeyboardHeight(); - const [dnsAbortController, setDnsAbortController] = useState(null); const { indexedFavoriteAddresses, favoriteAddresses, suggestedAddresses } = useSuggestedAddresses(); @@ -80,7 +78,7 @@ const AddressStepComponent: FC = (props) => { try { const domain = value.toLowerCase(); const resolvedDomain = await Tonapi.resolveDns(domain, signal); - + if (resolvedDomain === 'aborted') { return 'aborted'; } @@ -106,10 +104,10 @@ const AddressStepComponent: FC = (props) => { async (value: string, accountInfo?: Partial) => { try { const link = parseTonLink(value); - + if (dnsAbortController) { dnsAbortController.abort(); - setDnsAbortController(null); + dnsAbortController = null; setDnsLoading(false); } @@ -150,24 +148,24 @@ const AddressStepComponent: FC = (props) => { if (!favorite && !TonWeb.Address.isValid(domain) && domain.includes('.')) { setDnsLoading(true); - const dnsAbortController = new AbortController(); - setDnsAbortController(dnsAbortController); - - const resolvedDomain = await getAddressByDomain(domain, dnsAbortController.signal); + const abortController = new AbortController(); + dnsAbortController = abortController; + const resolvedDomain = await getAddressByDomain(domain, abortController.signal); + if (resolvedDomain === 'aborted') { setDnsLoading(false); - setDnsAbortController(null); + dnsAbortController = null; return true; } else if (resolvedDomain) { setRecipient({ address: resolvedDomain, domain }); setDnsLoading(false); - setDnsAbortController(null); + dnsAbortController = null; return true; } else { setDnsLoading(false); - setDnsAbortController(null); + dnsAbortController = null; } } @@ -205,7 +203,6 @@ const AddressStepComponent: FC = (props) => { const isFavorite = suggest.type === SuggestedAddressType.FAVORITE; const value = isFavorite ? suggest.name! : suggest.address; const accountInfo = !isFavorite ? { name: suggest.name } : undefined; - updateRecipient(value, accountInfo); onContinue();