import { Button, Dialog, DialogActions, DialogContent, DialogTitle, } from "@mui/material"; import React from "react"; import { ServerApi } from "../api/ServerApi"; import { TokensApi, type BaseToken, type TokenWithSecret, } from "../api/TokensApi"; import { useAlert } from "../hooks/contexts_provider/AlertDialogProvider"; import { useLoadingMessage } from "../hooks/contexts_provider/LoadingMessageProvider"; import { time } from "../utils/DateUtils"; import { checkConstraint, checkNumberConstraint, isIPNetworkValid, } from "../utils/FormUtils"; import { CheckboxInput } from "../widgets/forms/CheckboxInput"; import { DateInput } from "../widgets/forms/DateInput"; import { NetworksInput } from "../widgets/forms/NetworksInput"; import { TextInput } from "../widgets/forms/TextInput"; const SECS_IN_DAY = 3600 * 24; export function CreateTokenDialog(p: { open: boolean; onClose: () => void; onCreated: (t: TokenWithSecret) => void; }): React.ReactElement { const alert = useAlert(); const loadingMessage = useLoadingMessage(); const [newTokenUndef, setNewToken] = React.useState(); const newToken: BaseToken = newTokenUndef ?? { name: "", max_inactivity: 3600 * 24 * 90, read_only: false, }; const valid = checkConstraint(ServerApi.Config.constraints.token_name, newToken.name) === undefined && checkNumberConstraint( ServerApi.Config.constraints.token_max_inactivity, newToken.max_inactivity ) === undefined && (newToken.networks === undefined || newToken.networks.every((n) => isIPNetworkValid(n))); const handleSubmit = async () => { try { loadingMessage.show("Creating access token..."); const token = await TokensApi.Create(newToken); p.onCreated(token); // Clear form setNewToken(undefined); } catch (e) { console.error(`Failed to create token! ${e}`); alert(`Failed to create API token! ${e}`); } finally { loadingMessage.hide(); } }; return ( Create new API token { setNewToken({ ...newToken, name: v ?? "", }); }} size={ServerApi.Config.constraints.token_name} /> { setNewToken({ ...newToken, networks: v, }); }} /> { setNewToken({ ...newToken, max_inactivity: Number(i) * SECS_IN_DAY, }); }} size={{ min: ServerApi.Config.constraints.token_max_inactivity.min / SECS_IN_DAY, max: ServerApi.Config.constraints.token_max_inactivity.max / SECS_IN_DAY, }} /> { setNewToken((t) => { return { ...(t ?? newToken), expiration: i ?? undefined, }; }); }} disablePast checkValue={(s) => s > time()} /> { setNewToken({ ...newToken, read_only: v, }); }} /> ); }