Files
Sub-Router/src/themes/shared/useHomeData.js
T

85 lines
3.1 KiB
JavaScript

import { useEffect, useMemo, useState } from 'react';
import { getSiteModels, getSitePackages, Q } from '../../api';
const previewModels = [
{ id: 'preview-1', model_name: 'gpt-4o-mini', display_name: 'GPT-4o Mini', enabled: true },
{ id: 'preview-2', model_name: 'claude-sonnet-4-5', display_name: 'Claude Sonnet 4.5', enabled: true },
{ id: 'preview-3', model_name: 'gemini-2.5-pro', display_name: 'Gemini 2.5 Pro', enabled: true },
{ id: 'preview-4', model_name: 'deepseek-chat', display_name: 'DeepSeek Chat', enabled: true },
{ id: 'preview-5', model_name: 'qwen-max', display_name: 'Qwen Max', enabled: true },
{ id: 'preview-6', model_name: 'grok-4', display_name: 'Grok 4', enabled: true },
{ id: 'preview-7', model_name: 'claude-haiku-4-5', display_name: 'Claude Haiku 4.5', enabled: true },
{ id: 'preview-8', model_name: 'gpt-5-mini', display_name: 'GPT-5 Mini', enabled: true },
];
const previewPackages = [
{
id: 'preview-basic',
name: 'Starter Pack',
description: '适合个人试用和轻量 API 调用。',
price: 29,
original_price: 49,
duration: 30,
quota_amount: Q * 6,
quota_reset_period: 'never',
enabled: true,
},
{
id: 'preview-pro',
name: 'Pro Relay',
description: '高频调用、自动路由、失败重试的主力套餐。',
price: 99,
original_price: 149,
duration: 30,
quota_amount: Q * 24,
quota_reset_period: 'never',
enabled: true,
},
{
id: 'preview-team',
name: 'Team Scale',
description: '适合团队共享密钥、模型分组和稳定生产调用。',
price: 299,
original_price: 399,
duration: 30,
quota_amount: Q * 90,
quota_reset_period: 'never',
enabled: true,
},
];
const devPreviewTheme =
import.meta.env.DEV && typeof window !== 'undefined'
? new URLSearchParams(window.location.search).get('preview_theme')
: '';
export function useHomeData() {
const [models, setModels] = useState(devPreviewTheme ? previewModels : []);
const [packages, setPackages] = useState(devPreviewTheme ? previewPackages : []);
useEffect(() => {
if (devPreviewTheme) return;
getSiteModels().then(r => { if (r.data.success) setModels(r.data.data || []); }).catch(() => {});
getSitePackages().then(r => { if (r.data.success) setPackages(r.data.data || []); }).catch(() => {});
}, []);
const enabledModels = useMemo(() => models.filter(m => m.enabled !== false), [models]);
const visiblePackages = useMemo(() => packages.filter(p => p.enabled), [packages]);
return { models, packages, enabledModels, visiblePackages };
}
export function packageQuotaDollars(pkg) {
const quotaDollars = pkg.quota_amount > 0 ? pkg.quota_amount / Q : 0;
const period = pkg.quota_reset_period || 'never';
if (period === 'never' || pkg.duration <= 0 || quotaDollars <= 0) {
return quotaDollars;
}
let count = 1;
if (period === 'daily') count = pkg.duration;
if (period === 'weekly') count = Math.floor(pkg.duration / 7);
if (period === 'monthly') count = Math.floor(pkg.duration / 30);
return quotaDollars * Math.max(count, 1);
}