{"version":3,"file":"quoteCard-0uC5wOok.js","sources":["../../src/scripts/modules/quoteCard.ts"],"sourcesContent":["import { Component } from '@verndale/core';\nimport YouTubeIframeLoader from 'youtube-iframe';\nimport Player from '@vimeo/player';\nimport { v4 as id } from 'uuid';\nimport { mediaQuery } from '../helpers/media-queries';\nimport { gsap } from 'gsap';\nimport { EventBusSingleton } from '../helpers/eventBus';\n\nexport type CaptionsProps =\n | {\n Start: number;\n Duration: number;\n Text: string;\n }[]\n | undefined;\n\ntype YouTubePlayer = {\n on: (event: string, callback: () => void) => void;\n playVideo: () => void;\n pauseVideo: () => void;\n mute: () => void;\n seekTo: (number: number, b: boolean) => void;\n unMute: () => void;\n playerInfo: {\n currentTime: number;\n };\n};\n\ntype DefaultPlayer = {\n muted: boolean;\n currentTime: number;\n play: () => void;\n pause: () => void;\n};\n\ntype VideoActions = {\n [key: string]: () => void;\n};\n\ntype VideoProvider = 'youtube' | 'vimeo' | 'default' | undefined;\n\nclass QuoteCard extends Component {\n videoId: string | undefined = undefined;\n provider: VideoProvider = undefined;\n player: YouTubePlayer | Player | DefaultPlayer | undefined;\n videoReady: boolean = false;\n isPlaying: boolean = false;\n isMuted: boolean = false;\n mq: MediaQueryList;\n id: string = id();\n captions: CaptionsProps = [];\n timeline: GSAPTimeline | undefined;\n\n constructor(el: HTMLElement) {\n super(el);\n\n this.mq = mediaQuery('tablet');\n this.captions = this.el.dataset.captions\n ? JSON.parse(this.decodeString(this.el.dataset.captions as string))\n : undefined;\n\n this.init();\n }\n\n setupDefaults() {\n this.dom = {\n videoPlaceholder: this.el.querySelector('.quote-card__video-placeholder'),\n videoWrapper: this.el.querySelector('.quote-card__video-inner'),\n imageWrapper: this.el.querySelector('.picture'),\n quoteWrapper: this.el.querySelector('.quote-card__quote'),\n quoteInner: this.el.querySelector('.quote-card__quote-inner'),\n controls: this.el.querySelector('.testimonial-cards-carousel__controls'),\n prevButton: this.el.querySelector('.testimonial-cards-carousel__control--prev'),\n nextButton: this.el.querySelector('.testimonial-cards-carousel__control--next'),\n playButton: this.el.querySelector(\n '.testimonial-cards-carousel__video-control--play'\n ),\n muteButton: this.el.querySelector(\n '.testimonial-cards-carousel__video-control--mute'\n ),\n repeatButton: this.el.querySelector(\n '.testimonial-cards-carousel__video-control--repeat'\n )\n };\n\n setTimeout(() => {\n this.setQuoteBlockHeight();\n }, 200);\n }\n\n addListeners() {\n if (this.dom.prevButton) {\n (this.dom.prevButton as HTMLButtonElement)?.addEventListener('click', () => {\n EventBusSingleton.publish('prevSlide');\n this.repeatVideo();\n this.pauseVideo();\n this.resetButtonState();\n this.setQuoteBlockHeight(true);\n this.timeline?.restart();\n this.timeline?.pause();\n });\n }\n\n if (this.dom.nextButton) {\n (this.dom.nextButton as HTMLButtonElement)?.addEventListener('click', () => {\n EventBusSingleton.publish('nextSlide');\n this.repeatVideo();\n this.pauseVideo();\n this.resetButtonState();\n this.setQuoteBlockHeight(true);\n this.timeline?.restart();\n this.timeline?.pause();\n });\n }\n\n if (this.dom.playButton) {\n (this.dom.playButton as HTMLButtonElement)?.addEventListener('click', (e: Event) => {\n if (this.isPlaying) {\n this.pauseVideo();\n } else {\n this.playVideo();\n }\n this.setActiveButton(e);\n });\n }\n\n if (this.dom.muteButton) {\n (this.dom.muteButton as HTMLButtonElement)?.addEventListener('click', (e: Event) => {\n if (this.isMuted) {\n this.unMuteVideo();\n } else {\n this.muteVideo();\n }\n this.setActiveButton(e);\n });\n }\n\n if (this.dom.repeatButton) {\n (this.dom.repeatButton as HTMLButtonElement)?.addEventListener('click', () => {\n this.repeatVideo();\n });\n }\n\n window.addEventListener('resize', () => {\n this.setQuoteBlockHeight();\n });\n }\n\n setQuoteBlockHeight(resetStyle?: boolean) {\n const quoteBlock = this.dom.quoteInner as HTMLElement;\n\n if (quoteBlock) {\n const activeBlocks = this.el.querySelectorAll('.quote-card__quote-inner [data-active]');\n\n if (activeBlocks && activeBlocks.length) {\n const heights = [...(activeBlocks as NodeList)].map(el => (el as HTMLElement).offsetHeight);\n quoteBlock.style.blockSize = `${heights.reduce((a, b) => a + b)}px`;\n }\n }\n\n if (resetStyle && quoteBlock) {\n quoteBlock.style.blockSize = 'auto';\n\n this.resetQuotes(true);\n }\n }\n\n resetQuotes(setFirstQuotesActive?: boolean) {\n const quotes = this.el.querySelectorAll('.caption');\n\n if (quotes) {\n quotes.forEach((quote, index) => {\n quote.removeAttribute('data-active');\n quote.removeAttribute('style');\n\n if (index <= 1 && setFirstQuotesActive) {\n quote.setAttribute('data-active', 'true');\n }\n });\n }\n }\n\n resetButtonState() {\n if (this.dom.playButton) {\n (this.dom.playButton as HTMLButtonElement).removeAttribute('data-active');\n }\n\n if (this.dom.muteButton) {\n (this.dom.muteButton as HTMLButtonElement).removeAttribute('data-active');\n }\n }\n\n setActiveButton(e: Event) {\n if (e.target) {\n const target = e.target as HTMLElement;\n const button = target.closest('button') as HTMLButtonElement;\n\n if (button.dataset.active === 'true') {\n button.removeAttribute('data-active');\n } else {\n button.dataset.active = 'true';\n }\n }\n }\n\n decodeString(str: string) {\n const textarea = document.createElement('textarea');\n textarea.innerHTML = str;\n return textarea.value;\n }\n\n init() {\n this.el.id = this.id;\n this.provider = this.el.dataset.provider as VideoProvider;\n this.videoId = this.el.dataset.videoId;\n\n const initActions: VideoActions = {\n youtube: () => {\n this.initYoutubeVideo();\n },\n vimeo: () => {\n this.initVimeoVideo();\n },\n default: () => {\n this.initDefaultPlayer();\n }\n };\n\n if (this.provider) {\n initActions[this.provider]();\n }\n\n if (this.captions) {\n this.initCaptions();\n }\n }\n\n initCaptions() {\n const quoteInner = this.dom.quoteInner as HTMLElement;\n quoteInner.innerHTML = '';\n if (this.captions) {\n this.captions.forEach((caption, index) => {\n const captionSpan = document.createElement('span');\n captionSpan.classList.add('caption');\n captionSpan.id = `caption-${index}`;\n captionSpan.innerHTML = caption.Text;\n\n if (index <= 1) {\n captionSpan.setAttribute('data-active', 'true');\n }\n\n quoteInner.appendChild(captionSpan);\n });\n }\n\n this.createTimeline();\n }\n\n createTimeline() {\n this.timeline = gsap.timeline({ paused: true });\n if (this.captions && this.timeline) {\n this.captions.forEach((caption, index) => {\n const delay = caption.Duration / 1000;\n const start = caption.Start / 1000;\n\n this.timeline\n ?.to(\n `#caption-${index}`,\n {\n opacity: 1,\n blockSize: 'auto',\n translateY: 0,\n duration: 1,\n onStart: () => {\n if (index <= 1) {\n this.setQuoteBlockHeight(true);\n } else {\n this.setQuoteBlockHeight();\n }\n },\n onComplete: () => {\n const caption = this.el.querySelector(`#caption-${index}`);\n\n if (caption) {\n caption.setAttribute('data-active', 'true');\n }\n }\n },\n start - 2\n )\n .to(\n `#caption-${index}`,\n {\n delay: delay,\n duration: 1,\n blockSize: 'auto',\n translateY: 0\n },\n start - 2\n )\n .to(\n `#caption-${index}`,\n {\n opacity: 0,\n blockSize: 0,\n translateY: -40,\n duration: 1,\n onComplete: () => {\n const caption = this.el.querySelector(`#caption-${index}`) as HTMLElement;\n\n if (caption) {\n caption.removeAttribute('data-active');\n }\n }\n },\n start + delay - 2\n );\n });\n }\n }\n\n initDefaultPlayer() {\n const videoWrapper = this.dom.videoPlaceholder as HTMLElement;\n const video = document.createElement('video');\n this.player = video;\n video.src = this.videoId as string;\n videoWrapper.appendChild(video);\n }\n\n initYoutubeVideo() {\n YouTubeIframeLoader.load(YT => {\n this.player = new YT.Player(this.dom.videoPlaceholder, {\n height: '100%',\n width: '100%',\n videoId: this.videoId,\n host: 'https://www.youtube-nocookie.com',\n playerVars: {\n controls: 0,\n showinfo: 0,\n mute: 0,\n rel: 0,\n disablekb: 1\n },\n origin: window.location.origin,\n events: {\n onReady: () => {\n this.videoReady = true;\n },\n onStateChange: (event: { data: number }) => {\n if (event.data === YT.PlayerState.PLAYING) {\n if (this.captions) {\n this.timeline?.play();\n }\n this.isPlaying = true;\n } else {\n if (this.captions) {\n this.timeline?.pause();\n }\n this.isPlaying = false;\n }\n }\n }\n });\n });\n }\n\n initVimeoVideo() {\n const options = {\n id: parseInt(this.videoId as string),\n controls: false,\n muted: false\n };\n\n this.player = new Player(this.dom.videoPlaceholder as HTMLElement, options);\n }\n\n playVideo() {\n const playActions: VideoActions = {\n youtube: () => {\n if ((this.player as YouTubePlayer).playVideo) {\n (this.player as YouTubePlayer)?.playVideo();\n }\n },\n vimeo: () => {\n (this.player as Player)?.play();\n },\n default: () => {\n (this.player as DefaultPlayer).play();\n }\n };\n\n if (this.provider) {\n playActions[this.provider]();\n }\n\n if (this.captions) {\n this.timeline?.play();\n }\n\n this.el.classList.add('is-playing');\n\n this.isPlaying = true;\n }\n\n pauseVideo() {\n const pauseActions: VideoActions = {\n youtube: () => {\n if ((this.player as YouTubePlayer).pauseVideo) {\n (this.player as YouTubePlayer).pauseVideo();\n }\n },\n vimeo: () => {\n (this.player as Player)?.pause();\n },\n default: () => {\n (this.player as DefaultPlayer).pause();\n }\n };\n\n if (this.provider) {\n pauseActions[this.provider]();\n }\n\n if (this.captions) {\n this.timeline?.pause();\n }\n\n this.el.classList.remove('is-playing');\n\n this.isPlaying = false;\n }\n\n muteVideo() {\n const muteActions: VideoActions = {\n youtube: () => {\n if ((this.player as YouTubePlayer).mute) {\n (this.player as YouTubePlayer)?.mute();\n }\n },\n vimeo: () => {\n (this.player as Player)?.setVolume(0);\n },\n default: () => {\n (this.player as DefaultPlayer).muted = true;\n }\n };\n\n if (this.provider) {\n muteActions[this.provider]();\n }\n this.isMuted = true;\n }\n\n unMuteVideo() {\n const unMuteActions: VideoActions = {\n youtube: () => {\n if ((this.player as YouTubePlayer).unMute) {\n (this.player as YouTubePlayer)?.unMute();\n }\n },\n vimeo: () => {\n (this.player as Player)?.setVolume(1);\n },\n default: () => {\n (this.player as DefaultPlayer).muted = false;\n }\n };\n\n if (this.provider) {\n unMuteActions[this.provider]();\n }\n this.isMuted = false;\n }\n\n repeatVideo() {\n const repeatActions: VideoActions = {\n youtube: () => {\n if ((this.player as YouTubePlayer).seekTo) {\n (this.player as YouTubePlayer)?.seekTo(0, true);\n }\n },\n vimeo: () => {\n (this.player as Player)?.setCurrentTime(0);\n },\n default: () => {\n (this.player as DefaultPlayer).currentTime = 0;\n }\n };\n\n if (this.captions) {\n this.timeline?.restart();\n this.timeline?.pause();\n\n // this.setQuoteBlockHeight(true);\n }\n\n if (this.provider) {\n repeatActions[this.provider]();\n\n if (this.isPlaying) {\n this.playVideo();\n } else {\n this.pauseVideo();\n }\n }\n }\n}\n\nexport default QuoteCard;\n"],"names":["QuoteCard","Component","el","__publicField","id","mediaQuery","_a","EventBusSingleton","_b","_c","e","_d","_e","resetStyle","quoteBlock","activeBlocks","heights","a","b","setFirstQuotesActive","quotes","quote","index","button","str","textarea","initActions","quoteInner","caption","captionSpan","gsap","delay","start","videoWrapper","video","YouTubeIframeLoader","YT","event","options","Player","playActions","pauseActions","muteActions","unMuteActions","repeatActions"],"mappings":"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"}