/* * @Author: ZhaoYing * @Date: 2026-02-25 * @Last Modified by: ZhaoYing * @Last Modified time: 2026-04-14 14:48:13 */ /** * Package Component * * Package management page with: * - Tabs for SaaS Personal and Commercial Deployment * - Package cards showing features and pricing * - Edit and delete actions * * @component */ import { useMemo, useState, useEffect, type FC } from 'react'; import { useTranslation } from 'react-i18next'; import { useNavigate } from 'react-router-dom'; import { Flex, Row, Col, type SegmentedProps } from 'antd'; import clsx from 'clsx'; import type { Package } from './types' import { getPackageList } from '@/api/package'; import PageTabs from '@/components/PageTabs' import { billingUnits } from './constant' import RbCard from '@/components/RbCard/Card' import BodyWrapper from '@/components/Empty/BodyWrapper' import { useI18n } from '@/store/locale' import RbButton from '@/components/RbButton' const Package: FC = () => { const { t } = useTranslation(); const { language } = useI18n() const navigate = useNavigate(); const [data, setData] = useState([]) const [activeTab, setActiveTab] = useState('saas_personal'); const formatTabItems = useMemo(() => { return ['saas_personal', 'commercial_deployment'].map(value => ({ value, label: t(`package.${value}`), })) }, [t]) /** Handle tab change */ const handleChangeTab = (value: SegmentedProps['value']) => { setActiveTab(value as string); } const getList = () => { getPackageList({ category: activeTab as Package['category'], status: true }) .then(res => { setData(res as Package[] || []) }) } useEffect(() => { getList() }, [activeTab]) const getKeyWithLanguage = (key: string) => { return (language === 'en' ? `${key}_en` : key) as keyof Package } /** Navigate to order history */ const goToHistory = () => { navigate('/orders'); } return ( <>
{t('pricing.orderHistory')}
{data.map((pkg) => (
{/* Header */}

{String(pkg[getKeyWithLanguage('name')] ?? '')}

{String(pkg[getKeyWithLanguage('core_value')] ?? '')}

{pkg.billing_cycle !== 'permanent_free' && <>¥{pkg.price}} {pkg.billing_cycle && {pkg.billing_cycle !== 'permanent_free' && '/'}{t(`package.${pkg.billing_cycle}`)}}
{/* Features */}
{billingUnits.map(({ key, unit }) => { if (typeof pkg.quotas[key as keyof Package['quotas']] === 'number') { return (
{t(`package.${key}`)} {pkg.quotas[key as keyof Package['quotas']]}{unit}
) } })} {pkg.tech_support &&
{t(`package.tech_support`)} {String(pkg[getKeyWithLanguage('tech_support')] ?? '')}
} {pkg.api_ops_rate_limit &&
{t(`package.api_ops_rate_limit`)} {pkg.api_ops_rate_limit}(次/秒)
}
))}
); }; export default Package;