18F/identity-idp

View on GitHub
app/javascript/packages/form-steps/form-steps-button.tsx

Summary

Maintainability
A
0 mins
Test Coverage
import { useContext, useEffect, useRef } from 'react';
import { useI18n } from '@18f/identity-react-i18n';
import SpinnerButton, { SpinnerButtonRefHandle } from '@18f/identity-spinner-button/spinner-button';
import FormStepsContext from './form-steps-context';

interface FormStepsButtonProps {
  /**
   * Optional additional class names to apply to button.
   */
  className?: string;

  /**
   * Button label.
   */
  children: string;
}

function FormStepsButton({ className, children }: FormStepsButtonProps) {
  const ref = useRef<SpinnerButtonRefHandle>(null);
  const { isSubmitting } = useContext(FormStepsContext);
  useEffect(() => ref.current?.toggleSpinner(isSubmitting), [isSubmitting]);

  const classes = ['margin-y-5', className].filter(Boolean).join(' ');

  return (
    <div className={classes}>
      <SpinnerButton ref={ref} spinOnClick={false} type="submit" isBig isWide>
        {children}
      </SpinnerButton>
    </div>
  );
}

export default {
  Continue(props: Omit<FormStepsButtonProps, 'children'>) {
    const { t } = useI18n();
    return <FormStepsButton {...props}>{t('forms.buttons.continue')}</FormStepsButton>;
  },
  Submit(props: Omit<FormStepsButtonProps, 'children'>) {
    const { t } = useI18n();
    return <FormStepsButton {...props}>{t('forms.buttons.submit.default')}</FormStepsButton>;
  },
};