import React, { useEffect, useState } from "react"; import { Button, Text, TextInput, Title, Grid, Col } from "@tremor/react"; import { Modal, Form, InputNumber, message } from "antd"; import { add } from "date-fns"; import { regenerateKeyCall } from "./networking"; import { KeyResponse } from "./key_team_helpers/key_list"; import { CopyToClipboard } from "react-copy-to-clipboard"; interface RegenerateKeyModalProps { selectedToken: KeyResponse | null; visible: boolean; onClose: () => void; accessToken: string | null; } export function RegenerateKeyModal({ selectedToken, visible, onClose, accessToken, }: RegenerateKeyModalProps) { const [form] = Form.useForm(); const [regeneratedKey, setRegeneratedKey] = useState(null); const [regenerateFormData, setRegenerateFormData] = useState(null); const [newExpiryTime, setNewExpiryTime] = useState(null); const [isRegenerating, setIsRegenerating] = useState(false); useEffect(() => { if (visible && selectedToken) { form.setFieldsValue({ key_alias: selectedToken.key_alias, max_budget: selectedToken.max_budget, tpm_limit: selectedToken.tpm_limit, rpm_limit: selectedToken.rpm_limit, duration: selectedToken.duration || "", }); } }, [visible, selectedToken, form]); useEffect(() => { if (!visible) { // Reset states when modal is closed setRegeneratedKey(null); setIsRegenerating(false); form.resetFields(); } }, [visible, form]); useEffect(() => { const calculateNewExpiryTime = (duration: string | undefined) => { if (!duration) return null; try { const now = new Date(); let newExpiry: Date; if (duration.endsWith("s")) { newExpiry = add(now, { seconds: parseInt(duration) }); } else if (duration.endsWith("h")) { newExpiry = add(now, { hours: parseInt(duration) }); } else if (duration.endsWith("d")) { newExpiry = add(now, { days: parseInt(duration) }); } else { throw new Error("Invalid duration format"); } return newExpiry.toLocaleString(); } catch (error) { return null; } }; if (regenerateFormData?.duration) { setNewExpiryTime(calculateNewExpiryTime(regenerateFormData.duration)); } else { setNewExpiryTime(null); } }, [regenerateFormData?.duration]); const handleRegenerateKey = async () => { if (!selectedToken || !accessToken) return; setIsRegenerating(true); try { const formValues = await form.validateFields(); const response = await regenerateKeyCall(accessToken, selectedToken.token, formValues); setRegeneratedKey(response.key); message.success("API Key regenerated successfully"); } catch (error) { console.error("Error regenerating key:", error); message.error("Failed to regenerate API Key"); setIsRegenerating(false); // Reset regenerating state on error } }; const handleClose = () => { setRegeneratedKey(null); setIsRegenerating(false); form.resetFields(); onClose(); }; return ( Close , ] : [ , , ]} > {regeneratedKey ? ( Regenerated Key

Please replace your old key with the new key generated. For security reasons, you will not be able to view it again{" "} through your LiteLLM account. If you lose this secret key, you will need to generate a new one.

Key Alias:
                {selectedToken?.key_alias || "No alias set"}
              
New API Key:
{regeneratedKey}
message.success("API Key copied to clipboard")} >
) : (
{ if ("duration" in changedValues) { setRegenerateFormData((prev: { duration?: string }) => ({ ...prev, duration: changedValues.duration })); } }} >
Current expiry: {selectedToken?.expires ? new Date(selectedToken.expires).toLocaleString() : "Never"}
{newExpiryTime && (
New expiry: {newExpiryTime}
)}
)}
); }