import { useState, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { Card } from '@/components/ui/Card'; import { Button } from '@/components/ui/Button'; import { Input } from '@/components/ui/Input'; import { Modal } from '@/components/ui/Modal'; import { Select } from '@/components/ui/Select'; import type { ModelPrice } from '@/utils/usage'; import styles from '@/pages/UsagePage.module.scss'; export interface PriceSettingsCardProps { modelNames: string[]; modelPrices: Record; onPricesChange: (prices: Record) => void; } export function PriceSettingsCard({ modelNames, modelPrices, onPricesChange }: PriceSettingsCardProps) { const { t } = useTranslation(); // Add form state const [selectedModel, setSelectedModel] = useState(''); const [promptPrice, setPromptPrice] = useState(''); const [completionPrice, setCompletionPrice] = useState(''); const [cachePrice, setCachePrice] = useState(''); // Edit modal state const [editModel, setEditModel] = useState(null); const [editPrompt, setEditPrompt] = useState(''); const [editCompletion, setEditCompletion] = useState(''); const [editCache, setEditCache] = useState(''); const handleSavePrice = () => { if (!selectedModel) return; const prompt = parseFloat(promptPrice) || 0; const completion = parseFloat(completionPrice) || 0; const cache = cachePrice.trim() === '' ? prompt : parseFloat(cachePrice) || 0; const newPrices = { ...modelPrices, [selectedModel]: { prompt, completion, cache } }; onPricesChange(newPrices); setSelectedModel(''); setPromptPrice(''); setCompletionPrice(''); setCachePrice(''); }; const handleDeletePrice = (model: string) => { const newPrices = { ...modelPrices }; delete newPrices[model]; onPricesChange(newPrices); }; const handleOpenEdit = (model: string) => { const price = modelPrices[model]; setEditModel(model); setEditPrompt(price?.prompt?.toString() || ''); setEditCompletion(price?.completion?.toString() || ''); setEditCache(price?.cache?.toString() || ''); }; const handleSaveEdit = () => { if (!editModel) return; const prompt = parseFloat(editPrompt) || 0; const completion = parseFloat(editCompletion) || 0; const cache = editCache.trim() === '' ? prompt : parseFloat(editCache) || 0; const newPrices = { ...modelPrices, [editModel]: { prompt, completion, cache } }; onPricesChange(newPrices); setEditModel(null); }; const handleModelSelect = (value: string) => { setSelectedModel(value); const price = modelPrices[value]; if (price) { setPromptPrice(price.prompt.toString()); setCompletionPrice(price.completion.toString()); setCachePrice(price.cache.toString()); } else { setPromptPrice(''); setCompletionPrice(''); setCachePrice(''); } }; const options = useMemo( () => [ { value: '', label: t('usage_stats.model_price_select_placeholder') }, ...modelNames.map((name) => ({ value: name, label: name })) ], [modelNames, t] ); return (
{/* Price Form */}
setPromptPrice(e.target.value)} placeholder="0.00" step="0.0001" />
setCompletionPrice(e.target.value)} placeholder="0.00" step="0.0001" />
setCachePrice(e.target.value)} placeholder="0.00" step="0.0001" />
{/* Saved Prices List */}

{t('usage_stats.saved_prices')}

{Object.keys(modelPrices).length > 0 ? (
{Object.entries(modelPrices).map(([model, price]) => (
{model}
{t('usage_stats.model_price_prompt')}: ${price.prompt.toFixed(4)}/1M {t('usage_stats.model_price_completion')}: ${price.completion.toFixed(4)}/1M {t('usage_stats.model_price_cache')}: ${price.cache.toFixed(4)}/1M
))}
) : (
{t('usage_stats.model_price_empty')}
)}
{/* Edit Modal */} setEditModel(null)} footer={
} width={420} >
setEditPrompt(e.target.value)} placeholder="0.00" step="0.0001" />
setEditCompletion(e.target.value)} placeholder="0.00" step="0.0001" />
setEditCache(e.target.value)} placeholder="0.00" step="0.0001" />
); }