Replacement Antenna - 4G/5G (2024)

${unmuteText}

`; const productTpl = (product, shopText) => { const thumbnailUrl = product.featuredImage && product.featuredImage.url; return `

${ product.title } ${ product.price } ${shopText}

`; }; const reelTpl = ({ id, Video, product }, textsConfig, shouldHideLogo) => { return `

${product?.title ? productTpl(product, textsConfig.shopText) : ""} ${ !shouldHideLogo ? `Powered by SwipeUp` : "" }

${muteControlsTpl(textsConfig)}

`; }; let activeVideo; const sendAnalyticsEvent = (params) => { const qs = new URLSearchParams(params).toString(); return fetch(`/apps/swipeup/client-api/event?${qs}`).catch((e) => console.log("Fetch error", e) ); }; const initViewer = ({ activators, feed, overlayId, textsConfig }) => { // styles const styles = shadowRootEl.getElementById(`SwipeUp-overlay_styles_${overlayId}`); styles.remove(); shadowEl.appendChild(styles); const link = shadowRootEl.querySelector('link'); link.remove(); shadowEl.appendChild(link); // overlay const overlay = shadowRootEl.getElementById(`SwipeUp-overlay_${overlayId}`); overlay.remove(); shadowEl.appendChild(overlay); const overlayContent = overlay.querySelector(".SwipeUp-overlay-content"); const shouldHideLogo = Boolean(feed.shouldHideLogo); const reelsCount = feed.Reels.length; overlayContent.innerHTML = feed.Reels.map((item) => reelTpl(item, textsConfig, shouldHideLogo) ).join(""); function lockBodyScroll(locked) { if (!locked) { const offsetY = Math.abs(parseInt(document.body.style.top || 0, 10)); document.body.classList.remove("SwipeUpLockScroll"); document.body.style.removeProperty("top"); document.body.style.removeProperty("left"); document.body.style.removeProperty("right"); window.scrollTo(0, offsetY || 0); } else { // Lock body scroll (hack for iOS) const offsetY = window.pageYOffset; document.body.style.top = `${-offsetY}px`; document.body.style.left = "0"; document.body.style.right = "0"; document.body.classList.add("SwipeUpLockScroll"); } } const scrollFeed = (type, count = 1, instant = false) => { const height = firstReel.clientHeight; const scrollAmount = height * count; const scrollAmountVec = type === "next" ? scrollAmount : -scrollAmount; if (instant) { overlayContent.scrollTop += scrollAmountVec; overlayContent.style.opacity = 1; } else { overlayContent.scrollBy({ top: scrollAmountVec, behavior: "smooth", }); } }; const onNextPress = () => { scrollFeed("next"); }; const onPrevPress = () => { scrollFeed("prev"); }; const overlayCloseBtn = overlay.querySelector(".SwipeUp-overlay-close"); const firstReel = overlay.querySelector(".SwipeUp-reel"); const nextBtn = overlay.querySelector(".SwipeUp-next"); const prevBtn = overlay.querySelector(".SwipeUp-prev"); nextBtn.addEventListener("click", onNextPress); prevBtn.addEventListener("click", onPrevPress); const activatorClickHandler = (event) => { event.preventDefault(); lockBodyScroll(true); const reelIndex = Number(event.target.dataset.reelidx); if (reelIndex) { overlayContent.style.opacity = 0; } overlay.style.display = "block"; if (reelIndex) { scrollFeed("next", reelIndex, true); } if (reelsCount > 1 && localStorage.getItem('swipeup-viewer-tutorial-seen') !== 'true') { if (reelIndex === reelsCount - 1) { overlayContent.classList.add('SwipeUp-overlay-content_withTutorial_down') } else { overlayContent.classList.add('SwipeUp-overlay-content_withTutorial') } } function hideOverlay() { lockBodyScroll(false); overlayContent.scrollTop = 0; overlay.style.display = "none"; document.removeEventListener("keyup", keyPressHandler); overlay.removeEventListener("click", clickHandler); overlayCloseBtn.removeEventListener("click", closeBtnHandler); overlayContent.classList.remove('SwipeUp-overlay-content_withTutorial'); overlayContent.classList.remove('SwipeUp-overlay-content_withTutorial_down'); activeVideo = null; } function clickHandler(event) { if (event.target === event.currentTarget) { hideOverlay(); } } function closeBtnHandler() { hideOverlay(); } function keyPressHandler(event) { if (event.key === "Escape") { hideOverlay(); } } document.addEventListener("keyup", keyPressHandler); overlay.addEventListener("click", clickHandler); overlayCloseBtn.addEventListener("click", closeBtnHandler); localStorage.setItem('swipeup-viewer-tutorial-seen', 'true'); shadowRoot.SwipeUp.sendAnalyticsEvent({ type: 'widgetClick' }); }; // TODO: maybe a better check like instanceof NodeList if (activators.length) { activators.forEach((activator) => activator.addEventListener("click", activatorClickHandler) ); } else { activators.addEventListener("click", activatorClickHandler); } }; // Lazy loading code const initViewerVideos = (isDesignMode) => { let muted = true; const muteButtons = shadowEl.querySelectorAll(".SwipeUp-Mute"); const unmuteButtons = shadowEl.querySelectorAll(".SwipeUp-Unmute"); const productCards = shadowEl.querySelectorAll(".reel-product-link"); if (!isDesignMode) { productCards.forEach((card) => { card.addEventListener("click", () => { sendAnalyticsEvent({ type: "productClick" }); }); }); } muteButtons.forEach((btn) => btn.addEventListener("click", () => { if (activeVideo) { activeVideo.muted = true; } muted = true; muteButtons.forEach((btn) => (btn.style.display = "none")); unmuteButtons.forEach((btn) => (btn.style.display = "flex")); }) ); unmuteButtons.forEach((btn) => btn.addEventListener("click", () => { if (activeVideo) { activeVideo.muted = false; } muted = false; muteButtons.forEach((btn) => (btn.style.display = "flex")); unmuteButtons.forEach((btn) => (btn.style.display = "none")); }) ); const reelVideos = shadowEl.querySelectorAll(".reel-video-full"); if (reelVideos[0]) { reelVideos[0].autoplay = "true"; reelVideos[0].preload = "auto"; } const reportVideoView = (id) => sendAnalyticsEvent({ type: "reelView", id }); const observer = new IntersectionObserver( (entries) => { for (const entry of entries) { if (entry.intersectionRatio > 0.9) { if (entry.target !== activeVideo && !isDesignMode) { reportVideoView(entry.target.dataset.reelid); } entry.target.play(); entry.target.muted = muted; activeVideo = entry.target; const sibling = entry.target.parentNode.parentNode.nextElementSibling; if (sibling) { const nextVideo = sibling.querySelector("video"); if (nextVideo) { nextVideo.preload = "auto"; } } } else { entry.target.pause(); entry.target.currentTime = 0; } } }, { threshold: 0.9 } ); for (const reel of reelVideos) { observer.observe(reel); reel.addEventListener("canplay", (e) => { reel.parentNode.parentNode.querySelector( ".SwipeUpReel-Skeleton" ).style.display = "none"; reel.parentNode.querySelector( ".reel-bubble-product-card" ).style.display = "flex"; }); reel.addEventListener("click", (e) => { const videoEl = e.target; if (!videoEl.paused) { videoEl.pause(); } else { videoEl.play(); } }); } }; // viewer in shadowDom shadowRoot.SwipeUp = window.SwipeUp || {}; shadowRoot.SwipeUp.viewerLoaded = true; shadowRoot.SwipeUp.initViewer = initViewer; shadowRoot.SwipeUp.initViewerVideos = initViewerVideos; shadowRoot.SwipeUp.sendAnalyticsEvent = sendAnalyticsEvent; shadowRoot.dispatchEvent(new Event("SwipeUp::ViewerLoaded")); } }); })();

    -->

    ${limitProductName(reelProductName)}

    ${reelProductPrice}

    `; const slideTpl = ({ reelPicUrl, reelName, reelProductUrl, reelProductPicUrl, reelProductName, reelProductPrice, reelVideoUrl, reelId, idx, }) => { return `
  • ${reelProductName ? productDataTpl({ reelProductUrl, reelProductPicUrl, reelProductName, reelProductPrice, }) : ''}
  • ` } const initSelectOptions = () => { for (const feed of feeds) { const option = document.createElement("option"); option.value = feed.id; option.textContent = feed.name; feedSelect.appendChild(option); } } const initSectionFeed = (id) => { return fetch(`/apps/swipeup/client-api/sections/feed?sectionId=${id}`).then((res) => { return res.json() }).then(res => { if (res.section) { selectedFeed = res.section.feed; if (isDesignMode) { for (let option of feedSelect.children) { if (option.getAttribute('value') === String(selectedFeed.id)) { option.setAttribute('selected', 'selected'); } } } initSlider(); } else { console.log('[SwipeUp::Feeds] nothing to load, section feed is empty'); } }).catch((e) => console.log('[SwipeUp::Feeds] error getting section feed', e)); }; const saveSectionFeedSettings = (params) => { return fetch(`/apps/swipeup/client-api/sections/feed`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(params) }).then((response) => { if (response.ok) { return alert('Widget settings saved'); } throw new Error(response.statusText); }).catch((e) => { alert('Error saving widget settings'); console.log("[SwipeUp] error section feed changing", e); }); }; const loadFeeds = () => { // TODO: possibly migrate to a single handle that has all the needed info (both feed list and selected feed) return fetch("/apps/swipeup/client-api/feeds").then((r) => r.json()).then((feedsResponse) => { if (feedsResponse) { feeds = feedsResponse.feeds; initSelectOptions(); initSectionFeed(sectionId); } else { console.log("[SwipeUp] nothing to load, feeds are empty"); } }).catch((e) => console.log("[SwipeUp] error loading feeds", e)); }; const initFeedBlock = () => { if (isDesignMode) { feedSelectContainer.querySelector('.SwipeUp-feeds-save').addEventListener('click', () => { saveSectionFeedSettings({ sectionId, feedId: selectedFeed?.id || null, }); }); feedSelect.addEventListener('change', onFeedSelect); loadFeeds(); } else { initSectionFeed(sectionId); } } const initSlider = () => { const reels = selectedFeed?.Reels; if (reels?.length) { sliderContainer.innerHTML = reels.map((r, idx) => { return slideTpl({ reelPicUrl: r.Video.thumbnailUrl, reelName: r.name, reelProductUrl: r.product.onlineStoreUrl || r.product.url, reelProductPicUrl: r.product.featuredImage?.url, reelProductName: r.product.title, reelProductPrice: r.product.price, reelVideoUrl: r.Video.url, reelId: r.id, idx, }) }).join(''); const videos = sliderContainer.querySelectorAll('.SwipeUp-slide-reel-pic'); const canPlayHandler = (event) => { const video = event.target; video.play().catch(console.log); video.removeEventListener('canplay', canPlayHandler); } videos.forEach((video) => { const parent = video.parentNode; const touchStartHandler = () => { if (video.readyState >= 2) { video.play().catch(console.log); } else { video.load(); video.addEventListener('canplay', canPlayHandler); } }; const touchEndHandler = () => { video.removeEventListener('canplay', canPlayHandler); video.pause(); }; parent.addEventListener('mouseenter', touchStartHandler); parent.addEventListener('touchstart', touchStartHandler); parent.addEventListener('mouseleave', touchEndHandler); parent.addEventListener('touchend', touchEndHandler); }); shadowRoot.SwipeUp.initViewer({ feed: selectedFeed, activators: sliderContainer.querySelectorAll('.SwipeUp-slide-scroll-overlay'), overlayId: sectionId, textsConfig, }); shadowRoot.SwipeUp.initViewerVideos(isDesignMode); } else if (isDesignMode) { sliderContainer.textContent = 'Selected feed has no reels'; } }; const onFeedSelect = (e) => { const selectedOption = Number(e.target.value) if (feeds) { selectedFeed = feeds.find(feed => feed.id === selectedOption); if (!selectedFeed) { return sliderContainer.textContent = 'No feed selected'; } initSlider(); } }; // TODO: add logging & timeout for this event to occur // if event does not occur send warning to monitoring tools shadowRoot.addEventListener('SwipeUp::ViewerLoaded', (e) => { initFeedBlock(); }); } catch (e) { console.log("Failed to load SwipeUp Reels Feed", e); }
    Replacement Antenna - 4G/5G (2024)

    References

    Top Articles
    Latest Posts
    Article information

    Author: Fr. Dewey Fisher

    Last Updated:

    Views: 6528

    Rating: 4.1 / 5 (42 voted)

    Reviews: 81% of readers found this page helpful

    Author information

    Name: Fr. Dewey Fisher

    Birthday: 1993-03-26

    Address: 917 Hyun Views, Rogahnmouth, KY 91013-8827

    Phone: +5938540192553

    Job: Administration Developer

    Hobby: Embroidery, Horseback riding, Juggling, Urban exploration, Skiing, Cycling, Handball

    Introduction: My name is Fr. Dewey Fisher, I am a powerful, open, faithful, combative, spotless, faithful, fair person who loves writing and wants to share my knowledge and understanding with you.