import React, { useEffect, useState, useRef } from 'react'; import { Banner, Button, Form, Row, Col, Typography, Spin, Table, Modal, Input, InputNumber, Select, } from '@douyinfe/semi-ui'; const { Text } = Typography; import { API, showError, showSuccess, } from '../../../helpers'; import { useTranslation } from 'react-i18next'; import { Plus, Trash2 } from 'lucide-react'; export default function SettingsPaymentGatewayCreem(props) { const { t } = useTranslation(); const [loading, setLoading] = useState(false); const [inputs, setInputs] = useState({ CreemApiKey: '', CreemWebhookSecret: '', CreemProducts: '[]', CreemTestMode: false, }); const [originInputs, setOriginInputs] = useState({}); const [products, setProducts] = useState([]); const [showProductModal, setShowProductModal] = useState(false); const [editingProduct, setEditingProduct] = useState(null); const [productForm, setProductForm] = useState({ name: '', productId: '', price: 0, quota: 0, currency: 'USD', }); const formApiRef = useRef(null); useEffect(() => { if (props.options && formApiRef.current) { const currentInputs = { CreemApiKey: props.options.CreemApiKey || '', CreemWebhookSecret: props.options.CreemWebhookSecret || '', CreemProducts: props.options.CreemProducts || '[]', CreemTestMode: props.options.CreemTestMode === 'true', }; setInputs(currentInputs); setOriginInputs({ ...currentInputs }); formApiRef.current.setValues(currentInputs); // Parse products try { const parsedProducts = JSON.parse(currentInputs.CreemProducts); setProducts(parsedProducts); } catch (e) { setProducts([]); } } }, [props.options]); const handleFormChange = (values) => { setInputs(values); }; const submitCreemSetting = async () => { setLoading(true); try { const options = []; if (inputs.CreemApiKey && inputs.CreemApiKey !== '') { options.push({ key: 'CreemApiKey', value: inputs.CreemApiKey }); } if (inputs.CreemWebhookSecret && inputs.CreemWebhookSecret !== '') { options.push({ key: 'CreemWebhookSecret', value: inputs.CreemWebhookSecret }); } // Save test mode setting options.push({ key: 'CreemTestMode', value: inputs.CreemTestMode ? 'true' : 'false' }); // Save products as JSON string options.push({ key: 'CreemProducts', value: JSON.stringify(products) }); // 发送请求 const requestQueue = options.map(opt => API.put('/api/option/', { key: opt.key, value: opt.value, }) ); const results = await Promise.all(requestQueue); // 检查所有请求是否成功 const errorResults = results.filter(res => !res.data.success); if (errorResults.length > 0) { errorResults.forEach(res => { showError(res.data.message); }); } else { showSuccess(t('更新成功')); // 更新本地存储的原始值 setOriginInputs({ ...inputs }); props.refresh?.(); } } catch (error) { showError(t('更新失败')); } setLoading(false); }; const openProductModal = (product = null) => { if (product) { setEditingProduct(product); setProductForm({ ...product }); } else { setEditingProduct(null); setProductForm({ name: '', productId: '', price: 0, quota: 0, currency: 'USD', }); } setShowProductModal(true); }; const closeProductModal = () => { setShowProductModal(false); setEditingProduct(null); setProductForm({ name: '', productId: '', price: 0, quota: 0, currency: 'USD', }); }; const saveProduct = () => { if (!productForm.name || !productForm.productId || productForm.price <= 0 || productForm.quota <= 0 || !productForm.currency) { showError(t('请填写完整的产品信息')); return; } let newProducts = [...products]; if (editingProduct) { // 编辑现有产品 const index = newProducts.findIndex(p => p.productId === editingProduct.productId); if (index !== -1) { newProducts[index] = { ...productForm }; } } else { // 添加新产品 if (newProducts.find(p => p.productId === productForm.productId)) { showError(t('产品ID已存在')); return; } newProducts.push({ ...productForm }); } setProducts(newProducts); closeProductModal(); }; const deleteProduct = (productId) => { const newProducts = products.filter(p => p.productId !== productId); setProducts(newProducts); }; const columns = [ { title: t('产品名称'), dataIndex: 'name', key: 'name', }, { title: t('产品ID'), dataIndex: 'productId', key: 'productId', }, { title: t('展示价格'), dataIndex: 'price', key: 'price', render: (price, record) => `${record.currency === 'EUR' ? '€' : '$'}${price}`, }, { title: t('充值额度'), dataIndex: 'quota', key: 'quota', }, { title: t('操作'), key: 'action', render: (_, record) => (
), }, ]; return (
(formApiRef.current = api)} > {t('Creem 介绍')} Creem Official Site
{t('产品配置')}
{t('暂无产品配置')} } /> {/* 产品配置模态框 */}
{t('产品名称')} setProductForm({ ...productForm, name: value })} placeholder={t('例如:基础套餐')} size='large' />
{t('产品ID')} setProductForm({ ...productForm, productId: value })} placeholder={t('例如:prod_6I8rBerHpPxyoiU9WK4kot')} size='large' disabled={!!editingProduct} />
{t('货币')}
{t('价格')} ({productForm.currency === 'EUR' ? t('欧元') : t('美元')}) setProductForm({ ...productForm, price: value })} placeholder={t('例如:4.99')} min={0.01} precision={2} size='large' className='w-full' defaultValue={4.49} />
{t('充值额度')} setProductForm({ ...productForm, quota: value })} placeholder={t('例如:100000')} min={1} precision={0} size='large' className='w-full' />
); }