2019-05-15 12:11:58 +02:00
|
|
|
import PropTypes from 'prop-types';
|
|
|
|
import React from 'react';
|
|
|
|
import format from 'date-fns/format';
|
|
|
|
import distanceInWordsToNow from 'date-fns/distance_in_words_to_now';
|
|
|
|
import orderBy from 'lodash/orderBy';
|
|
|
|
|
|
|
|
import { APIKeyPropType } from './APIKeyForm';
|
|
|
|
|
2020-04-30 00:34:37 +02:00
|
|
|
import TrashCanIcon from '../../../images/trash-can.svg';
|
2019-05-15 12:11:58 +02:00
|
|
|
|
|
|
|
function APIKeyList({ apiKeys, onRemove }) {
|
|
|
|
return (
|
|
|
|
<table className="api-key-list">
|
|
|
|
<thead>
|
|
|
|
<tr>
|
|
|
|
<th>Name</th>
|
|
|
|
<th>Created on</th>
|
|
|
|
<th>Last used</th>
|
|
|
|
<th>Actions</th>
|
|
|
|
</tr>
|
|
|
|
</thead>
|
|
|
|
<tbody>
|
|
|
|
{orderBy(apiKeys, ['createdAt'], ['desc']).map((key) => {
|
2019-05-15 16:25:58 +02:00
|
|
|
const lastUsed = key.lastUsedAt ?
|
|
|
|
distanceInWordsToNow(new Date(key.lastUsedAt), { addSuffix: true }) :
|
|
|
|
'Never';
|
2019-05-15 12:11:58 +02:00
|
|
|
|
|
|
|
return (
|
|
|
|
<tr key={key.id}>
|
|
|
|
<td>{key.label}</td>
|
|
|
|
<td>{format(new Date(key.createdAt), 'MMM D, YYYY h:mm A')}</td>
|
2019-05-15 12:28:18 +02:00
|
|
|
<td>{lastUsed}</td>
|
2019-05-15 12:11:58 +02:00
|
|
|
<td className="api-key-list__action">
|
2020-05-06 01:03:58 +02:00
|
|
|
<button
|
|
|
|
className="api-key-list__delete-button"
|
|
|
|
onClick={() => onRemove(key)}
|
|
|
|
aria-label="Delete API Key"
|
|
|
|
>
|
|
|
|
<TrashCanIcon focusable="false" aria-hidden="true" />
|
2019-05-15 12:11:58 +02:00
|
|
|
</button>
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
);
|
|
|
|
})}
|
|
|
|
</tbody>
|
|
|
|
</table>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
APIKeyList.propTypes = {
|
|
|
|
apiKeys: PropTypes.arrayOf(PropTypes.shape(APIKeyPropType)).isRequired,
|
|
|
|
onRemove: PropTypes.func.isRequired,
|
|
|
|
};
|
|
|
|
|
|
|
|
export default APIKeyList;
|