All files / app/assets/javascripts/behaviors gl_emoji.js

100% Statements 38/38
91.3% Branches 21/23
100% Functions 5/5
100% Lines 38/38

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69          14x     14x 14x 14x   14x 14x 9x   9x 9x 2x 2x   9x 9x   9x 9x   9x         14x 12x   14x 14x   14x   9x 2x 1x 1x 1x 1x 1x     2x 2x 7x 3x 3x   4x 4x 4x             2x 2x      
import { initEmojiMap, getEmojiInfo, emojiFallbackImageSrc, emojiImageTag } from '../emoji';
import isEmojiUnicodeSupported from '../emoji/support';
 
class GlEmoji extends HTMLElement {
  connectedCallback() {
    this.initialize();
  }
  initialize() {
    let emojiUnicode = this.textContent.trim();
    const { fallbackSpriteClass, fallbackSrc } = this.dataset;
    let { name, unicodeVersion } = this.dataset;
 
    return initEmojiMap().then(() => {
      if (!unicodeVersion) {
        const emojiInfo = getEmojiInfo(name);
 
        Eif (emojiInfo) {
          if (name !== emojiInfo.name) {
            ({ name } = emojiInfo);
            this.dataset.name = emojiInfo.name;
          }
          unicodeVersion = emojiInfo.u;
          this.dataset.unicodeVersion = unicodeVersion;
 
          emojiUnicode = emojiInfo.e;
          this.textContent = emojiInfo.e;
 
          this.title = emojiInfo.d;
        }
      }
 
      const isEmojiUnicode =
        this.childNodes &&
        Array.prototype.every.call(this.childNodes, (childNode) => childNode.nodeType === 3);
 
      const hasImageFallback = fallbackSrc?.length > 0;
      const hasCssSpriteFallback = fallbackSpriteClass?.length > 0;
 
      if (emojiUnicode && isEmojiUnicode && isEmojiUnicodeSupported(emojiUnicode, unicodeVersion)) {
        // noop
      } else if (hasCssSpriteFallback) {
        if (!gon.emoji_sprites_css_added && gon.emoji_sprites_css_path) {
          const emojiSpriteLinkTag = document.createElement('link');
          emojiSpriteLinkTag.setAttribute('rel', 'stylesheet');
          emojiSpriteLinkTag.setAttribute('href', gon.emoji_sprites_css_path);
          document.head.appendChild(emojiSpriteLinkTag);
          gon.emoji_sprites_css_added = true;
        }
        // IE 11 doesn't like adding multiple at once :(
        this.classList.add('emoji-icon');
        this.classList.add(fallbackSpriteClass);
      } else if (hasImageFallback) {
        this.innerHTML = '';
        this.appendChild(emojiImageTag(name, fallbackSrc));
      } else {
        const src = emojiFallbackImageSrc(name);
        this.innerHTML = '';
        this.appendChild(emojiImageTag(name, src));
      }
    });
  }
}
 
export default function installGlEmojiElement() {
  Eif (!customElements.get('gl-emoji')) {
    customElements.define('gl-emoji', GlEmoji);
  }
}