misc_pterodactyl-panel/resources/scripts/components/admin/api/NewApiKeyButton.tsx
2021-01-10 11:34:14 -07:00

173 lines
8.5 KiB
TypeScript

import React, { useState } from 'react';
import Button from '@/components/elements/Button';
import Field from '@/components/elements/Field';
import Modal from '@/components/elements/Modal';
import FlashMessageRender from '@/components/FlashMessageRender';
import useFlash from '@/plugins/useFlash';
import { Form, Formik, FormikHelpers } from 'formik';
import tw from 'twin.macro';
import { object } from 'yup';
interface Values {
description: string,
}
const schema = object().shape({
});
export default () => {
const [ visible, setVisible ] = useState(false);
const { clearFlashes } = useFlash();
const submit = (values: Values, { setSubmitting }: FormikHelpers<Values>) => {
clearFlashes('api:create');
console.log(values);
setSubmitting(true);
setTimeout(() => {
setVisible(false);
}, 500);
};
return (
<>
<Formik
onSubmit={submit}
initialValues={{ description: '' }}
validationSchema={schema}
>
{
({ isSubmitting, resetForm }) => (
<Modal
visible={visible}
dismissable={!isSubmitting}
showSpinnerOverlay={isSubmitting}
onDismissed={() => {
resetForm();
setVisible(false);
}}
>
<FlashMessageRender byKey={'api:create'} css={tw`mb-6`}/>
<h2 css={tw`text-2xl mb-6`}>New API Key</h2>
<Form css={tw`m-0`}>
<Field
type={'string'}
id={'description'}
name={'description'}
label={'Description'}
description={'A descriptive note for this API Key.'}
/>
<div css={tw`w-full flex flex-col mt-6`}>
<div css={tw`h-10 w-full flex flex-row items-center bg-neutral-900 rounded-t-md px-4`}>
<p css={tw`text-sm text-neutral-300 uppercase`}>Permissions</p>
<div css={tw`flex flex-row space-x-4 ml-auto`}>
<span css={tw`text-xs text-neutral-300 cursor-pointer`}>None</span>
<span css={tw`text-xs text-neutral-300 cursor-pointer`}>Read</span>
<span css={tw`text-xs text-neutral-300 cursor-pointer`}>Write</span>
</div>
</div>
<div css={tw`w-full flex flex-col bg-neutral-700 rounded-b-md py-1 px-4`}>
<div css={tw`w-full flex flex-row items-center py-1`}>
<p css={tw`text-sm text-neutral-200`}>Allocations</p>
<div css={tw`flex space-x-6 ml-auto`}>
<div css={tw`flex pr-1`}>
<input type={'radio'} name={'allocations'} css={tw`h-5 w-5`} value={'0'}/>
</div>
<div css={tw`flex`}>
<input type={'radio'} name={'allocations'} css={tw`h-5 w-5`} value={'1'}/>
</div>
<div css={tw`flex pr-1`}>
<input type={'radio'} name={'allocations'} css={tw`h-5 w-5`} value={'2'}/>
</div>
</div>
</div>
<div css={tw`w-full flex flex-row items-center py-1`}>
<p css={tw`text-sm text-neutral-200`}>Databases</p>
<div css={tw`flex space-x-6 ml-auto`}>
<div css={tw`flex pr-1`}>
<input type={'radio'} name={'databases'} css={tw`h-5 w-5`} value={'0'}/>
</div>
<div css={tw`flex`}>
<input type={'radio'} name={'databases'} css={tw`h-5 w-5`} value={'1'}/>
</div>
<div css={tw`flex pr-1`}>
<input type={'radio'} name={'databases'} css={tw`h-5 w-5`} value={'2'}/>
</div>
</div>
</div>
<div css={tw`w-full flex flex-row items-center py-1`}>
<p css={tw`text-sm text-neutral-200`}>Eggs</p>
<div css={tw`flex space-x-6 ml-auto`}>
<div css={tw`flex pr-1`}>
<input type={'radio'} name={'eggs'} css={tw`h-5 w-5`} value={'0'}/>
</div>
<div css={tw`flex`}>
<input type={'radio'} name={'eggs'} css={tw`h-5 w-5`} value={'1'}/>
</div>
<div css={tw`flex pr-1`}>
<input type={'radio'} name={'eggs'} css={tw`h-5 w-5`} value={'2'}/>
</div>
</div>
</div>
<div css={tw`w-full flex flex-row items-center py-1`}>
<p css={tw`text-sm text-neutral-200`}>Locations</p>
<div css={tw`flex space-x-6 ml-auto`}>
<div css={tw`flex pr-1`}>
<input type={'radio'} name={'locations'} css={tw`h-5 w-5`} value={'0'}/>
</div>
<div css={tw`flex`}>
<input type={'radio'} name={'locations'} css={tw`h-5 w-5`} value={'1'}/>
</div>
<div css={tw`flex pr-1`}>
<input type={'radio'} name={'locations'} css={tw`h-5 w-5`} value={'2'}/>
</div>
</div>
</div>
</div>
</div>
<div css={tw`flex flex-wrap justify-end mt-6`}>
<Button
type={'button'}
isSecondary
css={tw`w-full sm:w-auto sm:mr-2`}
onClick={() => setVisible(false)}
>
Cancel
</Button>
<Button css={tw`w-full mt-4 sm:w-auto sm:mt-0`} type={'submit'}>
Create API Key
</Button>
</div>
</Form>
</Modal>
)
}
</Formik>
<Button type={'button'} size={'large'} css={tw`h-10 px-4 py-0 whitespace-nowrap`} onClick={() => setVisible(true)}>
New API Key
</Button>
</>
);
};