import React, { useState, useEffect } from 'react'; import { Table, Tag, Space, Button, Modal, Checkbox, Input, Typography, Row, Col } from 'antd'; import { DeleteOutlined } from '@ant-design/icons'; import format from 'date-fns/format'; import dynamic from 'next/dynamic'; import { fetchData, ACCESS_TOKENS, DELETE_ACCESS_TOKEN, CREATE_ACCESS_TOKEN, } from '../../utils/apis'; const { Title, Paragraph } = Typography; // Lazy loaded components const Tooltip = dynamic(() => import('antd').then(mod => mod.Tooltip), { ssr: false, }); const availableScopes = { CAN_SEND_SYSTEM_MESSAGES: { name: 'System messages', description: 'Can send official messages on behalf of the system.', color: 'purple', }, CAN_SEND_MESSAGES: { name: 'User chat messages', description: 'Can send chat messages on behalf of the owner of this token.', color: 'green', }, HAS_ADMIN_ACCESS: { name: 'Has admin access', description: 'Can perform administrative actions such as moderation, get server statuses, etc.', color: 'red', }, }; function convertScopeStringToTag(scopeString: string) { if (!scopeString || !availableScopes[scopeString]) { return null; } const scope = availableScopes[scopeString]; return ( {scope.name} ); } interface Props { onCancel: () => void; onOk: any; // todo: make better type open: boolean; } const NewTokenModal = (props: Props) => { const { onOk, onCancel, open } = props; const [selectedScopes, setSelectedScopes] = useState([]); const [name, setName] = useState(''); const scopes = Object.keys(availableScopes).map(key => ({ value: key, label: availableScopes[key].description, })); function onChange(checkedValues) { setSelectedScopes(checkedValues); } function saveToken() { onOk(name, selectedScopes); // Clear the modal setSelectedScopes([]); setName(''); } const okButtonProps = { disabled: selectedScopes.length === 0 || name === '', }; function selectAll() { setSelectedScopes(Object.keys(availableScopes)); } const checkboxes = scopes.map(singleEvent => ( {singleEvent.label} )); return (

The name will be displayed as the chat user when sending messages with this access token.

setName(input.currentTarget.value)} />

Select the permissions this access token will have. It cannot be edited after it's created.

{checkboxes}

); }; const AccessTokens = () => { const [tokens, setTokens] = useState([]); const [isTokenModalOpen, setIsTokenModalOpen] = useState(false); function handleError(error) { console.error('error', error); } async function getAccessTokens() { try { const result = await fetchData(ACCESS_TOKENS); setTokens(result); } catch (error) { handleError(error); } } useEffect(() => { getAccessTokens(); }, []); async function handleDeleteToken(token) { try { await fetchData(DELETE_ACCESS_TOKEN, { method: 'POST', data: { token }, }); getAccessTokens(); } catch (error) { handleError(error); } } async function handleSaveToken(name: string, scopes: string[]) { try { const newToken = await fetchData(CREATE_ACCESS_TOKEN, { method: 'POST', data: { name, scopes }, }); setTokens(tokens.concat(newToken)); } catch (error) { handleError(error); } } const columns = [ { title: '', key: 'delete', render: (text, record) => (