Home Reference Source Repository

js/Managers/ErrorManager.js

import Backbone from 'backbone';
import RODAN_EVENTS from 'js/Shared/RODAN_EVENTS';
import Radio from 'backbone.radio';
import ViewError from 'js/Views/Master/Error/ViewError';

/**
 * General error manager.
 */
export default class ErrorHandler
{
///////////////////////////////////////////////////////////////////////////////////////
// PUBLIC METHODS
///////////////////////////////////////////////////////////////////////////////////////
    /**
     * Constructor.
     */
    constructor()
    {
        window.onerror = (errorText, url, lineNumber, columnNumber, error) => this._handleJavaScriptError(errorText, url, lineNumber, columnNumber, error);
        Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__SYSTEM_HANDLE_ERROR, (options) => this._handleError(options));
    }

///////////////////////////////////////////////////////////////////////////////////////
// PRIVATE METHODS
///////////////////////////////////////////////////////////////////////////////////////
    /**
     * Handles Javscript error.
     */
    _handleJavaScriptError(errorText, url, lineNumber, columnNumber, error)
    {
        var text = 'Rodan Client has encountered an unexpected error.<br><br>';
        text += 'text: ' + errorText + '<br>';
        text += 'url: ' + url + '<br>';
        text += 'line: ' + lineNumber + '<br>';
        text += 'column: ' + columnNumber;
        this._showErrorView(text, error);
    }

    /**
     * Handle error.
     */
    _handleError(options)
    {
        var response = options.response;
        var responseTextObject = response.responseText !== '' ? JSON.parse(response.responseText) : null;
        if (responseTextObject !== null)
        {
            if (responseTextObject.hasOwnProperty('error_code'))
            {
                var error = options.response.responseJSON
                var text = error.error_code + '<br>';
                text += error.details[0];
                Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__SERVER_ERROR, {json: error});
     //           this._showRodanErrorView(text, error);
            }
            else
            {
                var response = options.response;
                var responseTextObject = JSON.parse(response.responseText);
                var message = 'An unknown error occured.';

                // Look for message in options first.
                if (options.hasOwnProperty('message'))
                {
                    message = options.message;
                }

                // Go through the response text.
                var first =  true;
                for(var property in responseTextObject)
                {
                    if (responseTextObject.hasOwnProperty(property))
                    {
                        message += '\n';
                        if (first)
                        {
                            message += '\n';
                            first = false;
                        }
                        message += responseTextObject[property];
                    }
                }
                this._showRodanErrorView(message, null);
            }
        }
        else
        {
            this._showErrorView(response.statusText, null);
        }
    }

    /**
     * Show error view.
     */
    _showErrorView(text, error)
    {
        var log = Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__LOG);
        var model = new Backbone.Model({text: text, error: error, log: log});
        var view = new ViewError({model: model, template: '#template-modal_error'});
        Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MODAL_SHOW, {view: view, title: 'Error', override: true});
    }

    /**
     * Show Rodan error view.
     */
    _showRodanErrorView(text, error)
    {
        var log = Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__LOG);
        var model = new Backbone.Model({text: text, error: error, log: log});
        var view = new ViewError({model: model, template: '#template-rodan_error'});
        Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MODAL_SHOW, {view: view, title: 'Error', override: true});
    }
}