Home Reference Source

js/controllers/LeaderboardViewController.js

import ViewController from '~/controllers/ViewController';
import LeaderboardItemTemplate from '~/template/LeaderboardItemTemplate';
import Leaderboard from '~/models/Request/Leaderboard';
import ErrorManager from '~/helpers/ErrorManager';

/**
 * Leaderboard buttons and all.
 */
export default class LeaderboardViewController extends ViewController {
    /**
     * Manages an existing leaderboard instance. Provide the post instance
     * also.
     *
     * @param {string} element element id.
     * @param {Post} post Post which leaderboard represents.
     */
    constructor(element, post) {
        super(element);

        /** @private */
        this.elem = element;

        /** @private */
        this.body = element.tBodies[0];

        /**
         * Post managed
         * @type {Post}
         */
        this.post = post;

        /** @private */
        this.seeMore = this.elem.parentNode.getElementsByClassName('lvc-reveal')[0];
        if (this.seeMore) {
            this.seeMore.addEventListener("click", () => {
                this.showMore().catch(error => {
                    ErrorManager.silent(
                        error,
                        `Failed to obtain further leaderboard data`
                    );
                });
            });
        }

        /**
         * Number of items in leaderboard
         * @type {number}
         */
        this.atIndex = this.body.children.length;
    }

    /**
     * Shows more leaderboard options
     */
    async showMore() {
        let leaderboard = await new Leaderboard({
            postId: this.post.id
        }).run();

        // Remove already existing ones
        leaderboard.splice(0, this.atIndex);

        leaderboard.forEach(answer => {
            this.atIndex += 1;
            let template = new LeaderboardItemTemplate(answer, this.atIndex);
            template.loadInContext(this.body);
        });

        this.seeMore.parentNode.removeChild(this.seeMore);
    }
}