diff --git a/src/i18n/locales/en.json b/src/i18n/locales/en.json index ba731d3..caa3acb 100644 --- a/src/i18n/locales/en.json +++ b/src/i18n/locales/en.json @@ -317,6 +317,11 @@ "topup.close": "Close", "topup.selectChain": "Please select a blockchain network", "topup.selectToken": "Please select a token", + "topup.cryptoSelectionHint": "Choose the blockchain and token first, then click the button below to generate a payment address.", + "topup.cryptoStepChain": "1. Select network", + "topup.cryptoStepToken": "2. Select token", + "topup.cryptoSelectedSummary": "Current payment method", + "topup.generateCryptoAddress": "3. Generate {{method}} payment address", "topup.token": "Token", "topup.payWith": "Pay with", "topup.payNow": "Pay", diff --git a/src/i18n/locales/zh.json b/src/i18n/locales/zh.json index aada911..4768b01 100644 --- a/src/i18n/locales/zh.json +++ b/src/i18n/locales/zh.json @@ -317,6 +317,11 @@ "topup.close": "关闭", "topup.selectChain": "请选择区块链网络", "topup.selectToken": "请选择代币", + "topup.cryptoSelectionHint": "先选择区块链网络和代币,再点击下方按钮生成支付地址。", + "topup.cryptoStepChain": "1. 选择网络", + "topup.cryptoStepToken": "2. 选择代币", + "topup.cryptoSelectedSummary": "当前支付方式", + "topup.generateCryptoAddress": "3. 生成 {{method}} 支付地址", "topup.token": "代币", "topup.payWith": "使用", "topup.payNow": "支付", diff --git a/src/pages/Topup.jsx b/src/pages/Topup.jsx index f736a2a..556d2fb 100644 --- a/src/pages/Topup.jsx +++ b/src/pages/Topup.jsx @@ -3,10 +3,10 @@ import { useTranslation } from 'react-i18next'; import { useAuth } from '../context/AuthContext'; import { useSite } from '../context/SiteContext'; import { - getUserUsage, redeemCode, getTopupInfo, calculateAmount, + getUserUsage, redeemCode, getTopupInfo, createEpayOrder, createStripeOrder, createCreemOrder, createCryptoOrder, getCryptoOrderStatus, getTopupHistory, - Q, quotaToDollar, + Q, } from '../api'; import { useCurrency } from '../context/SiteContext'; import CountUp from '../components/bits/CountUp'; @@ -30,8 +30,6 @@ export default function Topup() { const [amount, setAmount] = useState(''); const [displayAmount, setDisplayAmount] = useState(''); const [selectedPreset, setSelectedPreset] = useState(null); - const [payAmount, setPayAmount] = useState(null); - const [amountLoading, setAmountLoading] = useState(false); const [paymentLoading, setPaymentLoading] = useState(false); const [payingMethod, setPayingMethod] = useState(''); @@ -112,25 +110,11 @@ export default function Topup() { setRedeeming(false); }; - // Calculate amount - const calcAmount = async (val) => { - if (!val || val <= 0) { setPayAmount(null); return; } - setAmountLoading(true); - try { - const res = await calculateAmount({ amount: parseInt(val) }); - if (res.data.message === 'success') { - setPayAmount(res.data.data); - } - } catch (e) { /* interceptor */ } - setAmountLoading(false); - }; - // Select preset const handlePreset = (val) => { setSelectedPreset(val); setAmount(String(val)); setDisplayAmount(toDisplayAmount(val)); - calcAmount(val); }; // Determine if a payment method is Stripe-based @@ -286,6 +270,15 @@ export default function Topup() { if (cryptoWallets.bsc) chains.push({ key: 'bsc', label: 'BSC (BEP20)' }); return chains; }, [cryptoWallets.tron, cryptoWallets.eth, cryptoWallets.bsc]); + const selectedChainMeta = useMemo( + () => availableChains.find((chain) => chain.key === selectedChain) || null, + [availableChains, selectedChain], + ); + const selectedChainLabel = selectedChainMeta?.label || ''; + const selectedTokenLabel = selectedToken.toUpperCase(); + const selectedCryptoLabel = selectedChainLabel + ? `${selectedTokenLabel} (${selectedChainLabel})` + : selectedTokenLabel; // Set default chain when available useEffect(() => { @@ -409,19 +402,16 @@ export default function Topup() { setSelectedPreset(null); const quotaAmount = toQuotaAmount(currentValue); setAmount(quotaAmount === '' ? '' : String(quotaAmount)); - calcAmount(quotaAmount); }} onBlur={(e) => { const quotaAmount = toQuotaAmount(e.target.value); if (quotaAmount === '') { setDisplayAmount(''); setAmount(''); - setPayAmount(null); return; } setAmount(String(quotaAmount)); setDisplayAmount(toDisplayAmount(quotaAmount)); - calcAmount(quotaAmount); }} min={minTopup * rate} step="0.01" @@ -432,18 +422,7 @@ export default function Topup() {

{t('topup.customAmountHint')}

- {amountLoading ? ( -

{t('topup.calculating')}

- ) : payAmount ? ( -
-

- {t('topup.rechargeAmountLabel')}: {symbol}{displayAmount || toDisplayAmount(amount)} -

-

- {t('topup.payAmountLabel')}: {symbol}{payAmount} -

-
- ) : amount ? ( + {amount ? (

{t('topup.rechargeAmountLabel')}: {symbol}{displayAmount || toDisplayAmount(amount)}

@@ -474,48 +453,72 @@ export default function Topup() { {enableCrypto && availableChains.length > 0 && (
-
- {/* Chain */} -
- {availableChains.map((chain) => ( - - ))} +
+

+ {t('topup.cryptoSelectionHint')} +

+ +
+

+ {t('topup.cryptoStepChain')} +

+
+ {availableChains.map((chain) => ( + + ))} +
- {/* Token */} -
- {['usdt', 'usdc'].map((token) => ( - - ))} + +
+

+ {t('topup.cryptoStepToken')} +

+
+ {['usdt', 'usdc'].map((token) => ( + + ))} +
- {/* Pay */} + +
+

+ {t('topup.cryptoSelectedSummary')} +

+

+ {selectedCryptoLabel} +

+
+
@@ -581,7 +584,7 @@ export default function Topup() {

{t('topup.chain')}

-

{cryptoOrder.chain}

+

{selectedChainLabel || cryptoOrder.chain}

{cryptoPolling && (