Code coverage report for app/components/_common/services/router-helper.provider.js

Statements: 100% (84 / 84)      Branches: 100% (38 / 38)      Functions: 100% (18 / 18)      Lines: 100% (46 / 46)      Ignored: 2 statements, 5 branches     

All files » app/components/_common/services/ » router-helper.provider.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124                18×     18× 18× 18×         18× 18×                                   18×                                     18×                 19×   19×       19×       18×       18×                        
import angular from 'angular';
 
const [handlingStateChangeError, hasOtherwise, stateCounts] = [
    Symbol(), Symbol(), Symbol()
];
 
class RouterHelper {
    constructor (config, $stateProvider, $urlRouterProvider,
        $rootScope, $state, Logger, Resolve) {
        Object.assign(this, {config, $stateProvider, $urlRouterProvider,
            $rootScope, $state, Logger, Resolve});
        // private variable
        this[handlingStateChangeError] = false;
        this[hasOtherwise] = false;
        this[stateCounts] = {
            errors: 0,
            changes: 0
        };
 
        this.handleRoutingErrors();
        this.updateDocTitle();
    }
 
    configureStates (states, otherwisePath) {
        const self = this;
        states.forEach((state) => {
            // add login check if requireLogin is true
            const data = state.config.data;
            if (data && data.requireLogin === true) {
                state.config.resolve = angular.extend(
                    state.config.resolve || {},
                    {loginResolve: self.Resolve.login}
                );
            }
            state.config.resolve =
                angular.extend(state.config.resolve || {}, self.config.resolveAlways);
            this.$stateProvider.state(state.state, state.config);
        });
        if (otherwisePath && !this[hasOtherwise]) {
            this[hasOtherwise] = true;
            this.$urlRouterProvider.otherwise(otherwisePath);
        }
    }
 
    handleRoutingErrors () {
        // Route cancellation:
        // On routing error, go to the dashboard.
        // Provide an exit clause if it tries to do it twice.
        this.$rootScope.$on('$stateChangeError',
            (event, toState, toParams, fromState, fromParams, error) => {
                if (this[handlingStateChangeError]) {
                    return;
                }
                this[stateCounts].errors++;
                this[handlingStateChangeError] = true;
                const destination = (toState &&
                    (toState.title || toState.name || toState.loadedTemplateUrl)) ||
                    'unknown target';
                const errorMessage = (error && error.message) || error;
                const msg = `Error routing to ${destination}.\nReason: ${errorMessage}.`;
                this.Logger.warning(msg);
                // handle requireLogin issue
                if (error === 'requireLogin') {
                    this.$state.prev = {
                        state: toState.name,
                        params: toParams
                    };
                    this.$state.go('root.layout.login');
                } else {
                    this.$state.go('root.layout.home');
                }
            }
        );
    }
 
    getStates () {
        return this.$state.get();
    }
 
    updateDocTitle () {
        this.$rootScope.$on('$stateChangeSuccess',
            (event, toState) => {
                this[stateCounts].changes++;
                this[handlingStateChangeError] = false;
                const title = `${toState.data.title} - ${this.config.mainTitle}`;
                this.$rootScope.title = title; // data bind to <title>
                this.$rootScope._class = toState.data._class; // data bind to <body>
            }
        );
    }
}
 
// Help configure the state-base ui.router
class RouterHelperProvider {
    constructor ($locationProvider, $stateProvider, $urlRouterProvider) {
        Object.assign(this, {$locationProvider, $stateProvider, $urlRouterProvider});
 
        this.config = {
            mainTitle: '',
            resolveAlways: {}
        };
        this.$locationProvider.html5Mode(true);
    }
 
    configure (cfg) {
        angular.extend(this.config, cfg);
    }
 
    $get ($rootScope, $state, Logger, Resolve) {
        return new RouterHelper(
            this.config, this.$stateProvider, this.$urlRouterProvider,
            $rootScope, $state, Logger, Resolve);
    }
}
 
RouterHelperProvider.prototype.$get.$inject = [
    '$rootScope', '$state', 'Logger', 'Resolve'
];
 
RouterHelperProvider.$inject = ['$locationProvider', '$stateProvider', '$urlRouterProvider'];
 
export default RouterHelperProvider;