InstallForm.tsx 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. import { Button } from '@chakra-ui/react';
  2. import React from 'react';
  3. import { Form, Field } from 'react-final-form';
  4. import FormInput from '../../../components/Form/FormInput';
  5. import { validateAppConfig } from '../../../components/Form/validators';
  6. import { AppInfo } from '../../../generated/graphql';
  7. interface IProps {
  8. formFields: AppInfo['form_fields'];
  9. onSubmit: (values: Record<string, unknown>) => void;
  10. initalValues?: Record<string, string>;
  11. }
  12. const InstallForm: React.FC<IProps> = ({ formFields, onSubmit, initalValues }) => {
  13. const renderField = (field: typeof formFields[0]) => {
  14. return (
  15. <Field
  16. key={field.env_variable}
  17. name={field.env_variable}
  18. render={({ input, meta }) => <FormInput className="mb-3" error={meta.error} isInvalid={meta.invalid && (meta.submitError || meta.submitFailed)} label={field.label} {...input} />}
  19. />
  20. );
  21. };
  22. return (
  23. <Form<Record<string, string>>
  24. initialValues={initalValues}
  25. onSubmit={onSubmit}
  26. validateOnBlur={true}
  27. validate={(values) => validateAppConfig(values, formFields)}
  28. render={({ handleSubmit, validating, submitting }) => (
  29. <form className="flex flex-col" onSubmit={handleSubmit}>
  30. {formFields.map(renderField)}
  31. <Button isLoading={validating || submitting} className="self-end mb-2" colorScheme="green" type="submit">
  32. {initalValues ? 'Update' : 'Install'}
  33. </Button>
  34. </form>
  35. )}
  36. />
  37. );
  38. };
  39. export default InstallForm;