{"version":3,"file":"js/6589.chunk.js?v=1742528680091","mappings":"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","sources":["webpack://fed-boilerplate/./src/3-components/video-switcher/c-video-switcher.js"],"sourcesContent":["import $ from 'jquery';\n\nconst parseISO8601 = ISOduration => {\n const regex =\n /(-)?P(?:([.,\\d]+)Y)?(?:([.,\\d]+)M)?(?:([.,\\d]+)W)?(?:([.,\\d]+)D)?T(?:([.,\\d]+)H)?(?:([.,\\d]+)M)?(?:([.,\\d]+)S)?/;\n const matches = ISOduration.match(regex);\n let hours = matches[6] === undefined ? 0 : matches[6];\n let minutes = matches[7] === undefined ? '00' : matches[7];\n let seconds = matches[8] === undefined ? '00' : matches[8];\n\n hours = hours.length === 1 ? `0${hours}` : hours;\n minutes = minutes.length === 1 ? `0${minutes}` : minutes;\n seconds = seconds.length === 1 ? `0${seconds}` : seconds;\n\n let duration = hours === 0 ? '' : `${hours}:`;\n duration += `${minutes}:${seconds}`;\n\n return duration;\n};\n\nconst playVideo = ($item, firstLoad) => {\n if ($item.closest('li').hasClass('active')) {\n return;\n }\n\n if (firstLoad) {\n const $videoSwitcher = $('.js-video-switcher');\n const $videoPlayer = $videoSwitcher.find('.js-video-player');\n const $slider = $videoPlayer.find('.video-player-slider .inner');\n const $currentSlide = $slider.find('.slick-current');\n $currentSlide.addClass('slick-main-active');\n }\n\n const { videoId } = $item.find('.js-item-duration')[0].dataset;\n $item.closest('li').addClass('active');\n\n const $player = $item.closest('.js-video-player');\n $player\n .find('.js-video-player-main iframe')\n .attr(\n 'src',\n `https://www.youtube.com/embed/${videoId}?showinfo=0&rel=0`\n );\n $player.find('.js-video-title').text($item.find('.js-item-title').text());\n $player\n .find('.js-video-description')\n .html($item.find('.js-item-description').html());\n $player\n .find('.js-video-duration')\n .attr('data-video-id', $item.data('video-id'))\n .text($item.find('.js-item-duration')[0].innerText);\n};\n\nconst populateList = (list, $videoPlayer) => {\n // const $listDom = $videoPlayer.find('.js-video-player-sidebar');\n const template = $('.js-sidebar-item-template').html();\n const $slider = $videoPlayer.find('.video-player-slider .inner');\n\n // if ($listDom.length <= 0) return;\n if (list.length <= 0) {\n return;\n }\n\n let firstTrigger = false;\n // $listDom.html('');\n for (let i = 0; i < list.length; i += 1) {\n const $item = $(template).clone();\n $item\n .find('.js-video-player-item')\n .attr('data-video-id', list[i].videoId);\n $item\n .find('.js-item-thumb')\n .css('backgroundImage', `url(${list[i].thumbUrl})`);\n $item.find('.js-item-title').text(list[i].title);\n $item.find('.js-item-description').html(list[i].description);\n $item.find('.js-item-duration').attr('data-video-id', list[i].videoId);\n\n $slider.slick('slickAdd', $item);\n\n if (!firstTrigger) {\n playVideo($item, true);\n firstTrigger = true;\n }\n }\n\n const $videoSwitcher = $('.js-video-switcher');\n\n $videoSwitcher.on('click', '.js-video-player-item', function() {\n const $selectedSlide = $slider.find('.slick-main-active');\n $selectedSlide.removeClass('slick-main-active');\n $(this).addClass('slick-main-active');\n playVideo($(this), false);\n if (window.innerWidth <= 1024) {\n const sliderToScrollId = $(this).closest('.c-tabs')\n .attr('id');\n const sliderToScroll = document.getElementById(sliderToScrollId);\n const sliderToScrollPosition =\n sliderToScroll.getBoundingClientRect();\n window.scrollTo({\n top: sliderToScrollPosition.top + window.scrollY - 24,\n behavior: 'smooth',\n });\n }\n });\n\n // update tab title and show\n $videoPlayer\n .closest('.js-video-switcher')\n .find(`.js-tab-item[data='${list[0].playlistId}']`)\n .addClass('visible');\n // comment this for now, seem like YT change the API, also update select for mobile\n // .find('h3')\n // .text(list[0].channelTitle);\n\n $slider.on('wheel', function(e) {\n e.preventDefault();\n\n if (e.originalEvent.deltaY > 0) {\n $(this).slick('slickNext');\n } else {\n $(this).slick('slickPrev');\n }\n });\n\n const prevButton = $videoPlayer.find('.prev-button');\n const nextButton = $videoPlayer.find('.next-button');\n\n prevButton.on('click', () => {\n return $slider.slick('slickPrev');\n });\n nextButton.on('click', () => {\n return $slider.slick('slickNext');\n });\n\n if (\n (list.length <= 5 && window.innerWidth > 768) ||\n (list.length <= 2 && window.innerWidth <= 768)\n ) {\n prevButton.addClass('btn-disabled');\n nextButton.addClass('btn-disabled');\n }\n};\n\nconst handleJSONError = error => {\n console.error(error);\n};\n\nconst mapToVideoList = item => {\n const { snippet } = item;\n const thumbUrl = snippet.thumbnails ? snippet.thumbnails.high.url : '';\n\n return {\n thumbUrl,\n playlistId: snippet.playlistId,\n channelTitle: snippet.channelTitle,\n videoId: snippet.resourceId.videoId,\n title: snippet.title,\n description: snippet.description,\n };\n};\n\nconst handleJSONResponseVideo = response => {\n if (!response.items || !response.items.length) {\n return;\n }\n\n response.items.map(item => {\n return $(\n `.js-item-duration[data-video-id='${item.id}'], .js-video-duration[data-video-id='${item.id}']`\n ).text(parseISO8601(item.contentDetails.duration));\n }\n );\n};\n\nconst getVideoDuration = (ids, key) => {\n const apiUrl = 'https://www.googleapis.com/youtube/v3/videos';\n const options = {\n part: 'contentDetails',\n key,\n id: ids.join(','),\n };\n\n $.getJSON(apiUrl, options)\n .done(handleJSONResponseVideo.bind(null))\n .fail(handleJSONError);\n};\n\nconst handleJSONResponsePlayList = ({ key, $videoPlayer }, response) => {\n if (!response.items || !response.items.length) {\n return;\n }\n\n getVideoDuration(\n response.items.map(item => {\n return item.snippet.resourceId.videoId;\n }),\n key\n );\n populateList(response.items.map(mapToVideoList), $videoPlayer);\n};\n\nconst fetchData = (apiUrl, $videoPlayer, key) => {\n const options = {\n part: 'snippet',\n key,\n // maxResults: $videoPlayer.data('max-item'),\n maxResults: 50,\n playlistId: $videoPlayer.data('playlist-id'),\n };\n\n $.getJSON(apiUrl, options)\n .done(handleJSONResponsePlayList.bind(null, { key, $videoPlayer }))\n .fail(handleJSONError);\n};\n\nconst mobileFilter = () => {\n const $mobileSelect = $('.js-mobile-tab-selection');\n const $tabItem = $('.js-tabs');\n const $customSelect = $('.custom-select-opener span');\n let newSelection = '';\n\n if ($mobileSelect.length <= 0) {\n return;\n }\n if ($tabItem.length <= 0) {\n return;\n }\n\n $mobileSelect.change(function() {\n const $opt = $(this);\n const $tab = $opt\n .closest('.js-video-switcher')\n .find(`.js-tab-item[data=\"${$opt.val()}\"]:not(.active)`);\n\n if ($tab.length === 1) {\n $tab.click();\n }\n newSelection = $tab.find('.tab-btn')[0].innerText;\n });\n\n // change selection on tab clicked\n $tabItem.on('click', '.js-tab-item', function() {\n const $item = $(this);\n const playlistKey = $item.attr('data');\n $item\n .closest('.js-video-switcher')\n .find('.js-mobile-tab-selection')\n .val(playlistKey);\n // Here we reset all other tab's iframe src to stop them from playing\n $item\n .closest('.js-video-switcher')\n .find(\n `.js-video-player:not([data-playlist-id=\"${playlistKey}\"]) iframe`\n )\n .each(function() {\n const currentSrc = $(this).attr('src');\n $(this).attr('src', '');\n $(this).attr('src', currentSrc);\n });\n\n const $videoSwitcher = $('.js-video-switcher');\n const $videoPlayer = $videoSwitcher.find('.js-video-player');\n const $sidebar = $videoPlayer.find('.video-player-sidebar');\n const $slider = $videoPlayer.find('.video-player-slider .inner');\n $sidebar.css('opacity', '0');\n setTimeout(() => {\n $slider.slick('refresh');\n $sidebar.css('opacity', '1');\n if (newSelection) {\n const newItem = $item\n .closest('.js-video-switcher')\n .find($customSelect)\n .val(playlistKey);\n newItem.text(newSelection);\n } else {\n $customSelect.text(\n $tabItem.find('.js-tab-item.active button')[0].innerText\n );\n }\n }, 1000);\n });\n\n // trigger click for first time because tabs has function to retrieve url and cookie\n $tabItem.find('.js-tab-item.active').click();\n};\n\nconst initVideoSwitcher = () => {\n const apiUrl = 'https://www.googleapis.com/youtube/v3/playlistItems';\n const $videoSwitcher = $('.js-video-switcher');\n const $videoPlayer = $videoSwitcher.find('.js-video-player');\n\n if ($videoSwitcher.length <= 0) {\n return;\n }\n\n mobileFilter();\n\n $videoPlayer.each(function() {\n fetchData(apiUrl, $(this), $videoSwitcher.data('key'));\n });\n};\n\n$(() => {\n initVideoSwitcher();\n});\n"],"names":["playVideo","$item","firstLoad","closest","hasClass","$","find","addClass","videoId","dataset","$player","attr","concat","text","html","data","innerText","handleJSONError","error","console","mapToVideoList","item","snippet","thumbUrl","thumbnails","high","url","playlistId","channelTitle","resourceId","title","description","handleJSONResponseVideo","response","items","length","map","id","ISOduration","contentDetails","duration","matches","match","hours","undefined","minutes","seconds","getVideoDuration","ids","key","options","part","join","done","bind","fail","handleJSONResponsePlayList","_ref","$videoPlayer","list","template","$slider","firstTrigger","i","clone","css","slick","on","removeClass","this","window","innerWidth","sliderToScrollId","sliderToScrollPosition","document","getElementById","getBoundingClientRect","scrollTo","top","scrollY","behavior","e","preventDefault","originalEvent","deltaY","prevButton","nextButton","populateList","initVideoSwitcher","$mobileSelect","$tabItem","$customSelect","newSelection","$videoSwitcher","change","$opt","$tab","val","click","playlistKey","each","currentSrc","$sidebar","setTimeout","apiUrl","maxResults","fetchData"],"sourceRoot":""}