Source: ui/ad_statistics_button.js

/*! @license
 * Shaka Player
 * Copyright 2016 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */


goog.provide('shaka.ui.AdStatisticsButton');

goog.require('shaka.log');
goog.require('shaka.ads.Utils');
goog.require('shaka.ui.Controls');
goog.require('shaka.ui.Locales');
goog.require('shaka.ui.OverflowMenu');
goog.require('shaka.ui.StatisticsButtonBase');
goog.require('shaka.ui.Utils');
goog.requireType('shaka.ui.Controls');


/**
 * @extends {shaka.ui.StatisticsButtonBase}
 * @final
 * @export
 */
shaka.ui.AdStatisticsButton = class extends shaka.ui.StatisticsButtonBase {
  /**
   * @param {!HTMLElement} parent
   * @param {!shaka.ui.Controls} controls
   */
  constructor(parent, controls) {
    super(parent, controls,
        'shaka-ad-statistics-button', 'shaka-ad-statistics-container');

    /** @private {!shaka.extern.AdsStats} */
    this.currentStats_ = this.adManager.getStats();

    shaka.ui.Utils.setDisplay(this.statsButton, this.currentStats_.started > 0);

    const parseLoadTimes = (name) => {
      let totalTime = 0;
      const loadTimes =
        /** @type {!Array<number>} */ (this.currentStats_[name]);
      for (const loadTime of loadTimes) {
        totalTime += parseFloat(loadTime);
      }
      return totalTime;
    };

    const showNumber = (name) => {
      return this.currentStats_[name];
    };

    this.statsParseFrom = new Map()
        .set('loadTimes', parseLoadTimes)
        .set('averageLoadTime', showNumber)
        .set('started', showNumber)
        .set('overlayAds', showNumber)
        .set('playedCompletely', showNumber)
        .set('skipped', showNumber)
        .set('errors', showNumber);

    this.eventManager.listen(this.statsButton, 'click', () => {
      if (!this.controls.isOpaque()) {
        return;
      }
      this.toggleContainer();
      this.updateLocalizedStrings();
    });

    this.eventManager.listen(this.player, 'loading', () => {
      this.updateStatsDisplay();
      this.checkAvailability();
    });

    this.eventManager.listen(
        this.adManager, shaka.ads.Utils.AD_STARTED, () => {
          this.updateStatsDisplay();
          this.checkAvailability();
        });

    this.updateLocalizedStrings();
    this.updateStatsDisplay();
    this.loadContainer_();
    this.checkAvailability();
  }

  /** @override */
  updateLocalizedStrings() {
    const LocIds = shaka.ui.Locales.Ids;

    const label = this.localization.resolve(LocIds.AD_STATISTICS);

    this.statsNameSpan.textContent = label;
    this.statsHeaderTitle.textContent = label;
    this.statsButton.ariaLabel = label;

    const labelText = this.statsContainer.classList.contains('shaka-hidden') ?
        LocIds.OFF : LocIds.ON;
    this.statsStateSpan.textContent = this.localization.resolve(labelText);
  }

  /** @override */
  checkAvailability() {
    const hasStats = this.currentStats_.started > 0 ||
        this.currentStats_.overlayAds > 0 ||
        this.currentStats_.playedCompletely > 0 ||
        this.currentStats_.skipped > 0 ||
        this.currentStats_.errors > 0;
    shaka.ui.Utils.setDisplay(
        this.statsButton, !this.isSubMenuOpened && hasStats);
    if (!hasStats && !this.statsContainer.classList.contains('shaka-hidden')) {
      this.toggleContainer();
    }
  }

  /** @private */
  loadContainer_() {
    this.buildStatsContainerHeader();

    for (const name of this.controls.getConfig().adStatisticsList) {
      if (name in this.currentStats_) {
        this.statsContainer.appendChild(this.generateStatComponent(name));
        this.statsList.push(name);
      } else {
        shaka.log.alwaysWarn('Unrecognized ad statistic element:', name);
      }
    }
  }

  /** @override */
  updateStatsDisplay() {
    this.currentStats_ = this.adManager.getStats();

    for (const name of this.statsList) {
      this.statsDisplayedElements.get(name).textContent =
          this.statsParseFrom.get(name)(name);
    }
  }
};


/**
 * @implements {shaka.extern.IUIElement.Factory}
 * @final
 */
shaka.ui.AdStatisticsButton.Factory = class {
  /** @override */
  create(rootElement, controls) {
    return new shaka.ui.AdStatisticsButton(rootElement, controls);
  }
};


shaka.ui.OverflowMenu.registerElement(
    'ad_statistics', new shaka.ui.AdStatisticsButton.Factory());