diff --git a/src/api/trust_relationships.js b/src/api/trust_relationships.js index 2e077ad..3769783 100644 --- a/src/api/trust_relationships.js +++ b/src/api/trust_relationships.js @@ -133,8 +133,8 @@ export const getTrustedWallets = async (token) => { .get(`/wallets/${wallet.id}/trust_relationships?exclude_managed=true`); const trustedWallets = response.data.trust_relationships.map(relationship => ({ - id: relationship.target_wallet_id, - name: relationship.target_wallet, + id: relationship.actor_wallet_id, + name: relationship.actor_wallet, tokensInWallet: 0, })); diff --git a/src/pages/SendTokens/SendTokens.js b/src/pages/SendTokens/SendTokens.js index 47a06f3..4e539a1 100644 --- a/src/pages/SendTokens/SendTokens.js +++ b/src/pages/SendTokens/SendTokens.js @@ -20,7 +20,7 @@ import { handleCreateWallet } from './helpers/walletHandlers'; import { handleSendToUntrustedWallets } from './helpers/sendTokenHandlers'; import apiClient from '../../utils/apiClient'; import { getTrustedWallets } from '../../api/trust_relationships'; -import { getPendingTransfers } from '../../api/wallets'; +import { getPendingTransfers, getWalletById } from '../../api/wallets'; @@ -41,6 +41,10 @@ const SendTokens = () => { const handleTabChange = (event, newValue) => { setTabValue(newValue); + setSenderWalletName(null); + setSenderWalletTokens(null); + setSenderWalletId(null); + setPendingTransfers(0); }; useEffect(() => { @@ -53,7 +57,10 @@ const SendTokens = () => { try { setIsLoading(true); const wallets = await getTrustedWallets(authContext.token); - setTrustedWallets(wallets); + const uniqueWallets = wallets.filter((wallet, index, self) => + index === self.findIndex((w) => w.id === wallet.id) + ); + setTrustedWallets(uniqueWallets); } catch (error) { console.error(error); setErrorMessage('An error occurred while fetching trusted wallets.'); @@ -72,6 +79,21 @@ const SendTokens = () => { } }; + const refreshWalletData = async (walletId) => { + try { + const walletData = await getWalletById(authContext.token, walletId); + const pendingAmount = await fetchPendingTransfers(walletId); + + setSenderWalletTokens(walletData.tokensInWallet); + setPendingTransfers(pendingAmount); + + return walletData; + } catch (error) { + console.error('Error refreshing wallet data:', error); + setErrorMessage('An error occurred while refreshing wallet data.'); + } + }; + const handleWalletSelection = async (wallet) => { if (!wallet) { setSenderWalletName(null); @@ -133,18 +155,14 @@ const SendTokens = () => { receiver_wallet: data.receiverWallet, claim: false, }) - .then((response) => { + .then(async (response) => { console.log( 'Tokens transfer completed. Response: ' + JSON.stringify(response) ); - // update tokens amount: total and sender's wallet token - // TODO: uncomment when API is ready: is should have a totalTokens value - // getTotalTokensAmount(); - setSenderWalletTokens((prev) => prev - data.tokensAmount); - + // Refresh wallet data from backend to get accurate token information if (senderWalletId) { - fetchPendingTransfers(senderWalletId).then(setPendingTransfers); + await refreshWalletData(senderWalletId); } setErrorMessage(''); @@ -176,7 +194,9 @@ const SendTokens = () => { setSenderWalletTokens, setCreatedWalletName, setPendingTransfers, - fetchPendingTransfers + fetchPendingTransfers, + refreshWalletData, + senderWalletId }; return ( @@ -231,12 +251,14 @@ const SendTokens = () => { walletType="managed" availableTokens={(senderWalletTokens || 0) - pendingTransfers} /> - + {senderWalletName && ( + + )} @@ -249,12 +271,14 @@ const SendTokens = () => { trustedWallets={trustedWallets} availableTokens={(senderWalletTokens || 0) - pendingTransfers} /> - + {senderWalletName && ( + + )} @@ -265,12 +289,14 @@ const SendTokens = () => { onSenderWalletSelected={handleWalletSelection} availableTokens={(senderWalletTokens || 0) - pendingTransfers} /> - + {senderWalletName && ( + + )} diff --git a/src/pages/SendTokens/SendTokensForm/SelectWallet.js b/src/pages/SendTokens/SendTokensForm/SelectWallet.js index 6fcbf03..1dbd94c 100644 --- a/src/pages/SendTokens/SendTokensForm/SelectWallet.js +++ b/src/pages/SendTokens/SendTokensForm/SelectWallet.js @@ -34,12 +34,12 @@ function SelectWallet({ wallet.name .toLowerCase() .includes(walletSearchString.toLocaleLowerCase()) - ) - .map((wallet) => wallet.name); + ); - wallets.sort(); - setWalletsFullLoadedData(trustedWallets); - setWalletsLoadedData(wallets); + const walletNames = wallets.map(wallet => wallet.name); + walletNames.sort(); + setWalletsFullLoadedData(wallets); + setWalletsLoadedData(walletNames); return; } @@ -74,7 +74,7 @@ function SelectWallet({ }; getWalletsData(); - }, [walletSearchString, trustedWallets, walletType]); + }, [walletSearchString, walletType]); useEffect(() => { // If createdWalletName is not null, get wallets again by createdWalletName and set it as selected value @@ -145,26 +145,6 @@ function SelectWallet({ setWalletsLoadedData(dataToShow); }; - const handleWalletRenderOption = (props, option) => { - if (!option) return; - - if (option === filterLoadMore) { - return ( -
  • - -
  • - ); - } - - return
  • {option}
  • ; - }; - const handleLoadMoreWallets = async (event) => { event.stopPropagation(); setWalletPage(walletPage + 1); @@ -182,14 +162,17 @@ function SelectWallet({ htmlFor="wallet" id="wallet" sx={{ maxWidth: '30rem', minWidth: '15rem' }} - options={[...walletsLoadedData]} - value={wallet} - getOptionLabel={(wallet) => { - if (wallet === filterLoadMore) { + options={walletType === 'trusted' ? trustedWallets : [...walletsLoadedData]} + value={wallet ? (walletType === 'trusted' ? trustedWallets.find(w => w.name === wallet) : wallet) : null} + getOptionLabel={(option) => { + if (!option) return ''; + if (option === filterLoadMore) { return walletSearchString; } - - return wallet; + if (walletType === 'trusted') { + return option?.name || ''; + } + return option || ''; }} loading={walletsLoadedData.length === 1} loadingText={'Loading..'} @@ -197,11 +180,14 @@ function SelectWallet({ // event is triggered by onInputChange if (newVal === filterLoadMore) return; - const walletData = walletsFullLoadedData.find( - (wallet) => wallet.name === newVal - ); - - onChangeWallet(walletData); + if (walletType === 'trusted') { + onChangeWallet(newVal); // newVal is already the wallet object + } else { + const walletData = walletsFullLoadedData.find( + (wallet) => wallet.name === newVal + ); + onChangeWallet(walletData); + } }} onInputChange={(event, newVal) => { // Do not select 'LOAD_MORE' as an autocomplete value @@ -221,7 +207,22 @@ function SelectWallet({ /> ); }} - renderOption={handleWalletRenderOption} + renderOption={(props, option) => { + if (option === filterLoadMore) { + return ( +
  • + +
  • + ); + } + return
  • {walletType === 'trusted' ? option.name : option}
  • ; + }} /> ); diff --git a/src/pages/SendTokens/TokenInfoBlock/TokenInfoBlock.js b/src/pages/SendTokens/TokenInfoBlock/TokenInfoBlock.js index 3344d80..22f86c1 100644 --- a/src/pages/SendTokens/TokenInfoBlock/TokenInfoBlock.js +++ b/src/pages/SendTokens/TokenInfoBlock/TokenInfoBlock.js @@ -45,7 +45,7 @@ const TokenInfoBlock = ({ {inWallet?.toLocaleString() || '0'} - In Wallet + Tokens In Wallet @@ -58,7 +58,7 @@ const TokenInfoBlock = ({ - Pending Transfer + Tokens Pending Transfer @@ -69,7 +69,7 @@ const TokenInfoBlock = ({ {calculatedAvailable?.toLocaleString() || '0'} - Available + Tokens Available diff --git a/src/pages/SendTokens/helpers/sendTokenHandlers.js b/src/pages/SendTokens/helpers/sendTokenHandlers.js index e5eb178..ebc1c2a 100644 --- a/src/pages/SendTokens/helpers/sendTokenHandlers.js +++ b/src/pages/SendTokens/helpers/sendTokenHandlers.js @@ -3,7 +3,7 @@ import apiClient from "../../../utils/apiClient"; export const handleSendTokenForm = async (data, authContext, callbacks) => { - const { setIsLoading, setErrorMessage, setSuccessMessage, setSenderWalletTokens } = callbacks; + const { setIsLoading, setErrorMessage, setSuccessMessage, setSenderWalletTokens, refreshWalletData, senderWalletId } = callbacks; setIsLoading(true); @@ -21,7 +21,12 @@ export const handleSendTokenForm = async (data, authContext, callbacks) => { 'Tokens transfer completed. Response: ' + JSON.stringify(response) ); - setSenderWalletTokens((prev) => prev - data.tokensAmount); + if (senderWalletId && refreshWalletData) { + await refreshWalletData(senderWalletId); + } else { + setSenderWalletTokens((prev) => prev - data.tokensAmount); + } + setErrorMessage(''); setSuccessMessage( `${data.tokensAmount} tokens were successfully sent from '${data.senderWallet}' to '${data.receiverWallet}' wallet. Status of the transfer: '${response.data.state}'` @@ -41,7 +46,7 @@ export const handleSendTokenForm = async (data, authContext, callbacks) => { }; export const handleSendToUntrustedWallets = async (data, authContext, callbacks) => { - const { setIsLoading, setErrorMessage, setSuccessMessage, setSenderWalletTokens } = callbacks; + const { setIsLoading, setErrorMessage, setSuccessMessage, setSenderWalletTokens, refreshWalletData, senderWalletId } = callbacks; setIsLoading(true); @@ -59,7 +64,12 @@ export const handleSendToUntrustedWallets = async (data, authContext, callbacks) 'Tokens transfer to untrusted wallet completed. Response: ' + JSON.stringify(response) ); - setSenderWalletTokens((prev) => prev - data.tokensAmount); + if (senderWalletId && refreshWalletData) { + await refreshWalletData(senderWalletId); + } else { + setSenderWalletTokens((prev) => prev - data.tokensAmount); + } + setErrorMessage(''); setSuccessMessage( `${data.tokensAmount} tokens were successfully sent to untrusted wallet '${data.receiverWallet}'. ` +