Path: blob/develop/resources/scripts/components/dashboard/forms/CreateApiKeyForm.tsx
7454 views
import { useState } from 'react';1import { Field, Form, Formik, FormikHelpers } from 'formik';2import { object, string } from 'yup';3import FormikFieldWrapper from '@/components/elements/FormikFieldWrapper';4import createApiKey from '@/api/account/createApiKey';5import { Actions, useStoreActions } from 'easy-peasy';6import { ApplicationStore } from '@/state';7import { httpErrorToHuman } from '@/api/http';8import SpinnerOverlay from '@/components/elements/SpinnerOverlay';9import { ApiKey } from '@/api/account/getApiKeys';10import tw from 'twin.macro';11import Button from '@/components/elements/Button';12import Input, { Textarea } from '@/components/elements/Input';13import styled from 'styled-components';14import ApiKeyModal from '@/components/dashboard/ApiKeyModal';1516interface Values {17description: string;18allowedIps: string;19}2021const CustomTextarea = styled(Textarea)`22${tw`h-32`}23`;2425export default ({ onKeyCreated }: { onKeyCreated: (key: ApiKey) => void }) => {26const [apiKey, setApiKey] = useState('');27const { addError, clearFlashes } = useStoreActions((actions: Actions<ApplicationStore>) => actions.flashes);2829const submit = (values: Values, { setSubmitting, resetForm }: FormikHelpers<Values>) => {30clearFlashes('account');31createApiKey(values.description, values.allowedIps)32.then(({ secretToken, ...key }) => {33resetForm();34setSubmitting(false);35setApiKey(`${key.identifier}${secretToken}`);36onKeyCreated(key);37})38.catch(error => {39console.error(error);4041addError({ key: 'account', message: httpErrorToHuman(error) });42setSubmitting(false);43});44};4546return (47<>48<ApiKeyModal visible={apiKey.length > 0} onModalDismissed={() => setApiKey('')} apiKey={apiKey} />49<Formik50onSubmit={submit}51initialValues={{ description: '', allowedIps: '' }}52validationSchema={object().shape({53allowedIps: string(),54description: string().required().min(4),55})}56>57{({ isSubmitting }) => (58<Form>59<SpinnerOverlay visible={isSubmitting} />60<FormikFieldWrapper61label={'Description'}62name={'description'}63description={'A description of this API key.'}64css={tw`mb-6`}65>66<Field name={'description'} as={Input} />67</FormikFieldWrapper>68<FormikFieldWrapper69label={'Allowed IPs'}70name={'allowedIps'}71description={72'Leave blank to allow any IP address to use this API key, otherwise provide each IP address on a new line.'73}74>75<Field name={'allowedIps'} as={CustomTextarea} />76</FormikFieldWrapper>77<div css={tw`flex justify-end mt-6`}>78<Button>Create</Button>79</div>80</Form>81)}82</Formik>83</>84);85};868788