import { Button, IconButton } from "@mui/joy"; import copy from "copy-to-clipboard"; import { useEffect, useState } from "react"; import { toast } from "react-hot-toast"; import { useTranslation } from "react-i18next"; import { userServiceClient } from "@/grpcweb"; import { UserAccessToken } from "@/types/proto/api/v1/user_service"; import useUserStore from "../../stores/v1/user"; import { showCommonDialog } from "../Alert"; import CreateAccessTokenDialog from "../CreateAccessTokenDialog"; import Icon from "../Icon"; const listAccessTokens = async (userId: number) => { const { accessTokens } = await userServiceClient.listUserAccessTokens({ id: userId, }); return accessTokens; }; const AccessTokenSection = () => { const { t } = useTranslation(); const currentUser = useUserStore().getCurrentUser(); const [userAccessTokens, setUserAccessTokens] = useState([]); const [showCreateDialog, setShowCreateDialog] = useState(false); useEffect(() => { listAccessTokens(currentUser.id).then((accessTokens) => { setUserAccessTokens(accessTokens); }); }, []); const handleCreateAccessTokenDialogConfirm = async () => { const accessTokens = await listAccessTokens(currentUser.id); setUserAccessTokens(accessTokens); }; const copyAccessToken = (accessToken: string) => { copy(accessToken); toast.success("Access token copied to clipboard"); }; const handleDeleteAccessToken = async (accessToken: string) => { showCommonDialog({ title: "Delete Access Token", content: `Are you sure to delete access token \`${getFormatedAccessToken(accessToken)}\`? You cannot undo this action.`, style: "danger", onConfirm: async () => { await userServiceClient.deleteUserAccessToken({ id: currentUser.id, accessToken: accessToken, }); setUserAccessTokens(userAccessTokens.filter((token) => token.accessToken !== accessToken)); }, }); }; const getFormatedAccessToken = (accessToken: string) => { return `${accessToken.slice(0, 4)}****${accessToken.slice(-4)}`; }; return ( <>

Access Tokens

A list of all access tokens for your account.

{userAccessTokens.map((userAccessToken) => ( ))}
Token Description Created At Expires At {t("common.delete")}
{getFormatedAccessToken(userAccessToken.accessToken)} {userAccessToken.description} {userAccessToken.issuedAt?.toLocaleString()} {userAccessToken.expiresAt?.toLocaleString() ?? "Never"} { handleDeleteAccessToken(userAccessToken.accessToken); }} >
{showCreateDialog && ( setShowCreateDialog(false)} onConfirm={handleCreateAccessTokenDialogConfirm} /> )} ); }; export default AccessTokenSection;