alerts.js 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import { defineMessages } from 'react-intl';
  2. const messages = defineMessages({
  3. unexpectedTitle: { id: 'alert.unexpected.title', defaultMessage: 'Oops!' },
  4. unexpectedMessage: { id: 'alert.unexpected.message', defaultMessage: 'An unexpected error occurred.' },
  5. rateLimitedTitle: { id: 'alert.rate_limited.title', defaultMessage: 'Rate limited' },
  6. rateLimitedMessage: { id: 'alert.rate_limited.message', defaultMessage: 'Please retry after {retry_time, time, medium}.' },
  7. });
  8. export const ALERT_SHOW = 'ALERT_SHOW';
  9. export const ALERT_DISMISS = 'ALERT_DISMISS';
  10. export const ALERT_CLEAR = 'ALERT_CLEAR';
  11. export const ALERT_NOOP = 'ALERT_NOOP';
  12. export const dismissAlert = alert => ({
  13. type: ALERT_DISMISS,
  14. alert,
  15. });
  16. export const clearAlert = () => ({
  17. type: ALERT_CLEAR,
  18. });
  19. export const showAlert = alert => ({
  20. type: ALERT_SHOW,
  21. alert,
  22. });
  23. export const showAlertForError = (error, skipNotFound = false) => {
  24. if (error.response) {
  25. const { data, status, statusText, headers } = error.response;
  26. // Skip these errors as they are reflected in the UI
  27. if (skipNotFound && (status === 404 || status === 410)) {
  28. return { type: ALERT_NOOP };
  29. }
  30. // Rate limit errors
  31. if (status === 429 && headers['x-ratelimit-reset']) {
  32. return showAlert({
  33. title: messages.rateLimitedTitle,
  34. message: messages.rateLimitedMessage,
  35. values: { 'retry_time': new Date(headers['x-ratelimit-reset']) },
  36. });
  37. }
  38. return showAlert({
  39. title: `${status}`,
  40. message: data.error || statusText,
  41. });
  42. }
  43. console.error(error);
  44. return showAlert({
  45. title: messages.unexpectedTitle,
  46. message: messages.unexpectedMessage,
  47. });
  48. };