import { Dispatch, SetStateAction, useState, FC } from "react"; import { useForm } from "react-hook-form"; import { useRouter } from "next/router"; // helpers import { addDays, renderDateFormat } from "helpers/date-time.helper"; import { csvDownload } from "helpers/download.helper"; // types import { IApiToken } from "types/api_token"; // hooks import { useMobxStore } from "lib/mobx/store-provider"; import useToast from "hooks/use-toast"; // services import { APITokenService } from "services/api_token.service"; // components import { APITokenTitle } from "./token-title"; import { APITokenDescription } from "./token-description"; import { APITokenExpiry, EXPIRY_OPTIONS } from "./token-expiry"; import { APITokenKeySection } from "./token-key-section"; // ui import { Button } from "@plane/ui"; interface APITokenFormProps { generatedToken: IApiToken | null | undefined; setGeneratedToken: Dispatch>; setDeleteTokenModal: Dispatch>; } export interface APIFormFields { never_expires: boolean; title: string; description: string; } const apiTokenService = new APITokenService(); export const APITokenForm: FC = (props) => { const { generatedToken, setGeneratedToken, setDeleteTokenModal } = props; // states const [loading, setLoading] = useState(false); const [neverExpires, setNeverExpire] = useState(false); const [focusTitle, setFocusTitle] = useState(false); const [focusDescription, setFocusDescription] = useState(false); const [selectedExpiry, setSelectedExpiry] = useState(1); // hooks const { setToastAlert } = useToast(); // store const { theme: { sidebarCollapsed }, } = useMobxStore(); // router const router = useRouter(); const { workspaceSlug } = router.query; const { control, handleSubmit, formState: { errors }, } = useForm({ defaultValues: { never_expires: false, title: "", description: "", }, }); const getExpiryDate = (): string | null => { if (neverExpires === true) return null; return addDays({ date: new Date(), days: EXPIRY_OPTIONS[selectedExpiry].days }).toISOString(); }; function renderExpiry(): string { return renderDateFormat(addDays({ date: new Date(), days: EXPIRY_OPTIONS[selectedExpiry].days }), true); } const downloadSecretKey = (token: IApiToken) => { const csvData = { Label: token.label, Description: token.description, Expiry: renderDateFormat(token.expired_at ?? null), "Secret Key": token.token, }; csvDownload(csvData, `Secret-key-${Date.now()}`); }; const generateToken = async (data: any) => { if (!workspaceSlug) return; setLoading(true); await apiTokenService .createApiToken(workspaceSlug.toString(), { label: data.title, description: data.description, expired_at: getExpiryDate(), }) .then((res) => { setGeneratedToken(res); downloadSecretKey(res); setLoading(false); }) .catch((err) => { setToastAlert({ message: err.message, type: "error", title: "Error", }); }); }; return (
{ if (err.title) { setFocusTitle(true); } })} className={`${sidebarCollapsed ? "xl:w-[50%] lg:w-[60%] " : "w-[60%]"} mx-auto py-8`} >
{errors.title && focusTitle &&

{errors.title.message}

}
{!generatedToken && (
<>
)} ); };