Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 3628 | Rev 3645 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
3630 stevensc 1
import React, { useEffect } from 'react';
3452 stevensc 2
import { useForm, FormProvider } from 'react-hook-form';
3
 
4
import { Spinner } from '..';
3630 stevensc 5
import { useAlert, useApi } from '@shared/hooks';
3452 stevensc 6
 
7
export function Form({
8
  children,
9
  onSubmit,
3555 stevensc 10
  defaultValues,
3452 stevensc 11
  defaultValuesPromise,
12
  reset: propReset = false,
3628 stevensc 13
  style,
3452 stevensc 14
  ...rest
15
}) {
3555 stevensc 16
  const methods = useForm({ defaultValues });
3630 stevensc 17
  const {
18
    handleSubmit,
19
    reset,
20
    formState: { isSubmitting }
21
  } = methods;
3452 stevensc 22
 
3630 stevensc 23
  const { showError } = useAlert();
3452 stevensc 24
 
3630 stevensc 25
  const { loading, execute } = useApi(defaultValuesPromise, {
26
    onSuccess: (data) => {
27
      reset(data);
28
    },
29
    onError: (error) => {
30
      showError(error.message);
3452 stevensc 31
    }
3630 stevensc 32
  });
3452 stevensc 33
 
3630 stevensc 34
  useEffect(() => {
35
    if (defaultValuesPromise) execute();
36
  }, [defaultValuesPromise]);
3452 stevensc 37
 
38
  const handleFormSubmit = (data) => {
39
    if (onSubmit) {
40
      onSubmit(data);
41
    }
42
    if (propReset) {
3555 stevensc 43
      reset(undefined, { keepDefaultValues: true });
3452 stevensc 44
    }
45
  };
46
 
47
  return (
48
    <FormProvider {...methods}>
3630 stevensc 49
      <form
50
        onSubmit={handleSubmit(handleFormSubmit)}
51
        style={{ position: 'relative', ...style }}
52
        {...rest}
53
      >
54
        {children}
55
        {(isSubmitting || loading) && <Spinner absolute />}
3452 stevensc 56
      </form>
57
    </FormProvider>
58
  );
59
}