import Link from "next/link"; import { useState } from "react"; import { Controller, useForm } from "react-hook-form"; import dayjs from "@calcom/dayjs"; import type { TApiKeys } from "@calcom/ee/api-keys/components/ApiKeyListItem"; import LicenseRequired from "@calcom/ee/common/components/LicenseRequired"; import { API_NAME_LENGTH_MAX_LIMIT } from "@calcom/lib/constants"; import { IS_CALCOM } from "@calcom/lib/constants"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { trpc } from "@calcom/trpc/react"; import { Button } from "@calcom/ui/components/button"; import { DialogFooter } from "@calcom/ui/components/dialog"; import { Form } from "@calcom/ui/components/form"; import { TextField } from "@calcom/ui/components/form"; import { SelectField } from "@calcom/ui/components/form"; import { Switch } from "@calcom/ui/components/form"; import { showToast } from "@calcom/ui/components/toast"; import { Tooltip } from "@calcom/ui/components/tooltip"; import { revalidateApiKeysList } from "@calcom/web/app/(use-page-wrapper)/settings/(settings-layout)/developer/api-keys/actions"; export default function ApiKeyDialogForm({ defaultValues, handleClose, }: { defaultValues?: Omit & { neverExpires?: boolean }; handleClose: () => void; }) { const { t } = useLocale(); const utils = trpc.useUtils(); const updateApiKeyMutation = trpc.viewer.apiKeys.edit.useMutation({ onSuccess() { utils.viewer.apiKeys.list.invalidate(); revalidateApiKeysList(); showToast(t("api_key_updated"), "success"); handleClose(); }, onError() { showToast(t("api_key_update_failed"), "error"); }, }); type Option = { value: Date | null | undefined; label: string }; const [apiKey, setApiKey] = useState(""); const [expiryDate, setExpiryDate] = useState( () => defaultValues?.expiresAt || dayjs().add(30, "day").toDate() ); const [successfulNewApiKeyModal, setSuccessfulNewApiKeyModal] = useState(false); const [apiKeyDetails, setApiKeyDetails] = useState({ expiresAt: null as Date | null, note: "" as string | null, neverExpires: false, }); const form = useForm({ defaultValues: { note: defaultValues?.note || "", neverExpires: defaultValues?.neverExpires || false, expiresAt: defaultValues?.expiresAt || dayjs().add(30, "day").toDate(), }, mode: "onChange", criteriaMode: "all", resolver: (values) => { const errors: { note?: { type: string; message: string } } = {}; if (values.note && values.note.length > API_NAME_LENGTH_MAX_LIMIT) { errors.note = { type: "maxLength", message: t("api_key_name_too_long", { max: API_NAME_LENGTH_MAX_LIMIT }), }; } return { values, errors }; }, }); const watchNeverExpires = form.watch("neverExpires"); const expiresAtOptions: Option[] = [ { label: t("seven_days"), value: dayjs().add(7, "day").toDate(), }, { label: t("thirty_days"), value: dayjs().add(30, "day").toDate(), }, { label: t("three_months"), value: dayjs().add(3, "month").toDate(), }, { label: t("one_year"), value: dayjs().add(1, "year").toDate(), }, ]; return ( {successfulNewApiKeyModal ? ( <>

{t("success_api_key_created")}

{t("success_api_key_created_bold_tagline")}{" "} {t("you_will_only_view_it_once")}
{" "} {apiKey}
{apiKeyDetails.neverExpires ? t("never_expires") : `${t("expires")} ${apiKeyDetails?.expiresAt?.toLocaleDateString()}`}
) : (
{ if (defaultValues) { await updateApiKeyMutation.mutate({ id: defaultValues.id, note: event.note }); } else { const apiKey = await utils.client.viewer.apiKeys.create.mutate(event); setApiKey(apiKey); setApiKeyDetails({ ...event }); await utils.viewer.apiKeys.list.invalidate(); revalidateApiKeysList(); setSuccessfulNewApiKeyModal(true); } }} className="space-y-4">

{defaultValues ? t("edit_api_key") : t("create_api_key")}

{IS_CALCOM ? (
{t("api_key_modal_subtitle")}
{t("api_key_modal_subtitle_platform")}
) : (

{t("api_key_modal_subtitle")}

)}
( { form.setValue("note", e?.target.value); }} type="text" /> )} />
{!defaultValues && (
{t("expire_date")} ( )} />
{ const defaultValue = expiresAtOptions[1]; return ( ({ ...baseStyles, fontSize: "14px", }), option: (baseStyles) => ({ ...baseStyles, fontSize: "14px", }), }} isDisabled={watchNeverExpires || !!defaultValues} containerClassName="data-testid-field-type" options={expiresAtOptions} onChange={(option) => { if (!option) { return; } onChange(option.value); setExpiryDate(option.value); }} defaultValue={defaultValue} /> ); }} /> {!watchNeverExpires && ( {t("api_key_expires_on")} {dayjs(expiryDate).format("DD-MM-YYYY")} )}
)}
)}
); }