Home Reference Source Repository

app/views/EventLogView.js

import GameEvents from '../events/GameEvents.js';

import UIMessageEvent from '../controllers/UIMessageEvent.js';

export default class EventLogView {
    /**
     * @class EventLogView
     * @description Event feed widget
     */
    constructor(sharedData) {
        var scrollPane = this._scrollPane = document.createElement('div');
        scrollPane.classList.add('log-scroll');
        var log = document.createElement('div');
        log.classList.add('log');
        log.setAttribute('aria-live', 'polite');
        log.setAttribute('data-locked-bottom', true);
        scrollPane.appendChild(log);

        function observer(event) {
            if(event && event.getText &&
                    !(event instanceof GameEvents.HumanToMoveEvent ||
                    event instanceof GameEvents.HumanMovingEvent ||
                    event instanceof GameEvents.InventoryChangeEvent ||
                    event instanceof GameEvents.PositionChangeEvent)) {
                var dungeon = sharedData.getDungeon();
                if(dungeon && (!event.isSeenBy || event.isSeenBy(dungeon, dungeon.getPlayableCharacter()))) {
                    var message = document.createElement('div');
                    message.textContent = /*"<" + event.getTimestamp() + "> " +*/ event.getText(dungeon);
                    if(event instanceof UIMessageEvent) {
                        message.classList.add('ui-error');
                    }
                    log.appendChild(message);
                    checkScroll();
                }
            }
        }

        sharedData.addObserver(observer);

        scrollPane.addEventListener('scroll', function() {
            log.setAttribute('data-locked-bottom', scrollPane.scrollTop + scrollPane.clientHeight === scrollPane.scrollHeight);
        });

        function checkScroll() {
            if(log.getAttribute('data-locked-bottom') === 'true') {
                scrollPane.scrollTop = Number.MAX_VALUE;
            }
        }
    }

    getDom() {
        return this._scrollPane;
    }
}