{"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":""}