ArticleTemplates/assets/js/modules/creativeInjector.js (59 lines of code) (raw):

import { debounce, isOnline, signalDevice, isElementPartiallyInViewport } from 'modules/util'; import { initPositionPoller } from 'modules/cards'; let impressionSeen = false; function buttonHtml(buttonText, buttonName) { return ` <div> <a class="epic-button" href="x-gu://creative_tap/${buttonName}"> ${buttonText} <svg class="epic-button-arrow" xmlns="http://www.w3.org/2000/svg" width="23" height="23" viewBox="5 5 20 20"> <path fill="#121212" d="M22.8 14.6L15.2 7l-.7.7 5.5 6.6H6v1.5h14l-5.5 6.6.7.7 7.6-7.6v-.9"/> </svg> </a> </div>`; } function epicHtml(title, body, premiumButton, contributeButton) { return ` <h1>${title}</h1> <div>${body}</div> <div class="button-container"> ${buttonHtml(premiumButton, 'premium_button')} ${contributeButton ? buttonHtml(contributeButton, 'contribute_button') : ''} </div> `; } function isCreativeInView(creativeContainer) { if (!impressionSeen && isElementPartiallyInViewport(creativeContainer)) { signalDevice('creative_impression'); impressionSeen = true; } } function addEventListenerScroll(creativeContainer) { window.addEventListener('scroll', debounce(isCreativeInView.bind(null, creativeContainer), 100)); } function injectEpicCreative(creativeContainer) { const prose = document.querySelector('.article__body > div.prose'); if (prose) { prose.appendChild(creativeContainer); } } function injectEpic(title, body, firstButton, secondButton) { if (isOnline() && !document.getElementById('creative-container')) { const creativeContainer = document.createElement('div'); creativeContainer.id = 'creative-container'; creativeContainer.innerHTML = epicHtml(title, body, firstButton, secondButton); injectEpicCreative(creativeContainer); addEventListenerScroll(creativeContainer); initPositionPoller(); } } function init() { window.injectEpic = injectEpic; window.applyNativeFunctionCall('injectEpic'); } export { init };