import Swal from 'sweetalert2/dist/sweetalert2.js'; /** * Zentrale Error-Handler für Admin API Fehler */ /** * Behandelt Admin API Fehler mit benutzerfreundlichen Meldungen * @param {Error} error - Der aufgetretene Fehler * @param {string} context - Kontext der Operation (z.B. "Gruppe laden") * @returns {Promise} */ export const handleAdminError = async (error, context = 'Operation') => { console.error(`Admin API Error [${context}]:`, error); const status = error?.status; const reason = error?.reason || error?.code || error?.payload?.reason; // Session missing or expired if (status === 401 || reason === 'SESSION_REQUIRED') { await Swal.fire({ icon: 'warning', title: 'Anmeldung erforderlich', text: 'Ihre Sitzung ist abgelaufen. Bitte melden Sie sich erneut an.', confirmButtonText: 'Zum Login' }); return; } // CSRF token invalid or missing if (status === 403 && (reason === 'CSRF_INVALID' || reason === 'CSRF_REQUIRED')) { await Swal.fire({ icon: 'warning', title: 'Sicherheitsüberprüfung fehlgeschlagen', text: 'Bitte laden Sie die Seite neu und versuchen Sie es erneut.', confirmButtonText: 'Neu laden' }); return; } // Generic forbidden if (status === 403) { await Swal.fire({ icon: 'error', title: 'Keine Berechtigung', text: 'Sie besitzen keine Berechtigung für diese Aktion.', confirmButtonText: 'OK' }); return; } // Rate limit if (status === 429) { await Swal.fire({ icon: 'warning', title: 'Zu viele Anfragen', text: 'Bitte warten Sie einen Moment und versuchen Sie es erneut.', timer: 3000, showConfirmButton: false }); return; } // Not found if (status === 404) { await Swal.fire({ icon: 'error', title: 'Nicht gefunden', text: 'Die angeforderte Ressource wurde nicht gefunden.', confirmButtonText: 'OK' }); return; } // Server error if (status && status >= 500) { await Swal.fire({ icon: 'error', title: 'Server-Fehler', text: 'Ein interner Fehler ist aufgetreten. Bitte versuchen Sie es später erneut.', confirmButtonText: 'OK' }); return; } // Generic fallback await Swal.fire({ icon: 'error', title: `Fehler: ${context}`, text: error?.message || 'Ein unbekannter Fehler ist aufgetreten.', confirmButtonText: 'OK' }); }; /** * Wrapper für async Operationen mit automatischem Error-Handling * @param {Function} operation - Die auszuführende async Operation * @param {string} context - Kontext der Operation * @returns {Promise} - Ergebnis der Operation oder null bei Fehler */ export const withErrorHandling = async (operation, context) => { try { return await operation(); } catch (error) { await handleAdminError(error, context); return null; } };