Skip to content

Commit

Permalink
Merge pull request #196 from tonkeeper/fix/correctly-set-favorite-rec…
Browse files Browse the repository at this point in the history
…ipient

fix: correctly set favorite recipient
  • Loading branch information
olyaMay authored Jan 24, 2023
2 parents 5ff02dc + 53f8e7f commit ed11bc8
Show file tree
Hide file tree
Showing 2 changed files with 78 additions and 53 deletions.
125 changes: 73 additions & 52 deletions src/core/Send/steps/AddressStep/AddressStep.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +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';

const TonWeb = require('tonweb');

let dnsAbortController: null | AbortController = null;
const AddressStepComponent: FC<AddressStepProps> = (props) => {
const {
recipient,
Expand Down Expand Up @@ -74,12 +74,15 @@ const AddressStepComponent: FC<AddressStepProps> = (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);

if (resolvedDomain?.wallet?.address) {
const resolvedDomain = await Tonapi.resolveDns(domain, signal);

if (resolvedDomain === 'aborted') {
return 'aborted';
}
else if (resolvedDomain?.wallet?.address) {
return new TonWeb.Address(resolvedDomain.wallet.address).toString(
true,
true,
Expand All @@ -99,71 +102,89 @@ const AddressStepComponent: FC<AddressStepProps> = (props) => {

const updateRecipient = useCallback(
async (value: string, accountInfo?: Partial<AccountRepr>) => {
const link = parseTonLink(value);
try {
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 });
if (dnsAbortController) {
dnsAbortController.abort();
dnsAbortController = 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.text) {
setComment(link.query.text as string);
}

if (link.query.bin) {
return false;
if (link.query.bin) {
return false;
}

value = link.address;
}

value = link.address;
}
const favorite = favoriteAddresses.find(
(item) =>
item.name?.toLowerCase() === value.toLowerCase() ||
item.address?.toLowerCase() === value.toLowerCase(),
);

const favorite = favoriteAddresses.find(
(item) =>
item.name?.toLowerCase() === value.toLowerCase() ||
item.address?.toLowerCase() === value.toLowerCase(),
);
if (favorite) {
setRecipient({
address: favorite.address,
name: favorite.name,
domain: favorite.domain,
});

if (favorite) {
setRecipient({
address: favorite.address,
name: favorite.name,
domain: favorite.domain,
});
return true;
}

return true;
}
const domain = value.toLowerCase();

const domain = value.toLowerCase();
if (!favorite && !TonWeb.Address.isValid(domain) && domain.includes('.')) {
setDnsLoading(true);
const abortController = new AbortController();
dnsAbortController = abortController;

if (!TonWeb.Address.isValid(domain) && domain.includes('.')) {
setDnsLoading(true);
const resolvedDomain = await getAddressByDomain(domain, abortController.signal);

if (resolvedDomain === 'aborted') {
setDnsLoading(false);
dnsAbortController = null;
return true;
}
else if (resolvedDomain) {
setRecipient({ address: resolvedDomain, domain });
setDnsLoading(false);
dnsAbortController = null;
return true;
} else {
setDnsLoading(false);
dnsAbortController = null;
}
}

const resolvedDomain = await getAddressByDomain(domain);
if (isValidAddress(value)) {
if (accountInfo) {
setRecipientAccountInfo(accountInfo as AccountRepr);
}

if (resolvedDomain) {
setRecipient({ address: resolvedDomain, domain });
setDnsLoading(false);
setRecipient({ address: value });

return true;
} else {
setDnsLoading(false);
}
}

if (isValidAddress(value)) {
if (accountInfo) {
setRecipientAccountInfo(accountInfo as AccountRepr);
}

setRecipient({ address: value });
setRecipient(null);

return true;
return false;
} catch (e) {
return false;
}

setRecipient(null);

return false;
},
[
decimals,
Expand All @@ -173,6 +194,7 @@ const AddressStepComponent: FC<AddressStepProps> = (props) => {
setComment,
setRecipient,
setRecipientAccountInfo,
dnsAbortController,
],
);

Expand All @@ -181,7 +203,6 @@ const AddressStepComponent: FC<AddressStepProps> = (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();
Expand Down
6 changes: 5 additions & 1 deletion src/libs/Tonapi/Tonapi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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`, {
Expand All @@ -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;
}
}
Expand Down

0 comments on commit ed11bc8

Please sign in to comment.