Files
2025-10-12 13:42:02 +02:00

60 lines
1.7 KiB
JavaScript

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 const dismissAlert = alert => ({
type: ALERT_DISMISS,
alert,
});
export const clearAlert = () => ({
type: ALERT_CLEAR,
});
export const showAlert = alert => ({
type: ALERT_SHOW,
alert,
});
export const showAlertForError = (error, skipNotFound = false) => {
if (error.response) {
const { data, status, statusText, headers } = error.response;
// Skip these errors as they are reflected in the UI
if (skipNotFound && (status === 404 || status === 410)) {
return { type: ALERT_NOOP };
}
// Rate limit errors
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,
});
};