import { useState } from "react"; import { useTranslation } from "react-i18next"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { Button } from "@/components/ui/button"; import { Alert, AlertDescription } from "@/components/ui/alert"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { useModelPricing, useDeleteModelPricing } from "@/lib/query/usage"; import { PricingEditModal } from "./PricingEditModal"; import type { ModelPricing } from "@/types/usage"; import { Plus, Pencil, Trash2, ChevronDown, ChevronRight } from "lucide-react"; export function PricingConfigPanel() { const { t } = useTranslation(); const { data: pricing, isLoading, error } = useModelPricing(); const deleteMutation = useDeleteModelPricing(); const [editingModel, setEditingModel] = useState(null); const [isAddingNew, setIsAddingNew] = useState(false); const [deleteConfirm, setDeleteConfirm] = useState(null); const [isExpanded, setIsExpanded] = useState(false); const handleDelete = (modelId: string) => { deleteMutation.mutate(modelId, { onSuccess: () => { setDeleteConfirm(null); }, }); }; const handleAddNew = () => { setIsAddingNew(true); setEditingModel({ modelId: "", displayName: "", inputCostPerMillion: "0", outputCostPerMillion: "0", cacheReadCostPerMillion: "0", cacheCreationCostPerMillion: "0", }); }; if (isLoading) { return ( setIsExpanded(!isExpanded)} >
{t("usage.modelPricing")}
); } if (error) { return ( setIsExpanded(!isExpanded)} >
{isExpanded ? ( ) : ( )} {t("usage.modelPricing")}
{isExpanded && ( {t("usage.loadPricingError")}: {String(error)} )}
); } return (

{t("usage.modelPricingDesc")} {t("usage.perMillion")}

{!pricing || pricing.length === 0 ? ( {t("usage.noPricingData")} ) : (
{t("usage.model")} {t("usage.displayName")} {t("usage.inputCost")} {t("usage.outputCost")} {t("usage.cacheReadCost")} {t("usage.cacheWriteCost")} {t("common.actions")} {pricing.map((model) => ( {model.modelId} {model.displayName} ${model.inputCostPerMillion} ${model.outputCostPerMillion} ${model.cacheReadCostPerMillion} ${model.cacheCreationCostPerMillion}
))}
)}
{editingModel && ( { setEditingModel(null); setIsAddingNew(false); }} /> )} setDeleteConfirm(null)} > {t("usage.deleteConfirmTitle")} {t("usage.deleteConfirmDesc")}
); }