import AddIcon from "@mui/icons-material/Add"; import RefreshIcon from "@mui/icons-material/Refresh"; import { Alert, AlertTitle, IconButton, Tooltip } from "@mui/material"; import type { GridColDef } from "@mui/x-data-grid"; import { DataGrid, GridActionsCellItem } from "@mui/x-data-grid"; import { QRCodeCanvas } from "qrcode.react"; import React from "react"; import { APIClient } from "../api/ApiClient"; import { TokensApi, type Token, type TokenWithSecret } from "../api/TokensApi"; import { CreateTokenDialog } from "../dialogs/CreateTokenDialog"; import { AsyncWidget } from "../widgets/AsyncWidget"; import { CopyTextChip } from "../widgets/CopyTextChip"; import { MatrixGWRouteContainer } from "../widgets/MatrixGWRouteContainer"; import { TimeWidget } from "../widgets/TimeWidget"; import DeleteIcon from "@mui/icons-material/DeleteOutlined"; import { useSnackbar } from "../hooks/contexts_provider/SnackbarProvider"; import { useConfirm } from "../hooks/contexts_provider/ConfirmDialogProvider"; import { useAlert } from "../hooks/contexts_provider/AlertDialogProvider"; import { time } from "../utils/DateUtils"; export function APITokensRoute(): React.ReactElement { const count = React.useRef(0); const [openCreateTokenDialog, setOpenCreateTokenDialog] = React.useState(false); const [createdToken, setCreatedToken] = React.useState(null); const [list, setList] = React.useState(); const load = async () => { setList(await TokensApi.GetList()); }; const handleRefreshTokensList = () => { count.current += 1; setList(undefined); }; const handleOpenCreateTokenDialog = () => setOpenCreateTokenDialog(true); const handleCancelCreateToken = () => setOpenCreateTokenDialog(false); const handleCreatedToken = (s: TokenWithSecret) => { setCreatedToken(s); setOpenCreateTokenDialog(false); handleRefreshTokensList(); }; return (    } > {/* Create token dialog anchor */} {/* Info about created token */} {createdToken && } {/* Tokens list */} ( )} /> ); } function CreatedToken(p: { token: TokenWithSecret }): React.ReactElement { return (

Mobile App Qr Code
Token successfully created The API token {p.token.name} was successfully created. Please note the following information as they won't be available after.

API URL:
Token ID:
Token secret:
); } function TokensListGrid(p: { list: Token[]; onReload: () => void; }): React.ReactElement { const snackbar = useSnackbar(); const confirm = useConfirm(); const alert = useAlert(); // Delete a token const handleDeleteClick = (token: Token) => async () => { try { if ( !(await confirm( `Do you really want to delete the token named '${token.name}' ?` )) ) return; await TokensApi.Delete(token); p.onReload(); snackbar("The token was successfully deleted!"); } catch (e) { console.error(e); alert(`Failed to delete API token! ${e}`); } }; const columns: GridColDef<(typeof p.list)[number]>[] = [ { field: "id", headerName: "ID", flex: 1 }, { field: "name", headerName: "Name", flex: 3, }, { field: "networks", headerName: "Networks restriction", flex: 3, renderCell(params) { return ( params.row.networks?.join(", ") ?? ( Unrestricted ) ); }, }, { field: "created", headerName: "Creation", flex: 3, renderCell(params) { return ; }, }, { field: "last_used", headerName: "Last usage", flex: 3, renderCell(params) { return ( ); }, }, { field: "max_inactivity", headerName: "Max inactivity", flex: 3, renderCell(params) { return ( ); }, }, { field: "expiration", headerName: "Expiration", flex: 3, renderCell(params) { return ( ); }, }, { field: "read_only", headerName: "Read only", flex: 2, type: "boolean", }, { field: "actions", type: "actions", headerName: "Actions", flex: 2, cellClassName: "actions", getActions: ({ row }) => { return [ } label="Delete" onClick={handleDeleteClick(row)} color="inherit" />, ]; }, }, ]; if (p.list.length === 0) return (
You do not have created any token yet!
); return ( c.id} isCellEditable={() => false} isRowSelectable={() => false} /> ); }