@diamondkinetics/dk-video-player-ts
Version:
A custom web component for playing video content
446 lines (432 loc) • 32.8 kB
JavaScript
export class VideoPlayer extends HTMLElement {
LONG_TOUCH_DURATION = 500;
VIDEO_ACTIVE_CLASS = 'video--active';
INDICATORS_CONTAINER_CLASS = 'indicators-container';
INDICATOR_CLASS = 'indicator';
INDICATOR_ACTIVE_CLASS = 'indicator--active';
INDICATOR_FILL_CLASS = 'indicator-fill';
_config;
muted = true;
shadow;
currentVideoIndex = 0;
touchTimer;
touchStartTime;
constructor() {
super();
}
connectedCallback() {
this.shadow = this.attachShadow({ mode: 'open' });
}
disconnectedCallback() {
this.shadow.innerHTML = '';
}
render() {
if (this.shadow) {
this.reset();
this.appendStyles();
this.buildVideoIndicatorsHtml();
this.buildBannerAndVideoHtml();
}
}
reset() {
if (!!this.shadow.querySelector(`.${this.INDICATORS_CONTAINER_CLASS}`)) {
this.resetIndicators();
this.getVideoElements().forEach(video => this.resetAndRemoveVideo(video));
this.shadow.innerHTML = '';
this.currentVideoIndex = 0;
}
}
buildVideoIndicatorsHtml() {
const indicatorsContainer = document.createElement('div');
indicatorsContainer.classList.add(this.INDICATORS_CONTAINER_CLASS);
this._config.videoUrls.forEach((_, i) => {
const indicator = document.createElement('div');
indicator.classList.add(this.INDICATOR_CLASS);
const indicatorFill = document.createElement('div');
indicatorFill.classList.add(this.INDICATOR_FILL_CLASS);
indicator.appendChild(indicatorFill);
indicatorsContainer.appendChild(indicator);
});
this.shadow.appendChild(indicatorsContainer);
}
getInidicatorElements() {
return this.shadow.querySelectorAll(`.${this.INDICATOR_CLASS}`);
}
updateIndicators() {
this.getInidicatorElements().forEach((indicator, i) => {
if (i === 0 && this.currentVideoIndex === 0) {
indicator.classList.remove(this.INDICATOR_ACTIVE_CLASS);
}
if (i <= this.currentVideoIndex) {
indicator.classList.add(this.INDICATOR_ACTIVE_CLASS);
}
else {
indicator.classList.remove(this.INDICATOR_ACTIVE_CLASS);
}
});
}
updateFillWidth(video) {
const fill = this.getInidicatorElements()[this.currentVideoIndex]?.querySelector(`.${this.INDICATOR_FILL_CLASS}`);
if (fill) {
const currentTime = video.currentTime > 0 ? video.currentTime + 0.25 : video.currentTime;
const width = currentTime < video.duration ? (currentTime / video.duration) * 100 : 100;
fill.style.width = `${width}%`;
}
}
resetIndicators() {
this.getInidicatorElements().forEach(indicator => {
indicator.classList.remove(this.INDICATOR_ACTIVE_CLASS);
const fill = indicator.querySelector(`.${this.INDICATOR_FILL_CLASS}`);
this.applyFillWithoutTransition(fill, 0);
});
}
applyFillWithoutTransition(fill, percent) {
fill.style.transition = 'none';
fill.style.width = `${percent}%`;
// Force a reflow to apply the width change immediately
fill.offsetHeight;
fill.style.transition = '';
}
resetFillWidthAfterCurrentVideoIndex() {
this.getInidicatorElements().forEach((indicator, i) => {
indicator.classList.remove(this.INDICATOR_ACTIVE_CLASS);
const fill = indicator.querySelector(`.${this.INDICATOR_FILL_CLASS}`);
if (i >= this.currentVideoIndex) {
this.applyFillWithoutTransition(fill, 0);
}
});
}
applyFillWidthBeforeCurrentVideoIndex() {
this.getInidicatorElements().forEach((indicator, i) => {
indicator.classList.remove(this.INDICATOR_ACTIVE_CLASS);
const fill = indicator.querySelector(`.${this.INDICATOR_FILL_CLASS}`);
if (i <= this.currentVideoIndex) {
this.applyFillWithoutTransition(fill, 100);
}
});
}
buildBannerAndVideoHtml() {
const videos = this.buildVideosHtml();
const banner = this.buildBannerHtml();
const content = document.createElement('div');
content.classList.add('content');
if (videos) {
content.appendChild(videos);
}
content.appendChild(banner);
this.shadow.appendChild(content);
}
buildBannerHtml() {
const banner = document.createElement('div');
banner.classList.add('banner');
const bannerCopy = document.createElement('div');
bannerCopy.classList.add('banner-copy');
const title = document.createElement('h1');
title.textContent = this._config.title;
bannerCopy.appendChild(title);
const description = document.createElement('p');
description.textContent = this._config.description;
bannerCopy.appendChild(description);
banner.appendChild(bannerCopy);
const button = document.createElement('button');
button.textContent = this._config.buttonText;
button.onclick = this._config.buttonClick;
banner.appendChild(button);
return banner;
}
buildVideosHtml() {
if (this._config.videoUrls.length > 0) {
const videosContainer = document.createElement('div');
videosContainer.classList.add('videos-container');
this._config.videoUrls.forEach((url, i) => {
const video = this.createVideoElement(url);
this.initializeVideoEventHandlers(video);
if (i === this.currentVideoIndex) {
video.classList.add(this.VIDEO_ACTIVE_CLASS);
video.play();
}
videosContainer.appendChild(video);
});
videosContainer.appendChild(this.createMuteToggle());
return videosContainer;
}
}
createMuteToggle() {
const button = document.createElement('button');
button.classList.add('mute-toggle');
button.onclick = this.toggleMute;
button.appendChild(this.getMuteToggleSvg());
return button;
}
toggleMute = (event) => {
const button = event.currentTarget;
this.muted = !this.muted;
this.getVideoElements().forEach(video => (video.muted = this.muted));
button.replaceChild(this.getMuteToggleSvg(), button.firstChild);
};
getMuteToggleSvg() {
return this.muted ? this.createMutedSvg() : this.createUnmutedSvg();
}
createUnmutedSvg() {
const svgNS = 'http://www.w3.org/2000/svg';
const svg = this.createBaseSvg();
const path = document.createElementNS(svgNS, 'path');
path.setAttribute('d', 'M744-480.66q0-78.34-43-142.84t-112.84-96.84Q574-727 567-740.5t-1-27.5q6-15 21.5-21t30.51.58Q709-748 762.5-664.5 816-581 816-479.87t-53.5 184Q709-213 618.01-172.58 603-166 587.5-172q-15.5-6-21.5-21-6-14 1-27.5t21.16-20.16Q658-273 701-337.66q43-64.65 43-143ZM288-384H180q-15.3 0-25.65-10.35Q144-404.7 144-420v-120q0-15.3 10.35-25.65Q164.7-576 180-576h108l131-131q17-17 39-7.55t22 33.76v401.48q0 24.31-22 33.81-22 9.5-39-7.5L288-384Zm360-96q0 37-18 76t-51 59q-9 5-18 .5t-9-15.97v-239.06q0-11.47 9-15.97t18 .5q33 19 51 58.5t18 76.5ZM408-594l-90 90H216v48h102l90 90v-228Zm-97 114Z');
svg.appendChild(path);
return svg;
}
createMutedSvg() {
const svgNS = 'http://www.w3.org/2000/svg';
const svg = this.createBaseSvg();
const path = document.createElementNS(svgNS, 'path');
path.setAttribute('d', 'M661-197q-11 7-23 13t-26 12q-14 6-28.5 0T564-192q-5-14 1.5-27.5T586-239l12-6q6-3 11-5L480-378v100q0 24-22 33.5t-39-7.5L288-383H180q-15 0-25.5-10.5T144-419v-120q0-15 10.5-25.5T180-575h102L115-743q-11-11-11-25.5t11-25.5q11-11 25.5-11t25.5 11l628 628q11 11 11 25t-11 25q-11 11-25.5 11T743-116l-82-81Zm83-282q0-79-43-143.5T588-719q-14-7-21-20.5t-1-27.5q6-15 21-21t30 1q90 40 144.5 122.5T816-480q0 32-6 63t-18 60q-8 20-22 25t-27 0q-13-5-20.5-17.5T722-376q11-24 16.5-50t5.5-53ZM579-614q32 20 50.5 59t18.5 76v12q0 6-1 11-2 11-13 14.5t-20-5.5l-51-51q-5-5-8-11.5t-3-14.5v-75q0-11 9-15.5t18 .5Zm-179-47q-5-5-5-13t5-13l19-19q17-17 39-7.5t22 33.5v56q0 12-11.5 16t-19.5-4l-49-49Zm8 296v-85l-72-72-18 19H216v48h102l90 90Zm-36-121Z');
svg.appendChild(path);
return svg;
}
createBaseSvg() {
const svgNS = 'http://www.w3.org/2000/svg';
const svg = document.createElementNS(svgNS, 'svg');
svg.setAttribute('xmlns', svgNS);
svg.setAttribute('height', '20px');
svg.setAttribute('viewBox', '0 -960 960 960');
svg.setAttribute('width', '20px');
svg.setAttribute('fill', '#FFFFFF');
return svg;
}
createVideoElement(src) {
const video = document.createElement('video');
video.src = src;
video.muted = this.muted;
video.preload = 'auto';
video.onended = this.onVideoEnded;
video.playsInline = true;
return video;
}
initializeVideoEventHandlers(video) {
video.addEventListener('touchstart', this.onVideoTouchStart);
video.addEventListener('touchend', this.onVideoTouchEnd);
video.addEventListener('play', this.onVideoPlay);
video.addEventListener('timeupdate', this.onVideoTimeUpdate);
}
onVideoTouchStart = (event) => {
this.touchStartTime = Date.now();
this.touchTimer = setTimeout(this.onVideoLongTouch, this.LONG_TOUCH_DURATION);
const video = event.currentTarget;
if (video.paused) {
video.play();
this.touchStartTime = 0;
}
};
onVideoTouchEnd = (event) => {
if (this.touchTimer) {
clearTimeout(this.touchTimer);
}
const touchDuration = Date.now() - this.touchStartTime;
if (touchDuration < this.LONG_TOUCH_DURATION) {
this.onVideoTap(event);
}
};
onVideoPlay = (event) => {
const video = event.currentTarget;
this.updateFillWidth(video);
this.updateIndicators();
};
onVideoTimeUpdate = (event) => {
const video = event.currentTarget;
this.updateFillWidth(video);
};
onVideoTap = (event) => {
const videoElement = event.currentTarget;
const rect = videoElement.getBoundingClientRect();
const x = event.changedTouches[0].clientX - rect.left;
if (x < rect.width / 2) {
this.playPreviousVideo();
}
else {
this.playNextVideo();
}
};
onVideoLongTouch = () => {
const currentVideo = this.getVideoElements()[this.currentVideoIndex];
if (currentVideo) {
currentVideo.paused ? currentVideo.play() : currentVideo.pause();
}
};
onVideoEnded = () => {
if (this.currentVideoIndex === this._config.videoUrls.length - 1) {
this.resetIndicators();
}
this.playNextVideo();
};
playNextVideo() {
const videos = this.getVideoElements();
this.resetAndRemoveVideo(videos[this.currentVideoIndex]);
if (this.currentVideoIndex === this._config.videoUrls.length - 1) {
this.resetIndicators();
}
else {
this.applyFillWidthBeforeCurrentVideoIndex();
}
this.currentVideoIndex = this.currentVideoIndex === videos.length - 1 ? 0 : this.currentVideoIndex + 1;
this.activateAndPlayVideo(videos[this.currentVideoIndex]);
}
playPreviousVideo() {
const videos = this.getVideoElements();
this.resetAndRemoveVideo(videos[this.currentVideoIndex]);
this.currentVideoIndex = this.currentVideoIndex > 0 ? this.currentVideoIndex - 1 : 0;
if (this.currentVideoIndex === 0) {
this.resetIndicators();
}
else {
this.resetFillWidthAfterCurrentVideoIndex();
}
this.activateAndPlayVideo(videos[this.currentVideoIndex]);
}
getVideoElements() {
return this.shadow.querySelectorAll('video');
}
resetAndRemoveVideo(video) {
if (video) {
video.pause();
video.currentTime = 0;
video.classList.remove(this.VIDEO_ACTIVE_CLASS);
}
}
activateAndPlayVideo(video) {
if (video) {
video.classList.add(this.VIDEO_ACTIVE_CLASS);
video.play();
}
}
appendStyles() {
const style = document.createElement('style');
style.textContent = `
.indicators-container {
box-sizing: border-box;
position: absolute;
top: 0;
left: 0;
z-index: 500;
display: flex;
justify-content: space-between;
gap: 0 1rem;
width: 100%;
padding: 1rem 0.5rem;
background: var(--indicators-background, linear-gradient(to bottom, rgba(0, 0, 0, 0.85), rgba(0, 0, 0, 0)));
user-select: none;
-webkit-user-select: none;
.indicator {
display: flex;
width: 100%;
height: 0.125rem;
background-color: var(--unplayed-bar-color, rgba(255, 255, 255, 0.5));
.indicator-fill {
width: 0%;
transition: width 0s linear;
background-color: var(--played-bar-color, #69ff5e);
}
}
.${this.INDICATOR_ACTIVE_CLASS} {
.indicator-fill {
transition-duration: 250ms;
}
}
}
.content {
display: flex;
flex-direction: column;
position: relative;
z-index: 400;
width: 100%;
height: 100svh;
.videos-container {
position: relative;
flex-grow: 1;
width: 100%;
min-height: 0;
user-select: none;
-webkit-user-select: none;
video {
display: none;
width: 100%;
height: 100%;
object-fit: cover;
object-position: center;
&.${this.VIDEO_ACTIVE_CLASS} {
display: block;
}
}
.mute-toggle {
all: unset;
position: absolute;
bottom: 16px;
right: 16px;
display: flex;
justify-content: center;
align-items: center;
width: 32px;
height: 32px;
border-radius: 50%;
padding: 0;
background-color: rgba(0, 0, 0, 0.5);
color: #fff;
text-align: center;
}
}
.banner {
box-sizing: border-box;
display: flex;
justify-content: space-between;
align-items: center;
width: 100%;
padding: 1rem;
gap: 0 1rem;
background: var(--banner-background, #1a1a1a);
user-select: none;
-webkit-user-select: none;
.banner-copy {
flex-shrink: 1;
h1 {
margin: 0 0 0.375rem;
font-size: 1.125rem;
text-transform: uppercase;
font-family: var(--banner-title-font, Inter, Roboto, 'Helvetica Neue', 'Arial Nova', 'Nimbus Sans', Arial, sans-serif);
}
p {
margin: 0;
font-size: 0.875rem;
font-family: var(--banner-description-font, Inter, Roboto, 'Helvetica Neue', 'Arial Nova', 'Nimbus Sans', Arial, sans-serif);
}
}
button {
flex-shrink: 0;
padding: 0.75rem 1rem;
border: none;
border-radius: 20px;
font-family: var(--banner-button-font, Inter, Roboto, 'Helvetica Neue', 'Arial Nova', 'Nimbus Sans', Arial, sans-serif);
font-size: 0.875rem;
line-height: 1;
font-weight: bold;
letter-spacing: 0.5px;
color: #000;
text-transform: uppercase;
background-color: #69ff5e;
&:active {
background-color: #3cc732;
}
}
}
}
`;
this.shadow.appendChild(style);
}
get config() {
return this._config;
}
set config(value) {
this._config = value;
this.muted = this._config.muted ?? this.muted;
this.render();
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlkZW8tcGxheWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3ZpZGVvLXBsYXllci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLE9BQU8sV0FBWSxTQUFRLFdBQVc7SUFDekIsbUJBQW1CLEdBQUcsR0FBRyxDQUFDO0lBQzFCLGtCQUFrQixHQUFHLGVBQWUsQ0FBQztJQUNyQywwQkFBMEIsR0FBRyxzQkFBc0IsQ0FBQztJQUNwRCxlQUFlLEdBQUcsV0FBVyxDQUFDO0lBQzlCLHNCQUFzQixHQUFHLG1CQUFtQixDQUFDO0lBQzdDLG9CQUFvQixHQUFHLGdCQUFnQixDQUFDO0lBRWpELE9BQU8sQ0FBb0I7SUFDM0IsS0FBSyxHQUFHLElBQUksQ0FBQztJQUNiLE1BQU0sQ0FBYTtJQUNuQixpQkFBaUIsR0FBRyxDQUFDLENBQUM7SUFDdEIsVUFBVSxDQUFTO0lBQ25CLGNBQWMsQ0FBUztJQUUvQjtRQUNFLEtBQUssRUFBRSxDQUFDO0lBQ1YsQ0FBQztJQUVNLGlCQUFpQjtRQUN0QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRU0sb0JBQW9CO1FBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRU8sTUFBTTtRQUNaLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNiLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUNqQyxDQUFDO0lBQ0gsQ0FBQztJQUVPLEtBQUs7UUFDWCxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJ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