import React, { useState } from "react"; import { Card, Text, Button, Grid, Col, Tab, TabList, TabGroup, TabPanel, TabPanels, Title, Badge, TextInput, Select as TremorSelect } from "@tremor/react"; import { ArrowLeftIcon, TrashIcon, RefreshIcon } from "@heroicons/react/outline"; import { keyDeleteCall, keyUpdateCall } from "./networking"; import { KeyResponse } from "./key_team_helpers/key_list"; import { Form, Input, InputNumber, message, Select } from "antd"; import { KeyEditView } from "./key_edit_view"; import { RegenerateKeyModal } from "./regenerate_key_modal"; import { rolesWithWriteAccess } from '../utils/roles'; interface KeyInfoViewProps { keyId: string; onClose: () => void; keyData: KeyResponse | undefined; onKeyDataUpdate?: (data: Partial) => void; onDelete?: () => void; accessToken: string | null; userID: string | null; userRole: string | null; teams: any[] | null; } export default function KeyInfoView({ keyId, onClose, keyData, accessToken, userID, userRole, teams, onKeyDataUpdate, onDelete }: KeyInfoViewProps) { const [isEditing, setIsEditing] = useState(false); const [form] = Form.useForm(); const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false); const [isRegenerateModalOpen, setIsRegenerateModalOpen] = useState(false); if (!keyData) { return (
Key not found
); } const handleKeyUpdate = async (formValues: Record) => { try { if (!accessToken) return; const currentKey = formValues.token; formValues.key = currentKey; // Convert metadata back to an object if it exists and is a string if (formValues.metadata && typeof formValues.metadata === "string") { try { const parsedMetadata = JSON.parse(formValues.metadata); formValues.metadata = { ...parsedMetadata, ...(formValues.guardrails?.length > 0 ? { guardrails: formValues.guardrails } : {}), }; } catch (error) { console.error("Error parsing metadata JSON:", error); message.error("Invalid metadata JSON"); return; } } else { formValues.metadata = { ...(formValues.metadata || {}), ...(formValues.guardrails?.length > 0 ? { guardrails: formValues.guardrails } : {}), }; } // Convert budget_duration to API format if (formValues.budget_duration) { const durationMap: Record = { daily: "24h", weekly: "7d", monthly: "30d" }; formValues.budget_duration = durationMap[formValues.budget_duration]; } const newKeyValues = await keyUpdateCall(accessToken, formValues); if (onKeyDataUpdate) { onKeyDataUpdate(newKeyValues) } message.success("Key updated successfully"); setIsEditing(false); // Refresh key data here if needed } catch (error) { message.error("Failed to update key"); console.error("Error updating key:", error); } }; const handleDelete = async () => { try { if (!accessToken) return; await keyDeleteCall(accessToken as string, keyData.token); message.success("Key deleted successfully"); if (onDelete) { onDelete() } onClose(); } catch (error) { console.error("Error deleting the key:", error); message.error("Failed to delete key"); } }; return (
{keyData.key_alias || "API Key"} {keyData.token}
{userRole && rolesWithWriteAccess.includes(userRole) && (
)}
{/* Add RegenerateKeyModal */} setIsRegenerateModalOpen(false)} accessToken={accessToken} /> {/* Delete Confirmation Modal */} {isDeleteModalOpen && (

Delete Key

Are you sure you want to delete this key?

)} Overview Settings {/* Overview Panel */} Spend
${Number(keyData.spend).toFixed(4)} of {keyData.max_budget !== null ? `$${keyData.max_budget}` : "Unlimited"}
Rate Limits
TPM: {keyData.tpm_limit !== null ? keyData.tpm_limit : "Unlimited"} RPM: {keyData.rpm_limit !== null ? keyData.rpm_limit : "Unlimited"}
Models
{keyData.models && keyData.models.length > 0 ? ( keyData.models.map((model, index) => ( {model} )) ) : ( No models specified )}
{/* Settings Panel */}
Key Settings {!isEditing && userRole && rolesWithWriteAccess.includes(userRole) && ( )}
{isEditing ? ( setIsEditing(false)} onSubmit={handleKeyUpdate} teams={teams} accessToken={accessToken} userID={userID} userRole={userRole} /> ) : (
Key ID {keyData.token}
Key Alias {keyData.key_alias || "Not Set"}
Secret Key {keyData.key_name}
Team ID {keyData.team_id || "Not Set"}
Organization {keyData.organization_id || "Not Set"}
Created {new Date(keyData.created_at).toLocaleString()}
Expires {keyData.expires ? new Date(keyData.expires).toLocaleString() : "Never"}
Spend ${Number(keyData.spend).toFixed(4)} USD
Budget {keyData.max_budget !== null ? `$${keyData.max_budget} USD` : "Unlimited"}
Models
{keyData.models && keyData.models.length > 0 ? ( keyData.models.map((model, index) => ( {model} )) ) : ( No models specified )}
Rate Limits TPM: {keyData.tpm_limit !== null ? keyData.tpm_limit : "Unlimited"} RPM: {keyData.rpm_limit !== null ? keyData.rpm_limit : "Unlimited"} Max Parallel Requests: {keyData.max_parallel_requests !== null ? keyData.max_parallel_requests : "Unlimited"} Model TPM Limits: {keyData.metadata?.model_tpm_limit ? JSON.stringify(keyData.metadata.model_tpm_limit) : "Unlimited"} Model RPM Limits: {keyData.metadata?.model_rpm_limit ? JSON.stringify(keyData.metadata.model_rpm_limit) : "Unlimited"}
Metadata
                      {JSON.stringify(keyData.metadata, null, 2)}
                    
)}
); }