import React, { useState } from "react"; import { Card, Text, Button, Grid, Col, Tab, TabList, TabGroup, TabPanel, TabPanels, Title, Badge, } from "@tremor/react"; import { ArrowLeftIcon, TrashIcon } from "@heroicons/react/outline"; import { userInfoCall, userDeleteCall, userUpdateUserCall, modelAvailableCall } from "../networking"; import { message } from "antd"; import { rolesWithWriteAccess } from '../../utils/roles'; import { UserEditView } from "../user_edit_view"; interface UserInfoViewProps { userId: string; onClose: () => void; accessToken: string | null; userRole: string | null; onDelete?: () => void; possibleUIRoles: Record> | null; } interface UserInfo { user_id: string; user_info: { user_email: string | null; user_role: string | null; teams: any[] | null; models: string[] | null; max_budget: number | null; spend: number | null; metadata: Record | null; created_at: string | null; updated_at: string | null; }; keys: any[] | null; teams: any[] | null; } export default function UserInfoView({ userId, onClose, accessToken, userRole, onDelete, possibleUIRoles }: UserInfoViewProps) { const [userData, setUserData] = useState(null); const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false); const [isLoading, setIsLoading] = useState(true); const [isEditing, setIsEditing] = useState(false); const [userModels, setUserModels] = useState([]); React.useEffect(() => { console.log(`userId: ${userId}, userRole: ${userRole}, accessToken: ${accessToken}`) const fetchData = async () => { try { if (!accessToken) return; const data = await userInfoCall(accessToken, userId, userRole || "", false, null, null, true); setUserData(data); // Fetch available models const modelDataResponse = await modelAvailableCall(accessToken, userId, userRole || ""); const availableModels = modelDataResponse.data.map((model: any) => model.id); setUserModels(availableModels); } catch (error) { console.error("Error fetching user data:", error); message.error("Failed to fetch user data"); } finally { setIsLoading(false); } }; fetchData(); }, [accessToken, userId, userRole]); const handleDelete = async () => { try { if (!accessToken) return; await userDeleteCall(accessToken, [userId]); message.success("User deleted successfully"); if (onDelete) { onDelete(); } onClose(); } catch (error) { console.error("Error deleting user:", error); message.error("Failed to delete user"); } }; const handleUserUpdate = async (formValues: Record) => { try { if (!accessToken || !userData) return; const response = await userUpdateUserCall(accessToken, formValues, null); // Update local state with new values setUserData({ ...userData, user_info: { ...userData.user_info, user_email: formValues.user_email, models: formValues.models, max_budget: formValues.max_budget, metadata: formValues.metadata, } }); message.success("User updated successfully"); setIsEditing(false); } catch (error) { console.error("Error updating user:", error); message.error("Failed to update user"); } }; if (isLoading) { return (
Loading user data...
); } if (!userData) { return (
User not found
); } return (
{userData.user_info?.user_email || "User"} {userData.user_id}
{userRole && rolesWithWriteAccess.includes(userRole) && ( )}
{/* Delete Confirmation Modal */} {isDeleteModalOpen && (

Delete User

Are you sure you want to delete this user?

)} Overview Details {/* Overview Panel */} Spend
${Number(userData.user_info?.spend || 0).toFixed(4)} of {userData.user_info?.max_budget !== null ? `$${userData.user_info.max_budget}` : "Unlimited"}
Teams
{userData.teams?.length || 0} teams
API Keys
{userData.keys?.length || 0} keys
Personal Models
{userData.user_info?.models?.length && userData.user_info?.models?.length > 0 ? ( userData.user_info?.models?.map((model, index) => ( {model} )) ) : ( All proxy models )}
{/* Details Panel */}
User Settings {!isEditing && userRole && rolesWithWriteAccess.includes(userRole) && ( )}
{isEditing && userData ? ( setIsEditing(false)} onSubmit={handleUserUpdate} teams={userData.teams} accessToken={accessToken} userID={userId} userRole={userRole} userModels={userModels} possibleUIRoles={possibleUIRoles} /> ) : (
User ID {userData.user_id}
Email {userData.user_info?.user_email || "Not Set"}
Role {userData.user_info?.user_role || "Not Set"}
Created {userData.user_info?.created_at ? new Date(userData.user_info.created_at).toLocaleString() : "Unknown"}
Last Updated {userData.user_info?.updated_at ? new Date(userData.user_info.updated_at).toLocaleString() : "Unknown"}
Teams
{userData.teams?.length && userData.teams?.length > 0 ? ( userData.teams?.map((team, index) => ( {team.team_alias || team.team_id} )) ) : ( No teams )}
Models
{userData.user_info?.models?.length && userData.user_info?.models?.length > 0 ? ( userData.user_info?.models?.map((model, index) => ( {model} )) ) : ( All proxy models )}
API Keys
{userData.keys?.length && userData.keys?.length > 0 ? ( userData.keys.map((key, index) => ( {key.key_alias || key.token} )) ) : ( No API keys )}
Metadata
                      {JSON.stringify(userData.user_info?.metadata || {}, null, 2)}
                    
)}
); }