import React, { useState, useEffect, useCallback, useRef } from "react"; import { Tab, TabGroup, TabList, TabPanels, TabPanel, Select, SelectItem, } from "@tremor/react"; import { message } from "antd"; import { userInfoCall, userUpdateUserCall, getPossibleUserRoles, userListCall, UserListResponse, } from "./networking"; import { Button } from "@tremor/react"; import CreateUser from "./create_user_button"; import EditUserModal from "./edit_user"; import { userDeleteCall } from "./networking"; import { columns } from "./view_users/columns"; import { UserDataTable } from "./view_users/table"; import { UserInfo } from "./view_users/types"; import SSOSettings from "./SSOSettings"; import debounce from "lodash/debounce"; import { useQuery, useQueryClient } from "@tanstack/react-query"; import { updateExistingKeys } from "@/utils/dataUtils"; import { useDebouncedState } from '@tanstack/react-pacer/debouncer' interface ViewUserDashboardProps { accessToken: string | null; token: string | null; keys: any[] | null; userRole: string | null; userID: string | null; teams: any[] | null; setKeys: React.Dispatch>; } interface FilterState { email: string; user_id: string; user_role: string; sso_user_id: string; team: string; model: string; min_spend: number | null; max_spend: number | null; sort_by: string; sort_order: 'asc' | 'desc'; } const isLocal = process.env.NODE_ENV === "development"; const proxyBaseUrl = isLocal ? "http://localhost:4000" : null; if (isLocal != true) { console.log = function() {}; } const DEFAULT_PAGE_SIZE = 25; const initialFilters: FilterState = { email: "", user_id: "", user_role: "", sso_user_id: "", team: "", model: "", min_spend: null, max_spend: null, sort_by: "created_at", sort_order: "desc" } const ViewUserDashboard: React.FC = ({ accessToken, token, userRole, userID, teams, }) => { const queryClient = useQueryClient(); const [currentPage, setCurrentPage] = useState(1); const [editModalVisible, setEditModalVisible] = useState(false); const [selectedUser, setSelectedUser] = useState(null); const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false); const [userToDelete, setUserToDelete] = useState(null); const [activeTab, setActiveTab] = useState("users"); const [filters, setFilters] = useState(initialFilters); const [debouncedFilters, setDebouncedFilters, debouncer] = useDebouncedState(filters, { wait: 300 }) const [showFilters, setShowFilters] = useState(false); const handleDelete = (userId: string) => { setUserToDelete(userId); setIsDeleteModalOpen(true); }; useEffect(() => { return () => { debouncer.cancel() } }, [debouncer]) const updateFilters = (update: Partial) => { setFilters((previousFilters) => { const newFilters = {...previousFilters, ...update }; setDebouncedFilters(newFilters); return newFilters; }) }; const handleSortChange = (sortBy: string, sortOrder: 'asc' | 'desc') => { updateFilters({ sort_by: sortBy, sort_order: sortOrder }); }; const confirmDelete = async () => { if (userToDelete && accessToken) { try { await userDeleteCall(accessToken, [userToDelete]); // Update the user list after deletion queryClient.setQueriesData({ queryKey: ['userList'] }, (previousData) => { if (previousData === undefined) return previousData; const updatedUsers = previousData.users.filter(user => user.user_id !== userToDelete); return { ...previousData, users: updatedUsers }; }) message.success("User deleted successfully"); } 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 { const response = await userUpdateUserCall(accessToken, editedUser, null); queryClient.setQueriesData({ queryKey: ['userList'] }, (previousData) => { if (previousData === undefined) return previousData; const updatedUsers = previousData.users.map(user => { if (user.user_id === response.data.user_id) { return updateExistingKeys(user, response.data); } return user; }); return { ...previousData, users: updatedUsers }; }) message.success(`User ${editedUser.user_id} updated successfully`); } catch (error) { console.error("There was an error updating the user", error); } setSelectedUser(null); setEditModalVisible(false); // Close the modal }; const handlePageChange = async (newPage: number) => { setCurrentPage(newPage); }; const userListQuery = useQuery({ queryKey: ['userList', { debouncedFilter: debouncedFilters, currentPage }], queryFn: async () => { if (!accessToken) throw new Error('Access token required'); return await userListCall( accessToken, debouncedFilters.user_id ? [debouncedFilters.user_id] : null, currentPage, DEFAULT_PAGE_SIZE, debouncedFilters.email || null, debouncedFilters.user_role || null, debouncedFilters.team || null, debouncedFilters.sso_user_id || null, debouncedFilters.sort_by, debouncedFilters.sort_order ); }, enabled: Boolean(accessToken && token && userRole && userID), placeholderData: (previousData) => previousData }); const userListResponse = userListQuery.data const userRolesQuery = useQuery>>({ queryKey: ['userRoles'], initialData: () => ({}), queryFn: async () => { if (!accessToken) throw new Error('Access token required'); return await getPossibleUserRoles(accessToken); }, enabled: Boolean(accessToken && token && userRole && userID), }); const possibleUIRoles = userRolesQuery.data if (userListQuery.isLoading) { return
Loading...
} if (!accessToken || !token || !userRole || !userID) { return
Loading...
; } const tableColumns = columns( possibleUIRoles, (user) => { setSelectedUser(user); setEditModalVisible(true); }, handleDelete ); return (

Users

setActiveTab(index === 0 ? "users" : "settings")}> Users Default User Settings
{/* Search and Filter Controls */}
{/* Email Search */}
updateFilters({ email: e.target.value })} />
{/* Filter Button */} {/* Reset Filters Button */}
{/* Additional Filters */} {showFilters && (
{/* User ID Search */}
updateFilters({ user_id : e.target.value })} />
{/* Role Dropdown */}
{/* Team Dropdown */}
{/* SSO ID Search */}
updateFilters({ sso_user_id : e.target.value })} />
)} {/* Results Count and Pagination */}
Showing{" "} {userListResponse && userListResponse.users && userListResponse.users.length > 0 ? (userListResponse.page - 1) * userListResponse.page_size + 1 : 0}{" "} -{" "} {userListResponse && userListResponse.users ? Math.min( userListResponse.page * userListResponse.page_size, userListResponse.total ) : 0}{" "} of {userListResponse ? userListResponse.total : 0} results {/* Pagination Buttons */}
{/* Existing Modals */} {/* Delete Confirmation Modal */} {isDeleteModalOpen && (
{/* Modal Panel */} {/* Confirmation Modal Content */}

Delete User

Are you sure you want to delete this user?

User ID: {userToDelete}

)}
); }; export default ViewUserDashboard;