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.

63 lines
1.8 KiB

  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 function dismissAlert(alert) {
  13. return {
  14. type: ALERT_DISMISS,
  15. alert,
  16. };
  17. };
  18. export function clearAlert() {
  19. return {
  20. type: ALERT_CLEAR,
  21. };
  22. };
  23. export function showAlert(title = messages.unexpectedTitle, message = messages.unexpectedMessage, message_values = undefined) {
  24. return {
  25. type: ALERT_SHOW,
  26. title,
  27. message,
  28. message_values,
  29. };
  30. };
  31. export function showAlertForError(error, skipNotFound = false) {
  32. if (error.response) {
  33. const { data, status, statusText, headers } = error.response;
  34. if (skipNotFound && (status === 404 || status === 410)) {
  35. // Skip these errors as they are reflected in the UI
  36. return { type: ALERT_NOOP };
  37. }
  38. if (status === 429 && headers['x-ratelimit-reset']) {
  39. const reset_date = new Date(headers['x-ratelimit-reset']);
  40. return showAlert(messages.rateLimitedTitle, messages.rateLimitedMessage, { 'retry_time': reset_date });
  41. }
  42. let message = statusText;
  43. let title = `${status}`;
  44. if (data.error) {
  45. message = data.error;
  46. }
  47. return showAlert(title, message);
  48. } else {
  49. console.error(error);
  50. return showAlert();
  51. }
  52. }