
// // export default Recharge;
// import React, { useState } from 'react';
// import axios from 'axios';
// import { useUser } from '../../context/UserContext';
// import toast from 'react-hot-toast';
// import { confirmAlert } from 'react-confirm-alert';
// import 'react-confirm-alert/src/react-confirm-alert.css';

// const UserRecharge = () => {
//   const [amount, setAmount] = useState('');
//   const [loading, setLoading] = useState(false);
//   const [message, setMessage] = useState('');
//   const [showPayDialog, setShowPayDialog] = useState(false);
//   const [payProcessing, setPayProcessing] = useState(false);

//   const { user } = useUser();
//   const userId = user?.userId;

//   // 点击提交充值，打开模拟支付弹窗
//   const handleSubmit = () => {
//     if (!userId) {
//       setMessage('未登录，无法充值');
//       return;
//     }
//     if (!amount || isNaN(amount) || Number(amount) <= 0) {
//       setMessage('请输入有效的充值金额');
//       return;
//     }
//     setMessage('');
//     setShowPayDialog(true);
//   };

//   // 模拟支付弹窗点击“确认支付”
//   const handlePayConfirm = async () => {
//     setPayProcessing(true);
//     setMessage('');

//     // 模拟支付等待 2 秒
//     setTimeout(async () => {
//       try {
//         // 支付成功后调用后端充值接口
//         const response = await axios.post('/echo/user/recharge', null, {
//           params: {
//             userId,
//             amount: Number(amount),
//           },
//         });

//         setMessage(response.data.message || '充值成功！');
//         setAmount('');
//       } catch (error) {
//         setMessage(error.response?.data?.message || '充值失败，请重试');
//       } finally {
//         setPayProcessing(false);
//         setShowPayDialog(false);
//       }
//     }, 2000);
//   };

//   // 取消支付弹窗
//   const handlePayCancel = () => {
//     setShowPayDialog(false);
//     setMessage('支付已取消');
//   };

//   return (
//     <div className="recharge-page" style={{ maxWidth: 400, margin: 'auto', padding: 20 }}>
//       <h2>充值服务</h2>
//       <div style={{ marginBottom: 12 }}>
//         <label>
//           充值金额：
//           <input
//             type="number"
//             min="1"
//             value={amount}
//             onChange={(e) => setAmount(e.target.value)}
//             disabled={loading || payProcessing}
//             style={{ marginLeft: 8, width: 120 }}
//           />
//         </label>
//       </div>
//       <button onClick={handleSubmit} disabled={loading || payProcessing}>
//         {loading || payProcessing ? '处理中...' : '提交充值'}
//       </button>

//       {message && <p style={{ marginTop: 12 }}>{message}</p>}

//       {/* 模拟支付弹窗 */}
//       {showPayDialog && (
//         <div
//           style={{
//             position: 'fixed',
//             top: 0, left: 0, right: 0, bottom: 0,
//             backgroundColor: 'rgba(0,0,0,0.5)',
//             display: 'flex',
//             justifyContent: 'center',
//             alignItems: 'center',
//             zIndex: 1000,
//           }}
//         >
//           <div
//             style={{
//               backgroundColor: '#fff',
//               padding: 20,
//               borderRadius: 8,
//               width: 300,
//               textAlign: 'center',
//               boxShadow: '0 0 10px rgba(0,0,0,0.25)',
//             }}
//           >
//             <h3>模拟支付</h3>
//             <p>支付金额：{amount} 元</p>

//             {payProcessing ? (
//               <p>支付处理中，请稍候...</p>
//             ) : (
//               <>
//                 <button onClick={handlePayConfirm} style={{ marginRight: 10 }}>
//                   确认支付
//                 </button>
//                 <button onClick={handlePayCancel}>取消</button>
//               </>
//             )}
//           </div>
//         </div>
//       )}
//     </div>
//   );
// };

// export default UserRecharge;
import React, { useState } from 'react';
import axios from 'axios';
import { useUser } from '../../context/UserContext';
import toast from 'react-hot-toast';
import { confirmAlert } from 'react-confirm-alert';
import 'react-confirm-alert/src/react-confirm-alert.css';

const UserRecharge = () => {
  const [amount, setAmount] = useState('');
  const [payProcessing, setPayProcessing] = useState(false);

  const { user } = useUser();
  const userId = user?.userId;

  // 点击提交充值
  const handleSubmit = () => {
    if (!userId) {
      toast.error('未登录，无法充值');
      return;
    }
    if (!amount || isNaN(amount) || Number(amount) <= 0) {
      toast.error('请输入有效的充值金额');
      return;
    }

    confirmAlert({
      title: '确认支付',
      message: `确认充值 ${amount} 元吗？`,
      buttons: [
        {
          label: '确认支付',
          onClick: () => handlePayConfirm(),
        },
        {
          label: '取消',
          onClick: () => toast('已取消充值'),
        },
      ],
    });
  };

  const handlePayConfirm = async () => {
    setPayProcessing(true);

    toast.loading('正在处理支付...', { id: 'recharge' });

    setTimeout(async () => {
      try {
        const response = await axios.post('/echo/user/recharge', null, {
          params: {
            userId,
            amount: Number(amount),
          },
        });

        toast.success(response.data.message || '充值成功！', { id: 'recharge' });
        setAmount('');
      } catch (error) {
        toast.error(error.response?.data?.message || '充值失败，请重试', { id: 'recharge' });
      } finally {
        setPayProcessing(false);
      }
    }, 2000);
  };

  return (
    <div className="recharge-page" style={{ maxWidth: 400, margin: 'auto', padding: 20 }}>
      <h2>充值服务</h2>
      <div style={{ marginBottom: 12 }}>
        <label>
          充值金额：
          <input
            type="number"
            min="1"
            value={amount}
            onChange={(e) => setAmount(e.target.value)}
            disabled={payProcessing}
            style={{ marginLeft: 8, width: 120 }}
          />
        </label>
      </div>
      <button onClick={handleSubmit} disabled={payProcessing}>
        {payProcessing ? '处理中...' : '提交充值'}
      </button>
    </div>
  );
};

export default UserRecharge;
