Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 3630 | Rev 3658 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |

import React, { useEffect } from 'react';
import { useForm, FormProvider } from 'react-hook-form';

import { Spinner } from '..';
import { useAlert, useApi } from '@shared/hooks';

export function Form({
  children,
  onSubmit,
  defaultValues,
  defaultValuesPromise,
  reset: propReset = false,
  style,
  ...rest
}) {
  const methods = useForm({ defaultValues });
  const {
    handleSubmit,
    reset,
    formState: { isSubmitting }
  } = methods;

  const { showError } = useAlert();

  const { loading, execute } = useApi(defaultValuesPromise, {
    onSuccess: (data) => {
      reset(data);
    },
    onError: (error) => {
      showError(error.message);
    }
  });

  useEffect(() => {
    if (defaultValuesPromise) execute();
  }, [defaultValuesPromise]);

  const handleFormSubmit = async (data) => {
    if (onSubmit) {
      await onSubmit(data);
    }
    if (propReset) {
      reset(undefined, { keepDefaultValues: true });
    }
  };

  return (
    <FormProvider {...methods}>
      <form
        onSubmit={handleSubmit(handleFormSubmit)}
        style={{ position: 'relative', ...style }}
        {...rest}
      >
        {children}
        {(isSubmitting || loading) && <Spinner absolute />}
      </form>
    </FormProvider>
  );
}