import React, { useState } from 'react'; import styled from 'styled-components'; import { message, Button, Input, Modal, Typography, Form, Collapse, Tag } from 'antd'; import { useCreateDomainMutation } from '../../graphql/domain.generated'; import { useEnterKeyListener } from '../shared/useEnterKeyListener'; import { groupIdTextValidation } from '../shared/textUtil'; import analytics, { EventType } from '../analytics'; const SuggestedNamesGroup = styled.div` margin-top: 12px; `; const ClickableTag = styled(Tag)` :hover { cursor: pointer; } `; type Props = { onClose: () => void; onCreate: (urn: string, id: string | undefined, name: string, description: string) => void; }; const SUGGESTED_DOMAIN_NAMES = ['Engineering', 'Marketing', 'Sales', 'Product']; const ID_FIELD_NAME = 'id'; const NAME_FIELD_NAME = 'name'; const DESCRIPTION_FIELD_NAME = 'description'; export default function CreateDomainModal({ onClose, onCreate }: Props) { const [createDomainMutation] = useCreateDomainMutation(); const [createButtonEnabled, setCreateButtonEnabled] = useState(false); const [form] = Form.useForm(); const onCreateDomain = () => { createDomainMutation({ variables: { input: { id: form.getFieldValue(ID_FIELD_NAME), name: form.getFieldValue(NAME_FIELD_NAME), description: form.getFieldValue(DESCRIPTION_FIELD_NAME), }, }, }) .then(({ data, errors }) => { if (!errors) { analytics.event({ type: EventType.CreateDomainEvent, }); message.success({ content: `Created domain!`, duration: 3, }); onCreate( data?.createDomain || '', form.getFieldValue(ID_FIELD_NAME), form.getFieldValue(NAME_FIELD_NAME), form.getFieldValue(DESCRIPTION_FIELD_NAME), ); form.resetFields(); } }) .catch((e) => { message.destroy(); message.error({ content: `Failed to create Domain!: \n ${e.message || ''}`, duration: 3 }); }); onClose(); }; // Handle the Enter press useEnterKeyListener({ querySelectorToExecuteClick: '#createDomainButton', }); return ( } >
{ setCreateButtonEnabled(!form.getFieldsError().some((field) => field.errors.length > 0)); }} > Name}> Give your new Domain a name. {SUGGESTED_DOMAIN_NAMES.map((name) => { return ( { form.setFieldsValue({ name, }); setCreateButtonEnabled(true); }} > {name} ); })} Description}> An optional description for your new domain. You can change this later. Advanced} key="1"> Domain Id}> By default, a random UUID will be generated to uniquely identify this domain. If you'd like to provide a custom id instead to more easily keep track of this domain, you may provide it here. Be careful, you cannot easily change the domain id after creation. ({ validator(_, value) { if (value && groupIdTextValidation(value)) { return Promise.resolve(); } return Promise.reject(new Error('Please enter a valid Domain id')); }, }), ]} >
); }