Merge pull request #276 from bugout-dev/token-screen

Token screen
pull/278/head
Tim Pechersky 2021-09-23 15:11:07 +02:00 zatwierdzone przez GitHub
commit 639a366b80
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 4AEE18F83AFDEB23
6 zmienionych plików z 53 dodań i 27 usunięć

Wyświetl plik

@ -186,9 +186,8 @@ async def tokens_handler(request: Request) -> BugoutUserTokens:
async def token_update_handler( async def token_update_handler(
request: Request, token_note: str = Form(...), access_token: str = Form(...) request: Request, token_note: str = Form(...), access_token: str = Form(...)
) -> BugoutToken: ) -> BugoutToken:
token = request.state.token
try: try:
response = bc.update_token(token, token_note=token_note) response = bc.update_token(token=access_token, token_note=token_note)
except BugoutResponseException as e: except BugoutResponseException as e:
raise MoonstreamHTTPException(status_code=e.status_code, detail=e.detail) raise MoonstreamHTTPException(status_code=e.status_code, detail=e.detail)
except Exception as e: except Exception as e:

Wyświetl plik

@ -24,7 +24,7 @@ const Tokens = () => {
const { onOpen, onClose, isOpen } = useDisclosure(); const { onOpen, onClose, isOpen } = useDisclosure();
const [newToken, setNewToken] = useState(null); const [newToken, setNewToken] = useState(null);
const [tokens, setTokens] = useState(); const [tokens, setTokens] = useState();
const { list, update, revoke, isLoading, data } = useTokens(); const { list, updateMutation, revoke, isLoading, data } = useTokens();
useEffect(() => { useEffect(() => {
list(); list();
@ -44,7 +44,7 @@ const Tokens = () => {
if (data?.data?.user_id) { if (data?.data?.user_id) {
setTokens(data.data); setTokens(data.data);
} }
}, [data?.data, isLoading]); }, [data, isLoading]);
useEffect(() => { useEffect(() => {
document.title = `Tokens`; document.title = `Tokens`;
@ -75,8 +75,8 @@ const Tokens = () => {
</ModalBody> </ModalBody>
</ModalContent> </ModalContent>
</Modal> </Modal>
<Heading variant="tokensScreen"> My access tokens </Heading> <Heading variant="tokensScreen"> My API tokens </Heading>
<VStack overflow="initial" maxH="unset" height="100%"> <VStack overflow="initial" maxH="unset" height="100%" maxW="100%">
<Button <Button
alignSelf="flex-end" alignSelf="flex-end"
onClick={onOpen} onClick={onOpen}
@ -90,7 +90,7 @@ const Tokens = () => {
data={tokens} data={tokens}
revoke={revoke} revoke={revoke}
isLoading={isLoading} isLoading={isLoading}
updateCallback={update} update={updateMutation}
/> />
</VStack> </VStack>
</ScaleFade> </ScaleFade>

Wyświetl plik

@ -36,7 +36,7 @@ const AccountIconButton = (props) => {
<MenuItem>Security</MenuItem> <MenuItem>Security</MenuItem>
</RouterLink> </RouterLink>
<RouterLink href="/account/tokens" passHref> <RouterLink href="/account/tokens" passHref>
<MenuItem>Access tokens</MenuItem> <MenuItem>API tokens</MenuItem>
</RouterLink> </RouterLink>
</MenuGroup> </MenuGroup>
<MenuDivider /> <MenuDivider />

Wyświetl plik

@ -8,10 +8,15 @@ import {
} from "react-pro-sidebar"; } from "react-pro-sidebar";
import { useContext } from "react"; import { useContext } from "react";
import RouterLink from "next/link"; import RouterLink from "next/link";
import { Flex, Image, IconButton } from "@chakra-ui/react"; import { Flex, Image, IconButton, Divider } from "@chakra-ui/react";
import UIContext from "../core/providers/UIProvider/context"; import UIContext from "../core/providers/UIProvider/context";
import React from "react"; import React from "react";
import { HamburgerIcon, ArrowLeftIcon, ArrowRightIcon } from "@chakra-ui/icons"; import {
HamburgerIcon,
ArrowLeftIcon,
ArrowRightIcon,
LockIcon,
} from "@chakra-ui/icons";
import { MdTimeline, MdSettings } from "react-icons/md"; import { MdTimeline, MdSettings } from "react-icons/md";
import { ImStatsBars } from "react-icons/im"; import { ImStatsBars } from "react-icons/im";
import { HiAcademicCap } from "react-icons/hi"; import { HiAcademicCap } from "react-icons/hi";
@ -117,7 +122,16 @@ const Sidebar = () => {
</SidebarContent> </SidebarContent>
)} )}
<SidebarFooter></SidebarFooter> <SidebarFooter style={{ paddingBottom: "3rem" }}>
<Divider color="gray.300" w="100%" />
{ui.isLoggedIn && (
<Menu iconShape="square">
<MenuItem icon={<LockIcon />}>
<RouterLink href="/account/tokens">API Tokens</RouterLink>
</MenuItem>
</Menu>
)}
</SidebarFooter>
</ProSidebar> </ProSidebar>
); );
}; };

Wyświetl plik

@ -15,9 +15,12 @@ import { DeleteIcon } from "@chakra-ui/icons";
import moment from "moment"; import moment from "moment";
import CopyButton from "./CopyButton"; import CopyButton from "./CopyButton";
const List = ({ data, revoke, isLoading, updateCallback }) => { const List = ({ data, revoke, isLoading, update }) => {
const userToken = localStorage.getItem("BUGOUT_ACCESS_TOKEN"); const userToken = localStorage.getItem("MOONSTREAM_ACCESS_TOKEN");
const cellProps = {
px: ["2px", "6px", "inherit"],
};
if (data) { if (data) {
return ( return (
<Table <Table
@ -30,10 +33,10 @@ const List = ({ data, revoke, isLoading, updateCallback }) => {
> >
<Thead> <Thead>
<Tr> <Tr>
<Th>Token</Th> <Th>Label</Th>
<Th>Date Created</Th> <Th {...cellProps}>Token</Th>
<Th>Note</Th> <Th {...cellProps}>Date Created</Th>
<Th>Actions</Th> <Th {...cellProps}>Actions</Th>
</Tr> </Tr>
</Thead> </Thead>
<Tbody> <Tbody>
@ -42,27 +45,37 @@ const List = ({ data, revoke, isLoading, updateCallback }) => {
if (userToken !== token.id) { if (userToken !== token.id) {
return ( return (
<Tr key={`token-row-${token.id}`}> <Tr key={`token-row-${token.id}`}>
<Td mr={4} p={0}> <Td py={0} {...cellProps}>
<CopyButton>{token.id}</CopyButton>
</Td>
<Td py={0}>{moment(token.created_at).format("L")}</Td>
<Td py={0}>
<Editable <Editable
colorScheme="blue" colorScheme="blue"
placeholder="enter note here" placeholder="Click to set up label"
defaultValue={token.note} defaultValue={token.note}
isDisabled={update.isLoading}
onSubmit={(nextValue) => onSubmit={(nextValue) =>
updateCallback({ token: token.id, note: nextValue }) update.mutate({ token: token.id, note: nextValue })
} }
> >
<EditablePreview <EditablePreview
maxW="40rem" maxW="40rem"
textColor={token.note ? "inherit" : "gray.900"}
_placeholder={{ color: "black" }} _placeholder={{ color: "black" }}
/> />
<EditableInput maxW="40rem" /> <EditableInput maxW="40rem" />
</Editable> </Editable>
</Td> </Td>
<Td py={0}> <Td
mr={4}
py={0}
{...cellProps}
isTruncated
maxW={["100px", "150px", "300px"]}
>
<CopyButton>{token.id}</CopyButton>
</Td>
<Td py={0} {...cellProps}>
{moment(token.created_at).format("L")}
</Td>
<Td py={0} {...cellProps}>
<IconButton <IconButton
size="sm" size="sm"
variant="ghost" variant="ghost"

Wyświetl plik

@ -20,7 +20,7 @@ const useTokens = () => {
}, },
}); });
const { mutate: update } = useMutation(AuthService.updateToken, { const updateMutation = useMutation(AuthService.updateToken, {
onSuccess: () => { onSuccess: () => {
list(); list();
}, },
@ -42,7 +42,7 @@ const useTokens = () => {
return { return {
createToken, createToken,
list, list,
update, updateMutation,
revoke, revoke,
isLoading, isLoading,
data, data,