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

/**
 * @ngdoc directives
 * @name MensageriaUsuario
 * @module s4c.directives.mensageria.chatusuario.MensageriaUsuario
 *
 * @description
 * `MensageriaUsuario` Controller da funcionalidade de conversas entre Usuários no módulo de mensageria 
 * 
 * 
 */
(function () {
    angular.module('s4c.components.collaboration')
        .directive('mensageriaChatUsuario', MensageriaUsuario);

    MensageriaUsuario.$inject = [
        '$mdDialog',
        'MensageriaService',
        'AuthService',
        'MensageriaChatUsuario',
        'FileUploader',
        'API_ENDPOINT',
        '$sce'
    ];

    function MensageriaUsuario($mdDialog, MensageriaService, AuthService, MensageriaChatUsuario, FileUploader, API_ENDPOINT, $sce) {
        return {
            restrict: 'E',
            templateUrl: 'app/directives/mensageria/chat-usuario/chat-usuario.html',
            replace: true,
            scope: {
                usuario: '=usuario',
                ativo: '=ativo'
            },
            controller: function ($scope) {
                $scope.loadMoreMessages = function () {
                    return MensageriaService.obterMensagensDoUsuario($scope.usuario.id, $scope.page++).then(function (mensagens) {
                        $scope.mensagens = mensagens;
                        $scope.addMarkers();
                    });
                };

                var uploader = $scope.uploader = new FileUploader(),
                    uploadCallbackQueue = [];

                uploader.clearQueue();

                $scope.uploader.filters.push({
                    'name': 'enforceMaxFileSize',
                    'fn': function (item, evt) {
                        var megaByte = parseInt(item.size / 1000000) + "MB";
                        if (item.size <= 26214400) {
                            return item.size <= 26214400
                        } else {
                            $mdDialog
                                .show($mdDialog.alert()
                                    .title('Tamanho de arquivo ultrapassado')
                                    .content('O limite do tamanho de arquivos para upload é de 25MB. Seu arquivo possui ' + megaByte + ' - limite ultrapassado!')
                                    .ok('OK'))
                            return item.size <= 26214400
                        }
                    }
                });

                $scope.uploader.onCompleteItem = function (item, response) {
                    $scope.mensagem = response;
                };

                $scope.uploader.onAfterAddingFile = function (item, evt, arquivo) {
                    item.novoNome = item.file.name;
                    enviarArquivo(item.file.name);
                }

                function ext(filename) {
                    var index = _.lastIndexOf(filename, '.');
                    return filename.substring(index, filename.length);
                }

                $scope.uploader.onBeforeUploadItem = function (item) {
                    item.url = uploader.url;
                    var token = window.sessionStorage.getItem('s4cToken');
                    var tokenObj = JSON.parse(token);
                    item.headers = {
                        'Authorization': 'Bearer ' + tokenObj.access_token
                    };
                    item.file.name = item.novoNome + ext(item.file.name);
                };

                $scope.uploader.onProgressItem = function (fileItem, progress) {
                    console.info('onProgressItem', fileItem, progress);
                };

                $scope.uploader.onCompleteAll = function (result) {
                    _.each(uploadCallbackQueue, function (callback) {
                        callback();
                    });
                };

                /**
                 * 
                 * @method enviarArquivo
                 * 
                 * @param {*} nomeArquivo 
                 */
                function enviarArquivo(nomeArquivo) {
                    $scope.isUploading = true;
                    uploader.url = '/mensagem/usuarioFile/' + $scope.usuario.id;
                    uploader.uploadAll();
                    uploadCallbackQueue.push(function () {
                        $scope.isUploading = false;
                        $scope.arquivosPraSubir = false;
                        $scope.mensagem = ''
                    });
                }

                $scope.uploader.alias = 'arquivo';
                $scope.uploader.removeAfterUpload = true;
            },
            link: function ($scope, $elem, $attrs) {
                angular.extend($scope, {
                    isUploading: false,
                    desativar: desativar,
                    enviarMensagem: enviarMensagem,
                    me: AuthService.user.info,
                    mensagem: '',
                    mensagens: [],
                    apagarMensagens: apagarMensagens,
                    abrirUpload: abrirUpload
                });

                $scope.toTrustedHTML = function (html) {
                    return $sce.trustAsHtml(html);
                }

                $scope.input = $elem.find('input.uploadArquivo');

                // insere um delimitador de tempo
                $scope.addMarkers = function () {
                    $scope.mensagens.forEach(function (obj) {
                        obj.groupDate = moment(obj.createdAt).format('YYYY-MM-DD');
                        obj.createdAt = moment(obj.createdAt).format('HH:mm');
                    });
                };

                $scope.$watch('usuario', function () {
                    if ($scope.usuario && $scope.usuario.id) {
                        $scope.page = ($scope.page ? $scope.page : 1);
                        MensageriaService.obterMensagensDoUsuario($scope.usuario.id, $scope.page).then(function (mensagens) {
                            $scope.mensagens = mensagens;

                            $scope.addMarkers();

                            setTimeout(function () {
                                $('#mensagens').animate({
                                    scrollTop: $('#mensagens')[0].scrollHeight + 100
                                }, 10);
                            }, 500);
                        });
                    }
                });

                //MensageriaChatUsuario.getInstance();
                /**
                 * @method mensagensSelecionadas
                 */
                MensageriaChatUsuario.on('mensagensSelecionadas', function (mensagens) {
                    $scope.mensagensSelecionadas = mensagens;
                });

                /**
                 * @method apagarMensagens
                 */
                function apagarMensagens() {
                    var mensagens = $scope.mensagensSelecionadas;

                    mensagens.map(function (mensagem) {
                        MensageriaService.deletarMensagem(mensagem.id)
                            .then(function (response) {
                                MensageriaChatUsuario.trigger('mensagemApagada', mensagem);
                            });
                    });
                }

                /**
                 * @method mensagemApagada
                 * 
                 */
                MensageriaChatUsuario.on('mensagemApagada', function (mensagem) {
                    var indexMsg = _.findIndex($scope.mensagens, function (msg) {
                        return msg.id === mensagem.id;
                    });

                    if (indexMsg > -1) {
                        $scope.mensagens.splice(indexMsg, 1);
                    }
                });


                /**
                 * 
                 * @method novaMensagem
                 * 
                 */
                MensageriaChatUsuario.on('novaMensagem', function (mensagem) {

                    MensageriaService.obterMensagensDoUsuario($scope.usuario.id, $scope.page).then(function (mensagens) {
                        $scope.mensagens = mensagens;

                        mensagem.groupDate = moment(mensagem.createdAt).format('YYYY-MM-DD');
                        mensagem.createdAt = moment().format('HH:mm');

                        var indexMsg = _.findIndex($scope.mensagens, function (msg) {
                            return msg.id === mensagem.id;
                        });

                        if (indexMsg == -1) {
                            $scope.mensagens.push(mensagem);
                            if ($('#mensagens')[0]) {
                                $('#mensagens').animate({
                                    scrollTop: $('#mensagens')[0].scrollHeight + 100
                                }, 800);
                            }
                        }

                    });

					/*
                    mensagem.groupDate = moment(mensagem.createdAt).format('YYYY-MM-DD');
                        
                    mensagem.createdAt = moment().format('HH:mm');
                    
                    if (mensagem.Usuario.id === $scope.usuario.id) {
                    	
                        $scope.mensagens.push(mensagem);
                        
                        if($('#mensagens')[0]){
                        	$('#mensagens').animate({
                        		scrollTop: $('#mensagens')[0].scrollHeight + 100
                        	}, 800);
                        }
                        
                    } else if (mensagem.Usuario.id === $scope.me.id) {
                    	
                    	$scope.mensagens.push(mensagem);
                    	if($('#mensagens')[0]){
                        	$('#mensagens').animate({
                        		scrollTop: $('#mensagens')[0].scrollHeight + 100
                        	}, 800);
                        }
                    }
                    */
                });

                /**
                 * @method abrirUpload
                 */
                function abrirUpload() {
                    $("#chat_usuario_arquivo").click();
                }

                /**
                 * @method removerArquivo
                 */
                function removerArquivo() {
                    $scope.mensagem.arquivo = {};
                }

                /**
                 * @method contains
                 * 
                 * @param {*} mensagem 
                 */
                function contains(mensagem) {

                    var selectedMsg;
                    angular.forEach($scope.mensagens, function (msg) {
                        if (msg.id == mensagem.id) {
                            selectedMsg = msg;
                        }
                    });

                    return selectedMsg;
                }

                /**
                 * @method desativar
                 */
                function desativar() {
                    $scope.ativo = false;
                };

                /**
                 * @method enviarMensagem
                 */
                function enviarMensagem() {
                    // Verificação de mensage vazia:
                    $scope.mensagem = $scope.mensagem.replace(/^\s+|\s+$/g, '');
                    if ($scope.mensagem.length > 0) {
                        MensageriaChatUsuario.enviarMensagem($scope.usuario, $scope.mensagem);
                        //$scope.mensagens.push($scope.mensagem);
                        $scope.mensagem = '';
                    }
                }
            }
        }
    }
}());