Skip to content
Snippets Groups Projects
error.js 3.17 KiB
import {send as notify} from './notification';
import {i18n} from "./i18n";

/**
 * Error handling for XHR errors
 *
 * @param jqXHR
 * @param textStatus
 * @param errorThrown
 * @param icon
 */
export const handleXhrError = (jqXHR, textStatus, errorThrown, icon = "sad") => {
    // return if user aborted the request
    if (textStatus === "abort") {
        return;
    }

    let body;

    if (jqXHR.responseJSON !== undefined && jqXHR.responseJSON["hydra:description"] !== undefined) {
        // response is a JSON-LD
        body = jqXHR.responseJSON["hydra:description"];
    } else if (jqXHR.responseJSON !== undefined && jqXHR.responseJSON['detail'] !== undefined) {
        // response is a plain JSON
        body = jqXHR.responseJSON['detail'];
    } else {
        // no description available
        body = textStatus;
    }

    // if the server is not reachable at all
    if (jqXHR.status === 0) {
        body = i18n.t('error.connection-to-server-refused');
    }

    notify({
        "summary": i18n.t('error.summary'),
        "body": escapeHTML(stripHTML(body)),
        "icon": icon,
        "type": "danger",
    });

    if (window._paq !== undefined) {
        window._paq.push(['trackEvent', 'XhrError', body]);
    }
};

/**
 * Error handling for fetch errors
 *
 * @param error
 * @param summary
 * @param icon
 */
export const handleFetchError = async (error, summary = "", icon = "sad") => {
    // return if user aborted the request
    if (error.name === "AbortError") {
        return;
    }

    let body;

    try {
        await error.json().then((json) => {
            if (json["hydra:description"] !== undefined) {
                // response is a JSON-LD and possibly also contains HTML!
                body = json["hydra:description"];
            } else if (json['detail'] !== undefined) {
                // response is a plain JSON
                body = json['detail'];