1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-07-12 13:48:35 +02:00
unleash.unleash/frontend/src/page/admin/api/api-key-list.jsx
Fredrik Strand Oseberg 10eabb366f Offline mode (#312)
* move all icons to offline mode

* Reorder imports

* revert yarn.lock to original

* resolve errors

* use ConditionalRender, revert material icon css

* add all other font weights

* fix: add library icon

Co-authored-by: Aneesh Relan <aneesh.r@lucideustech.com>
2021-06-29 10:21:54 +02:00

170 lines
6.3 KiB
JavaScript

/* eslint-disable no-alert */
import React, { useContext, useEffect, useState } from 'react';
import PropTypes from 'prop-types';
import {
Table,
TableHead,
TableBody,
TableRow,
TableCell,
IconButton,
} from '@material-ui/core';
import { Delete } from '@material-ui/icons';
import { Alert } from '@material-ui/lab';
import { formatFullDateTimeWithLocale } from '../../../component/common/util';
import CreateApiKey from './api-key-create';
import Secret from './secret';
import ConditionallyRender from '../../../component/common/ConditionallyRender/ConditionallyRender';
import Dialogue from '../../../component/common/Dialogue/Dialogue';
import AccessContext from '../../../contexts/AccessContext';
import {
DELETE_API_TOKEN,
CREATE_API_TOKEN,
} from '../../../component/AccessProvider/permissions';
import PageContent from '../../../component/common/PageContent';
import HeaderTitle from '../../../component/common/HeaderTitle';
function ApiKeyList({
location,
fetchApiKeys,
removeKey,
addKey,
keys,
unleashUrl,
}) {
const [show, setShow] = useState(false);
const { hasAccess } = useContext(AccessContext);
const [showDelete, setShowDelete] = useState(false);
const [delKey, setDelKey] = useState(undefined);
const deleteKey = async () => {
await removeKey(delKey);
setDelKey(undefined);
setShowDelete(false);
};
useEffect(() => {
fetchApiKeys();
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
return (
<PageContent
headerContent={
<HeaderTitle
title="API Access"
actions={
<ConditionallyRender
condition={hasAccess(CREATE_API_TOKEN)}
show={
<CreateApiKey
addKey={addKey}
setShow={setShow}
show={show}
/>
}
/>
}
/>
}
>
<div>
<Alert severity="info">
<p>
Read the{' '}
<a
href="https://docs.getunleash.io/docs"
target="_blank"
rel="noreferrer"
>
Getting started guide
</a>{' '}
to learn how to connect to the Unleash API from your
application or programmatically. Please note it can take
up to 1 minute before a new API key is activated.
</p>
<br />
<strong>API URL: </strong>{' '}
<pre style={{ display: 'inline' }}>{unleashUrl}/api/</pre>
</Alert>
<br />
<br />
<br />
<Table>
<TableHead>
<TableRow>
<TableCell>Created</TableCell>
<TableCell>Username</TableCell>
<TableCell>Access Type</TableCell>
<TableCell>Secret</TableCell>
<TableCell>Action</TableCell>
</TableRow>
</TableHead>
<TableBody>
{keys.map(item => (
<TableRow key={item.secret}>
<TableCell style={{ textAlign: 'left' }}>
{formatFullDateTimeWithLocale(
item.createdAt,
location.locale
)}
</TableCell>
<TableCell style={{ textAlign: 'left' }}>
{item.username}
</TableCell>
<TableCell style={{ textAlign: 'left' }}>
{item.type}
</TableCell>
<TableCell style={{ textAlign: 'left' }}>
<Secret value={item.secret} />
</TableCell>
<ConditionallyRender
condition={hasAccess(DELETE_API_TOKEN)}
show={
<TableCell
style={{ textAlign: 'right' }}
>
<IconButton
onClick={() => {
setDelKey(item.secret);
setShowDelete(true);
}}
>
<Delete />
</IconButton>
</TableCell>
}
/>
</TableRow>
))}
</TableBody>
</Table>
<Dialogue
open={showDelete}
onClick={deleteKey}
onClose={() => {
setShowDelete(false);
setDelKey(undefined);
}}
title="Really delete API key?"
>
<div>Are you sure you want to delete?</div>
</Dialogue>
</div>
</PageContent>
);
}
ApiKeyList.propTypes = {
location: PropTypes.object,
fetchApiKeys: PropTypes.func.isRequired,
removeKey: PropTypes.func.isRequired,
addKey: PropTypes.func.isRequired,
keys: PropTypes.array.isRequired,
unleashUrl: PropTypes.string,
};
export default ApiKeyList;