import { useEffect, useState } from 'react' import { useDispatch, useSelector } from 'react-redux' import { enqueueSnackbar as enqueueSnackbarAction, closeSnackbar as closeSnackbarAction } from '@/store/actions' // material-ui import { Button, Box, Chip, Stack, Table, TableBody, TableContainer, TableHead, TableRow, Paper, IconButton, Popover, Collapse, Typography, Toolbar, TextField, InputAdornment, ButtonGroup } from '@mui/material' import TableCell, { tableCellClasses } from '@mui/material/TableCell' import { useTheme, styled } from '@mui/material/styles' // project imports import MainCard from '@/ui-component/cards/MainCard' import { StyledButton } from '@/ui-component/button/StyledButton' import APIKeyDialog from './APIKeyDialog' import ConfirmDialog from '@/ui-component/dialog/ConfirmDialog' // API import apiKeyApi from '@/api/apikey' // Hooks import useApi from '@/hooks/useApi' import useConfirm from '@/hooks/useConfirm' // utils import useNotifier from '@/utils/useNotifier' // Icons import { IconTrash, IconEdit, IconCopy, IconChevronsUp, IconChevronsDown, IconX, IconSearch, IconPlus, IconEye, IconEyeOff } from '@tabler/icons' import APIEmptySVG from '@/assets/images/api_empty.svg' import * as PropTypes from 'prop-types' import moment from 'moment/moment' // ==============================|| APIKey ||============================== // const StyledTableCell = styled(TableCell)(({ theme }) => ({ [`&.${tableCellClasses.head}`]: { backgroundColor: theme.palette.action.hover } })) const StyledTableRow = styled(TableRow)(() => ({ // hide last border '&:last-child td, &:last-child th': { border: 0 } })) function APIKeyRow(props) { const [open, setOpen] = useState(false) return ( <> {props.apiKey.keyName} {props.showApiKeys.includes(props.apiKey.apiKey) ? props.apiKey.apiKey : `${props.apiKey.apiKey.substring(0, 2)}${'•'.repeat(18)}${props.apiKey.apiKey.substring( props.apiKey.apiKey.length - 5 )}`} {props.showApiKeys.includes(props.apiKey.apiKey) ? : } Copied! {props.apiKey.chatFlows.length}{' '} {props.apiKey.chatFlows.length > 0 && ( setOpen(!open)}> {props.apiKey.chatFlows.length > 0 && open ? : } )} {props.apiKey.createdAt} {open && ( Chatflow Name Modified On Category {props.apiKey.chatFlows.map((flow, index) => ( {flow.flowName} {moment(flow.updatedDate).format('DD-MMM-YY')}   {flow.category && flow.category .split(';') .map((tag, index) => ( ))} ))}
)} ) } APIKeyRow.propTypes = { apiKey: PropTypes.any, showApiKeys: PropTypes.arrayOf(PropTypes.any), onCopyClick: PropTypes.func, onShowAPIClick: PropTypes.func, open: PropTypes.bool, anchorEl: PropTypes.any, onClose: PropTypes.func, theme: PropTypes.any, onEditClick: PropTypes.func, onDeleteClick: PropTypes.func } const APIKey = () => { const theme = useTheme() const customization = useSelector((state) => state.customization) const dispatch = useDispatch() useNotifier() const enqueueSnackbar = (...args) => dispatch(enqueueSnackbarAction(...args)) const closeSnackbar = (...args) => dispatch(closeSnackbarAction(...args)) const [showDialog, setShowDialog] = useState(false) const [dialogProps, setDialogProps] = useState({}) const [apiKeys, setAPIKeys] = useState([]) const [anchorEl, setAnchorEl] = useState(null) const [showApiKeys, setShowApiKeys] = useState([]) const openPopOver = Boolean(anchorEl) const [search, setSearch] = useState('') const onSearchChange = (event) => { setSearch(event.target.value) } function filterKeys(data) { return data.keyName.toLowerCase().indexOf(search.toLowerCase()) > -1 } const { confirm } = useConfirm() const getAllAPIKeysApi = useApi(apiKeyApi.getAllAPIKeys) const onShowApiKeyClick = (apikey) => { const index = showApiKeys.indexOf(apikey) if (index > -1) { //showApiKeys.splice(index, 1) const newShowApiKeys = showApiKeys.filter(function (item) { return item !== apikey }) setShowApiKeys(newShowApiKeys) } else { setShowApiKeys((prevkeys) => [...prevkeys, apikey]) } } const handleClosePopOver = () => { setAnchorEl(null) } const addNew = () => { const dialogProp = { title: 'Add New API Key', type: 'ADD', cancelButtonName: 'Cancel', confirmButtonName: 'Add' } setDialogProps(dialogProp) setShowDialog(true) } const edit = (key) => { const dialogProp = { title: 'Edit API Key', type: 'EDIT', cancelButtonName: 'Cancel', confirmButtonName: 'Save', key } setDialogProps(dialogProp) setShowDialog(true) } const deleteKey = async (key) => { const confirmPayload = { title: `Delete`, description: key.chatFlows.length === 0 ? `Delete key [${key.keyName}] ? ` : `Delete key [${key.keyName}] ?\n There are ${key.chatFlows.length} chatflows using this key.`, confirmButtonName: 'Delete', cancelButtonName: 'Cancel' } const isConfirmed = await confirm(confirmPayload) if (isConfirmed) { try { const deleteResp = await apiKeyApi.deleteAPI(key.id) if (deleteResp.data) { enqueueSnackbar({ message: 'API key deleted', options: { key: new Date().getTime() + Math.random(), variant: 'success', action: (key) => ( ) } }) onConfirm() } } catch (error) { const errorData = error.response.data || `${error.response.status}: ${error.response.statusText}` enqueueSnackbar({ message: `Failed to delete API key: ${errorData}`, options: { key: new Date().getTime() + Math.random(), variant: 'error', persist: true, action: (key) => ( ) } }) onCancel() } } } const onConfirm = () => { setShowDialog(false) getAllAPIKeysApi.request() } useEffect(() => { getAllAPIKeysApi.request() // eslint-disable-next-line react-hooks/exhaustive-deps }, []) useEffect(() => { if (getAllAPIKeysApi.data) { setAPIKeys(getAllAPIKeysApi.data) } }, [getAllAPIKeysApi.data]) return ( <>

API Keys 

) }} /> } > Create Key
{apiKeys.length <= 0 && ( APIEmptySVG
No API Keys Yet
)} {apiKeys.length > 0 && ( Key Name API Key Usage Created {apiKeys.filter(filterKeys).map((key, index) => ( { navigator.clipboard.writeText(key.apiKey) setAnchorEl(event.currentTarget) setTimeout(() => { handleClosePopOver() }, 1500) }} onShowAPIClick={() => onShowApiKeyClick(key.apiKey)} open={openPopOver} anchorEl={anchorEl} onClose={handleClosePopOver} theme={theme} onEditClick={() => edit(key)} onDeleteClick={() => deleteKey(key)} /> ))}
)}
setShowDialog(false)} onConfirm={onConfirm} > ) } export default APIKey