New.tsx 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. import React from 'react';
  2. import { ClusterName, NewSchemaSubjectRaw } from 'redux/interfaces';
  3. import { useForm } from 'react-hook-form';
  4. import { ErrorMessage } from '@hookform/error-message';
  5. import { clusterSchemaPath } from 'lib/paths';
  6. import { NewSchemaSubject, SchemaType } from 'generated-sources';
  7. import { SCHEMA_NAME_VALIDATION_PATTERN } from 'lib/constants';
  8. import { useHistory, useParams } from 'react-router';
  9. export interface NewProps {
  10. createSchema: (
  11. clusterName: ClusterName,
  12. newSchemaSubject: NewSchemaSubject
  13. ) => Promise<void>;
  14. }
  15. const New: React.FC<NewProps> = ({ createSchema }) => {
  16. const { clusterName } = useParams<{ clusterName: string }>();
  17. const history = useHistory();
  18. const {
  19. register,
  20. handleSubmit,
  21. formState: { isDirty, isSubmitting, errors },
  22. } = useForm<NewSchemaSubjectRaw>();
  23. const onSubmit = React.useCallback(
  24. async ({ subject, schema, schemaType }: NewSchemaSubjectRaw) => {
  25. try {
  26. await createSchema(clusterName, {
  27. subject,
  28. schema,
  29. schemaType,
  30. });
  31. history.push(clusterSchemaPath(clusterName, subject));
  32. } catch (e) {
  33. // Show Error
  34. }
  35. },
  36. [clusterName]
  37. );
  38. return (
  39. <div className="section">
  40. <div className="box">
  41. <form onSubmit={handleSubmit(onSubmit)}>
  42. <div>
  43. <div className="field">
  44. <label className="label">Subject *</label>
  45. <div className="control">
  46. <input
  47. className="input"
  48. placeholder="Schema Name"
  49. {...register('subject', {
  50. required: 'Schema Name is required.',
  51. pattern: {
  52. value: SCHEMA_NAME_VALIDATION_PATTERN,
  53. message: 'Only alphanumeric, _, -, and . allowed',
  54. },
  55. })}
  56. autoComplete="off"
  57. disabled={isSubmitting}
  58. />
  59. </div>
  60. <p className="help is-danger">
  61. <ErrorMessage errors={errors} name="subject" />
  62. </p>
  63. </div>
  64. <div className="field">
  65. <label className="label">Schema *</label>
  66. <div className="control">
  67. <textarea
  68. className="textarea"
  69. {...register('schema', {
  70. required: 'Schema is required.',
  71. })}
  72. disabled={isSubmitting}
  73. />
  74. </div>
  75. <p className="help is-danger">
  76. <ErrorMessage errors={errors} name="schema" />
  77. </p>
  78. </div>
  79. <div className="field">
  80. <label className="label">Schema Type *</label>
  81. <div className="control select">
  82. <select
  83. {...register('schemaType', {
  84. required: 'Schema Type is required.',
  85. })}
  86. disabled={isSubmitting}
  87. >
  88. <option value={SchemaType.AVRO}>AVRO</option>
  89. <option value={SchemaType.JSON}>JSON</option>
  90. <option value={SchemaType.PROTOBUF}>PROTOBUF</option>
  91. </select>
  92. </div>
  93. <p className="help is-danger">
  94. <ErrorMessage errors={errors} name="schemaType" />
  95. </p>
  96. </div>
  97. </div>
  98. <br />
  99. <div className="field">
  100. <div className="control">
  101. <input
  102. type="submit"
  103. className="button is-primary"
  104. disabled={isSubmitting || !isDirty}
  105. />
  106. </div>
  107. </div>
  108. </form>
  109. </div>
  110. </div>
  111. );
  112. };
  113. export default New;