import { Radio, RadioGroup } from "@mui/joy"; import { Button, Input } from "@usememos/mui"; import { XIcon } from "lucide-react"; import React, { useState } from "react"; import { toast } from "react-hot-toast"; import { userServiceClient } from "@/grpcweb"; import useCurrentUser from "@/hooks/useCurrentUser"; import useLoading from "@/hooks/useLoading"; import { useTranslate } from "@/utils/i18n"; import { generateDialog } from "./Dialog"; interface Props extends DialogProps { onConfirm: () => void; } interface State { description: string; expiration: number; } const CreateAccessTokenDialog: React.FC = (props: Props) => { const { destroy, onConfirm } = props; const t = useTranslate(); const currentUser = useCurrentUser(); const [state, setState] = useState({ description: "", expiration: 3600 * 8, }); const requestState = useLoading(false); const expirationOptions = [ { label: t("setting.access-token-section.create-dialog.duration-8h"), value: 3600 * 8, }, { label: t("setting.access-token-section.create-dialog.duration-1m"), value: 3600 * 24 * 30, }, { label: t("setting.access-token-section.create-dialog.duration-never"), value: 0, }, ]; const setPartialState = (partialState: Partial) => { setState({ ...state, ...partialState, }); }; const handleDescriptionInputChange = (e: React.ChangeEvent) => { setPartialState({ description: e.target.value, }); }; const handleRoleInputChange = (e: React.ChangeEvent) => { setPartialState({ expiration: Number(e.target.value), }); }; const handleSaveBtnClick = async () => { if (!state.description) { toast.error(t("message.description-is-required")); return; } try { await userServiceClient.createUserAccessToken({ name: currentUser.name, description: state.description, expiresAt: state.expiration ? new Date(Date.now() + state.expiration * 1000) : undefined, }); onConfirm(); destroy(); } catch (error: any) { toast.error(error.details); console.error(error); } }; return ( <>

{t("setting.access-token-section.create-dialog.create-access-token")}

{t("setting.access-token-section.create-dialog.description")} *
{t("setting.access-token-section.create-dialog.expiration")} *
{expirationOptions.map((option) => ( ))}
); }; function showCreateAccessTokenDialog(onConfirm: () => void) { generateDialog( { className: "create-access-token-dialog", dialogName: "create-access-token-dialog", }, CreateAccessTokenDialog, { onConfirm, }, ); } export default showCreateAccessTokenDialog;