@daimo/pay
Version:
Seamless crypto payments. Onboard users from any chain, any coin into your app with one click.
153 lines (150 loc) • 5.4 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 { flattenChildren } from '../utils/index.js';
import { formatUsd, roundTokenAmount } from '../utils/format.js';
import { useDaimoPay } from './useDaimoPay.js';
import useLocales from './useLocales.js';
import { usePayContext } from './usePayContext.js';
function useTokenOptions(mode) {
const { setRoute, paymentState } = usePayContext();
const {
isDepositFlow,
walletPaymentOptions,
solanaPaymentOptions,
setSelectedTokenOption,
setSelectedSolanaTokenOption
} = paymentState;
const locales = useLocales();
const onString = flattenChildren(locales.on).join("");
const pay = useDaimoPay();
const isPassthrough = !!pay.order?.metadata.payer?.passthroughTokens?.length;
const nonPassthroughToken = isPassthrough ? pay.order?.destFinalCallTokenAmount.token : void 0;
let optionsList = [];
let isLoading = false;
if (["evm", "all"].includes(mode)) {
optionsList.push(
...getEvmTokenOptions(
walletPaymentOptions.options ?? [],
isDepositFlow,
setSelectedTokenOption,
setRoute,
onString,
nonPassthroughToken
)
);
isLoading ||= walletPaymentOptions.isLoading;
}
if (["solana", "all"].includes(mode)) {
optionsList.push(
...getSolanaTokenOptions(
solanaPaymentOptions.options ?? [],
isDepositFlow,
setSelectedSolanaTokenOption,
setRoute,
onString
)
);
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, onString, nonPassthroughToken) {
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} ${onString} ${chainName}`;
const balanceStr = `${roundTokenAmount(option.balance.amount, option.balance.token)} ${option.balance.token.symbol}`;
let subtitle = option.disabledReason ?? `${isDepositFlow ? "" : "Balance: "}${balanceStr}`;
const disabled = option.disabledReason != null;
if (nonPassthroughToken != null) {
const defaultSym = nonPassthroughToken.symbol;
const optSym = option.balance.token.symbol;
if (option.passthroughAddress == null && optSym !== defaultSym) {
subtitle = `Convert to ${defaultSym}`;
} else {
subtitle = `Deposit ${optSym}`;
}
}
const sortValue = option.balance.usd + (option.passthroughAddress == null ? 0 : 1e9);
return {
id: getDaimoTokenKey(option.balance.token),
sortValue,
title,
subtitle,
icons: [
/* @__PURE__ */ 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, onString) {
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} ${onString} 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: [
/* @__PURE__ */ 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