Jake Vanderwerf
2025-12-21 3aada9949d51024a92a8b5c6cb70d12f9c3cac16
assets/js/concise/ErrorHandler.js
File was renamed from assets/js/dash/ErrorHandler.js
@@ -145,38 +145,67 @@
    }
    /**
     * Log error to server
    * Log error to server with enhanced context
     */
    async logErrorToServer(type, message, context) {
        try {
            if (!this.options.apiUrl) return;
         // Enhanced context with component tracking
         const enhancedContext = {
            ...context,
            url: window.location.href,
            pathname: window.location.pathname,
            userAgent: navigator.userAgent,
            timestamp: new Date().toISOString(),
            viewport: `${window.innerWidth}x${window.innerHeight}`,
            component: context.component || this.extractComponentFromStack(context.stack),
            method: context.method || this.extractMethodFromStack(context.stack),
            stack: context.stack || (context.error?.stack),
            isLoggedIn: window.auth.isAuthenticated(),
            source: 'frontend'
         };
            const data = new FormData();
            data.append('error_type', type);
            data.append('message', message);
            data.append('context', JSON.stringify({
                ...context,
                url: window.location.href,
                userAgent: navigator.userAgent,
                timestamp: new Date().toISOString()
            }));
         data.append('context', JSON.stringify(enhancedContext));
            // Use fetch with no-cors to ensure this always succeeds
            // even if there are CORS issues
            await fetch(`${this.options.apiUrl}errors/log`, {
                method: 'POST',
                headers: {
                    'X-WP-Nonce': window.feedSettings?.nonce || ''
               'X-WP-Nonce': window.auth.getNonce()
                },
                body: data
            });
        } catch (e) {
            // Silently fail - we don't want errors in error reporting
            console.warn('Failed to log error to server', e);
        }
    }
    /**
    * Extract component name from error stack
    */
   extractComponentFromStack(stack) {
      if (!stack) return 'Unknown';
      // Try to extract class/component name from stack trace
      const match = stack.match(/at\s+(\w+)\./);
      return match ? match[1] : 'Unknown';
   }
   /**
    * Extract method name from error stack
    */
   extractMethodFromStack(stack) {
      if (!stack) return null;
      // Try to extract method name
      const match = stack.match(/at\s+\w+\.(\w+)\s+/);
      return match ? match[1] : null;
   }
    /**
     * Display error notification
     */
    displayErrorNotification(message, type, retryCallback) {
@@ -213,8 +242,8 @@
     */
    handleAuthError() {
        // Redirect to login page if user isn't logged in
        if (window.feedSettings && window.feedSettings.loginUrl) {
            window.location.href = window.feedSettings.loginUrl;
        if (window.jvbSettings && window.jvbSettings.loginUrl) {
            window.location.href = window.jvbSettings.loginUrl;
            return;
        }
@@ -345,7 +374,9 @@
        });
    }
}
document.addEventListener('DOMContentLoaded', function () {
document.addEventListener('DOMContentLoaded', async function () {
   window.auth.subscribe((event) => {
      if (event === 'auth-loaded') {
   window.jvbError = new ErrorHandler({
      api: jvbSettings.api,
      logToServer: true,
@@ -354,5 +385,8 @@
      retryEnabled: true,
      maxRetries: 3
   });
      }
   });
});