|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import React from 'react'; |
|
|
import { Modal, Typography, Card, Skeleton } from '@douyinfe/semi-ui'; |
|
|
import { SiAlipay, SiWechat, SiStripe } from 'react-icons/si'; |
|
|
import { CreditCard } from 'lucide-react'; |
|
|
|
|
|
const { Text } = Typography; |
|
|
|
|
|
const PaymentConfirmModal = ({ |
|
|
t, |
|
|
open, |
|
|
onlineTopUp, |
|
|
handleCancel, |
|
|
confirmLoading, |
|
|
topUpCount, |
|
|
renderQuotaWithAmount, |
|
|
amountLoading, |
|
|
renderAmount, |
|
|
payWay, |
|
|
payMethods, |
|
|
// 新增:用于显示折扣明细 |
|
|
amountNumber, |
|
|
discountRate, |
|
|
}) => { |
|
|
const hasDiscount = |
|
|
discountRate && discountRate > 0 && discountRate < 1 && amountNumber > 0; |
|
|
const originalAmount = hasDiscount ? amountNumber / discountRate : 0; |
|
|
const discountAmount = hasDiscount ? originalAmount - amountNumber : 0; |
|
|
return ( |
|
|
<Modal |
|
|
title={ |
|
|
<div className='flex items-center'> |
|
|
<CreditCard className='mr-2' size={18} /> |
|
|
{t('充值确认')} |
|
|
</div> |
|
|
} |
|
|
visible={open} |
|
|
onOk={onlineTopUp} |
|
|
onCancel={handleCancel} |
|
|
maskClosable={false} |
|
|
size='small' |
|
|
centered |
|
|
confirmLoading={confirmLoading} |
|
|
> |
|
|
<div className='space-y-4'> |
|
|
<Card className='!rounded-xl !border-0 bg-slate-50 dark:bg-slate-800'> |
|
|
<div className='space-y-3'> |
|
|
<div className='flex justify-between items-center'> |
|
|
<Text strong className='text-slate-700 dark:text-slate-200'> |
|
|
{t('充值数量')}: |
|
|
</Text> |
|
|
<Text className='text-slate-900 dark:text-slate-100'> |
|
|
{renderQuotaWithAmount(topUpCount)} |
|
|
</Text> |
|
|
</div> |
|
|
<div className='flex justify-between items-center'> |
|
|
<Text strong className='text-slate-700 dark:text-slate-200'> |
|
|
{t('实付金额')}: |
|
|
</Text> |
|
|
{amountLoading ? ( |
|
|
<Skeleton.Title style={{ width: '60px', height: '16px' }} /> |
|
|
) : ( |
|
|
<div className='flex items-baseline space-x-2'> |
|
|
<Text strong className='font-bold' style={{ color: 'red' }}> |
|
|
{renderAmount()} |
|
|
</Text> |
|
|
{hasDiscount && ( |
|
|
<Text size='small' className='text-rose-500'> |
|
|
{Math.round(discountRate * 100)}% |
|
|
</Text> |
|
|
)} |
|
|
</div> |
|
|
)} |
|
|
</div> |
|
|
{hasDiscount && !amountLoading && ( |
|
|
<> |
|
|
<div className='flex justify-between items-center'> |
|
|
<Text className='text-slate-500 dark:text-slate-400'> |
|
|
{t('原价')}: |
|
|
</Text> |
|
|
<Text delete className='text-slate-500 dark:text-slate-400'> |
|
|
{`${originalAmount.toFixed(2)} ${t('元')}`} |
|
|
</Text> |
|
|
</div> |
|
|
<div className='flex justify-between items-center'> |
|
|
<Text className='text-slate-500 dark:text-slate-400'> |
|
|
{t('优惠')}: |
|
|
</Text> |
|
|
<Text className='text-emerald-600 dark:text-emerald-400'> |
|
|
{`- ${discountAmount.toFixed(2)} ${t('元')}`} |
|
|
</Text> |
|
|
</div> |
|
|
</> |
|
|
)} |
|
|
<div className='flex justify-between items-center'> |
|
|
<Text strong className='text-slate-700 dark:text-slate-200'> |
|
|
{t('支付方式')}: |
|
|
</Text> |
|
|
<div className='flex items-center'> |
|
|
{(() => { |
|
|
const payMethod = payMethods.find( |
|
|
(method) => method.type === payWay, |
|
|
); |
|
|
if (payMethod) { |
|
|
return ( |
|
|
<> |
|
|
{payMethod.type === 'alipay' ? ( |
|
|
<SiAlipay |
|
|
className='mr-2' |
|
|
size={16} |
|
|
color='#1677FF' |
|
|
/> |
|
|
) : payMethod.type === 'wxpay' ? ( |
|
|
<SiWechat |
|
|
className='mr-2' |
|
|
size={16} |
|
|
color='#07C160' |
|
|
/> |
|
|
) : payMethod.type === 'stripe' ? ( |
|
|
<SiStripe |
|
|
className='mr-2' |
|
|
size={16} |
|
|
color='#635BFF' |
|
|
/> |
|
|
) : ( |
|
|
<CreditCard |
|
|
className='mr-2' |
|
|
size={16} |
|
|
color={ |
|
|
payMethod.color || 'var(--semi-color-text-2)' |
|
|
} |
|
|
/> |
|
|
)} |
|
|
<Text className='text-slate-900 dark:text-slate-100'> |
|
|
{payMethod.name} |
|
|
</Text> |
|
|
</> |
|
|
); |
|
|
} else { |
|
|
// 默认充值方式 |
|
|
if (payWay === 'alipay') { |
|
|
return ( |
|
|
<> |
|
|
<SiAlipay |
|
|
className='mr-2' |
|
|
size={16} |
|
|
color='#1677FF' |
|
|
/> |
|
|
<Text className='text-slate-900 dark:text-slate-100'> |
|
|
{t('支付宝')} |
|
|
</Text> |
|
|
</> |
|
|
); |
|
|
} else if (payWay === 'stripe') { |
|
|
return ( |
|
|
<> |
|
|
<SiStripe |
|
|
className='mr-2' |
|
|
size={16} |
|
|
color='#635BFF' |
|
|
/> |
|
|
<Text className='text-slate-900 dark:text-slate-100'> |
|
|
Stripe |
|
|
</Text> |
|
|
</> |
|
|
); |
|
|
} else { |
|
|
return ( |
|
|
<> |
|
|
<SiWechat |
|
|
className='mr-2' |
|
|
size={16} |
|
|
color='#07C160' |
|
|
/> |
|
|
<Text className='text-slate-900 dark:text-slate-100'> |
|
|
{t('微信')} |
|
|
</Text> |
|
|
</> |
|
|
); |
|
|
} |
|
|
} |
|
|
})()} |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</Card> |
|
|
</div> |
|
|
</Modal> |
|
|
); |
|
|
}; |
|
|
|
|
|
export default PaymentConfirmModal; |
|
|
|