import { DateTime } from 'luxon'; import { useState } from 'react'; import { H2Title, Section } from 'twenty-ui'; import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; import { useCreateOneRecord } from '@/object-record/hooks/useCreateOneRecord'; import { SaveAndCancelButtons } from '@/settings/components/SaveAndCancelButtons/SaveAndCancelButtons'; import { SettingsPageContainer } from '@/settings/components/SettingsPageContainer'; import { EXPIRATION_DATES } from '@/settings/developers/constants/ExpirationDates'; import { apiKeyTokenFamilyState } from '@/settings/developers/states/apiKeyTokenFamilyState'; import { ApiKey } from '@/settings/developers/types/api-key/ApiKey'; import { SettingsPath } from '@/types/SettingsPath'; import { Select } from '@/ui/input/components/Select'; import { TextInput } from '@/ui/input/components/TextInput'; import { SubMenuTopBarContainer } from '@/ui/layout/page/components/SubMenuTopBarContainer'; import { useLingui } from '@lingui/react/macro'; import { useRecoilCallback } from 'recoil'; import { Key } from 'ts-key-enum'; import { useGenerateApiKeyTokenMutation } from '~/generated/graphql'; import { useNavigateSettings } from '~/hooks/useNavigateSettings'; import { getSettingsPath } from '~/utils/navigation/getSettingsPath'; import { isDefined } from 'twenty-shared/utils'; export const SettingsDevelopersApiKeysNew = () => { const { t } = useLingui(); const [generateOneApiKeyToken] = useGenerateApiKeyTokenMutation(); const navigateSettings = useNavigateSettings(); const [formValues, setFormValues] = useState<{ name: string; expirationDate: number | null; }>({ expirationDate: EXPIRATION_DATES[5].value, name: '', }); const { createOneRecord: createOneApiKey } = useCreateOneRecord({ objectNameSingular: CoreObjectNameSingular.ApiKey, }); const setApiKeyTokenCallback = useRecoilCallback( ({ set }) => (apiKeyId: string, token: string) => { set(apiKeyTokenFamilyState(apiKeyId), token); }, [], ); const handleSave = async () => { const expiresAt = DateTime.now() .plus({ days: formValues.expirationDate ?? 30 }) .toString(); const newApiKey = await createOneApiKey?.({ name: formValues.name, expiresAt, }); if (!newApiKey) { return; } const tokenData = await generateOneApiKeyToken({ variables: { apiKeyId: newApiKey.id, expiresAt: expiresAt, }, }); if (isDefined(tokenData.data?.generateApiKeyToken)) { setApiKeyTokenCallback( newApiKey.id, tokenData.data.generateApiKeyToken.token, ); navigateSettings(SettingsPath.DevelopersApiKeyDetail, { apiKeyId: newApiKey.id, }); } }; const canSave = !!formValues.name && createOneApiKey; return ( { navigateSettings(SettingsPath.APIs); }} onSave={handleSave} /> } >
{ if (e.key === Key.Enter) { handleSave(); } }} onChange={(value) => { setFormValues((prevState) => ({ ...prevState, name: value, })); }} fullWidth />