Restructure payment settings into a separate tab for better organization and user experience. The changes include: 1. Create dedicated Payment components in the Setting directory structure 2. Move payment-related settings from SystemSetting to PaymentSetting 3. Add proper i18n support with useTranslation hook 4. Split payment settings into GeneralPayment and PaymentGateway components 5. Fix internationalization issues in placeholder text 6. Update navigation with CreditCard icon for payment tab This refactoring improves code maintainability by following the established project pattern of having specialized setting components in their own directories.
175 lines
4.8 KiB
JavaScript
175 lines
4.8 KiB
JavaScript
import React, { useEffect, useState } from 'react';
|
|
import { Layout, TabPane, Tabs } from '@douyinfe/semi-ui';
|
|
import { useNavigate, useLocation } from 'react-router-dom';
|
|
import { useTranslation } from 'react-i18next';
|
|
import {
|
|
Settings,
|
|
Calculator,
|
|
Gauge,
|
|
Shapes,
|
|
Cog,
|
|
MoreHorizontal,
|
|
LayoutDashboard,
|
|
MessageSquare,
|
|
Palette,
|
|
CreditCard
|
|
} from 'lucide-react';
|
|
|
|
import SystemSetting from '../../components/settings/SystemSetting.js';
|
|
import { isRoot } from '../../helpers';
|
|
import OtherSetting from '../../components/settings/OtherSetting';
|
|
import OperationSetting from '../../components/settings/OperationSetting.js';
|
|
import RateLimitSetting from '../../components/settings/RateLimitSetting.js';
|
|
import ModelSetting from '../../components/settings/ModelSetting.js';
|
|
import DashboardSetting from '../../components/settings/DashboardSetting.js';
|
|
import RatioSetting from '../../components/settings/RatioSetting.js';
|
|
import ChatsSetting from '../../components/settings/ChatsSetting.js';
|
|
import DrawingSetting from '../../components/settings/DrawingSetting.js';
|
|
import PaymentSetting from '../../components/settings/PaymentSetting.js';
|
|
|
|
const Setting = () => {
|
|
const { t } = useTranslation();
|
|
const navigate = useNavigate();
|
|
const location = useLocation();
|
|
const [tabActiveKey, setTabActiveKey] = useState('1');
|
|
let panes = [];
|
|
|
|
if (isRoot()) {
|
|
panes.push({
|
|
tab: (
|
|
<span style={{ display: 'flex', alignItems: 'center', gap: '5px' }}>
|
|
<Settings size={18} />
|
|
{t('运营设置')}
|
|
</span>
|
|
),
|
|
content: <OperationSetting />,
|
|
itemKey: 'operation',
|
|
});
|
|
panes.push({
|
|
tab: (
|
|
<span style={{ display: 'flex', alignItems: 'center', gap: '5px' }}>
|
|
<MessageSquare size={18} />
|
|
{t('聊天设置')}
|
|
</span>
|
|
),
|
|
content: <ChatsSetting />,
|
|
itemKey: 'chats',
|
|
});
|
|
panes.push({
|
|
tab: (
|
|
<span style={{ display: 'flex', alignItems: 'center', gap: '5px' }}>
|
|
<Palette size={18} />
|
|
{t('绘图设置')}
|
|
</span>
|
|
),
|
|
content: <DrawingSetting />,
|
|
itemKey: 'drawing',
|
|
});
|
|
panes.push({
|
|
tab: (
|
|
<span style={{ display: 'flex', alignItems: 'center', gap: '5px' }}>
|
|
<CreditCard size={18} />
|
|
{t('支付设置')}
|
|
</span>
|
|
),
|
|
content: <PaymentSetting />,
|
|
itemKey: 'payment',
|
|
});
|
|
panes.push({
|
|
tab: (
|
|
<span style={{ display: 'flex', alignItems: 'center', gap: '5px' }}>
|
|
<Calculator size={18} />
|
|
{t('倍率设置')}
|
|
</span>
|
|
),
|
|
content: <RatioSetting />,
|
|
itemKey: 'ratio',
|
|
});
|
|
panes.push({
|
|
tab: (
|
|
<span style={{ display: 'flex', alignItems: 'center', gap: '5px' }}>
|
|
<Gauge size={18} />
|
|
{t('速率限制设置')}
|
|
</span>
|
|
),
|
|
content: <RateLimitSetting />,
|
|
itemKey: 'ratelimit',
|
|
});
|
|
panes.push({
|
|
tab: (
|
|
<span style={{ display: 'flex', alignItems: 'center', gap: '5px' }}>
|
|
<Shapes size={18} />
|
|
{t('模型相关设置')}
|
|
</span>
|
|
),
|
|
content: <ModelSetting />,
|
|
itemKey: 'models',
|
|
});
|
|
panes.push({
|
|
tab: (
|
|
<span style={{ display: 'flex', alignItems: 'center', gap: '5px' }}>
|
|
<Cog size={18} />
|
|
{t('系统设置')}
|
|
</span>
|
|
),
|
|
content: <SystemSetting />,
|
|
itemKey: 'system',
|
|
});
|
|
panes.push({
|
|
tab: (
|
|
<span style={{ display: 'flex', alignItems: 'center', gap: '5px' }}>
|
|
<LayoutDashboard size={18} />
|
|
{t('仪表盘设置')}
|
|
</span>
|
|
),
|
|
content: <DashboardSetting />,
|
|
itemKey: 'dashboard',
|
|
});
|
|
panes.push({
|
|
tab: (
|
|
<span style={{ display: 'flex', alignItems: 'center', gap: '5px' }}>
|
|
<MoreHorizontal size={18} />
|
|
{t('其他设置')}
|
|
</span>
|
|
),
|
|
content: <OtherSetting />,
|
|
itemKey: 'other',
|
|
});
|
|
}
|
|
const onChangeTab = (key) => {
|
|
setTabActiveKey(key);
|
|
navigate(`?tab=${key}`);
|
|
};
|
|
useEffect(() => {
|
|
const searchParams = new URLSearchParams(window.location.search);
|
|
const tab = searchParams.get('tab');
|
|
if (tab) {
|
|
setTabActiveKey(tab);
|
|
} else {
|
|
onChangeTab('operation');
|
|
}
|
|
}, [location.search]);
|
|
return (
|
|
<div>
|
|
<Layout>
|
|
<Layout.Content>
|
|
<Tabs
|
|
type='card'
|
|
collapsible
|
|
activeKey={tabActiveKey}
|
|
onChange={(key) => onChangeTab(key)}
|
|
>
|
|
{panes.map((pane) => (
|
|
<TabPane itemKey={pane.itemKey} tab={pane.tab} key={pane.itemKey}>
|
|
{tabActiveKey === pane.itemKey && pane.content}
|
|
</TabPane>
|
|
))}
|
|
</Tabs>
|
|
</Layout.Content>
|
|
</Layout>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default Setting;
|