Coursemology/coursemology2

View on GitHub
client/app/bundles/course/user-invitations/components/buttons/ResendAllInvitationsButton.tsx

Summary

Maintainability
A
0 mins
Test Coverage
import { FC, useState } from 'react';
import { defineMessages, injectIntl, WrappedComponentProps } from 'react-intl';
import { LoadingButton } from '@mui/lab';

import { useAppDispatch } from 'lib/hooks/store';
import toast from 'lib/hooks/toast';

import { resendAllInvitations } from '../../operations';

const translations = defineMessages({
  buttonText: {
    id: 'course.userInvitations.ResebdAllInvitationsButton.buttonText',
    defaultMessage: 'Resend All Invitations',
  },
  resendSuccess: {
    id: 'course.userInvitations.ResebdAllInvitationsButton.resendSuccess',
    defaultMessage: 'Email invitations were successfully resent.',
  },
  resendFailure: {
    id: 'course.userInvitations.ResebdAllInvitationsButton.resendFailure',
    defaultMessage: 'Email invitations failed to resend.',
  },
});

type Props = WrappedComponentProps;

const ResendInvitationsButton: FC<Props> = (props) => {
  const { intl } = props;
  const dispatch = useAppDispatch();
  const [isLoading, setIsLoading] = useState(false);

  const handleResend = (): Promise<void> => {
    setIsLoading(true);
    return dispatch(resendAllInvitations())
      .then(() => {
        toast.success(intl.formatMessage(translations.resendSuccess));
      })
      .catch(() => {
        toast.error(intl.formatMessage(translations.resendFailure));
      })
      .finally(() => setIsLoading(false));
  };

  return (
    <LoadingButton
      loading={isLoading}
      onClick={handleResend}
      variant="contained"
    >
      {intl.formatMessage(translations.buttonText)}
    </LoadingButton>
  );
};

export default injectIntl(ResendInvitationsButton);