2021-09-21 14:58:13 +00:00
|
|
|
import React, { useState, useEffect, useLayoutEffect } from "react";
|
|
|
|
import TokensList from "../../src/components/TokensList";
|
|
|
|
import TokenRequest from "../../src/components/TokenRequest";
|
|
|
|
import { useTokens } from "../../src/core/hooks";
|
|
|
|
import {
|
|
|
|
VStack,
|
|
|
|
Box,
|
|
|
|
Center,
|
|
|
|
Spinner,
|
|
|
|
ScaleFade,
|
|
|
|
Button,
|
|
|
|
Heading,
|
2021-09-21 18:37:23 +00:00
|
|
|
useDisclosure,
|
|
|
|
Modal,
|
|
|
|
ModalOverlay,
|
|
|
|
ModalContent,
|
|
|
|
ModalHeader,
|
|
|
|
ModalBody,
|
|
|
|
ModalCloseButton,
|
2021-09-21 14:58:13 +00:00
|
|
|
} from "@chakra-ui/react";
|
|
|
|
import { getLayout } from "../../src/layouts/AccountLayout";
|
|
|
|
|
|
|
|
const Tokens = () => {
|
2021-09-21 18:37:23 +00:00
|
|
|
const { onOpen, onClose, isOpen } = useDisclosure();
|
2021-09-21 14:58:13 +00:00
|
|
|
const [newToken, setNewToken] = useState(null);
|
|
|
|
const [tokens, setTokens] = useState();
|
|
|
|
const { list, update, revoke, isLoading, data } = useTokens();
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
list();
|
|
|
|
//eslint-disable-next-line
|
|
|
|
}, []);
|
|
|
|
|
|
|
|
useLayoutEffect(() => {
|
|
|
|
if (newToken) {
|
|
|
|
const newData = { ...tokens };
|
|
|
|
newData.token.push(newToken);
|
|
|
|
setTokens(newData);
|
|
|
|
setNewToken(null);
|
|
|
|
}
|
|
|
|
}, [newToken, list, data, tokens]);
|
|
|
|
|
|
|
|
useLayoutEffect(() => {
|
|
|
|
if (data?.data?.user_id) {
|
|
|
|
setTokens(data.data);
|
|
|
|
}
|
|
|
|
}, [data?.data, isLoading]);
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
document.title = `Tokens`;
|
|
|
|
}, []);
|
|
|
|
|
|
|
|
return (
|
|
|
|
<Box>
|
|
|
|
{isLoading && !tokens ? (
|
|
|
|
<Center>
|
|
|
|
<Spinner
|
|
|
|
hidden={false}
|
|
|
|
my={8}
|
|
|
|
size="lg"
|
2021-09-21 18:37:23 +00:00
|
|
|
color="blue.500"
|
2021-09-21 14:58:13 +00:00
|
|
|
thickness="4px"
|
|
|
|
speed="1.5s"
|
|
|
|
/>
|
|
|
|
</Center>
|
|
|
|
) : (
|
|
|
|
<ScaleFade in>
|
2021-09-22 13:45:45 +00:00
|
|
|
<Modal isOpen={isOpen} onClose={onClose} size="lg" trapFocus={false}>
|
2021-09-21 18:37:23 +00:00
|
|
|
<ModalOverlay />
|
|
|
|
<ModalContent>
|
|
|
|
<ModalHeader>New API access token</ModalHeader>
|
|
|
|
<ModalCloseButton />
|
|
|
|
<ModalBody>
|
|
|
|
<TokenRequest setNewToken={setNewToken} onClose={onClose} />
|
|
|
|
</ModalBody>
|
|
|
|
</ModalContent>
|
|
|
|
</Modal>
|
2021-09-21 14:58:13 +00:00
|
|
|
<Heading variant="tokensScreen"> My access tokens </Heading>
|
|
|
|
<VStack overflow="initial" maxH="unset" height="100%">
|
2021-09-21 18:37:23 +00:00
|
|
|
<Button
|
|
|
|
alignSelf="flex-end"
|
|
|
|
onClick={onOpen}
|
|
|
|
colorScheme="orange"
|
|
|
|
variant="solid"
|
|
|
|
size="sm"
|
|
|
|
>
|
|
|
|
Add new token
|
|
|
|
</Button>
|
2021-09-21 14:58:13 +00:00
|
|
|
<TokensList
|
|
|
|
data={tokens}
|
|
|
|
revoke={revoke}
|
|
|
|
isLoading={isLoading}
|
|
|
|
updateCallback={update}
|
|
|
|
/>
|
|
|
|
</VStack>
|
|
|
|
</ScaleFade>
|
|
|
|
)}
|
|
|
|
</Box>
|
|
|
|
);
|
|
|
|
};
|
|
|
|
|
|
|
|
Tokens.getLayout = getLayout;
|
|
|
|
export default Tokens;
|