{"version":3,"file":"video-playlist-min.js","mappings":"mBACA,IAAIA,EAAsB,CCA1BA,EAAyBC,IACxB,IAAIC,EAASD,GAAUA,EAAOE,WAC7B,IAAOF,EAAiB,QACxB,IAAM,EAEP,OADAD,EAAoBI,EAAEF,EAAQ,CAAEG,EAAGH,IAC5BA,CAAM,ECLdF,EAAwB,CAACM,EAASC,KACjC,IAAI,IAAIC,KAAOD,EACXP,EAAoBS,EAAEF,EAAYC,KAASR,EAAoBS,EAAEH,EAASE,IAC5EE,OAAOC,eAAeL,EAASE,EAAK,CAAEI,YAAY,EAAMC,IAAKN,EAAWC,IAE1E,ECNDR,EAAwB,CAACc,EAAKC,IAAUL,OAAOM,UAAUC,eAAeC,KAAKJ,EAAKC,ICAlF,MAAM,EAA+BI,M,aCArC,MAAM,EAA+BC,S,aCGrC,MAeA,EAfmBC,GAGX,yBACIC,MAAM,6BACNC,MAAQF,EAAME,MACdC,OAASH,EAAME,MACfE,UAAYJ,EAAMK,QAClBC,QAAQ,aACR,wCACA,0BAAMC,KAAOP,EAAMQ,OAAS,UAAYzB,EAAE,6zBAA6zB0B,UAAU,oBCH73B,EARwBT,GAEpB,yBAAKI,UAAWJ,EAAMK,QAASJ,MAAM,6BAA6BC,MAAOF,EAAME,MAAOC,OAAQH,EAAMG,OAAQG,QAAQ,WAAWC,KAAK,QAChI,0BAAMG,SAAS,UAAUC,SAAS,UAAU5B,EAAE,kRAAkRwB,KAAMP,EAAMQ,SCFvUI,EAAa,wBASbC,EAA2B,KACpC,MAAMC,EAAgBC,SAASC,eAAe,qBAC1CF,GAEJA,EAAcG,UAAUC,OAAON,EAA/B,EA4BJ,EAzBkB,IAeV,4BACIO,QAdO,KACX,MAAML,EAAgBC,SAASC,eAAe,qBAC1CF,IAEDA,EAAcG,UAAUG,SAASR,GAChCC,IArB2B,MACnC,MAAMC,EAAgBC,SAASC,eAAe,qBAC1CF,GAEJA,EAAcG,UAAUI,IAAIT,EAA5B,EAoBQU,GACH,EAMGC,KAAK,SACLnB,UAAU,0BACV,0BAAMA,UAAU,QAAhB,kBACA,kBAAC,EAAD,CAAgBF,MAAM,MAAMM,MAAM,UCU9C,EAxCsB,IAA2C,UAA1C,aAAEgB,GAAwC,EAE7D,OACI,qCAEQA,SAAA,UAAAA,EAAcC,gBAAd,eAAwBC,QAAS,GACjC,yBAAKtB,UAAU,8KACX,yBAAKA,UAAU,8DACX,6BACKoB,EAAaC,SAAS,GAAGE,cAG9B,4BACIvB,UAAU,YACVmB,KAAK,SACLK,MAAM,QACNT,QAAUN,GACV,kBAAC,EAAD,CAAWX,MAAM,KAAKM,MAAM,cAKhCgB,EAAaC,SAASI,KAAI,CAACC,EAAcC,IAEjC,uBACIC,KAAI,UAAOF,EAAaG,SAApB,qBAA2CH,EAAaI,cAC5D9B,UAAS,oDAA+C0B,EAAaK,eAAiB,YAAc,IACpGhD,IAAG,UAAK2C,EAAaI,aAAlB,YAAkCH,IACrC,0BAAM3B,UAAU,QAAQ0B,EAAaM,UAArC,KACA,8BAAON,EAAaO,eA3BpD,ECLSC,EAAmBC,IAC5B,IAAIA,IAAQA,EAAIC,YAAa,OAAO,KAEpC,IAAIC,EAAO,KAEX,IACIA,EAAOC,KAAKC,MAAMJ,EAAIC,YACzB,CACD,MAAMI,GAAK,CAEX,OAAOH,CAAP,EChBW,SAASI,EAAgBpD,EAAKN,EAAK2D,GAYhD,OAXI3D,KAAOM,EACTJ,OAAOC,eAAeG,EAAKN,EAAK,CAC9B2D,MAAOA,EACPvD,YAAY,EACZwD,cAAc,EACdC,UAAU,IAGZvD,EAAIN,GAAO2D,EAGNrD,CACT,C,8NCTA,MAyCA,EAzCmBO,IAEf,MAAQG,EAAQ8C,IAAcC,EAAAA,EAAAA,UAASlD,EAAMG,SACrCgD,EAAOC,IAAaF,EAAAA,EAAAA,aAEtB,MAAEhD,EAAF,cAASmD,GAAkBrD,EAsBjC,OApBAsD,EAAAA,EAAAA,YAAU,KAQN,QAJcC,IAAXpD,GAAwBD,EAAMsD,SAAS,OACtCP,ECbgB,EAAC/C,EAAeuD,EAAuBC,KAC/D,MAAMC,EAAWC,OAAO1D,EAAM2D,QAAQ,KAAM,KAC5C,gBDW0C,ECXhCF,EDW4B,GCXtC,ODWkBG,CAAa5D,KAGvB6D,MAAMH,OAAOP,IAAgB,CAC7B,MAAMW,EAAQ,UAAH,OAAcX,EAAd,QAELF,EAAQnD,EAAMmD,M,+VAAN,IAAmBnD,EAAMmD,OAAU,CAAC,EAClDA,EAAMc,gBAAkBD,EACxBb,EAAMe,YAAcF,EACpBb,EAAM1C,UAAYuD,EAElBZ,EAASD,EACZ,IACF,CAAChD,EAAQD,EAAOmD,EAAerD,EAAMmD,QAGpC,yBACIjD,MAAQF,EAAME,MACdC,OAASA,EACTC,UAAYJ,EAAMK,QAClB8C,MAAQA,EACR7C,QAAQ,WACRL,MAAM,6BACNkE,WAAW,gCACTnE,EAAM4B,OAAS,+BAAS5B,EAAM4B,OAChC,8BAAM,0BAAM7C,EAAE,wIAAwIqF,GAAG,OAAY,yBAAK7D,KAAOP,EAAMQ,MAAQC,UAAU,6BAA6B4D,UAAU,KAAK3D,SAAS,YAVtQ,EEeJ,EAtC2B,IAAgD,UAA/C,aAAEc,GAA6C,EAEvE,MAAM8C,EAAU9C,SAAH,UAAGA,EAAcC,gBAAjB,aAAG,EAAwB8C,MAAKC,GAAQA,EAAKrC,iBAE1D,OACI,yBAAK/B,UAAU,mEAGPkE,aAAA,EAAAA,EAASG,eACT,uBACIrE,UAAU,+HACV4B,KAAI,UAAOsC,EAAQG,aAAf,qBAA0CH,EAAQpC,eACtD,kBAAC,EAAD,CACIhC,MAAM,OACNmD,cAAe,GACf7C,MAAM,YANd,aAaA8D,aAAA,EAAAA,EAASI,eACT,uBACItE,UAAU,uIACV4B,KAAI,UAAOsC,EAAQI,aAAf,qBAA0CJ,EAAQpC,eAF1D,OAII,kBAAC,EAAD,CACIhC,MAAM,OACNmD,cAAe,IACf7C,MAAM,aA1B1B,ECGJ,EAbyB,IAEjB,yBAAKP,MAAM,6BAA6BC,MAAM,KAAKC,OAAO,KAAKG,QAAQ,aACnE,uBAAGC,KAAK,OAAOG,SAAS,WACpB,uBAAGH,KAAK,OAAOoE,OAAO,UAAUC,YAAY,MACxC,0BAAM7F,EAAE,s2BAAs2B0B,UAAU,6CAE53B,0BAAMkE,OAAO,OAAOC,YAAY,QAAQ7F,EAAE,8CAA8C0B,UAAU,8CC2BlH,EA7BqB,IAA6C,UAA5C,aAAEe,GAA0C,EAC9D,OACI,yCAEQA,SAAA,UAAAA,EAAcC,gBAAd,eAAwBC,QAAS,GACjC,2BAAKtB,UAAU,yDAEX,oBAAC,EAAD,MACA,4BAAMA,UAAU,QAAhB,0CAGIoB,EAAaC,SAASI,KAAI,CAACC,EAAcC,IAEjC,yBACI5C,IAAG,UAAK2C,EAAaI,aAAlB,YAAkCH,GACrC3B,UAAU,OACV4B,KAAI,UAAMF,EAAaG,SAAnB,qBAA0CH,EAAaI,eACzDJ,EAAaH,aAAgBI,IAAMP,EAAaC,SAASC,OAAS,EAAI,GAAK,SAhB7G,ECuDJX,SAAS8D,iBAAiB,oBAAoB,KAtCTrD,KACjC,IAAIA,EAAc,OAElB,MAAMsD,EAAsB/D,SAASC,eAAe,yBAChD8D,GAEJ/E,IAAAA,OACI,kBAAC,EAAD,CAAoByB,aAAeA,IACnCsD,EAFJ,EAkCAC,CAvDsB,MACtB,MAAMC,EAAQjE,SAASC,eAAe,qBACtC,IAAKgE,EAAO,OAAO,KAEnB,MAAMxD,EAAec,EAAgBvB,SAASC,eAAe,wBAC7D,OAAIQ,GAEJzB,IAAAA,OACI,kBAAC,EAAD,CAAeyB,aAAeA,IAC9BwD,GAGGxD,GAPkB,IAOzB,EA0CqByD,IA3BA,MACrB,MAAMC,EAAgBnE,SAASC,eAAe,6BAC1CkE,GCnBsB,SAACC,GAAgE,IAA/CC,IAA+C,yDAE3F,MAAMC,EAAS,CAAC,EASE,MAIlB,GAXIF,IACAA,EAASG,OAAOC,SAASJ,QAI7BA,EAASG,OAAOE,mBAAmBL,EAAOM,YAEtCL,IACAD,EAAM,UAAGA,SAAH,aAAG,EAAQO,eAGlBP,EAAOzD,QAAU,EAAG,OAAO2D,EAG9B,MAAMM,EAASR,EAAOS,UAAU,GAAGC,MAAM,KAEzC,IAAI,IAAI9D,EAAI,EAAGA,EAAI4D,EAAOjE,OAAQK,IAAI,CAGlC,MAGM+D,EAHOH,EAAO5D,GAGE8D,MAAM,KAE5B,GAAGC,EAASpE,QAAU,EAAE,CAEpB,IAAIqE,EAAM,GAEV,IAAI,IAAIC,EAAE,EAAGA,EAAEF,EAASpE,OAAQsE,IAEzBA,EAAI,IACHD,GAAO,KAGXA,GAAOD,EAASE,GAIpBX,EAAOS,EAAS,IAAMC,CACzB,CACJ,CAED,OAAOV,CACV,CD1BoBY,GAAc,UAG/BlG,IAAAA,OACI,kBAAC,EAAD,MACAmF,EAFJ,EAsBAgB,GAhBqB,MACrB,MAAMC,EAAwBpF,SAASC,eAAe,oBACtD,IAAImF,EAAuB,OAE3B,MAAM3E,EAAec,EAAgBvB,SAASC,eAAe,uBAC7D,IAAIQ,EAAc,OAAO,KAEzBzB,IAAAA,OACI,kBAAC,EAAD,CAAcyB,aAAeA,IAC7B2E,EAFJ,EAUAC,EAAkB,G","sources":["webpack://waves/webpack/bootstrap","webpack://waves/webpack/runtime/compat get default export","webpack://waves/webpack/runtime/define property getters","webpack://waves/webpack/runtime/hasOwnProperty shorthand","webpack://waves/external var \"React\"","webpack://waves/external var \"ReactDOM\"","webpack://waves/./src/ui/svg/common/close.tsx","webpack://waves/./src/projects/olp/common/svg/right-arrow.tsx","webpack://waves/./src/projects/videos/video-playlist/ui/mobile-btn.tsx","webpack://waves/./src/projects/videos/video-playlist/ui/video-playlist.tsx","webpack://waves/./src/domain/common.ts","webpack://waves/./node_modules/@babel/runtime/helpers/esm/defineProperty.js","webpack://waves/./src/ui/svg/common/arrow.tsx","webpack://waves/./src/ui/svg/svg-provider.ts","webpack://waves/./src/projects/videos/video-playlist/ui/playlist-navigation.tsx","webpack://waves/./src/ui/svg/common/computer-with-play.tsx","webpack://waves/./src/projects/videos/video-playlist/ui/playlist-info.tsx","webpack://waves/./src/projects/videos/video-playlist/index.tsx","webpack://waves/./src/domain/url-provider.ts"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","const __WEBPACK_NAMESPACE_OBJECT__ = React;","const __WEBPACK_NAMESPACE_OBJECT__ = ReactDOM;","import React from 'react';\r\nimport { IIconProps } from '../interfaces';\r\n\r\nconst CloseIcon = (props: IIconProps) => {\r\n\r\n return (\r\n \r\n Close\r\n \r\n \r\n )\r\n};\r\n\r\nexport default CloseIcon;\r\n","import React from 'react';\r\nimport {IIconProps} from \"../../../../ui/svg/interfaces\";\r\nconst RightArrowIcon = (props: IIconProps) => {\r\n return (\r\n \r\n \r\n \r\n )\r\n};\r\n\r\nexport default RightArrowIcon;","import RightArrowIcon from '../../../olp/common/svg/right-arrow';\r\nimport React from 'react';\r\n\r\nexport const CLASS_NAME = 'video-playlist-opened';\r\n\r\nexport const openVideoPlaylistMobile = () => {\r\n const $playlistRoot = document.getElementById('video-playlist-ph');\r\n if(!$playlistRoot) return;\r\n\r\n $playlistRoot.classList.add(CLASS_NAME);\r\n};\r\n\r\nexport const closeVideoPlaylistMobile = () => {\r\n const $playlistRoot = document.getElementById('video-playlist-ph');\r\n if(!$playlistRoot) return;\r\n\r\n $playlistRoot.classList.remove(CLASS_NAME);\r\n};\r\n\r\nconst MobileBtn = () => {\r\n\r\n const toggle = () => {\r\n const $playlistRoot = document.getElementById('video-playlist-ph');\r\n if(!$playlistRoot) return;\r\n\r\n if($playlistRoot.classList.contains(CLASS_NAME)) {\r\n closeVideoPlaylistMobile();\r\n }\r\n else{\r\n openVideoPlaylistMobile();\r\n }\r\n };\r\n\r\n return (\r\n \r\n Course Outline\r\n \r\n \r\n )\r\n};\r\n\r\nexport default MobileBtn;","import { IPlayListData } from '../interfaces';\r\nimport CloseIcon from '../../../../ui/svg/common/close';\r\nimport React from 'react';\r\nimport { closeVideoPlaylistMobile } from './mobile-btn';\r\n\r\ninterface IVideoPlaylistProps {\r\n playlistData: IPlayListData;\r\n}\r\n\r\nconst VideoPlaylist = ({ playlistData }: IVideoPlaylistProps) => {\r\n\r\n return (\r\n <>\r\n {\r\n playlistData?.playList?.length > 0 &&\r\n
\r\n
\r\n
\r\n {playlistData.playList[0].playlistName}\r\n
\r\n\r\n \r\n \r\n \r\n
\r\n\r\n {\r\n playlistData.playList.map((playlistItem, i) => {\r\n return (\r\n \r\n {playlistItem.videoSort}.\r\n {playlistItem.videoName}\r\n \r\n )\r\n })\r\n }\r\n
\r\n }\r\n \r\n )\r\n}\r\n\r\nexport default VideoPlaylist;","/**\r\n * get JSON from HTML element on the page\r\n */\r\nimport React, {useEffect, useState} from \"react\";\r\n\r\n\r\nexport const getJSONFromHtml = ($el: HTMLElement|null) => {\r\n if(!$el || !$el.textContent) return null;\r\n\r\n let json = null;\r\n\r\n try{\r\n json = JSON.parse($el.textContent);\r\n }\r\n catch(ex){}\r\n\r\n return json;\r\n};\r\n\r\n/**\r\n * get setting fromHTML\r\n *
...
\r\n */\r\nexport const getSettingFromHtml = (id: string) => {\r\n const $div = document.querySelector(`#${ id }`);\r\n if(!$div || !$div.textContent) return '';\r\n return $div.textContent.trim();\r\n};\r\n\r\n/**\r\n * helper: get GUID\r\n */\r\nconst guidHelper = () => {\r\n return Math.floor((1 + Math.random()) * 0x10000)\r\n .toString(16)\r\n .substring(1);\r\n};\r\n\r\n/**\r\n * get GUID\r\n */\r\nexport const guid = () => {\r\n return guidHelper() + guidHelper() + '-' + guidHelper() + '-' + guidHelper() + '-' + guidHelper() + '-' + guidHelper() + guidHelper() + guidHelper();\r\n};\r\n\r\n/**\r\n * timeout in milliseconds\r\n */\r\nexport const timeout = (ms: number) => {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n};\r\n\r\n/**\r\n * get page node GUID from meta tag printed in HTML\r\n *
67633544-c1c1-4096-a3cc-880a96fe4713
\r\n */\r\nexport const getPageNodeGUID = () => {\r\n const $div = document.querySelector('#nodeguid');\r\n if(!$div || !$div.textContent) return '';\r\n return $div.textContent.trim();\r\n};\r\n\r\n/**\r\n * get img CDN domain\r\n */\r\nexport const getImgCDNDomain = () => {\r\n const $box = document.getElementById('img-cdn-domain');\r\n const domain = $box?.textContent || '';\r\n return domain.trim().toLowerCase();\r\n};\r\n\r\ndeclare const window: any;\r\nexport const isMobile = () => {\r\n let check = false;\r\n\r\n // eslint-disable-next-line\r\n (function(a){if(/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(a.substr(0,4))) check = true;})( navigator.userAgent||navigator.vendor||window.opera);\r\n return check;\r\n};\r\nexport const isTablet_NOTWORK = () => {\r\n const userAgent = navigator.userAgent.toLowerCase();\r\n const isTablet = /(ipad|tablet|(android(?!.*mobile))|(windows(?!.*phone)(.*touch))|kindle|playbook|silk|(puffin(?!.*(IP|AP|WP))))/.test(userAgent);\r\n return isTablet;\r\n};\r\nexport const isTablet = () => {\r\n const isTouchDevice = 'ontouchstart' in window || navigator.maxTouchPoints > 0;\r\n if (isTouchDevice && !isMobile()) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n};\r\n\r\nexport const stopAllYouTubeVideos = () => {\r\n // eslint-disable-next-line\r\n document.querySelectorAll('iframe').forEach(v => { v.src = v.src;});\r\n const cnt = document.querySelectorAll('iframe')?.length;\r\n if(cnt > 0){\r\n window.setTimeout(() => {\r\n window.history.go(cnt-1);\r\n }, 200);\r\n }\r\n //window.history.go(-1);\r\n}\r\n\r\n\r\nexport const getHashByPrefix = (toFind:string, indexToFind:number = 0) => {\r\n let result = \"\";\r\n const _hash = window.location.hash.substring(1);\r\n if(!_hash || _hash === '')\r\n return result;\r\n var a = decodeURIComponent(_hash).split(\"|\"),\r\n i;\r\n\r\n for (i = 0; i < a.length; i++) {\r\n\r\n if(i < indexToFind)\r\n continue;\r\n\r\n if(a[i].startsWith(toFind) || toFind === ''){\r\n result = a[i];\r\n return result;\r\n }\r\n }\r\n\r\n return result;\r\n};\r\n\r\nexport const getParents = (elem: any) => {\r\n\r\n // Set up a parent array\r\n var parents = [];\r\n\r\n // Push each parent element to the array\r\n for ( ; elem && elem !== document; elem = elem.parentNode ) {\r\n parents.push(elem);\r\n }\r\n\r\n // Return our parent array\r\n return parents;\r\n\r\n};\r\nexport const isChildOfElementById = (elem: any, parentId: string) => {\r\n\r\n let res = false;\r\n // Push each parent element to the array\r\n for ( ; elem && elem !== document; elem = elem.parentNode ) {\r\n if(elem.id && elem.id === parentId)\r\n res = true;\r\n }\r\n\r\n // Return our parent array\r\n return res;\r\n\r\n};\r\n//Hook for dynamic window size\r\nexport const useWindowSize = () => {\r\n\r\n // Initialize state with undefined width/height so server and client renders match\r\n // Learn more here: https://joshwcomeau.com/react/the-perils-of-rehydration/\r\n const [windowSize, setWindowSize] = useState({\r\n width: undefined,\r\n height: undefined,\r\n });\r\n useEffect(() => {\r\n // Handler to call on window resize\r\n function handleResize() {\r\n // Set window width/height to state\r\n setWindowSize({\r\n width: window.innerWidth,\r\n height: window.innerHeight,\r\n });\r\n }\r\n // Add event listener\r\n window.addEventListener(\"resize\", handleResize);\r\n // Call handler right away so state gets updated with initial window size\r\n handleResize();\r\n // Remove event listener on cleanup\r\n return () => window.removeEventListener(\"resize\", handleResize);\r\n }, []); // Empty array ensures that effect is only run on mount\r\n\r\n return windowSize;\r\n\r\n};\r\n//Hook for detect if HTML element is overflow\r\nexport const useIsOverflow = (ref : any) => {\r\n const [isOverflow, setIsOverflow] = React.useState(false);\r\n\r\n React.useLayoutEffect(() => {\r\n const { current } = ref;\r\n\r\n const trigger = () => {\r\n const hasOverflow = current.scrollWidth > current.clientWidth;\r\n\r\n setIsOverflow(hasOverflow);\r\n\r\n //if (callback) callback(hasOverflow);\r\n };\r\n\r\n if (current) {\r\n trigger();\r\n }\r\n }, [ ref]);\r\n\r\n return isOverflow;\r\n};\r\n\r\nexport const openWindowPopup = (url: string, title: string, width: number, height: number) => {\r\n const left = (window.screen.width / 2) - (width / 2);\r\n const top = (window.screen.height / 2) - (height / 2);\r\n return window.open(\r\n url,\r\n title,\r\n `toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no, width=${ width }, height=${ height }, top=${ top }, left=${ left }`\r\n );\r\n};","export default function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}","import React, { CSSProperties, useEffect, useState } from 'react';\r\nimport { getSVGHeight } from '../svg-provider';\r\nimport { IIconProps } from '../interfaces';\r\n\r\nconst ArrowIcon = (props: IIconProps) => {\r\n\r\n const [ height, setHeight ] = useState(props.height);\r\n const [ style, setStyle ] = useState();\r\n\r\n const { width, rotationAngle } = props;\r\n\r\n useEffect(() => {\r\n\r\n // if height property is not defined, and width & height should be defined in px ->\r\n // calculate the height dynamically, keeping the aspect ratio using the viewport\r\n if(height === undefined && width.endsWith('px')){\r\n setHeight(getSVGHeight(width, 11, 7));\r\n }\r\n\r\n if(!isNaN(Number(rotationAngle))){\r\n const angle = `rotate(${ rotationAngle }deg)`;\r\n\r\n const style = props.style ? { ...props.style } : {};\r\n style.WebkitTransform = angle;\r\n style.msTransform = angle;\r\n style.transform = angle;\r\n\r\n setStyle(style)\r\n }\r\n }, [height, width, rotationAngle, props.style]);\r\n\r\n return (\r\n \r\n { props.title && { props.title } }\r\n \r\n )\r\n};\r\n\r\nexport default ArrowIcon;\r\n","/**\r\n * get image height based on width and viewport\r\n */\r\nexport const getSVGHeight = (width: string, viewPortWidth: number, viewPortHeight: number) => {\r\n const widthNum = Number(width.replace('px', ''));\r\n return`${ widthNum * viewPortHeight / viewPortWidth }px`;\r\n};","import { IPlayListData } from '../interfaces';\r\nimport ArrowIcon from '../../../../ui/svg/common/arrow';\r\nimport React from 'react';\r\n\r\ninterface IPlaylistNavigationProps {\r\n playlistData: IPlayListData;\r\n}\r\n\r\nconst PlaylistNavigation = ({ playlistData }: IPlaylistNavigationProps) => {\r\n\r\n const current = playlistData?.playList?.find(item => item.isCurrentVideo);\r\n\r\n return (\r\n
\r\n\r\n {\r\n current?.prevVideoURL &&\r\n \r\n \r\n Previous\r\n \r\n }\r\n\r\n {\r\n current?.nextVideoURL &&\r\n \r\n Next\r\n \r\n \r\n }\r\n
\r\n )\r\n};\r\n\r\nexport default PlaylistNavigation;","import React from 'react';\r\n\r\nconst ComputerWithPlay = () => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default ComputerWithPlay;","import { IPlayListData } from '../interfaces';\r\nimport ComputerWithPlay from '../../../../ui/svg/common/computer-with-play';\r\n\r\ninterface ILoggedOutPlaylistBox {\r\n playlistData: IPlayListData;\r\n}\r\n\r\nconst PlaylistInfo = ({ playlistData }: ILoggedOutPlaylistBox) => {\r\n return (\r\n <>\r\n {\r\n playlistData?.playList?.length > 0 &&\r\n
\r\n\r\n \r\n This video is part of these playlists:\r\n\r\n {\r\n playlistData.playList.map((playlistItem, i) => {\r\n return (\r\n \r\n { playlistItem.playlistName }{ i === playlistData.playList.length - 1 ? '' : ', ' }\r\n \r\n )\r\n })\r\n }\r\n\r\n
\r\n }\r\n \r\n )\r\n};\r\n\r\nexport default PlaylistInfo;","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport VideoPlaylist from './ui/video-playlist';\r\nimport { getJSONFromHtml } from '../../../domain/common';\r\nimport { IPlayListData } from './interfaces';\r\nimport PlaylistNavigation from './ui/playlist-navigation';\r\nimport MobileBtn from './ui/mobile-btn';\r\nimport PlaylistInfo from './ui/playlist-info';\r\nimport { getQueryString } from '../../../domain/url-provider';\r\n\r\nconst initVideoPlaylist = () => {\r\n const $root = document.getElementById('video-playlist-ph');\r\n if (!$root) return null;\r\n\r\n const playlistData = getJSONFromHtml(document.getElementById('video-playlist-data')) as IPlayListData;\r\n if(!playlistData) return null;\r\n\r\n ReactDOM.render(\r\n ,\r\n $root\r\n );\r\n\r\n return playlistData;\r\n};\r\n\r\nconst initVideoPlaylistNavigation = (playlistData: IPlayListData|null) => {\r\n if(!playlistData) return;\r\n\r\n const $playlistNavigation = document.getElementById('video-playlist-nav-ph');\r\n if(!$playlistNavigation) return;\r\n\r\n ReactDOM.render(\r\n ,\r\n $playlistNavigation\r\n );\r\n};\r\n\r\nconst initMobileButton = () => {\r\n const $mobileButton = document.getElementById('video-playlist-mobile-btn');\r\n if(!$mobileButton) return;\r\n\r\n const playlist = getQueryString()['playlist'];\r\n if(!playlist) return;\r\n\r\n ReactDOM.render(\r\n ,\r\n $mobileButton\r\n );\r\n};\r\n\r\nconst initPlaylistInfo = () => {\r\n const $loggedOutPlaceholder = document.getElementById('playlist-info-ph');\r\n if(!$loggedOutPlaceholder) return;\r\n\r\n const playlistData = getJSONFromHtml(document.getElementById('playlist-info-data')) as IPlayListData;\r\n if(!playlistData) return null;\r\n\r\n ReactDOM.render(\r\n ,\r\n $loggedOutPlaceholder\r\n );\r\n};\r\n\r\ndocument.addEventListener('DOMContentLoaded', () => {\r\n const playlistData = initVideoPlaylist();\r\n initVideoPlaylistNavigation(playlistData);\r\n initMobileButton();\r\n initPlaylistInfo();\r\n});\r\n\r\n","import { IIndexable } from './interfaces';\r\n\r\n/**\r\n * Read a page's GET URL variables and return them as an associative array\r\n * search (optional) - '?me=myValue&name2=SomeOtherValue'\r\n *\r\n * Usage:\r\n * ------\r\n * getQueryString(); //window.location.search\r\n * getQueryString('?me=myValue&name2=SomeOtherValue');\r\n * getQueryString()['key'] -> value\r\n *\r\n * Result:\r\n * -------\r\n * {\r\n * \"me\" : \"myValue\",\r\n * \"name2\" : \"SomeOtherValue\"\r\n * }\r\n *\r\n */\r\nexport const getQueryString = (search?: string, caseSensitive: boolean = true) : IIndexable => {\r\n\r\n const result = {} as IIndexable;\r\n\r\n if(!search){\r\n search = window.location.search;\r\n }\r\n\r\n // decode if needed\r\n search = window.decodeURIComponent(search.toString());\r\n\r\n if(!caseSensitive){\r\n search = search?.toLowerCase();\r\n }\r\n\r\n if(search.length <= 1) return result;\r\n\r\n // get hashes\r\n const hashes = search.substring(1).split('&');\r\n\r\n for(let i = 0; i < hashes.length; i++){\r\n\r\n //get hash\r\n const hash = hashes[i];\r\n\r\n //get hash sections\r\n const sections = hash.split('=');\r\n\r\n if(sections.length >= 2){\r\n\r\n let val = '';\r\n\r\n for(let s=1; s 1){\r\n val += '=';\r\n }\r\n\r\n val += sections[s];\r\n }\r\n\r\n //add to the object\r\n result[sections[0]] = val;\r\n }\r\n }\r\n\r\n return result;\r\n};\r\n\r\n/**\r\n * generate return URL that includes query string and hashes\r\n * https://www.waves.com/login?ReturnUrl=/vocal-mixing-masterclass-leslie-brathwaite?playlist=756640c2-13c0-408b-ad77-0294173d7721\r\n */\r\nexport const getReturnURL = (prefix = '/login') => {\r\n /*\r\n const qs = Object.entries(getQueryString()).map(([key, value], index) => `${key}=${value}`); //\r\n qs.push(`returnurl=${encodeURIComponent(window.location.pathname)}`);\r\n return `/login?${qs.join('&')}`*/\r\n\r\n const returnURL = `ReturnUrl=${window.location.pathname}${window.location.search}${window.location.hash}`;\r\n return `${prefix}?${returnURL}`\r\n};\r\n\r\nexport const removeQueryParamFromUrl = (queryParam: string) => {\r\n if(!queryParam || typeof URLSearchParams === 'undefined') return;\r\n\r\n const url = new URL(window.location.href);\r\n const params = new URLSearchParams(url.search);\r\n if(params.has(queryParam)){\r\n params.delete(queryParam);\r\n url.search = params.toString();\r\n }\r\n\r\n window.history.replaceState({}, '', url.toString());\r\n};"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","React","ReactDOM","props","xmlns","width","height","className","classes","viewBox","fill","color","transform","fillRule","clipRule","CLASS_NAME","closeVideoPlaylistMobile","$playlistRoot","document","getElementById","classList","remove","onClick","contains","add","openVideoPlaylistMobile","type","playlistData","playList","length","playlistName","title","map","playlistItem","i","href","videoURL","playlistGUID","isCurrentVideo","videoSort","videoName","getJSONFromHtml","$el","textContent","json","JSON","parse","ex","_defineProperty","value","configurable","writable","setHeight","useState","style","setStyle","rotationAngle","useEffect","undefined","endsWith","viewPortWidth","viewPortHeight","widthNum","Number","replace","getSVGHeight","isNaN","angle","WebkitTransform","msTransform","xmlnsXlink","id","xlinkHref","current","find","item","prevVideoURL","nextVideoURL","stroke","strokeWidth","addEventListener","$playlistNavigation","initVideoPlaylistNavigation","$root","initVideoPlaylist","$mobileButton","search","caseSensitive","result","window","location","decodeURIComponent","toString","toLowerCase","hashes","substring","split","sections","val","s","getQueryString","initMobileButton","$loggedOutPlaceholder","initPlaylistInfo"],"sourceRoot":""}