import React, { useState, useEffect } from "react"; import { Card, Title, Subtitle, Table, TableHead, TableHeaderCell, TableRow, TableCell, TableBody, Tab, Text, TabGroup, TabList, TabPanels, Metric, Grid, TabPanel, Select, SelectItem, Dialog, DialogPanel, Icon, TextInput, } from "@tremor/react"; import { message } from "antd"; import { Modal } from "antd"; import { userInfoCall, userUpdateUserCall, getPossibleUserRoles, } from "./networking"; import { Badge, BadgeDelta, Button } from "@tremor/react"; import RequestAccess from "./request_model_access"; import CreateUser from "./create_user_button"; import EditUserModal from "./edit_user"; import Paragraph from "antd/es/skeleton/Paragraph"; import { PencilAltIcon, InformationCircleIcon, TrashIcon, } from "@heroicons/react/outline"; import { userDeleteCall } from "./networking"; interface ViewUserDashboardProps { accessToken: string | null; token: string | null; keys: any[] | null; userRole: string | null; userID: string | null; teams: any[] | null; setKeys: React.Dispatch>; } interface UserListResponse { users: any[] | null; total: number; page: number; page_size: number; total_pages: number; } const isLocal = process.env.NODE_ENV === "development"; const proxyBaseUrl = isLocal ? "http://localhost:4000" : null; if (isLocal != true) { console.log = function() {}; } const ViewUserDashboard: React.FC = ({ accessToken, token, keys, userRole, userID, teams, setKeys, }) => { const [userListResponse, setUserListResponse] = useState(null); const [userData, setUserData] = useState(null); const [endUsers, setEndUsers] = useState(null); const [currentPage, setCurrentPage] = useState(1); const [openDialogId, setOpenDialogId] = React.useState(null); const [selectedItem, setSelectedItem] = useState(null); const [editModalVisible, setEditModalVisible] = useState(false); const [selectedUser, setSelectedUser] = useState(null); const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false); const [userToDelete, setUserToDelete] = useState(null); const [possibleUIRoles, setPossibleUIRoles] = useState< Record> >({}); const defaultPageSize = 25; // check if window is not undefined if (typeof window !== "undefined") { window.addEventListener("beforeunload", function () { // Clear session storage sessionStorage.clear(); }); } const handleDelete = (userId: string) => { setUserToDelete(userId); setIsDeleteModalOpen(true); }; const confirmDelete = async () => { if (userToDelete && accessToken) { try { await userDeleteCall(accessToken, [userToDelete]); message.success("User deleted successfully"); // Update the user list after deletion if (userData) { const updatedUserData = userData.filter(user => user.user_id !== userToDelete); setUserData(updatedUserData); } } catch (error) { console.error("Error deleting user:", error); message.error("Failed to delete user"); } } setIsDeleteModalOpen(false); setUserToDelete(null); }; const cancelDelete = () => { setIsDeleteModalOpen(false); setUserToDelete(null); }; const handleEditCancel = async () => { setSelectedUser(null); setEditModalVisible(false); }; const handleEditSubmit = async (editedUser: any) => { console.log("inside handleEditSubmit:", editedUser); if (!accessToken || !token || !userRole || !userID) { return; } try { await userUpdateUserCall(accessToken, editedUser, null); message.success(`User ${editedUser.user_id} updated successfully`); } catch (error) { console.error("There was an error updating the user", error); } if (userData) { const updatedUserData = userData.map((user) => user.user_id === editedUser.user_id ? editedUser : user ); setUserData(updatedUserData); } setSelectedUser(null); setEditModalVisible(false); // Close the modal }; useEffect(() => { if (!accessToken || !token || !userRole || !userID) { return; } const fetchData = async () => { try { // Check session storage first const cachedUserData = sessionStorage.getItem(`userList_${currentPage}`); if (cachedUserData) { const parsedData = JSON.parse(cachedUserData); setUserListResponse(parsedData); setUserData(parsedData.users || []); } else { // Fetch from API if not in cache const userDataResponse = await userInfoCall( accessToken, null, userRole, true, currentPage, defaultPageSize ); // Store in session storage sessionStorage.setItem( `userList_${currentPage}`, JSON.stringify(userDataResponse) ); setUserListResponse(userDataResponse); setUserData(userDataResponse.users || []); } // Fetch roles if not cached const cachedRoles = sessionStorage.getItem('possibleUserRoles'); if (cachedRoles) { setPossibleUIRoles(JSON.parse(cachedRoles)); } else { const availableUserRoles = await getPossibleUserRoles(accessToken); sessionStorage.setItem('possibleUserRoles', JSON.stringify(availableUserRoles)); setPossibleUIRoles(availableUserRoles); } } catch (error) { console.error("There was an error fetching the model data", error); } }; if (accessToken && token && userRole && userID) { fetchData(); } }, [accessToken, token, userRole, userID, currentPage]); if (!userData) { return
Loading...
; } if (!accessToken || !token || !userRole || !userID) { return
Loading...
; } function renderPagination() { if (!userData) return null; const totalPages = userListResponse?.total_pages || 0; const handlePageChange = (newPage: number) => { setUserData([]); // Clear current users setCurrentPage(newPage); }; return (
Showing Page {currentPage } of {totalPages}
); } return (
User ID User Email Role User Spend ($ USD) User Max Budget ($ USD) API Keys {userData.map((user: any) => ( {user.user_id || "-"} {user.user_email || "-"} {possibleUIRoles?.[user?.user_role]?.ui_label || "-"} {user.spend ? user.spend?.toFixed(2) : "-"} {user.max_budget !== null ? user.max_budget : "Unlimited"} {user.key_count > 0 ? ( {user.key_count} Keys ) : ( No Keys )} {/* {user.key_aliases.filter(key => key !== null).length} Keys */} { setSelectedUser(user); setEditModalVisible(true); }} > View Keys handleDelete(user.user_id)} > Delete ))}
{isDeleteModalOpen && (
{/* Modal Panel */} {/* Confirmation Modal Content */}

Delete User

Are you sure you want to delete this user?

User ID: {userToDelete}

)}
{renderPagination()}
); }; export default ViewUserDashboard;