import { html, render } from "/js/lib/lit-html.js"; import { Component } from "/js/components/component.js"; import { externalLinkTemplate } from "/js/templates/externalLink.template.js"; const YOUTUBE_EMBED_BASE_URL = "https://www.youtube-nocookie.com/embed"; const DEFAULT_ASPECT_RATIO = String(16 / 9); class YoutubeEmbed extends Component { // Pause on navigate handlePageTransition = () => { if (!this.playing) { return; } this.querySelector("iframe")?.contentWindow?.postMessage( JSON.stringify({ event: "command", func: "pauseVideo", args: [] }), "https://www.youtube-nocookie.com", ); }; connectedCallback() { window.addEventListener("page-transition", this.handlePageTransition); if (this._initialized) { return; } this.videoId = this.getAttribute("video-id"); this.start = this.getAttribute("start"); this.thumb = this.getAttribute("thumb"); this.videoTitle = this.getAttribute("video-title") ?? ""; this.url = this.getAttribute("url"); this.description = this.getAttribute("description") ?? ""; this.aspectRatio = this.getAttribute("aspect-ratio"); this.playing = false; this.dataset.teststate = "preview"; this.render(); this._initialized = true; } disconnectedCallback() { window.removeEventListener("page-transition", this.handlePageTransition); } getPlayerSrc() { const startSeconds = /^\d+$/.test(this.start ?? "") ? this.start : "0"; return `${YOUTUBE_EMBED_BASE_URL}/${encodeURIComponent( this.videoId, )}?autoplay=1&start=${startSeconds}&rel=0&playsinline=1&enablejsapi=1&origin=${encodeURIComponent(window.location.origin)}`; } play() { this.playing = true; this.dataset.teststate = "playing"; this.classList.add("is-playing"); this.style.aspectRatio = this.aspectRatio || DEFAULT_ASPECT_RATIO; this.render(); this.querySelector("iframe")?.focus(); } render() { render( this.playing ? html`` : externalLinkTemplate({ url: this.url, title: this.videoTitle, description: this.description, image: this.thumb, lazyLoadImages: true, onClick: () => this.play(), ariaLabel: this.videoTitle ? `Play YouTube video: ${this.videoTitle}` : "Play YouTube video", }), this, ); } } YoutubeEmbed.register();