You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

37 lines
1.1 KiB

  1. import { defineMessages } from 'react-intl';
  2. import { showAlert } from '../actions/alerts';
  3. const defaultFailSuffix = 'FAIL';
  4. const messages = defineMessages({
  5. unexpectedTitle: { id: 'alert.unexpected.title', defaultMessage: 'Oops!' },
  6. unexpectedMessage: { id: 'alert.unexpected.message', defaultMessage: 'An unexpected error occurred.' },
  7. });
  8. export default function errorsMiddleware() {
  9. return ({ dispatch }) => next => action => {
  10. if (action.type && !action.skipAlert) {
  11. const isFail = new RegExp(`${defaultFailSuffix}$`, 'g');
  12. if (action.type.match(isFail)) {
  13. if (action.error.response) {
  14. const { data, status, statusText } = action.error.response;
  15. let message = statusText;
  16. let title = `${status}`;
  17. if (data.error) {
  18. message = data.error;
  19. }
  20. dispatch(showAlert(title, message));
  21. } else {
  22. console.error(action.error);
  23. dispatch(showAlert(messages.unexpectedTitle, messages.unexpectedMessage));
  24. }
  25. }
  26. }
  27. return next(action);
  28. };
  29. };