123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- import React from 'react';
- import { NewSchemaSubjectRaw } from 'redux/interfaces';
- import { FormProvider, useForm, Controller } from 'react-hook-form';
- import { ErrorMessage } from '@hookform/error-message';
- import {
- ClusterNameRoute,
- clusterSchemaPath,
- clusterSchemasPath,
- } from 'lib/paths';
- import { SchemaType } from 'generated-sources';
- import { SCHEMA_NAME_VALIDATION_PATTERN } from 'lib/constants';
- import { useNavigate } from 'react-router-dom';
- import { InputLabel } from 'components/common/Input/InputLabel.styled';
- import Input from 'components/common/Input/Input';
- import { FormError } from 'components/common/Input/Input.styled';
- import Select, { SelectOption } from 'components/common/Select/Select';
- import { Button } from 'components/common/Button/Button';
- import { Textarea } from 'components/common/Textbox/Textarea.styled';
- import PageHeading from 'components/common/PageHeading/PageHeading';
- import { schemaAdded } from 'redux/reducers/schemas/schemasSlice';
- import { useAppDispatch } from 'lib/hooks/redux';
- import useAppParams from 'lib/hooks/useAppParams';
- import { showServerError } from 'lib/errorHandling';
- import { schemasApiClient } from 'lib/api';
- import * as S from './New.styled';
- const SchemaTypeOptions: Array<SelectOption> = [
- { value: SchemaType.AVRO, label: 'AVRO' },
- { value: SchemaType.JSON, label: 'JSON' },
- { value: SchemaType.PROTOBUF, label: 'PROTOBUF' },
- ];
- const New: React.FC = () => {
- const { clusterName } = useAppParams<ClusterNameRoute>();
- const navigate = useNavigate();
- const dispatch = useAppDispatch();
- const methods = useForm<NewSchemaSubjectRaw>({
- mode: 'onChange',
- defaultValues: {
- schemaType: SchemaType.AVRO,
- },
- });
- const {
- register,
- handleSubmit,
- control,
- formState: { isDirty, isSubmitting, errors, isValid },
- } = methods;
- const onSubmit = async ({
- subject,
- schema,
- schemaType,
- }: NewSchemaSubjectRaw) => {
- try {
- const resp = await schemasApiClient.createNewSchema({
- clusterName,
- newSchemaSubject: { subject, schema, schemaType },
- });
- dispatch(schemaAdded(resp));
- navigate(clusterSchemaPath(clusterName, subject));
- } catch (e) {
- showServerError(e as Response);
- }
- };
- return (
- <FormProvider {...methods}>
- <PageHeading
- text="Create"
- backText="Schema Registry"
- backTo={clusterSchemasPath(clusterName)}
- />
- <S.Form onSubmit={handleSubmit(onSubmit)}>
- <div>
- <InputLabel>Subject *</InputLabel>
- <Input
- inputSize="M"
- placeholder="Schema Name"
- name="subject"
- hookFormOptions={{
- required: 'Schema Name is required.',
- pattern: {
- value: SCHEMA_NAME_VALIDATION_PATTERN,
- message: 'Only alphanumeric, _, -, and . allowed',
- },
- }}
- autoComplete="off"
- disabled={isSubmitting}
- />
- <FormError>
- <ErrorMessage errors={errors} name="subject" />
- </FormError>
- </div>
- <div>
- <InputLabel>Schema *</InputLabel>
- <Textarea
- {...register('schema', {
- required: 'Schema is required.',
- })}
- disabled={isSubmitting}
- />
- <FormError>
- <ErrorMessage errors={errors} name="schema" />
- </FormError>
- </div>
- <div>
- <InputLabel>Schema Type *</InputLabel>
- <Controller
- control={control}
- rules={{ required: 'Schema Type is required.' }}
- name="schemaType"
- defaultValue={SchemaTypeOptions[0].value as SchemaType}
- render={({ field: { name, onChange, value } }) => (
- <Select
- selectSize="M"
- name={name}
- value={value}
- onChange={onChange}
- minWidth="100%"
- disabled={isSubmitting}
- options={SchemaTypeOptions}
- />
- )}
- />
- <FormError>
- <ErrorMessage errors={errors} name="schemaType" />
- </FormError>
- </div>
- <Button
- buttonSize="M"
- buttonType="primary"
- type="submit"
- disabled={!isValid || isSubmitting || !isDirty}
- >
- Submit
- </Button>
- </S.Form>
- </FormProvider>
- );
- };
- export default New;
|