SeasonedSoftware/croods-auth

View on GitHub
src/useSignUp.tsx

Summary

Maintainability
B
4 hrs
Test Coverage
A
100%
import { useCroods } from 'croods'
import { useFormState } from 'react-use-form-state'
import getBaseOpts from './getBaseOpts'
import { useOnUnmount } from './hooks'
import { saveHeaders } from './headersHelpers'
import {
  ActionOptions,
  InstanceOptions,
} from 'croods/dist/types/typeDeclarations'
import { AxiosResponse } from 'axios'
import { SignUpState } from './typeDeclarations'
import {
  commonFields,
  getFieldError,
  getFieldProps,
  isValidForm,
  additionalCheckerPasswordConfirmation,
} from './formHelpers'

function useSignUp(
  options: ActionOptions = {},
): [SignUpState, (t: any) => Promise<any>] {
  const [formState, fields] = useFormState()

  const afterSuccess = (response: AxiosResponse) => {
    saveHeaders(response, options)
    options.afterSuccess && options.afterSuccess(response)
  }
  const opts = { ...getBaseOpts(options, 'signUp'), afterSuccess }
  const [
    { saving: signingUp, saveError: error },
    { save, setInfo, resetState },
  ] = useCroods(opts as InstanceOptions)

  useOnUnmount(resetState)

  const isFormValid = isValidForm(formState, additionalCheckerPasswordConfirmation)

  const signUp = async (data: any) => {
    const saved = await save({})(data)
    saved && setInfo(saved, false)
  }

  const onSubmit = (event: Event) => {
    event && event.preventDefault && event.preventDefault()
    return isFormValid ? signUp(formState.values) : undefined
  }

  const fieldError = getFieldError(formState)
  const fieldProps = getFieldProps(fields, formState)

  return [
    {
      fields,
      emailProps: fieldProps.apply(null, commonFields.email),
      passwordProps: fieldProps.apply(null, commonFields.password),
      passwordConfirmationProps: fieldProps.apply(
        null,
        commonFields.passwordConfirmation,
      ),
      formProps: { onSubmit },
      fieldProps,
      fieldError,
      formState,
      isFormValid,
      signingUp: !!signingUp,
      error,
    },
    signUp,
  ]
}

export default useSignUp