@daimo/pay
Version:
Seamless crypto payments. Onboard users from any chain, any coin into your app with one click.
110 lines (107 loc) • 4.76 kB
JavaScript
import { jsx } from 'react/jsx-runtime';
import { getChainName } from '@daimo/pay-common';
import TokenChainLogo from '../components/Common/TokenChainLogo/index.js';
import { ROUTES } from '../constants/routes.js';
import { formatUsd, roundTokenAmount } from '../utils/format.js';
import { usePayContext } from './usePayContext.js';
/// and Solana tokens. See OptionsList.
function useTokenOptions(mode) {
const { setRoute, paymentState } = usePayContext();
const { isDepositFlow, walletPaymentOptions, solanaPaymentOptions, setSelectedTokenOption, setSelectedSolanaTokenOption, } = paymentState;
let optionsList = [];
let isLoading = false;
if (["evm", "all"].includes(mode)) {
optionsList.push(...getEvmTokenOptions(walletPaymentOptions.options ?? [], isDepositFlow, setSelectedTokenOption, setRoute));
isLoading ||= walletPaymentOptions.isLoading;
}
if (["solana", "all"].includes(mode)) {
optionsList.push(...getSolanaTokenOptions(solanaPaymentOptions.options ?? [], isDepositFlow, setSelectedSolanaTokenOption, setRoute));
isLoading ||= solanaPaymentOptions.isLoading;
}
optionsList.sort((a, b) => {
const dDisabled = (a.disabled ? 1 : 0) - (b.disabled ? 1 : 0);
if (dDisabled !== 0)
return dDisabled;
const dSort = (b.sortValue ?? 0) - (a.sortValue ?? 0);
return dSort;
});
return { optionsList, isLoading };
}
function getEvmTokenOptions(options, isDepositFlow, setSelectedTokenOption, setRoute) {
return options.map((option) => {
const chainName = getChainName(option.balance.token.chainId);
const titlePrice = isDepositFlow
? formatUsd(option.balance.usd)
: roundTokenAmount(option.required.amount, option.required.token);
const title = `${titlePrice} ${option.balance.token.symbol} on ${chainName}`;
const balanceStr = `${roundTokenAmount(option.balance.amount, option.balance.token)} ${option.balance.token.symbol}`;
const subtitle = option.disabledReason ??
`${isDepositFlow ? "" : "Balance: "}${balanceStr}`;
const disabled = option.disabledReason != null;
return {
id: getDaimoTokenKey(option.balance.token),
sortValue: option.balance.usd,
title,
subtitle,
icons: [
jsx(TokenChainLogo, { token: option.balance.token }, getDaimoTokenKey(option.balance.token)),
],
onClick: () => {
setSelectedTokenOption(option);
const meta = {
event: "click-token",
tokenSymbol: option.balance.token.symbol,
chainId: option.balance.token.chainId,
};
if (isDepositFlow) {
setRoute(ROUTES.SELECT_AMOUNT, meta);
}
else {
setRoute(ROUTES.PAY_WITH_TOKEN, meta);
}
},
disabled,
};
});
}
function getSolanaTokenOptions(options, isDepositFlow, setSelectedSolanaTokenOption, setRoute) {
return options.map((option) => {
const titlePrice = isDepositFlow
? formatUsd(option.balance.usd)
: roundTokenAmount(option.required.amount, option.required.token);
const title = `${titlePrice} ${option.balance.token.symbol} on Solana`;
const balanceStr = `${roundTokenAmount(option.balance.amount, option.balance.token)} ${option.balance.token.symbol}`;
const subtitle = option.disabledReason ??
`${isDepositFlow ? "" : "Balance: "}${balanceStr}`;
const disabled = option.disabledReason != null;
return {
id: getDaimoTokenKey(option.balance.token),
sortValue: option.balance.usd,
title,
subtitle,
icons: [
jsx(TokenChainLogo, { token: option.balance.token }, getDaimoTokenKey(option.balance.token)),
],
onClick: () => {
setSelectedSolanaTokenOption(option);
const meta = {
event: "click-solana-token",
tokenSymbol: option.balance.token.symbol,
chainId: option.balance.token.chainId,
};
if (isDepositFlow) {
setRoute(ROUTES.SOLANA_SELECT_AMOUNT, meta);
}
else {
setRoute(ROUTES.SOLANA_PAY_WITH_TOKEN, meta);
}
},
disabled,
};
});
}
function getDaimoTokenKey(token) {
return `${token.chainId}-${token.token}`;
}
export { useTokenOptions };
//# sourceMappingURL=useTokenOptions.js.map