Source: directives/mensageria/chat-usuario/chat-usuario.service.js

/**
 * @ngdoc directives
 * @name MensageriaChatUsuario
 * @module s4c.directives.mensageria.chatusuario.MensageriaChatUsuario
 *
 * @description
 * `MensageriaChatUsuarioService` Componente para acesso ao api do backend e/ou comunicação entre controllers
 * 
 * 
 */
(function () {
    angular.module('s4c.components.collaboration')
        .factory('MensageriaChatUsuario', MensageriaChatUsuario);

    MensageriaChatUsuario.$inject = [
        'MensageriaService',
        'CommService',
        'MensageriaManager'
    ];

    function MensageriaChatUsuario(MensageriaService, CommService, MensageriaManager) {
        var service = {
            on: on,
            trigger: trigger,
            _eventos: {
                'novaMensagem': [],
                'mensagensSelecionadas': [],
                'mensagemApagada': [],
                'obterInformacoes': [],
                'obterUsuarios': [],
                'obterContatos': [],
                'ocultarContatos': [],
                'updateUserList': []
            },
            enviarMensagem: enviarMensagem,
        };

        CommService.on('mensagem', function (data) {
            // Não notificar quando o usuário está com a janela aberta:
            trigger('novaMensagem', data);
        });

        /**
         * @method on
         * @param {*} nomeEvento 
         * @param {*} callback 
         */
        function on(nomeEvento, callback) {
            service._eventos[nomeEvento].push(callback);
        }

        /**
         * @method trigger
         * @param {*} nomeEvento 
         * @param {*} args 
         */
        function trigger(nomeEvento, args) {
            _.each(service._eventos[nomeEvento], function (callback) {
                callback(args);
            });
        }

        /**
         * @method enviarMensagem
         * @param {*} usuario 
         * @param {*} mensagem 
         */
        function enviarMensagem(usuario, mensagem) {
            MensageriaService.enviarMensagem(usuario.id, mensagem).then(function (resultado) {
                service.trigger('novaMensagem', resultado);
            });
        }

        return service;
    }
}());