kopia lustrzana https://github.com/bugout-dev/moonstream
commit
639a366b80
|
@ -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:
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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 />
|
||||||
|
|
|
@ -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>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Ładowanie…
Reference in New Issue