index.tsx 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. import React from 'react';
  2. import { Button } from 'components/common/Button/Button';
  3. import { useForm, FormProvider } from 'react-hook-form';
  4. import { yupResolver } from '@hookform/resolvers/yup';
  5. import formSchema from 'widgets/ClusterConfigForm/schema';
  6. import { FlexFieldset, StyledForm } from 'components/common/Form/Form.styled';
  7. import {
  8. useUpdateAppConfig,
  9. useValidateAppConfig,
  10. } from 'lib/hooks/api/appConfig';
  11. import { ClusterConfigFormValues } from 'widgets/ClusterConfigForm/types';
  12. import { transformFormDataToPayload } from 'widgets/ClusterConfigForm/utils/transformFormDataToPayload';
  13. import { showAlert, showSuccessAlert } from 'lib/errorHandling';
  14. import { getIsValidConfig } from 'widgets/ClusterConfigForm/utils/getIsValidConfig';
  15. import * as S from 'widgets/ClusterConfigForm/ClusterConfigForm.styled';
  16. import { useNavigate } from 'react-router-dom';
  17. import useBoolean from 'lib/hooks/useBoolean';
  18. import KafkaCluster from 'widgets/ClusterConfigForm/Sections/KafkaCluster';
  19. import SchemaRegistry from 'widgets/ClusterConfigForm/Sections/SchemaRegistry';
  20. import KafkaConnect from 'widgets/ClusterConfigForm/Sections/KafkaConnect';
  21. import Metrics from 'widgets/ClusterConfigForm/Sections/Metrics';
  22. import CustomAuthentication from 'widgets/ClusterConfigForm/Sections/CustomAuthentication';
  23. import Authentication from 'widgets/ClusterConfigForm/Sections/Authentication/Authentication';
  24. import KSQL from 'widgets/ClusterConfigForm/Sections/KSQL';
  25. interface ClusterConfigFormProps {
  26. hasCustomConfig?: boolean;
  27. initialValues?: Partial<ClusterConfigFormValues>;
  28. }
  29. const CLUSTER_CONFIG_FORM_DEFAULT_VALUES: Partial<ClusterConfigFormValues> = {
  30. bootstrapServers: [{ host: '', port: '' }],
  31. };
  32. const ClusterConfigForm: React.FC<ClusterConfigFormProps> = ({
  33. initialValues = {},
  34. hasCustomConfig,
  35. }) => {
  36. const navigate = useNavigate();
  37. const methods = useForm<ClusterConfigFormValues>({
  38. mode: 'all',
  39. resolver: yupResolver(formSchema),
  40. defaultValues: {
  41. ...CLUSTER_CONFIG_FORM_DEFAULT_VALUES,
  42. ...initialValues,
  43. },
  44. });
  45. const {
  46. formState: { isSubmitting, isDirty },
  47. trigger,
  48. } = methods;
  49. const validate = useValidateAppConfig();
  50. const update = useUpdateAppConfig({ initialName: initialValues.name });
  51. const {
  52. value: isFormDisabled,
  53. setTrue: disableForm,
  54. setFalse: enableForm,
  55. } = useBoolean();
  56. const onSubmit = async (data: ClusterConfigFormValues) => {
  57. const config = transformFormDataToPayload(data);
  58. try {
  59. await update.mutateAsync(config);
  60. navigate('/');
  61. } catch (e) {
  62. showAlert('error', {
  63. id: 'app-config-update-error',
  64. title: 'Error updating application config',
  65. message: 'There was an error updating the application config',
  66. });
  67. }
  68. };
  69. const onReset = () => methods.reset();
  70. const onValidate = async () => {
  71. await trigger(undefined, { shouldFocus: true });
  72. if (!methods.formState.isValid) return;
  73. disableForm();
  74. const data = methods.getValues();
  75. const config = transformFormDataToPayload(data);
  76. try {
  77. const response = await validate.mutateAsync(config);
  78. const isConfigValid = getIsValidConfig(response, data.name);
  79. if (isConfigValid) {
  80. showSuccessAlert({
  81. message: 'Configuration is valid',
  82. });
  83. }
  84. } catch (e) {
  85. showAlert('error', {
  86. id: 'app-config-validate-error',
  87. title: 'Error validating application config',
  88. message: 'There was an error validating the application config',
  89. });
  90. }
  91. enableForm();
  92. };
  93. const showCustomConfig = methods.watch('customAuth') && hasCustomConfig;
  94. const isValidateDisabled = isSubmitting;
  95. const isSubmitDisabled = isSubmitting || !isDirty;
  96. return (
  97. <FormProvider {...methods}>
  98. <StyledForm onSubmit={methods.handleSubmit(onSubmit)}>
  99. <FlexFieldset disabled={isFormDisabled || isSubmitting}>
  100. <KafkaCluster />
  101. <hr />
  102. {showCustomConfig ? <CustomAuthentication /> : <Authentication />}
  103. <hr />
  104. <SchemaRegistry />
  105. <hr />
  106. <KafkaConnect />
  107. <hr />
  108. <KSQL />
  109. <hr />
  110. <Metrics />
  111. <hr />
  112. <S.ButtonWrapper>
  113. <Button
  114. buttonSize="L"
  115. buttonType="secondary"
  116. onClick={onReset}
  117. disabled={isSubmitting}
  118. >
  119. Reset
  120. </Button>
  121. <Button
  122. buttonSize="L"
  123. buttonType="secondary"
  124. onClick={onValidate}
  125. disabled={isValidateDisabled}
  126. >
  127. Validate
  128. </Button>
  129. <Button
  130. type="submit"
  131. buttonSize="L"
  132. buttonType="primary"
  133. disabled={isSubmitDisabled}
  134. inProgress={isSubmitting}
  135. >
  136. Submit
  137. </Button>
  138. </S.ButtonWrapper>
  139. </FlexFieldset>
  140. </StyledForm>
  141. </FormProvider>
  142. );
  143. };
  144. export default ClusterConfigForm;