58 lines
2.4 KiB
JavaScript
58 lines
2.4 KiB
JavaScript
globalThis.Wegwichtel ??= {};
|
|
(function (ns) {
|
|
'use strict';
|
|
|
|
function messageText(error) {
|
|
const value = error?.responseJSON?.message || error?.message || error;
|
|
if (typeof value !== 'string') return '';
|
|
try {
|
|
const parsed = JSON.parse(value);
|
|
return typeof parsed.message === 'string' ? parsed.message : '';
|
|
} catch {
|
|
return value;
|
|
}
|
|
}
|
|
|
|
const explanations = [
|
|
[/Freigegebene Strecken dürfen nur/, "errors.delete-published"],
|
|
[/Freigegebene Strecken können/, "errors.edit-published"],
|
|
[/GPX|XML|Trackpunkte/, "errors.invalid-track"],
|
|
[/POI.*nicht gefunden/, "errors.station-missing"],
|
|
[/POI-Koordinaten/, "errors.station-location"],
|
|
[/Bildformat|Bilddatei/, "errors.image-format"],
|
|
[/Audioformat|Audiodatei/, "errors.audio-format"]
|
|
];
|
|
const statusExplanations = new Map([
|
|
[413, "errors.file-size"],
|
|
[401, "errors.permission"],
|
|
[403, "errors.permission"]
|
|
]);
|
|
|
|
function readableMessage(message, fallback) {
|
|
if (/\b(?:HTTP|API|HTTPS|JSON|IndexedDB|OPFS|CacheStorage|Base64|Blob|Server|sequence|dataUrl|PUT|POST)\b|https?:\/\/|[{}]/i.test(message)) return fallback;
|
|
if (/\b(?:Failed|NetworkError|TypeError|AbortError|SecurityError|NotAllowedError|undefined)\b/i.test(message)) return fallback;
|
|
if (message && readablePatterns.some(pattern => pattern.test(message))) return message;
|
|
return fallback;
|
|
}
|
|
|
|
const readablePatterns = [
|
|
/[äöüÄÖÜß]/,
|
|
/\b(?:The|This|Your|Please|Choose|Allow|Give|Save|Remove|Trail|Stop|There)\b/,
|
|
/\b(?:Die|Der|Das|Dein|Deine|Diese|Dieser|Dieses|Bitte|Wähle|Erlaube)\b/,
|
|
/\b(?:Ein|Eine|Kein|Keine|Speicher|Strecke|Station|Wegwichtel|Gespeichert|Entferne)\b/
|
|
];
|
|
|
|
function errorMessage(error, fallback = ns.I18n.t("editor.error.generic")) {
|
|
const message = messageText(error);
|
|
if (error?.name === 'QuotaExceededError' || error?.cause?.name === 'QuotaExceededError') return ns.I18n.t("errors.quota");
|
|
const explanation = explanations.find(([pattern]) => pattern.test(message));
|
|
if (explanation) return ns.I18n.t(explanation[1]);
|
|
const statusExplanation = statusExplanations.get(error?.status);
|
|
if (statusExplanation) return ns.I18n.t(statusExplanation);
|
|
if (error?.status >= 500) return ns.I18n.t("errors.unavailable");
|
|
return readableMessage(message, fallback);
|
|
}
|
|
|
|
ns.UserMessages = Object.freeze({ error: errorMessage });
|
|
}(globalThis.Wegwichtel));
|