import { defineMessages } from "react-intl"; const messages = defineMessages({ unexpectedTitle: { id: "alert.unexpected.title", defaultMessage: "Oops!" }, unexpectedMessage: { id: "alert.unexpected.message", defaultMessage: "An unexpected error occurred." }, rateLimitedTitle: { id: "alert.rate_limited.title", defaultMessage: "Rate limited" }, rateLimitedMessage: { id: "alert.rate_limited.message", defaultMessage: "Please retry after {retry_time, time, medium}." }, }); export const ALERT_SHOW = "ALERT_SHOW"; export const ALERT_DISMISS = "ALERT_DISMISS"; export const ALERT_CLEAR = "ALERT_CLEAR"; export const ALERT_NOOP = "ALERT_NOOP"; export function dismissAlert(alert) { return { type: ALERT_DISMISS, alert, }; } export function clearAlert() { return { type: ALERT_CLEAR, }; } export function showAlert(alert) { return { type: ALERT_SHOW, alert, }; } export function showAlertForError(error, skipNotFound = false) { if (error.response) { const { data, status, statusText, headers } = error.response; if (skipNotFound && (status === 404 || status === 410)) { // Skip these errors as they are reflected in the UI return { type: ALERT_NOOP }; } if (status === 429 && headers["x-ratelimit-reset"]) { return showAlert({ title: messages.rateLimitedTitle, message: messages.rateLimitedMessage, values: { "retry_time": new Date(headers["x-ratelimit-reset"]) }, }); } return showAlert({ title: `${status}`, message: data.error || statusText, }); } console.error(error); return showAlert({ title: messages.unexpectedTitle, message: messages.unexpectedMessage, }); }