mirror of
				https://github.com/pelican-dev/panel.git
				synced 2025-10-31 02:36:52 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			87 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import React, { useState } from 'react';
 | |
| import { Field, Form, Formik, FormikHelpers } from 'formik';
 | |
| import { object, string } from 'yup';
 | |
| import FormikFieldWrapper from '@/components/elements/FormikFieldWrapper';
 | |
| import createApiKey from '@/api/account/createApiKey';
 | |
| import { Actions, useStoreActions } from 'easy-peasy';
 | |
| import { ApplicationStore } from '@/state';
 | |
| import { httpErrorToHuman } from '@/api/http';
 | |
| import SpinnerOverlay from '@/components/elements/SpinnerOverlay';
 | |
| import { ApiKey } from '@/api/account/getApiKeys';
 | |
| import tw from 'twin.macro';
 | |
| import Button from '@/components/elements/Button';
 | |
| import Input, { Textarea } from '@/components/elements/Input';
 | |
| import styled from 'styled-components/macro';
 | |
| import ApiKeyModal from '@/components/dashboard/ApiKeyModal';
 | |
| 
 | |
| interface Values {
 | |
|     description: string;
 | |
|     allowedIps: string;
 | |
| }
 | |
| 
 | |
| const CustomTextarea = styled(Textarea)`
 | |
|     ${tw`h-32`}
 | |
| `;
 | |
| 
 | |
| export default ({ onKeyCreated }: { onKeyCreated: (key: ApiKey) => void }) => {
 | |
|     const [apiKey, setApiKey] = useState('');
 | |
|     const { addError, clearFlashes } = useStoreActions((actions: Actions<ApplicationStore>) => actions.flashes);
 | |
| 
 | |
|     const submit = (values: Values, { setSubmitting, resetForm }: FormikHelpers<Values>) => {
 | |
|         clearFlashes('account');
 | |
|         createApiKey(values.description, values.allowedIps)
 | |
|             .then(({ secretToken, ...key }) => {
 | |
|                 resetForm();
 | |
|                 setSubmitting(false);
 | |
|                 setApiKey(`${key.identifier}${secretToken}`);
 | |
|                 onKeyCreated(key);
 | |
|             })
 | |
|             .catch((error) => {
 | |
|                 console.error(error);
 | |
| 
 | |
|                 addError({ key: 'account', message: httpErrorToHuman(error) });
 | |
|                 setSubmitting(false);
 | |
|             });
 | |
|     };
 | |
| 
 | |
|     return (
 | |
|         <>
 | |
|             <ApiKeyModal visible={apiKey.length > 0} onModalDismissed={() => setApiKey('')} apiKey={apiKey} />
 | |
|             <Formik
 | |
|                 onSubmit={submit}
 | |
|                 initialValues={{ description: '', allowedIps: '' }}
 | |
|                 validationSchema={object().shape({
 | |
|                     allowedIps: string(),
 | |
|                     description: string().required().min(4),
 | |
|                 })}
 | |
|             >
 | |
|                 {({ isSubmitting }) => (
 | |
|                     <Form>
 | |
|                         <SpinnerOverlay visible={isSubmitting} />
 | |
|                         <FormikFieldWrapper
 | |
|                             label={'Description'}
 | |
|                             name={'description'}
 | |
|                             description={'A description of this API key.'}
 | |
|                             css={tw`mb-6`}
 | |
|                         >
 | |
|                             <Field name={'description'} as={Input} />
 | |
|                         </FormikFieldWrapper>
 | |
|                         <FormikFieldWrapper
 | |
|                             label={'Allowed IPs'}
 | |
|                             name={'allowedIps'}
 | |
|                             description={
 | |
|                                 'Leave blank to allow any IP address to use this API key, otherwise provide each IP address on a new line.'
 | |
|                             }
 | |
|                         >
 | |
|                             <Field name={'allowedIps'} as={CustomTextarea} />
 | |
|                         </FormikFieldWrapper>
 | |
|                         <div css={tw`flex justify-end mt-6`}>
 | |
|                             <Button>Create</Button>
 | |
|                         </div>
 | |
|                     </Form>
 | |
|                 )}
 | |
|             </Formik>
 | |
|         </>
 | |
|     );
 | |
| };
 | 
