From 5c15e21a0562618a2424d3f8ff3af9ef5d4e468c Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Fri, 6 Sep 2024 10:34:50 -0700 Subject: [PATCH] ui allow rotating keys --- .../src/components/view_key_table.tsx | 76 +++++++++++-------- 1 file changed, 43 insertions(+), 33 deletions(-) diff --git a/ui/litellm-dashboard/src/components/view_key_table.tsx b/ui/litellm-dashboard/src/components/view_key_table.tsx index 4116e033b..d22e844d4 100644 --- a/ui/litellm-dashboard/src/components/view_key_table.tsx +++ b/ui/litellm-dashboard/src/components/view_key_table.tsx @@ -1,6 +1,7 @@ "use client"; import React, { useEffect, useState } from "react"; import { keyDeleteCall, modelAvailableCall } from "./networking"; +import { add } from 'date-fns'; import { InformationCircleIcon, StatusOnlineIcon, TrashIcon, PencilAltIcon, RefreshIcon } from "@heroicons/react/outline"; import { keySpendLogsCall, PredictedSpendLogsCall, keyUpdateCall, modelInfoCall, regenerateKeyCall } from "./networking"; import { @@ -124,33 +125,10 @@ const ViewKeyTable: React.FC = ({ const [regeneratedKey, setRegeneratedKey] = useState(null); const [regenerateFormData, setRegenerateFormData] = useState(null); const [regenerateForm] = Form.useForm(); + const [newExpiryTime, setNewExpiryTime] = useState(null); const [knownTeamIDs, setKnownTeamIDs] = useState(initialKnownTeamIDs); - useEffect(() => { - const fetchUserModels = async () => { - try { - if (userID === null) { - return; - } - - if (accessToken !== null && userRole !== null) { - const model_available = await modelAvailableCall(accessToken, userID, userRole); - let available_model_names = model_available["data"].map( - (element: { id: string }) => element.id - ); - console.log("available_model_names:", available_model_names); - setUserModels(available_model_names); - } - } catch (error) { - console.error("Error fetching user models:", error); - } - }; - - fetchUserModels(); - }, [accessToken, userID, userRole]); - - const [newExpiryTime, setNewExpiryTime] = useState(null); useEffect(() => { if (regenerateFormData?.duration) { @@ -186,6 +164,32 @@ const ViewKeyTable: React.FC = ({ } }, [regenerateFormData?.duration]); + + + useEffect(() => { + const fetchUserModels = async () => { + try { + if (userID === null) { + return; + } + + if (accessToken !== null && userRole !== null) { + const model_available = await modelAvailableCall(accessToken, userID, userRole); + let available_model_names = model_available["data"].map( + (element: { id: string }) => element.id + ); + console.log("available_model_names:", available_model_names); + setUserModels(available_model_names); + } + } catch (error) { + console.error("Error fetching user models:", error); + } + }; + + fetchUserModels(); + }, [accessToken, userID, userRole]); + + const handleModelLimitClick = (token: ItemData) => { setSelectedToken(token); setModelLimitModalVisible(true); @@ -1159,7 +1163,15 @@ const ViewKeyTable: React.FC = ({ ]} > {premiumUser ? ( -
+ { + if ('duration' in changedValues) { + handleRegenerateFormChange('duration', changedValues.duration); + } + }} + > @@ -1182,19 +1194,17 @@ const ViewKeyTable: React.FC = ({
Current expiry: { selectedToken?.expires != null ? ( - new Date(selectedToken.expires).toLocaleString(undefined, { - day: 'numeric', - month: 'long', - year: 'numeric', - hour: 'numeric', - minute: 'numeric', - second: 'numeric' - }) + new Date(selectedToken.expires).toLocaleString() ) : ( 'Never' ) }
+ {newExpiryTime && ( +
+ New expiry: {newExpiryTime} +
+ )} ) : (