Source: directives/telegram/telegram-mensagem-grupos/telegram.mensagem.grupos.js

/**
 * @ngdoc directives
 * @name TelegramMensagemGrupos
 * @module s4c.directives.telegrammensagemgrupos.TelegramMensagemGrupos
 *
 * @description
 * `TelegramMensagemGrupos` Controller da funcionalidade de mensagens em grupo do telegram
 *
 * 
 */
(function () {
    'use strict';

    s4cTelegramMensagemGruposController.$inject = [
        '$scope',
        'TelegramService',
        'CommService',
        '$timeout',
        'localize'
    ];

    function s4cTelegramMensagemGruposController(
        $scope,
        TelegramService,
        CommService,
        $timeout,
        localize
    ) {
        $scope.groups = [];
        $scope.mensagens = [];
        $scope.page = 0;
        $scope.isLoadingMorePages = false;

        $scope.res = $scope.$root.res;

        $scope.timestamp2string = function (timestamp) {
            if (timestamp === null) {
                return;
            }

            var date = new Date(timestamp);
            var mom = moment(date);
            var formattedDate = mom.format('DD/MM/YY - HH:mm');
            return formattedDate;
        };

        TelegramService.getGroups().then(function (groups) {
            $scope.groups = groups;
        });

        /**
         * @method _reloadMessages
         * 
         * @param {*} pageNumber 
         * @param {*} pageToNumber 
         */
        function _reloadMessages(pageNumber, pageToNumber) {

            return TelegramService.getAllGroupMessages(pageNumber, pageToNumber)
                .then(function (messages) {

                    $scope.mensagens = _.chain(messages)
                        .uniqBy('id')
                        .orderBy('id', 'desc')
                        .each(function (message) {
                            if (message.texto) {
                                message.texto = message.texto.trim();
                            }
                        })
                        .value();

                    $timeout(function () {
                        $scope.scrollToTop();
                    });
                });
        }

        /**
         * @method loadMoreMessages
         */
        $scope.loadMoreMessages = function () {
            var page = $scope.page;
            $scope.page++;
            $scope.isLoadingMorePages = true;

            return TelegramService.getAllGroupMessages($scope.page)
                .then(function (messages) {
                    if (messages.length <= 0 && $scope.page > 0) $scope.page--;

                    $scope.isLoadingMorePages = false;

                    $scope.mensagens = _.chain($scope.mensagens.concat(messages))
                        .uniqBy('id')
                        .orderBy('id', 'desc')
                        .value();
                });
        };

        $scope.count_new_messages = 0;
        $scope.isOutScroll = false;

        /**
         * @method adjustPositionFixedHead
         */
        var adjustPositionFixedHead = function () {
            document.querySelectorAll('s4c-telegram-mensagem-grupos .table-telegram-mensagem-grupos-header')[0].style.top = document.querySelectorAll('s4c-telegram-mensagem-grupos #mensagem-grupos-list-telegram')[0].scrollTop + 'px';
        };

        /**
         * @method adjustFixedHead
         */
        var adjustFixedHead = function () {
            var headFxTh = document.querySelectorAll('s4c-telegram-mensagem-grupos .table-telegram-mensagem-grupos-header thead th');
            var headTh = document.querySelectorAll('s4c-telegram-mensagem-grupos .table-telegram-mensagem-grupos thead th');

            var tableWidth = document.querySelectorAll('s4c-telegram-mensagem-grupos .table-telegram-mensagem-grupos')[0].clientWidth;
            document.querySelectorAll('s4c-telegram-mensagem-grupos .table-telegram-mensagem-grupos-header')[0].setAttribute('style', 'width:' + tableWidth + 'px');

            for (var i = 0; i < headFxTh.length; i++) {
                var width = headTh[i].clientWidth;
                headFxTh[i].setAttribute('style', 'width:' + width + 'px');
            }
        };

        /**
         * @method onscroll_mensagem-grupos-list-telegram
         */
        document.getElementById('mensagem-grupos-list-telegram').onscroll = function (e) {
            adjustFixedHead();
            adjustPositionFixedHead();
            var objScroll = document.getElementById('mensagem-grupos-list-telegram');


            var h = objScroll.offsetHeight;

            if (objScroll.scrollTop > h) {
                $scope.isOutScroll = true;
            } else {
                $scope.isOutScroll = false;
                $scope.count_new_messages = 0;
            }
        };

        /**
         * @method scrollToTop
         */
        $scope.scrollToTop = function () {
            var objScroll = document.getElementById('mensagem-grupos-list-telegram');
            objScroll.scrollTop = 0;
            $scope.count_new_messages = 0;
        };

        /**
         * @method scrollToBottom
         */
        $scope.scrollToBottom = function () {
            var objScroll = document.getElementById('mensagem-grupos-list-telegram');
            var h = objScroll.offsetHeight;
            var limit = objScroll.scrollHeight - h;

            objScroll.scrollTop = limit;
            $scope.count_new_messages = 0;
        };

        /**
         * @method changeMessage
         */
        $scope.changeMessage = function (countMessage) {
            if ($scope.isOutScroll) {
                $scope.count_new_messages += countMessage;
                var objScroll = document.getElementById('mensagem-grupos-list-telegram');
                objScroll.scrollTop += 36;
                return;
            }

            $scope.scrollToTop();
        };

        CommService.on('mensageria_externa:mensagem', function (message) {
            $scope.mensagens.unshift(message);
            $timeout(function () {
                $scope.changeMessage(1);
                adjustFixedHead();
            }, 50);
        });

        _reloadMessages(0, 0);
    }

    function s4cTelegramMensagemGrupos() {
        return {
            restrict: 'EA',
            templateUrl: 'app/directives/telegram/telegram-mensagem-grupos/telegram.mensagem.grupos.html',
            scope: {},
            controller: s4cTelegramMensagemGruposController
        };
    }

    angular.module('s4c.components.telegram')
        .directive('s4cTelegramMensagemGrupos', s4cTelegramMensagemGrupos);
})();