@clickview/lite 0.64.0-rc.0 → 0.64.0-rc.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundles.json +1 -1
- package/dist/css/{7153-lite-0cc5db0db7.chunk.css → 2962-lite-2002c62a24.chunk.css} +0 -1
- package/dist/css/{1857-lite-324255d395.chunk.css → 6173-lite-911f35513f.chunk.css} +0 -1
- package/dist/css/{2083-lite-6cb1775e12.chunk.css → 7324-lite-238bd550b7.chunk.css} +0 -1
- package/dist/css/{9013-lite-620f218839.chunk.css → 9013-lite-3c31b606c5.chunk.css} +2 -2
- package/dist/languages/en.json +1 -1
- package/dist/scripts/1216-899540dc73-lite.chunk.js +2 -0
- package/dist/scripts/1216-899540dc73-lite.chunk.js.map +1 -0
- package/dist/scripts/1820-b572681b3a-lite.chunk.js +2 -0
- package/dist/scripts/1820-b572681b3a-lite.chunk.js.map +1 -0
- package/dist/scripts/{2056-84f388df20-lite.chunk.js → 2056-a9e8d17a46-lite.chunk.js} +3 -3
- package/dist/scripts/2056-a9e8d17a46-lite.chunk.js.map +1 -0
- package/dist/scripts/229-ac9f12e165-lite.chunk.js +2 -0
- package/dist/scripts/229-ac9f12e165-lite.chunk.js.map +1 -0
- package/dist/scripts/{2564-65e3fc9619-lite.chunk.js → 2564-f5628d4e56-lite.chunk.js} +3 -3
- package/dist/scripts/{2564-65e3fc9619-lite.chunk.js.map → 2564-f5628d4e56-lite.chunk.js.map} +1 -1
- package/dist/scripts/2712-a851ddc3c3-lite.chunk.js +2 -0
- package/dist/scripts/2712-a851ddc3c3-lite.chunk.js.map +1 -0
- package/dist/scripts/{2788-eca70707c6-lite.chunk.js → 2788-c8ae3be73f-lite.chunk.js} +1 -1
- package/dist/scripts/2788-c8ae3be73f-lite.chunk.js.map +1 -0
- package/dist/scripts/{7153-0ed8513e59-lite.chunk.js → 2962-7f2e4412f0-lite.chunk.js} +2 -2
- package/dist/scripts/{7153-0ed8513e59-lite.chunk.js.map → 2962-7f2e4412f0-lite.chunk.js.map} +1 -1
- package/dist/scripts/2988-b602b64344-lite.chunk.js +2 -0
- package/dist/scripts/2988-b602b64344-lite.chunk.js.map +1 -0
- package/dist/scripts/3180-c1f065183d-lite.chunk.js +2 -0
- package/dist/scripts/3180-c1f065183d-lite.chunk.js.map +1 -0
- package/dist/scripts/3549-111225ff0e-lite.chunk.js +2 -0
- package/dist/scripts/3549-111225ff0e-lite.chunk.js.map +1 -0
- package/dist/scripts/4591-f78fa6c784-lite.chunk.js +2 -0
- package/dist/scripts/4591-f78fa6c784-lite.chunk.js.map +1 -0
- package/dist/scripts/4667-5101904582-lite.chunk.js +2 -0
- package/dist/scripts/4667-5101904582-lite.chunk.js.map +1 -0
- package/dist/scripts/{5056-6057435479-lite.chunk.js → 5056-65c739468f-lite.chunk.js} +1 -1
- package/dist/scripts/5056-65c739468f-lite.chunk.js.map +1 -0
- package/dist/scripts/5157-e38b666fce-lite.chunk.js +2 -0
- package/dist/scripts/5157-e38b666fce-lite.chunk.js.map +1 -0
- package/dist/scripts/5201-98ee21febb-lite.chunk.js +2 -0
- package/dist/scripts/5201-98ee21febb-lite.chunk.js.map +1 -0
- package/dist/scripts/5595-79068997ce-lite.chunk.js +2 -0
- package/dist/scripts/5595-79068997ce-lite.chunk.js.map +1 -0
- package/dist/scripts/5770-f88f6d9c00-lite.chunk.js +2 -0
- package/dist/scripts/5770-f88f6d9c00-lite.chunk.js.map +1 -0
- package/dist/scripts/5896-60133bfdad-lite.chunk.js +3 -0
- package/dist/scripts/5896-60133bfdad-lite.chunk.js.map +1 -0
- package/dist/scripts/6173-7f9939c29e-lite.chunk.js +3 -0
- package/dist/scripts/6173-7f9939c29e-lite.chunk.js.map +1 -0
- package/dist/scripts/6181-9d7668c9e4-lite.chunk.js +3 -0
- package/dist/scripts/6181-9d7668c9e4-lite.chunk.js.map +1 -0
- package/dist/scripts/6455-37039eb687-lite.chunk.js +2 -0
- package/dist/scripts/6455-37039eb687-lite.chunk.js.map +1 -0
- package/dist/scripts/6623-84b33c6856-lite.chunk.js +3 -0
- package/dist/scripts/6623-84b33c6856-lite.chunk.js.map +1 -0
- package/dist/scripts/6919-0f2cef64e5-lite.chunk.js +2 -0
- package/dist/scripts/6919-0f2cef64e5-lite.chunk.js.map +1 -0
- package/dist/scripts/7267-1f5006c9c5-lite.chunk.js +2 -0
- package/dist/scripts/7267-1f5006c9c5-lite.chunk.js.map +1 -0
- package/dist/scripts/{2083-7daacf0112-lite.chunk.js → 7324-ee20e73ac1-lite.chunk.js} +2 -2
- package/dist/scripts/{2083-7daacf0112-lite.chunk.js.map → 7324-ee20e73ac1-lite.chunk.js.map} +1 -1
- package/dist/scripts/7434-fef3ea4e89-lite.chunk.js +2 -0
- package/dist/scripts/7434-fef3ea4e89-lite.chunk.js.map +1 -0
- package/dist/scripts/7443-4866d0c9ab-lite.chunk.js +3 -0
- package/dist/scripts/7443-4866d0c9ab-lite.chunk.js.map +1 -0
- package/dist/scripts/8416-7d71a55a14-lite.chunk.js +2 -0
- package/dist/scripts/8416-7d71a55a14-lite.chunk.js.map +1 -0
- package/dist/scripts/8465-01b0f72699-lite.chunk.js +2 -0
- package/dist/scripts/8465-01b0f72699-lite.chunk.js.map +1 -0
- package/dist/scripts/8722-a9eac1941c-lite.chunk.js +2 -0
- package/dist/scripts/8722-a9eac1941c-lite.chunk.js.map +1 -0
- package/dist/scripts/9013-6fcc58f028-lite.chunk.js +2 -0
- package/dist/scripts/9013-6fcc58f028-lite.chunk.js.map +1 -0
- package/dist/scripts/9264-998d93d1c2-lite.chunk.js +2 -0
- package/dist/scripts/9264-998d93d1c2-lite.chunk.js.map +1 -0
- package/dist/scripts/9894-0fba5cf702-lite.chunk.js +3 -0
- package/dist/scripts/9894-0fba5cf702-lite.chunk.js.map +1 -0
- package/dist/scripts/bundle-2e839958ca.min.js +3 -0
- package/dist/scripts/bundle-2e839958ca.min.js.map +1 -0
- package/package.json +1 -1
- package/dist/scripts/1755-462bcd99e9-lite.chunk.js +0 -2
- package/dist/scripts/1755-462bcd99e9-lite.chunk.js.map +0 -1
- package/dist/scripts/180-6c4779f6ab-lite.chunk.js +0 -2
- package/dist/scripts/180-6c4779f6ab-lite.chunk.js.map +0 -1
- package/dist/scripts/1820-3b5d0a340d-lite.chunk.js +0 -2
- package/dist/scripts/1820-3b5d0a340d-lite.chunk.js.map +0 -1
- package/dist/scripts/1857-d3af9d98eb-lite.chunk.js +0 -3
- package/dist/scripts/1857-d3af9d98eb-lite.chunk.js.map +0 -1
- package/dist/scripts/2056-84f388df20-lite.chunk.js.map +0 -1
- package/dist/scripts/229-900e650427-lite.chunk.js +0 -2
- package/dist/scripts/229-900e650427-lite.chunk.js.map +0 -1
- package/dist/scripts/2788-eca70707c6-lite.chunk.js.map +0 -1
- package/dist/scripts/3180-22edf4c9fc-lite.chunk.js +0 -2
- package/dist/scripts/3180-22edf4c9fc-lite.chunk.js.map +0 -1
- package/dist/scripts/3549-30d3b1cd05-lite.chunk.js +0 -2
- package/dist/scripts/3549-30d3b1cd05-lite.chunk.js.map +0 -1
- package/dist/scripts/3776-0027340c98-lite.chunk.js +0 -2
- package/dist/scripts/3776-0027340c98-lite.chunk.js.map +0 -1
- package/dist/scripts/4591-3e8dddd0e9-lite.chunk.js +0 -2
- package/dist/scripts/4591-3e8dddd0e9-lite.chunk.js.map +0 -1
- package/dist/scripts/4667-f3882f2379-lite.chunk.js +0 -2
- package/dist/scripts/4667-f3882f2379-lite.chunk.js.map +0 -1
- package/dist/scripts/5056-6057435479-lite.chunk.js.map +0 -1
- package/dist/scripts/5157-ad13101a6e-lite.chunk.js +0 -2
- package/dist/scripts/5157-ad13101a6e-lite.chunk.js.map +0 -1
- package/dist/scripts/5201-7d3867d027-lite.chunk.js +0 -2
- package/dist/scripts/5201-7d3867d027-lite.chunk.js.map +0 -1
- package/dist/scripts/5595-10e586779d-lite.chunk.js +0 -2
- package/dist/scripts/5595-10e586779d-lite.chunk.js.map +0 -1
- package/dist/scripts/5896-5d2f32c59e-lite.chunk.js +0 -3
- package/dist/scripts/5896-5d2f32c59e-lite.chunk.js.map +0 -1
- package/dist/scripts/6181-50a39979ec-lite.chunk.js +0 -3
- package/dist/scripts/6181-50a39979ec-lite.chunk.js.map +0 -1
- package/dist/scripts/6455-2f45be17cf-lite.chunk.js +0 -2
- package/dist/scripts/6455-2f45be17cf-lite.chunk.js.map +0 -1
- package/dist/scripts/6623-ebbffb59b3-lite.chunk.js +0 -3
- package/dist/scripts/6623-ebbffb59b3-lite.chunk.js.map +0 -1
- package/dist/scripts/6919-cb2de57c2e-lite.chunk.js +0 -2
- package/dist/scripts/6919-cb2de57c2e-lite.chunk.js.map +0 -1
- package/dist/scripts/7267-c2d30dd339-lite.chunk.js +0 -2
- package/dist/scripts/7267-c2d30dd339-lite.chunk.js.map +0 -1
- package/dist/scripts/7434-c34ca23a21-lite.chunk.js +0 -2
- package/dist/scripts/7434-c34ca23a21-lite.chunk.js.map +0 -1
- package/dist/scripts/7443-7c72de0cb9-lite.chunk.js +0 -3
- package/dist/scripts/7443-7c72de0cb9-lite.chunk.js.map +0 -1
- package/dist/scripts/8022-0656cce655-lite.chunk.js +0 -2
- package/dist/scripts/8022-0656cce655-lite.chunk.js.map +0 -1
- package/dist/scripts/8722-69c1c7a24f-lite.chunk.js +0 -2
- package/dist/scripts/8722-69c1c7a24f-lite.chunk.js.map +0 -1
- package/dist/scripts/9013-adc5d3517a-lite.chunk.js +0 -2
- package/dist/scripts/9013-adc5d3517a-lite.chunk.js.map +0 -1
- package/dist/scripts/9155-87c9030ce9-lite.chunk.js +0 -2
- package/dist/scripts/9155-87c9030ce9-lite.chunk.js.map +0 -1
- package/dist/scripts/9264-750b3d6ea0-lite.chunk.js +0 -2
- package/dist/scripts/9264-750b3d6ea0-lite.chunk.js.map +0 -1
- package/dist/scripts/9894-bc34edcd67-lite.chunk.js +0 -3
- package/dist/scripts/9894-bc34edcd67-lite.chunk.js.map +0 -1
- package/dist/scripts/bundle-3d3d127d98.min.js +0 -3
- package/dist/scripts/bundle-3d3d127d98.min.js.map +0 -1
- package/dist/css/{6455-lite-fe0bc6d95f.chunk.css → 6455-lite-c07987d46c.chunk.css} +1 -1
- /package/dist/css/{9155-lite-447d345417.chunk.css → 8465-lite-447d345417.chunk.css} +0 -0
- /package/dist/scripts/{1857-d3af9d98eb-lite.chunk.js.LICENSE.txt → 2056-a9e8d17a46-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{2056-84f388df20-lite.chunk.js.LICENSE.txt → 2564-f5628d4e56-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{2564-65e3fc9619-lite.chunk.js.LICENSE.txt → 5896-60133bfdad-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{5896-5d2f32c59e-lite.chunk.js.LICENSE.txt → 6173-7f9939c29e-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{6181-50a39979ec-lite.chunk.js.LICENSE.txt → 6181-9d7668c9e4-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{6623-ebbffb59b3-lite.chunk.js.LICENSE.txt → 6623-84b33c6856-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{7443-7c72de0cb9-lite.chunk.js.LICENSE.txt → 7443-4866d0c9ab-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{9894-bc34edcd67-lite.chunk.js.LICENSE.txt → 9894-0fba5cf702-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{bundle-3d3d127d98.min.js.LICENSE.txt → bundle-2e839958ca.min.js.LICENSE.txt} +0 -0
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[229],{50690:(e,t,n)=>{n.d(t,{b:()=>a});var r=n(12788),a={renderInPortalIfExists:function(e,t){return t?(0,r.createPortal)(e,t):e}}},84963:(e,t,n)=>{n.d(t,{r:()=>u});var r=n(32735),a=n(23481),o=n(83914),i=n(36532),l=n(35223);const c={tag:"XRj8d",tooltip:"X6mLk"};var s="specialEventCalendar.comingSoonTag";function u(e){return r.createElement(i.u,{title:a.T.getPhrase(s,"tooltip"),spanHackClassName:"d-block ".concat(c.tooltip),spanHack:!0},r.createElement("div",{className:"d-flex text-dark align-items-center ".concat(c.tag," ").concat(e.className)},r.createElement(o.x,{svgName:l.vn.Timer}),!e.onlyIcon&&a.T.getPhrase(s,"comingSoon")))}},73679:(e,t,n)=>{n.d(t,{s:()=>i});var r=n(32735),a=n(36848);const o={dateItem:"I3SBm",label:"PRORs",body:"RfiM_",bodyDay:"ZOVny",bodyRange:"vYhXN",bodyMonth:"mYslO",month:"EPkkQ"};function i(e){var t,n,i;return r.createElement(a.F,{appLink:null===(t=e.getAppLink)||void 0===t?void 0:t.call(e),className:"text-decoration-none text-center bg-white text-dark border border-3 ".concat(null===(n=e.theme)||void 0===n?void 0:n.border," rounded-3 d-block fw-semibold ").concat(e.className),analyticsData:e.analyticsData,analyticsOptions:e.analyticsOptions},r.createElement("div",{className:"position-relative ".concat(o.dateItem)},r.createElement("div",{className:"".concat(null===(i=e.theme)||void 0===i?void 0:i.background," py-1 ").concat(o.label," d-flex align-items-center justify-content-center")},e.label?e.label:r.createElement(r.Fragment,null," ")),r.createElement("div",{className:"".concat(function(){switch(e.body.type){case"range":return o.bodyRange;case"day":return o.bodyDay;case"month":return o.bodyMonth}}()," ").concat(o.body," my-2")},e.body.text),r.createElement("div",{className:"mb-0 ".concat(o.month)},e.month)))}},44522:(e,t,n)=>{n.d(t,{p:()=>k,v:()=>N});var r=n(32735),a=n(110),o=n(50690),i=n(84963),l=n(73679),c=n(83657),s=n(23481),u=n(36848),d=n(83914),m=n(35223),f="shared.backButton";function v(e){var t=Object.assign({textShadow:!0},e),n=t.backToName,a=t.appLink,o=t.color,i=t.extraClasses,l=t.textShadow,c=n?s.T.getPhrase(f,"backTo",{backToName:n}):s.T.getPhrase(f,"back"),v="black"===o?"":"text-white",h=l?"text-shadow":"";return r.createElement(u.F,{appLink:a,className:"d-inline-flex align-items-center h5 mb-0 ".concat(i," ").concat(v," ").concat(h)},r.createElement(d.x,{svgName:m.vn.ChevronLeft,size:d.S.Medium}),r.createElement("span",{className:"ms-1"},c))}v.defaultProps={color:"black",extraClasses:""};var h=n(36518),b=n(83345),p=n(10587),g=n(94232),y=n(54610),E=n(79967),C=n(67453);const S={bannerContent:"sSCTB",actionsContainer:"Z5WI2",bannerContentWithLogo:"rgs7Q",container:"M51HJ",logoContainer:"vkeJk",logoContainerLeft:"M3U9B",logoHeading:"EtRwC",specialEventContainer:"rOxDc",headingLarge:"_8pnV",heading:"JXVBH"};var w="".concat(p.y[y.__.Banners].width,":").concat(p.y[y.__.Banners].height);function A(e){return e.length<160?"h1":S.headingLarge}var k=r.memo((function(e){var t,n,s,u,d=e.heading,m=e.banner,f=e.imageCdnUrl,p=e.actions,k=e.sortComponent,N=e.blockColourClass,x=e.specialEvent,I=r.useContext(g.n),L=(0,E.k)().xxl?1920:1200,F=r.useMemo((function(){if(!x||e.showComingSoon)return!1;var t=a.O.format(new Date,"YYYY-MM-DD");return x.endDate?x.startDate<=t&&x.endDate>=t:x.startDate===t}),[x]),O=e.imageOptions||{width:L,ratio:w,resizeType:y.Nq.Cover},M=!!m&&!!f&&C.j.createBannerUrl(m,{fallbackBaseUrl:f,fallbackCategoryName:d,type:y.__.Banners},O),P={className:"banner banner-header ".concat(e.bannerClassName),style:M?{backgroundImage:"url('".concat(M,"')")}:{}};!m&&N&&(delete P.style,P.className+=" ".concat(N));var T=e.detailsComponent;return o.b.renderInPortalIfExists(r.createElement("header",Object.assign({},P),r.createElement("div",{className:"container ".concat(S.container," position-relative inner-banner")},e.backButtonAppLink&&r.createElement("div",{className:"pt-3"},r.createElement(v,{appLink:e.backButtonAppLink,backToName:e.backButtonText,extraClasses:e.backButtonClasses,color:"white"})),r.createElement("div",{className:"".concat(e.alignLogoLeft?"position-absolute top-50 start-0 translate-middle-y w-100 ps-4":"".concat(S.bannerContent," px-2 ").concat((null===(t=e.logo)||void 0===t?void 0:t.url)?S.bannerContentWithLogo:""))},!!x&&r.createElement("div",{className:"position-relative ".concat(S.specialEventContainer)},r.createElement(l.s,{body:{type:x.endDate?"range":"day",text:x.endDate?"".concat(a.O.format(x.startDate,"DD"),"-").concat(a.O.format(x.endDate,"DD")):a.O.format(x.startDate,"DD")},month:function(e){return e.endDate?a.O.isSame(e.startDate,e.endDate,"month")?a.O.format(e.startDate,"MMMM"):"".concat(a.O.format(e.startDate,"MMM")," - ").concat(a.O.format(e.endDate,"MMM")):a.O.format(e.startDate,"MMMM")}(x),theme:e.calendarTheme})),r.createElement("div",null,F&&r.createElement("div",{className:"rounded-pill py-1 px-2 my-1 me-1 fw-semibold bg-light-blue lh-1 d-inline-block"},r.createElement(b.x,{namespace:"shared.bannerHeader",phrase:"onToday"})),e.showComingSoon&&r.createElement(i.r,{className:"pe-2 fw-semibold mb-1 rounded-pill justify-content-start text-nowrap"}),r.createElement("div",{className:"d-flex align-items-center"},e.alignLogoLeft&&r.createElement("div",{className:"".concat(S.logoContainerLeft," d-none d-md-block partial-loading-background rounded-circle overflow-hidden me-3")},(null===(n=e.logo)||void 0===n?void 0:n.url)&&r.createElement(h.w,{src:C.j.createUrl(null===(s=e.logo)||void 0===s?void 0:s.url,{size:y.h2.Medium})})),r.createElement("h1",{className:"text-white text-shadow pe-3 position-static ".concat(S.heading," ").concat(A(d)," ").concat(e.alignLogoLeft?"w-50":"")},d,T&&r.createElement(T,null)))),!!p&&r.createElement("div",{className:S.actionsContainer},r.createElement(c.e,{actions:p,sortComponent:k,actionsDropdownClassName:e.actionsDropdownClassName}))),!e.alignLogoLeft&&!!(null===(u=e.logo)||void 0===u?void 0:u.url)&&r.createElement("div",{className:S.logoContainer},r.createElement("img",{src:C.j.createUrl(e.logo.url,{size:y.h2.Small}),className:"rounded-circle"})))),null==I?void 0:I.container)}),(function(e,t){var n,r;return e.actions===t.actions&&e.heading===t.heading&&(null===(n=e.logo)||void 0===n?void 0:n.url)===(null===(r=t.logo)||void 0===r?void 0:r.url)}));function N(){var e=r.useContext(g.n);return o.b.renderInPortalIfExists(r.createElement("div",{className:"partial-banner partial-loading-background ".concat(S.banner)}),null==e?void 0:e.container)}},49935:(e,t,n)=>{n.d(t,{Oo:()=>h,b2:()=>b});var r=n(32735),a=n(23481),o=n(36848),i=n(86764),l=n(3747),c=n(5859),s=n(35223),u=n(83914);function d(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,o,i,l=[],c=!0,s=!1;try{if(o=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=o.call(n)).done)&&(l.push(r.value),l.length!==t);c=!0);}catch(e){s=!0,a=e}finally{try{if(!c&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(s)throw a}}return l}}(e,t)||function(e,t){if(e){if("string"==typeof e)return m(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?m(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function m(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var f=a.T.encloseNamespace("shared.breadcrumbComponent"),v=r.forwardRef((function(e,t){var n=e.breadcrumb,a=n.name,i=n.appLink,l=n.active,c=e.withBackIcon,d=a,m=null;return d.length>48&&(d=a.slice(0,48)+"...",m=a),r.createElement("li",{className:"breadcrumb-item".concat(l?" active":""),title:m},l?r.createElement("strong",null,d):r.createElement(o.F,{appLink:i,ref:t},c&&r.createElement(u.x,{svgName:s.vn.ChevronLeft,size:u.S.Small}),r.createElement("span",{className:c?"ms-2":""},d)))})),h=function(e){var t=e.breadcrumbs,n=(0,l.a)(i.r.XS),a=(null==t?void 0:t.length)||0,o=d(r.useState(!1),2),c=o[0],s=o[1],u=d(r.useState(!1),2),m=u[0],h=u[1],b=r.useRef();if(r.useEffect((function(){var e,n=null!==(e=null==t?void 0:t.reduce((function(e,t){return e+t.name.length}),0))&&void 0!==e?e:0;a>4&&n>64&&s(!0)}),[null==t?void 0:t.length]),r.useLayoutEffect((function(){var e;m&&(null===(e=b.current)||void 0===e||e.focus())}),[b.current,m]),!a||n&&a<2)return r.createElement(r.Fragment,null);if(n)return r.createElement("nav",{"aria-label":"breadcrumb"},r.createElement("ol",{className:"breadcrumb m-0 p-0"},r.createElement(v,{breadcrumb:t[a-2],withBackIcon:!0})));var p=r.createElement(v,{breadcrumb:t[0]}),g=a>2?r.createElement(v,{breadcrumb:t[1]}):r.createElement(r.Fragment,null),y=a>3?r.createElement(v,{breadcrumb:t[a-2]}):r.createElement(r.Fragment,null),E=a>1?r.createElement(v,{breadcrumb:t[a-1]}):r.createElement(r.Fragment,null),C=t.slice(2,a-2);return r.createElement("nav",{"aria-label":"breadcrumb"},r.createElement("ol",{className:"breadcrumb m-0 p-0"},p,g,c?r.createElement("li",{className:"breadcrumb-item"},r.createElement("button",{className:"btn-link",onClick:function(){s(!1),h(!0)},"aria-label":f("expand")},"...")):C.map((function(e,t){return r.createElement(v,{key:t,breadcrumb:e,ref:0===t?b:null})})),y,E))},b=r.memo((function(e){var t=e.numItems,n=void 0===t?3:t;return(0,l.a)(i.r.XS)?r.createElement("div",{className:"partial-loading-background",style:{height:"1.3125rem",width:"6rem"}}):r.createElement("nav",{"aria-label":"breadcrumb"},r.createElement("ol",{className:"breadcrumb m-0 p-0"},c.u.getPartialLoadingItems({numItems:n}).map((function(e,t){var n=e.width;return r.createElement("li",{key:t,className:"breadcrumb-item"},r.createElement("span",{className:"d-inline-block partial-loading-background",style:{width:n},dangerouslySetInnerHTML:{__html:" "}}))}))))}))},71020:(e,t,n)=>{n.d(t,{_:()=>u});var r=n(32735),a=n(80247),o=n(34152),i=n(83914),l=n(35223);const c={container:"VwD1b",spinner:"eJ85e"};function s(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function u(e){var t,n,u=(t=(0,o.YD)(),n=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,o,i,l=[],c=!0,s=!1;try{if(o=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=o.call(n)).done)&&(l.push(r.value),l.length!==t);c=!0);}catch(e){s=!0,a=e}finally{try{if(!c&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(s)throw a}}return l}}(t,n)||function(e,t){if(e){if("string"==typeof e)return s(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(e,t):void 0}}(t,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),d=u[0],m=u[1];return r.useEffect((function(){var t;e.fetchOnScroll&&m&&!e.isFetching&&(null===(t=e.fetchNext)||void 0===t||t.call(e,e.nextCursor))}),[m,e.isFetching]),r.createElement("div",{className:"p-3 text-center ".concat(c.container),ref:d},e.isFetching?r.createElement(a.Z,{as:"span",animation:"border",role:"status",className:c.spinner}):r.createElement(i.x,{svgName:l.vn.ChevronDown,className:"svg-container cursor-pointer",size:i.S.Large,onClick:function(){var t;return null===(t=e.fetchNext)||void 0===t?void 0:t.call(e,e.nextCursor)}}))}u.defaultProps={fetchOnScroll:!1}},94644:(e,t,n)=>{n.d(t,{r:()=>u});var r=n(50242),a=n(81886),o=n(67058),i=n(14553),l=n(49267),c=n(49075),s={notFound:o.d,forbidden:{rating:i.q,yearLevel:i.q,region:l.a,privacy:i.q},badRequest:c._,internalServerError:c._};function u(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(e){var o;o="number"==typeof e?e:e.status;var i=Object.assign(Object.assign({},s),t);o&&a.Q.Ry.isStatusCodeError(o)&&(o!==r.o.InternalServer?o!==r.o.NotFound?o!==r.o.Forbidden?n.badRequest||a.Q.Ry.throw(new i.badRequest):n.forbidden||a.Q.Ry.throw(new i.forbidden.privacy):n.notFound||a.Q.Ry.throw(new i.notFound):n.internalServerError||a.Q.Ry.throw(new c._))}}},60115:(e,t,n)=>{n.d(t,{K:()=>s});var r=n(32735),a=n(50242),o=n(91967),i=400,l=n(45719);function c(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function s(e,t,n,s,u,d){var m,f,v,h,b=(m=(0,r.useState)(0),f=2,function(e){if(Array.isArray(e))return e}(m)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,o,i,l=[],c=!0,s=!1;try{if(o=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=o.call(n)).done)&&(l.push(r.value),l.length!==t);c=!0);}catch(e){s=!0,a=e}finally{try{if(!c&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(s)throw a}}return l}}(m,f)||function(e,t){if(e){if("string"==typeof e)return c(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?c(e,t):void 0}}(m,f)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),p=b[0],g=b[1],y=t,E=(0,l.P)((function(t){if(!e)return null;var n=e(t);return n?n.key:null}),s,u);return v={fetchNextPage:function(){if(t&&e&&E)return g((function(e){return e+1})),y(E.nextCursor)},hasMore:!!(null==E?void 0:E.nextCursor),isFetching:null==E?void 0:E.isFetching,scrollContainer:d},h=function(){if(!v.isFetching){if(v.scrollContainer){var e=v.scrollContainer;if(e.getBoundingClientRect().height+e.scrollTop<e.scrollHeight-i)return}else if(window.innerHeight+document.documentElement.scrollTop<document.documentElement.scrollHeight-i)return;v.fetchNextPage()}},(0,r.useEffect)((function(){var e=o.q.throttle(h,200),t=v.scrollContainer||window;return v.hasMore&&t.addEventListener("scroll",e),function(){return t.removeEventListener("scroll",e)}}),[v.hasMore,v.fetchNextPage,v.scrollContainer]),(0,r.useEffect)((function(){E&&E.shouldInitialFetch&&t&&(y(),g((function(e){return e+1})))}),[null==E?void 0:E.shouldInitialFetch,t]),(0,r.useEffect)((function(){var e,t;if((null==E?void 0:E.statusCode)&&o.q.isFunction(n)){var r=+(null===(t=null===(e=E.statusCode)||void 0===e?void 0:e.toString())||void 0===t?void 0:t.substr(0,1));r!==a.k.ClientError&&r!==a.k.ServerError||n(p,E.statusCode)}}),[null==E?void 0:E.statusCode]),{items:null==E?void 0:E.items,hasMore:!!(null==E?void 0:E.nextCursor),nextCursor:null==E?void 0:E.nextCursor,isFetching:null==E?void 0:E.isFetching,totalItems:null==E?void 0:E.totalItems,hasFirstPageCompleted:null==E?void 0:E.hasFirstPageCompleted}}},63719:(e,t,n)=>{n.d(t,{h:()=>l});var r=n(32735),a=n(77316);function o(e,t){if(e){if("string"==typeof e)return i(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?i(e,t):void 0}}function i(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function l(e){var t,n,l=(t=r.useMemo((function(){return a.p.getBuilder()}),[]),n=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,o,i,l=[],c=!0,s=!1;try{if(o=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=o.call(n)).done)&&(l.push(r.value),l.length!==t);c=!0);}catch(e){s=!0,a=e}finally{try{if(!c&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(s)throw a}}return l}}(t,n)||o(t,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),c=l[0],s=(0,l[1])(c);return s&&e?[].concat(function(e){return function(e){if(Array.isArray(e))return i(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||o(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}(s),[Object.assign(Object.assign({},e),{active:!0})]):s}},5859:(e,t,n)=>{function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}n.d(t,{u:()=>o});var a={numItems:5,minWidth:50,maxWidth:100},o={getPartialLoadingItems:function(){var e,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=Object.assign(Object.assign({},a),t);return(e=Array(n.numItems),function(e){if(Array.isArray(e))return r(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return r(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?r(e,t):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()).map((function(){return{width:"".concat(Math.max(Math.floor(Math.random()*n.maxWidth),n.minWidth),"px")}}))}}},44110:(e,t,n)=>{n.d(t,{i:()=>i});var r=n(20354),a=n(89454),o=n(86698),i=function(){var e=(0,o.y)({redirectOnError:!0}),t=e.activePresentation,n=e.getFallbackPresentation,i=t||n();return r.a.useBasicFetch(!!i&&a.O.presentationAudiences(i.id))}},97816:(e,t,n)=>{n.d(t,{V:()=>f});var r=n(32735),a=n(20354),o=n(75896),i=n(21750),l=n(31949),c=n(1575),s=n(31908);function u(e,t){if(e){if("string"==typeof e)return d(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?d(e,t):void 0}}function d(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var m=50;function f(e){var t,n,f=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},v=a.a.useBasicFetch(l.N.currentUser()),h=r.useRef(new Set),b=function(e){return e?Array.isArray(e)?e.filter((function(e){return!!e&&(s.M.isVideo(e)||s.M.isClip(e))})):"data"in e?e.data.filter((function(e){return!!e&&(s.M.isVideo(e)||s.M.isClip(e))})):[]:[]}(e),p=b.map((function(e){return e.id})),g=(t=r.useState([]),n=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,o,i,l=[],c=!0,s=!1;try{if(o=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=o.call(n)).done)&&(l.push(r.value),l.length!==t);c=!0);}catch(e){s=!0,a=e}finally{try{if(!c&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(s)throw a}}return l}}(t,n)||u(t,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),y=g[0],E=g[1];r.useEffect((function(){if((null==p?void 0:p.length)&&v.hasCompleted){var e=[];p.forEach((function(t){h.current.has(t)||(e.push(t),h.current.add(t))})),e.length&&E((function(t){var n=function(e){return function(e){if(Array.isArray(e))return d(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||u(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}(t);return o.m.chunk(e,m).forEach((function(e){var t;n.push(c.R.videoMixinAssocs(e,f.flightNamespace)),(null===(t=v.data)||void 0===t?void 0:t.isAuthenticated)&&n.push(i.x.hasCurriculumLinks(e,null,f.flightNamespace))})),n}))}}),[null==p?void 0:p.length,v.hasCompleted]),a.a.useBasicFetchAll(y)}},16641:(e,t,n)=>{n.r(t),n.d(t,{FavouritesView:()=>Z});var r=n(32735),a=n(70680),o=n(23481),i=n(20354),l=n(65858),c=n(44522),s=n(49935),u=n(71020),d=n(83345),m=n(74696),f=n(13231),v=n(51365),h=n(16714),b=n(94644),p=n(39151),g=n(1666),y=n(63419),E=n(31949),C=n(69883),S=n(63719),w=n(60115),A=n(22902),k=n(79612),N=n(99742),x=n(51855),I=n(27638),L=n(44110),F=n(97816),O=n(10741),M=n(22490),P=n(82431),T=n(23232),j=n(14070),D=n(97291);const B={image:"ZfpQv"};var R="shared.favouritesEmptyState",_=o.T.encloseNamespace(R);function U(){return r.createElement(d.D.Provider,{value:R},r.createElement(T.u,null,r.createElement(T.u.Image,{src:N.W.EmptyStates.FAVOURITED_VIDEOS,altText:_("info"),className:B.image}),r.createElement(T.u.Heading,{className:"h3"},r.createElement(d.x,{phrase:"heading"})),r.createElement(T.u.Info,null,r.createElement(d.x,{phrase:"info"})),r.createElement(T.u.Cta,{text:o.T.getPhrase(R,"cta"),appLink:{application:D.O.DASHBOARD,action:j.e.Dashboard.HOME}})))}function V(){return r.createElement(d.D.Provider,{value:R},r.createElement(T.u,null,r.createElement(T.u.Image,{src:N.W.EmptyStates.FAVOURITED_VIDEOS_PUBLIC,altText:_("publicInfo")}),r.createElement(T.u.Heading,null,r.createElement(d.x,{phrase:"publicHeading"})),r.createElement(T.u.Info,null,r.createElement(d.x,{phrase:"publicInfo"})),r.createElement(T.u.Cta,{text:o.T.getPhrase(R,"publicCta"),appLink:{application:D.O.SIGN_UP,action:j.e.SignUp.SIGN_UP},analyticsData:{},analyticsOptions:{actionType:l.Vw.Click,location:l.LZ.MyFavouritesLanding,entity:l.py.AppLink,workflowPhase:l.eu.Start,descriptor:l.Yu.SignUp}})))}var H=n(26323),W=n(35223),G=n(31908),$=n(10671),Q="shared.favourites";const Y={banner:"FEWd3"};var q="shared.favourites";function Z(){var e,t,n,T=(0,a.I0)(),j=(0,C.Z)(),D=(0,I.u)(l.LZ.VideoThumbnail),B=D.setFavourite,R=D.canFavourite,_=(0,x.G)().isPlugin,Z=function(){var e=(0,$._)({location:$.i.VideoItem}),t=(0,I.u)(l.LZ.VideoThumbnail).setFavourite;return Object.assign(Object.assign({},e),{getVideoActions:function(n){return G.M.getCanBeConsumed(n).canConsume?e.getVideoActions(n):[{label:o.T.getPhrase(Q,"removeFromFavourites"),svgName:W.vn.Delete,button:!1,className:"btn btn-link text-danger",onClick:function(){return t(n,!1)}}]}})}();(0,k.M)({title:o.T.getPhrase(q,"pageTitle")});var z=(0,A.T)(),X=z.hasLocalPermissions,J=z.hasPermissions,K=i.a.useBasicFetch(E.N.currentUser()),ee=i.a.useBasicFetch((null===(e=K.data)||void 0===e?void 0:e.isAuthenticated)&&g.h.yearGroups(K.data.customerId)),te=i.a.useBasicFetch(p.L.config()),ne=function(e){return y.P.getFavourites(K.data.id,e)},re=function(e){return i.a.getFetch(T)(ne(e))},ae=!X(h.E.ViewMyFavouritesLanding)&&K.hasCompleted,oe=(0,w.K)(!!ae&&ne,re,(function(e,t){if(1===e)return(0,b.r)(t);j.error(o.T.getPhrase(q,"error"))})),ie=oe.items,le=oe.hasMore,ce=oe.isFetching;(0,F.V)(ie);var se=(0,L.i)(),ue=(0,S.h)({name:o.T.getPhrase(q,"header")}),de=(0,H.B)(null===(t=K.data)||void 0===t?void 0:t.id),me=de.count;return de.isLoading?r.createElement(r.Fragment,null):X(h.E.ViewMyFavouritesLanding)?r.createElement(V,null):r.createElement(v.M.Provider,{value:Z},r.createElement("div",{className:"p-3"},r.createElement(c.p,{heading:o.T.getPhrase(q,"header"),banner:{url:N.W.FAVOURITES_PLAYLIST.FAV_PLAYLIST_BANNER},bannerClassName:"".concat(Y.banner," bg-pink"),imageCdnUrl:null===(n=te.data)||void 0===n?void 0:n.imageCdnUrl,detailsComponent:function(){return r.createElement("div",{className:"mb-n1 font-size-normal fw-normal mt-1"},r.createElement(d.x,{namespace:q,phrase:"videos",options:{smartCount:me}}))}}),(null==ue?void 0:ue.length)&&r.createElement("div",{className:"border-bottom pb-3"},r.createElement(s.Oo,{breadcrumbs:ue})),ie?ie.length?r.createElement("div",{className:"mt-2"},r.createElement(f.E4,{videos:ie,yearGroups:ee.data,getVideoAppLink:M.W.getAppLink,hasPermissions:J,getSubTextAppLink:function(e){return P.j.getSeriesAppLink(e.series)},setFavourite:B,canFavourite:R,presentationAudiences:se.data,getPreviewQuestionsAppLink:function(e){return O.j.getPreviewQuestionsAppLink(e)},isPlugin:_,getClassroomGuideAppLink:M.W.getClassroomGuideAppLink,getInteractiveGuidanceAppLink:M.W.getInteractiveGuidanceAppLink,getResourceGuidanceAppLink:M.W.getResourceGuidanceAppLink}),(le||ce)&&r.createElement(u._,{isFetching:ce,fetchNext:re})):r.createElement(U,null):r.createElement(m.S,null)))}},26323:(e,t,n)=>{n.d(t,{B:()=>l});var r=n(20354),a=n(63419);function o(e){return function(e){if(Array.isArray(e))return i(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return i(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?i(e,t):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function i(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function l(e){var t,n,i,l,c,s,u,d,m,f=r.a.useBasicFetch(e&&a.P.getFavouritesVideosCount(e)),v=r.a.useBasicFetch(e&&a.P.getFavouritesClipsCount(e)),h=r.a.useBasicFetch(e&&a.P.getFavouritesInteractivesCount(e));return{count:(null===(t=f.data)||void 0===t?void 0:t.count)+(null===(n=h.data)||void 0===n?void 0:n.count)+(null===(i=v.data)||void 0===i?void 0:i.count),favourites:[].concat(o((null===(l=f.data)||void 0===l?void 0:l.data)||[]),o((null===(c=v.data)||void 0===c?void 0:c.data)||[]),o((null===(s=h.data)||void 0===s?void 0:s.data)||[])),isLoading:!(null===(u=f.data)||void 0===u?void 0:u.data)||!(null===(d=v.data)||void 0===d?void 0:d.data)||!(null===(m=h.data)||void 0===m?void 0:m.data)}}},68050:(e,t,n)=>{n.d(t,{Z:()=>s});var r=n(95685),a=n.n(r),o=n(32735),i=n(46304),l=n(74512);const c=o.forwardRef((({bsPrefix:e,className:t,as:n="div",...r},o)=>{const c=(0,i.vE)(e,"row"),s=(0,i.pi)(),u=(0,i.zG)(),d=`${c}-cols`,m=[];return s.forEach((e=>{const t=r[e];let n;delete r[e],null!=t&&"object"==typeof t?({cols:n}=t):n=t;const a=e!==u?`-${e}`:"";null!=n&&m.push(`${d}${a}-${n}`)})),(0,l.jsx)(n,{ref:o,...r,className:a()(t,c,...m)})}));c.displayName="Row";const s=c}}]);
|
|
2
|
-
//# sourceMappingURL=229-900e650427-lite.chunk.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/229-900e650427-lite.chunk.js","mappings":"kJAGaA,EAAe,CAC1BC,uBAAsB,SAACC,EAA+BC,GACpD,OAAIA,GACK,IAAAC,cAAaF,EAAWC,GAE1BD,CACT,E,8FCRF,SAAgB,IAAM,QAAQ,QAAU,SCSxC,IAAMG,EAAY,qCAOZ,SAAUC,EAAcC,GAC5B,OACE,gBAACC,EAAA,EAAO,CAACC,MAAOC,EAAA,YAA0BL,EAAW,WAAYM,kBAAiB,kBAAa,WAAkBC,UAAQ,GACvH,uBAAKC,UAAS,8CAAyC,MAAU,YAAIN,EAAMM,YACzE,gBAACC,EAAA,EAAY,CAACC,QAAS,cACrBR,EAAMS,UAAYN,EAAA,YAA0BL,EAAW,eAIjE,C,6DCzBA,SAAgB,SAAW,QAAQ,MAAQ,QAAQ,KAAO,QAAQ,QAAU,QAAQ,UAAY,QAAQ,UAAY,QAAQ,MAAQ,SCyB9H,SAAUY,EAAoBV,G,UAYlC,OACE,gBAACW,EAAA,EAAO,CACNC,QAAyB,QAAhB,EAAAZ,EAAMa,kBAAU,uBACzBP,UAAS,8EAAoF,QAAX,EAAAN,EAAMc,aAAK,eAAEC,OAAM,0CAAkCf,EAAMM,WAC7IU,cAAehB,EAAMgB,cACrBC,iBAAkBjB,EAAMiB,kBAExB,uBAAKX,UAAS,4BAAuB,aACnC,uBAAKA,UAAS,UAAgB,QAAX,EAAAN,EAAMc,aAAK,eAAEI,WAAU,iBAAS,QAAY,sDAC5DlB,EAAMmB,MAAQnB,EAAMmB,MAAQ,sCAE/B,uBAAKb,UAAS,UAtBpB,WACE,OAAQN,EAAMoB,KAAKC,MACjB,IAAK,QACH,OAAO,YACT,IAAK,MACH,OAAO,UACT,IAAK,QACH,OAAO,YAEb,CAayBC,GAAc,YAAI,OAAW,UAC7CtB,EAAMoB,KAAKG,MAEd,uBAAKjB,UAAS,eAAU,UACrBN,EAAMwB,QAKjB,C,2JCjDM1B,EAAY,oBAkBZ,SAAU2B,EAAWzB,GACzB,MAA8D,eAC5D0B,YAAY,GACT1B,GAFG2B,EAAU,EAAVA,WAAYf,EAAO,EAAPA,QAASgB,EAAK,EAALA,MAAOC,EAAY,EAAZA,aAAcH,EAAU,EAAVA,WAK5CI,EAAaH,EACfxB,EAAA,YAA0BL,EAAW,SAAU,CAAE6B,WAAAA,IACjDxB,EAAA,YAA0BL,EAAW,QAEnCiC,EAAuB,UAAVH,EAAoB,GAAK,aACtCI,EAAkBN,EAAa,cAAgB,GAErD,OACE,gBAACf,EAAA,EAAO,CACNC,QAASA,EACTN,UAAS,mDAA8CuB,EAAY,YAAIE,EAAU,YAAIC,IAErF,gBAACzB,EAAA,EAAY,CAACC,QAAS,iBAA0ByB,KAAM1B,EAAA2B,EAAA,SACvD,wBAAM5B,UAAU,QAAQwB,GAG9B,CA3BAL,EAAWU,aAAe,CACxBP,MAAO,QACPC,aAAc,I,iFCvBhB,SAAgB,cAAgB,QAAQ,iBAAmB,QAAQ,sBAAwB,QAAQ,UAAY,QAAQ,cAAgB,QAAQ,kBAAoB,QAAQ,YAAc,QAAQ,sBAAwB,QAAQ,aAAe,QAAQ,QAAU,SCqBlQ,IAAMO,EAAQ,GAAH,OAAM,IAAmB,cAAmBC,MAAK,YAAI,IAAmB,cAAmBC,QAatG,SAASC,EAAaC,GACpB,OAAIA,EAAQC,OAAS,IACZ,KAEF,cACT,CAuBA,IAEaC,EAAe,QAAW,SAAS1C,G,YACtCwC,EAAyFxC,EAAzFwC,QAASG,EAAgF3C,EAAhF2C,OAAQC,EAAwE5C,EAAxE4C,YAAaC,EAA2D7C,EAA3D6C,QAASC,EAAkD9C,EAAlD8C,cAAeC,EAAmC/C,EAAnC+C,iBAAkBC,EAAiBhD,EAAjBgD,aAE1EC,EAAyB,aAAiBC,EAAA,GAE1CC,GA3Cc,EAAAC,EAAA,KAEJC,IALS,KADL,KAiDdC,EAAsB,WAAc,WACxC,IAAKN,GAAgBhD,EAAMuD,eACzB,OAAO,EAET,IAAMC,EAAQC,EAAA,SAAkB,IAAIC,KAAQ,cAE5C,OAAKV,EAAaW,QAGXX,EAAaY,WAAaJ,GAASR,EAAaW,SAAWH,EAFzDR,EAAaY,YAAcJ,CAGtC,GAAG,CAACR,IAYEa,EAAe7D,EAAM6D,cAAgB,CACzCxB,MAAOc,EACPW,MAAO1B,EACP2B,WAAY,YAGRC,IAAQrB,KAAYC,GAAeqB,EAAA,kBAA4BtB,EAAQ,CAC3EuB,gBAAiBtB,EACjBuB,qBAAsB3B,EACtBnB,KAAM,cACLwC,GAEGO,EAAgG,CACpG9D,UAAW,wBAAF,OAA0BN,EAAMqE,iBACzCC,MAAON,EAAM,CAAEO,gBAAiB,QAAF,OAAUP,EAAG,OAAS,CAAC,IAGlDrB,GAAUI,WACNqB,EAAeE,MACtBF,EAAe9D,WAAa,IAAJ,OAAQyC,IAGlC,IAAMyB,EAAmBxE,EAAMyE,iBAE/B,OAAOhF,EAAA,yBAEL,0CAAY2E,GACV,uBAAK9D,UAAS,oBAAe,YAAgB,oCAC1CN,EAAM0E,mBACL,uBAAKpE,UAAU,QACb,gBAACmB,EAAU,CACTb,QAASZ,EAAM0E,kBACf/C,WAAY3B,EAAM2E,eAClB9C,aAAc7B,EAAM4E,kBACpBhD,MAAM,WAKZ,uBAAKtB,UAAS,UAAKN,EAAM6E,cAAgB,iEAAmE,GAAH,OAAM,gBAAoB,kBAAmB,QAAV,EAAA7E,EAAM8E,YAAI,eAAEd,KAAM,wBAA+B,QACxLhB,GACD,uBAAK1C,UAAS,4BAAuB,0BACnC,gBAACI,EAAA,EAAmB,CAClBU,KAAM,CACJC,KAAM2B,EAAaW,QAAU,QAAU,MACvCpC,KAAMyB,EAAaW,QAAO,UACnBF,EAAA,SAAkBT,EAAaY,UAAW,MAAK,YAAIH,EAAA,SAAkBT,EAAaW,QAAS,OAC9FF,EAAA,SAAkBT,EAAaY,UAAW,OAEhDpC,MA3Dd,SAAkCwB,GAChC,OAAKA,EAAaW,QAGdF,EAAA,SAAkBT,EAAaY,UAAWZ,EAAaW,QAAS,SAC3DF,EAAA,SAAkBT,EAAaY,UAAW,QAE5C,GAAP,OAAUH,EAAA,SAAkBT,EAAaY,UAAW,OAAM,cAAMH,EAAA,SAAkBT,EAAaW,QAAS,QAL/FF,EAAA,SAAkBT,EAAaY,UAAW,OAMrD,CAmDqBmB,CAAyB/B,GAChClC,MAAOd,EAAMgF,iBAInB,2BACG1B,GACC,uBAAKhD,UAAU,kFACb,gBAAC2E,EAAA,EAAI,CAACnF,UAxFJ,sBAwF0BoF,OAAO,aAGtClF,EAAMuD,gBACL,gBAACxD,EAAA,EAAa,CAACO,UAAU,yEAE3B,uBAAKA,UAAU,6BACZN,EAAM6E,eACL,uBAAKvE,UAAS,UAAK,oBAAwB,uFAC9B,QAAV,EAAAN,EAAM8E,YAAI,eAAEd,MACX,gBAACmB,EAAA,EAAS,CAACC,IAAKnB,EAAA,YAAgC,QAAV,EAAAjE,EAAM8E,YAAI,eAAEd,IAAK,CAAE/B,KAAM,iBAGrE,sBAAI3B,UAAS,sDAAiD,UAAc,YAAIiC,EAAaC,GAAQ,YAAIxC,EAAM6E,cAAgB,OAAS,KACrIrC,EACAgC,GAAoB,gBAACA,EAAgB,WAIzC3B,GACD,uBAAKvC,UAAW,oBACd,gBAAC+E,EAAA,EAAO,CACNxC,QAASA,EACTC,cAAeA,EACfwC,yBAA0BtF,EAAMsF,8BAKtCtF,EAAM6E,kBAA6B,QAAV,EAAA7E,EAAM8E,YAAI,eAAEd,MACrC,uBAAK1D,UAAW,iBACd,uBACE8E,IAAKnB,EAAA,YAAsBjE,EAAM8E,KAAKd,IAAK,CAAE/B,KAAM,aACnD3B,UAAU,sBAMpB2C,aAAsB,EAAtBA,EAAwBsC,UAE5B,IAAG,SAACC,EAAWC,G,QAAuB,OACpCD,EAAU3C,UAAY4C,EAAU5C,SAC7B2C,EAAUhD,UAAYiD,EAAUjD,UAClB,QAAd,EAAAgD,EAAUV,YAAI,eAAEd,QAAsB,QAAd,EAAAyB,EAAUX,YAAI,eAAEd,I,IAGvC,SAAU0B,IACd,IAAMzC,EAAyB,aAAiBC,EAAA,GAEhD,OAAOzD,EAAA,yBACL,uBAAKa,UAAS,oDAA+C,YAC7D2C,aAAsB,EAAtBA,EAAwBsC,UAE5B,C,uoCChMA,IACMI,EAAY,qBADA,8BAiBLC,EAAiB,cAAiB,SAC7C5F,EACA6F,GAEA,MAAgE7F,EAAxD8F,WAAcC,EAAI,EAAJA,KAAMnF,EAAO,EAAPA,QAASoF,EAAM,EAANA,OAAUC,EAAiBjG,EAAjBiG,aAE3CC,EAAcH,EACd7F,EAAgB,KASpB,OAPIgG,EAAYzD,OAtBS,KAuBvByD,EAAcH,EAAKI,MAAM,EAvBF,IAuB2B,MAGlDjG,EAAQ6F,GAIR,sBACEzF,UAAS,yBAAoB0F,EAAS,UAAY,IAClD9F,MAAOA,GAEN8F,EACG,8BAASE,GACT,gBAAC,IAAO,CAACtF,QAASA,EAASiF,IAAKA,GAC/BI,GAAgB,gBAAC,IAAY,CAACzF,QAAS,iBAA0ByB,KAAM,EAAAC,EAAA,QACxE,wBAAM5B,UAAW2F,EAAe,OAAS,IAAKC,IAKxD,IAMaE,EAAc,SAAH,GAAyC,IAAnCC,EAAW,EAAXA,YACtBC,GAAW,OAAc,QAEzB7D,GAAS4D,aAAW,EAAXA,EAAa5D,SAAU,EAEiB,IAArB,YAAe,GAAM,GAA/C8D,EAAQ,KAAEC,EAAW,KACgC,IAArB,YAAe,GAAM,GAArDC,EAAW,KAAEC,EAAc,KAC7BC,EAAY,WAsBlB,GApBA,aAAgB,W,MACRC,EAAiF,QAA/D,EAAAP,aAAW,EAAXA,EAAaQ,QAAO,SAACC,EAAMC,GAAI,OAAKD,EAAOC,EAAKhB,KAAKtD,MAAM,GAAE,UAAE,QAAI,EAEvFA,EAAS,GAAKmE,EA9DW,IA+D3BJ,GAAY,EAChB,GAAG,CAACH,aAAW,EAAXA,EAAa5D,SAKjB,mBAAsB,W,MAChBgE,IACe,QAAjB,EAAAE,EAAUK,eAAO,SAAEC,QACvB,GAAG,CAAEN,EAAUK,QAASP,KAOnBhE,GAAW6D,GAAY7D,EAAS,EACnC,OAAO,iCAET,GAAI6D,EACF,OACE,oCAAgB,cACd,sBAAIhG,UAAU,sBACZ,gBAACsF,EAAc,CAACE,WAAYO,EAAY5D,EAAS,GAAIwD,cAAY,MAKzE,IAAMiB,EAAQ,gBAACtB,EAAc,CAACE,WAAYO,EAAY,KAChDc,EAAS1E,EAAS,EAAI,gBAACmD,EAAc,CAACE,WAAYO,EAAY,KAAS,iCACvEe,EAAa3E,EAAS,EAAI,gBAACmD,EAAc,CAACE,WAAYO,EAAY5D,EAAS,KAAS,iCACpF4E,EAAO5E,EAAS,EAAI,gBAACmD,EAAc,CAACE,WAAYO,EAAY5D,EAAS,KAAS,iCAC9E6E,EAAOjB,EAAYF,MAAM,EAAG1D,EAAS,GAE3C,OACE,oCAAgB,cACd,sBAAInC,UAAU,sBACX4G,EACAC,EACAZ,EACC,sBAAIjG,UAAU,mBACZ,0BACEA,UAAU,WACViH,QAhCZ,WACEf,GAAY,GACZE,GAAe,EACjB,EA6BkC,aACVf,EAAU,WAAS,QAKnC2B,EAAKE,KAAI,SAAC1B,EAAY2B,GAAG,OACvB,gBAAC7B,EAAc,CACb8B,IAAKD,EACL3B,WAAYA,EACZD,IAAa,IAAR4B,EAAYd,EAAY,MAC7B,IAGLS,EACAC,GAIT,EAEaM,EAAqB,QAAW,YAAiD,QAAtCC,SAAAA,OAAQ,IAAG,IAAC,EAGlE,OAFiB,OAAc,QAI3B,uBAAKtH,UAAU,6BAA6BgE,MAAO,CAAEhC,OAAQ,YAAaD,MAAO,UAKnF,oCAAgB,cACd,sBAAI/B,UAAU,sBACX,2BAA4C,CAAEsH,SAAAA,IAAYJ,KAAI,WAAYC,GAAG,IAAZpF,EAAK,EAALA,MAAK,OACrE,sBAAIqF,IAAKD,EAAKnH,UAAU,mBACtB,wBAAMA,UAAU,4CAA4CgE,MAAO,CAAEjC,MAAAA,GAASwF,wBAAyB,CAAEC,OAAQ,WAC9G,KAKf,G,8FClKA,SAAgB,UAAY,QAAQ,QAAU,S,sGCmBxC,SAAUC,EAAqB/H,GACnC,I,IAAmC,G,GAAX,U,EAAW,E,o4BAA3B6F,EAAG,KAAEmC,EAAM,KAYnB,OAVA,aAAgB,W,MACThI,EAAMiI,eAGND,IAAUhI,EAAMkI,aAGN,QAAf,EAAAlI,EAAMmI,iBAAS,gBAAGnI,EAAMoI,YAC1B,GAAG,CAAEJ,EAAQhI,EAAMkI,aAGjB,uBAAK5H,UAAS,0BAAqB,aAAoBuF,IAAKA,GACzD7F,EAAMkI,WACH,gBAACG,EAAA,EAAO,CAACC,GAAG,OAAOC,UAAU,SAASC,KAAK,SAASlI,UAAW,YAE/D,gBAACC,EAAA,EAAY,CACXC,QAAS,iBACTF,UAAU,+BACV2B,KAAM1B,EAAA2B,EAAA,MACNqF,QAAS,WAAK,MAAC,OAAe,QAAf,EAAAvH,EAAMmI,iBAAS,sBAAGnI,EAAMoI,WAAW,IAM9D,CAhCAL,EAAqB5F,aAAe,CAClC8F,eAAe,E,yGCUXQ,EAA8B,CAClCC,SAAU,IACVC,UAAW,CACTC,OAAQ,IACRC,UAAW,IACXC,OAAQ,IACRC,QAAS,KAEXC,WAAY,IACZC,oBAAqB,KAGjB,SAAUC,EACdC,GAMkC,IALlCC,EAAA,uDAA+B,CAAC,EAKhCC,EAAA,uDAAgC,CAAC,EAEjC,GAAKF,EAAL,CAGA,IAAIG,EAGFA,EADmB,iBAAVH,EACIA,EAEAA,EAAKI,OAGpB,IAAMC,EAAW,OAAH,wBACTf,GACAW,GAGAE,GAGA,yBAAmCA,KAGpCA,IAAe,mBAMfA,IAAe,aAMfA,IAAe,cAUdD,EAAUL,YACb,aAAuB,IAAIQ,EAASR,YAN/BK,EAAUV,WACb,aAAuB,IAAIa,EAASb,UAAUI,SAX3CM,EAAUX,UACb,aAAuB,IAAIc,EAASd,UAPjCW,EAAUJ,qBACb,aAAuB,IAAI,KAvBvB,CA6CV,C,wEC1FMQ,EAAmB,I,iHC2BnB,SAAUC,EACdC,EACAxB,EACAyB,EACAC,EACAC,EACAC,GAEA,I,ID1BgCC,EAC1BC,ECyB+C,G,GAAX,IAAAC,UAAS,G,EAAE,E,o4BAA7CC,EAAY,KAAEC,EAAe,KAE/BC,EAAclC,EAcdmC,GAAW,QAZjB,SAAgBC,GACd,IAAKZ,EACH,OAAO,KAET,IAAMa,EAAUb,EAAWY,GAE3B,OAAKC,EAGEA,EAAQ9C,IAFN,IAGX,GAIEmC,EACAC,GAwCF,ODrFgCE,ECwDd,CAChBS,cATF,WACE,GAAKtC,GAAcwB,GAAeW,EAIlC,OADAF,GAAgB,SAAAM,GAAU,OAAIA,EAAa,CAAC,IACrCL,EAAYC,EAASlC,WAC9B,EAIEuC,WAAWL,aAAQ,EAARA,EAAUlC,YACrBF,WAAYoC,aAAQ,EAARA,EAAUpC,WACtB6B,gBAAAA,GD3DIE,EAAe,WACnB,IAAID,EAAQ9B,WAAZ,CAGA,GAAK8B,EAAQD,gBAON,CACL,IAAQA,EAAoBC,EAApBD,gBAKR,GAJ4BA,EAAgBa,wBAAwBtI,OAASyH,EAAgBc,UAEzEd,EAAgBe,aAAerB,EAGjD,MACH,MAVC,GAJ4BsB,OAAOC,YAAcC,SAASC,gBAAgBL,UAEtDI,SAASC,gBAAgBJ,aAAerB,EAG1D,OAWJO,EAAQS,eAnBA,CAoBV,GAEA,IAAAU,YAAU,WACR,IAAMC,EAAWC,EAAA,WAAwBpB,EAAc,KAEjDF,EAAkBC,EAAQD,iBAAmBgB,OAKnD,OAHIf,EAAQW,SACVZ,EAAgBuB,iBAAiB,SAAUF,GAEtC,kBAAMrB,EAAgBwB,oBAAoB,SAAUH,EAAS,CACtE,GAAG,CAAEpB,EAAQW,QAASX,EAAQS,cAAeT,EAAQD,mBC6BrD,IAAAoB,YAAU,WACHb,GAGDA,EAASkB,oBAAsBrD,IACjCkC,IACAD,GAAgB,SAAAM,GAAU,OAAIA,EAAa,CAAC,IAEhD,GAAG,CAAEJ,aAAQ,EAARA,EAAUkB,mBAAoBrD,KAEnC,IAAAgD,YAAU,W,QACR,IAAKb,aAAQ,EAARA,EAAUhB,aAAe+B,EAAA,aAA0BzB,GAAxD,CAGA,IAAM6B,IAAoE,QAA/B,EAAmB,QAAnB,EAAAnB,EAAShB,kBAAU,eAAEoC,kBAAU,eAAEC,OAAO,EAAG,IAElFF,IAAoBG,EAAA,eAA+BH,IAAoBG,EAAA,eAG3EhC,EAAQO,EAAcG,EAAShB,WAPvB,CAQV,GAAG,CAACgB,aAAQ,EAARA,EAAUhB,aAEP,CACLuC,MAAOvB,aAAQ,EAARA,EAAUuB,MACjBlB,WAAWL,aAAQ,EAARA,EAAUlC,YACrBA,WAAYkC,aAAQ,EAARA,EAAUlC,WACtBF,WAAYoC,aAAQ,EAARA,EAAUpC,WACtB4D,WAAYxB,aAAQ,EAARA,EAAUwB,WACtBC,sBAAuBzB,aAAQ,EAARA,EAAUyB,sBAErC,C,mbCrGM,SAAUC,EAAehF,GAC7B,I,IAAqF,G,EAAvD,WAAc,kBAAM,gBAA8B,GAAE,I,EAAG,E,unBAA7EiF,EAAK,KAEP5F,GAAc6F,EAFK,MAEMD,GAE/B,OAAK5F,GAAgBW,EAGd,GAAP,O,yWAAA,CAAYX,GAAW,gCAAOW,GAAO,CAAEhB,QAAQ,MAFtCK,CAGX,C,wICdA,IAAM8F,EAAyD,CAC7DvE,SAAU,EACVwE,SAAU,GACVC,SAAU,KAaCC,EAAuB,CAClCC,uBAAsB,WAAoC,I,EAAnCvC,EAAA,uDAAiC,CAAC,EACjDwC,EAAO,OAAH,wBACLL,GACAnC,GAKL,O,EAAWyC,MAAMD,EAAK5E,U,omBAAWJ,KAAI,iBAAO,CAAEnF,MAAO,GAAF,OAFhBqK,KAAKC,IAAID,KAAKE,MAAMF,KAAKG,SAAWL,EAAKH,UAAWG,EAAKJ,UAEd,MAAM,GACtF,E,wECnBWU,EAA2B,WACtC,OAAwD,OAAgB,CAAEC,iBAAiB,IAAnFC,EAAkB,EAAlBA,mBAAoBC,EAAuB,EAAvBA,wBAEtBC,EAAeF,GAAsBC,IAO3C,OALkB,oBACdC,GACF,0BAAuCA,EAAaC,IAIxD,C,yeCPA,IAAMC,EAAa,GAyBb,SAAUC,EAAcC,GAA+C,I,IAA/BtD,EAAA,uDAA6B,CAAC,EACpEuD,EAAc,kBAAkC,mBAEhDC,EAAiB,SAA0B,IAAIC,KAE/CC,EA1BR,SAAyBJ,GACvB,OAAKA,EAGDb,MAAMkB,QAAQL,GACTA,EAAQM,QAAO,SAAAC,GAAC,QAAMA,IAAM,YAAoBA,IAAM,WAAmBA,GAAG,IAEjF,SAAUP,EACLA,EAAQQ,KAAKF,QAAO,SAAAC,GAAC,QAAMA,IAAM,YAAoBA,IAAM,WAAmBA,GAAG,IAEnF,GARE,EASX,CAeiBE,CAAgBT,GAEzBU,EAAWN,EAAOlG,KAAI,SAAAyG,GAAC,OAAIA,EAAEd,EAAE,IAE+B,G,EAApC,WAAiC,I,EAAG,E,unBAA5D3C,EAAO,KAAE0D,EAAU,KAE3B,aAAgB,WACd,IAAKF,aAAQ,EAARA,EAAUvL,SAAW8K,EAAYY,aAAtC,CAGA,IAAMC,EAA6B,GAEnCJ,EAASK,SAAQ,SAAAlB,GACVK,EAAexG,QAAQsH,IAAInB,KAC9BiB,EAAiBG,KAAKpB,GACtBK,EAAexG,QAAQwH,IAAIrB,GAE/B,IAEKiB,EAAiB3L,QAGtByL,GAAW,SAAAO,GACT,IAAMC,E,yWAAc,CAAID,GASxB,OAPA,UAA0BL,EAAkBhB,GAAYiB,SAAQ,SAAAM,G,MAC9DD,EAAYH,KAAK,qBAA+BI,EAAO3E,EAAQ4E,mBAE3C,QAAhB,EAAArB,EAAYO,YAAI,eAAEe,kBACpBH,EAAYH,KAAK,uBAA0CI,EAAO,KAAM3E,EAAQ4E,iBACpF,IAEOF,CACT,GAzBQ,CA0BV,GAAG,CAAEV,aAAQ,EAARA,EAAUvL,OAAQ8K,EAAYY,eAEnC,qBAAwB3D,EAC1B,C,gbC7EA,SAAgB,MAAQ,SCcxB,IAAM1K,EAAY,8BACZ6F,EAAYxF,EAAA,mBAAiCL,GAE7C,SAAUgP,IACd,OACE,gBAAC,aAAiC,CAACC,MAAOjP,GACxC,gBAACkP,EAAA,EAAU,KACT,gBAACA,EAAA,QAAgB,CACf5J,IAAK6J,EAAA,gCACLC,QAASvJ,EAAU,QACnBrF,UAAW,UAGb,gBAAC0O,EAAA,UAAkB,CAAC1O,UAAU,MAC5B,gBAAC2E,EAAA,EAAI,CAACC,OAAO,aAGf,gBAAC8J,EAAA,OAAe,KAAC,gBAAC/J,EAAA,EAAI,CAACC,OAAO,UAE9B,gBAAC8J,EAAA,MAAc,CACbzN,KAAMpB,EAAA,YAA0BL,EAAW,OAC3Cc,QAAS,CACPuO,YAAa,cACbC,OAAQ,uBAMpB,CAEM,SAAUC,IACd,OACE,gBAAC,aAAiC,CAACN,MAAOjP,GACxC,gBAACkP,EAAA,EAAU,KACT,gBAACA,EAAA,QAAgB,CAAC5J,IAAK6J,EAAA,uCAAgDC,QAASvJ,EAAU,gBAC1F,gBAACqJ,EAAA,UAAkB,KAAC,gBAAC/J,EAAA,EAAI,CAACC,OAAO,mBACjC,gBAAC8J,EAAA,OAAe,KAAC,gBAAC/J,EAAA,EAAI,CAACC,OAAO,gBAC9B,gBAAC8J,EAAA,MAAc,CACbzN,KAAMpB,EAAA,YAA0BL,EAAW,aAC3Cc,QAAS,CACPuO,YAAa,YACbC,OAAQ,oBAEVpO,cAAe,CAAC,EAChBC,iBAAkB,CAChBqO,WAAY,WACZC,SAAU,yBACVC,OAAQ,aACRC,cAAe,WACfC,WAAY,KAAAC,WAMxB,C,gDC5DM,EAAY,oBCVlB,SAAgB,OAAS,SC4CzB,IAAM,EAAY,oBAEZ,SAAUC,I,UACRC,GAAW,UACXC,GAAS,SACf,GAAuC,EAAAC,EAAAC,GAAkB,qBAAjDC,EAAY,EAAZA,aAAcC,EAAY,EAAZA,aACdC,GAAa,EAAAC,EAAA,KAAbD,SACFE,EFvCF,WACJ,IAAMA,GAAe,EAAAC,EAAA,GAAgB,CAAEf,SAAU,gBACzCU,GAAiB,EAAAF,EAAAC,GAAkB,qBAAnCC,aAkBR,OAAO,OAAP,wBACKI,GAAY,CACfE,gBAlBsB,SAACC,GAGvB,OAFuBC,EAAA,mBAA6BD,GAA5CE,WAYDL,EAAaE,gBAAgBC,GAT3B,CAAC,CACNrP,MAAOhB,EAAA,YAA0B,EAAW,wBAC5CK,QAAS,YACTmQ,QAAQ,EACRrQ,UAAW,2BACXiH,QAAS,WAAF,OAAQ0I,EAAaO,GAAO,EAAM,GAK/C,GAMF,CEeuBI,IAErB,EAAAC,EAAA,GAAmB,CAAE3Q,MAAOC,EAAA,YAA0B,EAAW,eACjE,OAAgD,EAAA2Q,EAAA,KAAxCC,EAAmB,EAAnBA,oBAAqBC,EAAc,EAAdA,eAEvBzD,EAAc,kBAAkC0D,EAAA,iBAChDC,GAAa,mBACD,QAAhB,EAAA3D,EAAYO,YAAI,eAAEe,kBAAmBsC,EAAA,aAA4B5D,EAAYO,KAAKsD,aAE9EC,GAAS,kBAA6BC,EAAA,YAEtC3H,GAAa,SAACY,GAClB,OAAOgH,EAAA,gBAAgChE,EAAYO,KAAKX,GAAI5C,EAC9D,EAEMpC,GAAY,SAACoC,GACjB,OAAO,aAAgBsF,EAAhB,CAA0BlG,GAAWY,GAC9C,EAEMiH,IAAeT,EAAoB,8BAAgDxD,EAAYY,aAErG,IAII,SAA4BqD,IAAc7H,GAAoBxB,IAQlE,SAAiBsJ,EAAoBC,GACnC,GAAmB,IAAfD,EACF,OAAO,OAAgBC,GAEzB5B,EAAO6B,MAAMxR,EAAA,YAA0B,EAAW,SACpD,IAhBE0L,GAAK,GAALA,MACAlB,GAAO,GAAPA,QACAzC,GAAU,GAAVA,YAGF,EAAAmF,EAAA,GAAcxB,IAEd,IAAM+F,IAAY,EAAA9E,EAAA,KAEZzG,IAAc,EAAA2F,EAAA,GAAe,CAAEjG,KAAM5F,EAAA,YAA0B,EAAW,YAShF,IAA6B,EAAA0R,EAAA,GAAmC,QAAhB,EAAAtE,EAAYO,YAAI,eAAEX,IAA1D2E,GAAK,GAALA,MACR,OADwB,GAATC,UAEN,iCAELhB,EAAoB,6BACf,gBAAC1B,EAA0B,MAGlC,gBAAC2C,EAAA,WAA4B,CAACjD,MAAOsB,GACnC,uBAAK/P,UAAU,OACb,gBAACoC,EAAA,EAAY,CACXF,QAASrC,EAAA,YAA0B,EAAW,UAC9CwC,OAAQ,CAAEqB,IAAKiL,EAAA,2CACf5K,gBAAe,UAAK,SAAa,YACjCzB,YAAwB,QAAX,EAAAyO,GAAOvD,YAAI,eAAElL,YAC1B6B,iBAAkB,WAAF,OACd,uBAAKnE,UAAU,yCACb,gBAAC2E,EAAA,EAAI,CAACnF,UAAW,EAAWoF,OAAO,SAAS8E,QAAS,CAAEiI,WAAYH,MAC/D,KAGTzL,cAAW,EAAXA,GAAa5D,SACZ,uBAAKnC,UAAU,sBACb,gBAAC8F,EAAA,GAAW,CAACC,YAAaA,MAKvBwF,GAGAA,GAAMpJ,OAIT,uBAAKnC,UAAU,QACb,gBAAC4R,EAAA,GAAS,CACRxE,OAAQ7B,GACRqF,WAAYA,GAAWpD,KACvBqE,gBAAiBC,EAAA,aACjBpB,eAAgBA,EAChBqB,kBAAmB,SAAA7B,GAAK,OAAI8B,EAAA,mBAAqC9B,EAAM+B,OAAO,EAC9EtC,aAAcA,EACdC,aAAcA,EACdsC,sBAAuBZ,GAAU9D,KACjC2E,2BAA4B,SAAAC,GAAW,OAAIC,EAAA,6BAA8CD,EAAY,EACrGvC,SAAUA,EACVyC,yBAA0BR,EAAA,2BAC1BS,8BAA+BT,EAAA,gCAC/BU,2BAA4BV,EAAA,gCAE5BzH,IAAWzC,KAAe,gBAACH,EAAA,EAAoB,CAACG,WAAYA,GAAYC,UAAWA,MAnBhF,gBAAC2G,EAAoB,MAHrB,gBAACiE,EAAA,EAAgB,OA6BpC,C,2xBChJM,SAAUlB,EAAmBmB,G,sBAE3BC,EAAuB,kBAA8CD,GACzE,6BAA2CA,IACvCE,EAAsB,kBAA8CF,GACxE,4BAA0CA,IACtCG,EAA6B,kBAA8CH,GAC/E,mCAAiDA,IAYnD,MAAO,CACLlB,OAX0C,QAAzB,EAAAmB,EAAqBnF,YAAI,eAAEgE,QACX,QAA/B,EAAAqB,EAA2BrF,YAAI,eAAEgE,QACT,QAAxB,EAAAoB,EAAoBpF,YAAI,eAAEgE,OAU5BsB,WARiB,GAAH,UACe,QAAzB,EAAAH,EAAqBnF,YAAI,eAAEA,OAAQ,IAAE,GACb,QAAxB,EAAAoF,EAAoBpF,YAAI,eAAEA,OAAQ,IAAE,GACL,QAA/B,EAAAqF,EAA2BrF,YAAI,eAAEA,OAAQ,KAM7CiE,YAAqC,QAAzB,EAAAkB,EAAqBnF,YAAI,eAAEA,SACT,QAAxB,EAAAoF,EAAoBpF,YAAI,eAAEA,SACK,QAA/B,EAAAqF,EAA2BrF,YAAI,eAAEA,MAE3C,C,4FC1BA,MAAMuF,EAAmB,cAAiB,EACxCC,WACAhT,YAEAgI,GAAIiL,EAAY,SACbvT,GACF6F,KACD,MAAM2N,GAAoB,QAAmBF,EAAU,OACjDG,GAAc,UACdC,GAAgB,UAChBC,EAAa,GAAGH,SAChBI,EAAU,GAehB,OAdAH,EAAYpF,SAAQwF,IAClB,MAAMC,EAAY9T,EAAM6T,GAExB,IAAIE,SADG/T,EAAM6T,GAEI,MAAbC,GAA0C,iBAAdA,IAE5BC,QACED,GAEJC,EAAOD,EAET,MAAME,EAAQH,IAAaH,EAAgB,IAAIG,IAAa,GAChD,MAARE,GAAcH,EAAQrF,KAAK,GAAGoF,IAAaK,KAASD,IAAO,KAE7C,SAAKR,EAAW,CAClC1N,IAAKA,KACF7F,EACHM,UAAW,IAAWA,EAAWkT,KAAsBI,IACvD,IAEJP,EAAIY,YAAc,MAClB,S","sources":["file:///app/packages/libs/common/src/react/utils/PortalHelper.ts","file:///app/packages/libs/shared/src/apps/calendar/components/coming-soon-tag/coming-soon-tag.scss","file:///app/packages/libs/shared/src/apps/calendar/components/coming-soon-tag/ComingSoonTag.tsx","file:///app/packages/libs/shared/src/apps/calendar/components/generic-calendar-date/generic-calendar-date.scss","file:///app/packages/libs/shared/src/apps/calendar/components/generic-calendar-date/GenericCalendarDate.tsx","file:///app/packages/libs/shared/src/components/back-button/BackButton.tsx","file:///app/packages/libs/shared/src/components/banner-header/banner-header.scss","file:///app/packages/libs/shared/src/components/banner-header/BannerHeader.tsx","file:///app/packages/libs/shared/src/components/breadcrumbs/Breadcrumbs.tsx","file:///app/packages/libs/shared/src/components/infinite-scroll-footer/infinite-scroll-footer.scss","file:///app/packages/libs/shared/src/components/infinite-scroll-footer/InfiniteScrollFooter.tsx","file:///app/packages/libs/shared/src/errors/handlers/HttpErrorHandlers.ts","file:///app/packages/libs/shared/src/hooks/UseInfiniteScroll.ts","file:///app/packages/libs/shared/src/hooks/UseInfiniteList.ts","file:///app/packages/libs/shared/src/hooks/useBreadcrumbs.ts","file:///app/packages/libs/shared/src/utils/PartialLoadingHelper.ts","file:///app/packages/projects/lite/src/shared/hooks/usePresentationAudiences.ts","file:///app/packages/projects/lite/src/shared/hooks/useVideoMixin.ts","file:///app/packages/projects/lite/src/shared/views/favourites/empty-state/favourites-empty-state.scss","file:///app/packages/projects/lite/src/shared/views/favourites/empty-state/FavouritesEmptyState.tsx","file:///app/packages/projects/lite/src/shared/views/favourites/FavouritesViewUtils.ts","file:///app/packages/projects/lite/src/shared/views/favourites/favourites-view.scss","file:///app/packages/projects/lite/src/shared/views/favourites/FavouritesView.tsx","file:///app/packages/projects/lite/src/shared/views/favourites/hooks/useFavouritesCount.ts","file:///app/node_modules/react-bootstrap/esm/Row.js"],"sourcesContent":["import React from 'react';\nimport { createPortal } from 'react-dom';\n\nexport const PortalHelper = {\n renderInPortalIfExists(component: React.ReactElement, portalContainer: Element | null): React.ReactElement {\n if (portalContainer)\n return createPortal(component, portalContainer);\n\n return component;\n }\n};","// extracted by mini-css-extract-plugin\nexport default {\"tag\":\"XRj8d\",\"tooltip\":\"X6mLk\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './coming-soon-tag.scss';\n\nconst namespace = 'specialEventCalendar.comingSoonTag';\n\ninterface ComingSoonProps {\n className?: string;\n onlyIcon?: boolean;\n}\n\nexport function ComingSoonTag(props: ComingSoonProps): JSX.Element {\n return (\n <Tooltip title={LanguageService.getPhrase(namespace, 'tooltip')} spanHackClassName={`d-block ${styles.tooltip}`} spanHack>\n <div className={`d-flex text-dark align-items-center ${styles.tag} ${props.className}`}>\n <SvgContainer svgName={cvSvgLibrary.Timer} />\n {!props.onlyIcon && LanguageService.getPhrase(namespace, 'comingSoon')}\n </div>\n </Tooltip>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"dateItem\":\"I3SBm\",\"label\":\"PRORs\",\"body\":\"RfiM_\",\"bodyDay\":\"ZOVny\",\"bodyRange\":\"vYhXN\",\"bodyMonth\":\"mYslO\",\"month\":\"EPkkQ\"};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { CalendarTheme } from 'libs/shared/apps/calendar/interfaces/CalendarTheme';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\n\nimport styles from './generic-calendar-date.scss';\n\nexport interface GenericCalendarDateProps {\n label?: string;\n body: {\n type: 'month' | 'range' | 'day';\n text: string;\n };\n month?: string;\n getAppLink?: () => Core.AppLink;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n className?: string;\n theme?: CalendarTheme;\n}\n\nexport function GenericCalendarDate(props: GenericCalendarDateProps): JSX.Element {\n function getBodyClass(): string {\n switch (props.body.type) {\n case 'range':\n return styles.bodyRange;\n case 'day':\n return styles.bodyDay;\n case 'month':\n return styles.bodyMonth;\n }\n }\n\n return (\n <AppLink\n appLink={props.getAppLink?.()}\n className={`text-decoration-none text-center bg-white text-dark border border-3 ${props.theme?.border} rounded-3 d-block fw-semibold ${props.className}`}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n >\n <div className={`position-relative ${styles.dateItem}`}>\n <div className={`${props.theme?.background} py-1 ${styles.label} d-flex align-items-center justify-content-center`}>\n {props.label ? props.label : <> </>}\n </div>\n <div className={`${getBodyClass()} ${styles.body} my-2`}>\n {props.body.text}\n </div>\n <div className={`mb-0 ${styles.month}`}>\n {props.month}\n </div>\n </div>\n </AppLink>\n );\n}","import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.backButton';\n\ninterface BackButtonProps {\n appLink: Core.AppLink;\n backToName?: string;\n color?: 'black' | 'white';\n extraClasses?: string;\n /**\n * Whether or not the button text has a text shadow. Defaults to true\n */\n textShadow?: boolean;\n}\n\nBackButton.defaultProps = {\n color: 'black',\n extraClasses: ''\n};\n\nexport function BackButton(props: BackButtonProps): React.ReactElement {\n const { backToName, appLink, color, extraClasses, textShadow } = {\n textShadow: true,\n ...props\n };\n\n const backPhrase = backToName\n ? LanguageService.getPhrase(namespace, 'backTo', { backToName })\n : LanguageService.getPhrase(namespace, 'back');\n\n const colorClass = color === 'black' ? '' : 'text-white';\n const textShadowClass = textShadow ? 'text-shadow' : '';\n\n return (\n <AppLink\n appLink={appLink}\n className={`d-inline-flex align-items-center h5 mb-0 ${extraClasses} ${colorClass} ${textShadowClass}`}\n >\n <SvgContainer svgName={cvSvgLibrary.ChevronLeft} size={SvgContainerSize.Medium} />\n <span className='ms-1'>{backPhrase}</span>\n </AppLink>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"bannerContent\":\"sSCTB\",\"actionsContainer\":\"Z5WI2\",\"bannerContentWithLogo\":\"rgs7Q\",\"container\":\"M51HJ\",\"logoContainer\":\"vkeJk\",\"logoContainerLeft\":\"M3U9B\",\"logoHeading\":\"EtRwC\",\"specialEventContainer\":\"rOxDc\",\"headingLarge\":\"_8pnV\",\"heading\":\"JXVBH\"};","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\nimport { PortalHelper } from 'libs/common/react/utils/PortalHelper';\n\nimport { ComingSoonTag } from 'libs/shared/apps/calendar/components/coming-soon-tag/ComingSoonTag';\nimport { GenericCalendarDate } from 'libs/shared/apps/calendar/components/generic-calendar-date/GenericCalendarDate';\nimport { CalendarTheme } from 'libs/shared/apps/calendar/interfaces/CalendarTheme';\nimport { ActionOptions, Actions } from 'libs/shared/components/actions/Actions';\nimport { BackButton } from 'libs/shared/components/back-button/BackButton';\nimport { LazyImage } from 'libs/shared/components/lazy-image/LazyImage';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ImageMinDimensions } from 'libs/shared/constants/ImageSizes';\nimport { BannerPortalContext } from 'libs/shared/context/BannerPortalContext';\nimport { ImageSize, ImageType, ResizeType } from 'libs/shared/enums/Images';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { Banner, CalendarEvent, Logo } from 'libs/shared/interfaces';\nimport { ImageHelper, ImageOptions } from 'libs/shared/utils/ImageHelper';\n\nimport styles from './banner-header.scss';\n\nconst RATIO = `${ImageMinDimensions[ImageType.Banners].width}:${ImageMinDimensions[ImageType.Banners].height}`;\nconst DEFAULT_WIDTH = 1200; // This is ImageSize.Large for a Banner.\nconst LARGE_SCREEN_WIDTH = 1920;\n\nfunction useGetImageWidth(): number {\n const breakpoints = useBreakpoints();\n\n if (breakpoints.xxl)\n return LARGE_SCREEN_WIDTH;\n\n return DEFAULT_WIDTH;\n}\n\nfunction getSizeClass(heading: string): string {\n if (heading.length < 160)\n return 'h1';\n\n return styles.headingLarge;\n}\n\ninterface BannerHeaderProps {\n heading: string;\n banner?: Banner;\n bannerClassName?: string;\n imageCdnUrl?: string;\n logo?: Logo;\n actions?: ActionOptions[];\n specialEvent?: CalendarEvent;\n backButtonAppLink?: Core.AppLink;\n backButtonText?: string;\n backButtonClasses?: string;\n sortComponent?: JSX.Element;\n blockColourClass?: string;\n actionsDropdownClassName?: string;\n detailsComponent?: () => React.ReactElement;\n imageOptions?: ImageOptions;\n showComingSoon?: boolean;\n alignLogoLeft?: boolean;\n calendarTheme?: CalendarTheme;\n}\n\nconst namespace = 'shared.bannerHeader';\n\nexport const BannerHeader = React.memo(function(props: React.PropsWithChildren<BannerHeaderProps>): React.ReactElement {\n const { heading, banner, imageCdnUrl, actions, sortComponent, blockColourClass, specialEvent } = props;\n\n const portalContainerContext = React.useContext(BannerPortalContext);\n\n const imageWidth = useGetImageWidth();\n\n const specialEventIsToday = React.useMemo(() => {\n if (!specialEvent || props.showComingSoon)\n return false;\n\n const today = DateHelper.format(new Date(), 'YYYY-MM-DD');\n\n if (!specialEvent.endDate)\n return specialEvent.startDate === today;\n\n return specialEvent.startDate <= today && specialEvent.endDate >= today;\n }, [specialEvent]);\n\n function getSpecialEventMonthText(specialEvent: CalendarEvent): string {\n if (!specialEvent.endDate)\n return DateHelper.format(specialEvent.startDate, 'MMMM');\n\n if (DateHelper.isSame(specialEvent.startDate, specialEvent.endDate, 'month'))\n return DateHelper.format(specialEvent.startDate, 'MMMM');\n\n return `${DateHelper.format(specialEvent.startDate, 'MMM')} - ${DateHelper.format(specialEvent.endDate, 'MMM')}`;\n }\n\n const imageOptions = props.imageOptions || {\n width: imageWidth,\n ratio: RATIO,\n resizeType: ResizeType.Cover\n };\n\n const url = !!banner && !!imageCdnUrl && ImageHelper.createBannerUrl(banner, {\n fallbackBaseUrl: imageCdnUrl,\n fallbackCategoryName: heading,\n type: ImageType.Banners\n }, imageOptions);\n\n const containerProps: React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement> = {\n className: `banner banner-header ${props.bannerClassName}`,\n style: url ? { backgroundImage: `url('${url}')` } : {}\n };\n\n if (!banner && blockColourClass) {\n delete containerProps.style;\n containerProps.className += ` ${blockColourClass}`;\n }\n\n const DetailsComponent = props.detailsComponent;\n\n return PortalHelper.renderInPortalIfExists(\n // \"banner\" is used in playlists in Online. banner-header is used by all other projects\n <header {...containerProps}>\n <div className={`container ${styles.container} position-relative inner-banner`}>\n {props.backButtonAppLink && (\n <div className='pt-3'>\n <BackButton\n appLink={props.backButtonAppLink}\n backToName={props.backButtonText}\n extraClasses={props.backButtonClasses}\n color='white'\n />\n </div>\n )}\n \n <div className={`${props.alignLogoLeft ? 'position-absolute top-50 start-0 translate-middle-y w-100 ps-4' : `${styles.bannerContent} px-2 ${props.logo?.url ? styles.bannerContentWithLogo : ''}`}`}>\n {!!specialEvent && (\n <div className={`position-relative ${styles.specialEventContainer}`}>\n <GenericCalendarDate\n body={{\n type: specialEvent.endDate ? 'range' : 'day',\n text: specialEvent.endDate\n ? `${DateHelper.format(specialEvent.startDate, 'DD')}-${DateHelper.format(specialEvent.endDate, 'DD')}`\n : DateHelper.format(specialEvent.startDate, 'DD')\n }}\n month={getSpecialEventMonthText(specialEvent)}\n theme={props.calendarTheme}\n />\n </div>\n )}\n <div>\n {specialEventIsToday && (\n <div className='rounded-pill py-1 px-2 my-1 me-1 fw-semibold bg-light-blue lh-1 d-inline-block'>\n <Text namespace={namespace} phrase='onToday' />\n </div>\n )}\n {props.showComingSoon && (\n <ComingSoonTag className='pe-2 fw-semibold mb-1 rounded-pill justify-content-start text-nowrap' />\n )}\n <div className='d-flex align-items-center'>\n {props.alignLogoLeft &&\n <div className={`${styles.logoContainerLeft} d-none d-md-block partial-loading-background rounded-circle overflow-hidden me-3`}>\n {props.logo?.url &&\n <LazyImage src={ImageHelper.createUrl(props.logo?.url, { size: ImageSize.Medium })} />}\n </div>\n }\n <h1 className={`text-white text-shadow pe-3 position-static ${styles.heading} ${getSizeClass(heading)} ${props.alignLogoLeft ? 'w-50' : ''}`}>\n {heading}\n {DetailsComponent && <DetailsComponent />}\n </h1>\n </div>\n </div>\n {!!actions && (\n <div className={styles.actionsContainer}>\n <Actions\n actions={actions}\n sortComponent={sortComponent}\n actionsDropdownClassName={props.actionsDropdownClassName}\n />\n </div>\n )}\n </div>\n {!props.alignLogoLeft && !!props.logo?.url &&\n <div className={styles.logoContainer}>\n <img\n src={ImageHelper.createUrl(props.logo.url, { size: ImageSize.Small })}\n className='rounded-circle'\n />\n </div>\n }\n </div>\n </header>,\n portalContainerContext?.container\n );\n}, (prevProps, nextProps): boolean => (\n prevProps.actions === nextProps.actions\n && prevProps.heading === nextProps.heading\n && prevProps.logo?.url === nextProps.logo?.url\n));\n\nexport function PartialBannerHeader(): JSX.Element {\n const portalContainerContext = React.useContext(BannerPortalContext);\n\n return PortalHelper.renderInPortalIfExists(\n <div className={`partial-banner partial-loading-background ${styles.banner}`} />,\n portalContainerContext?.container\n );\n}","import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { useMediaQuery } from 'libs/shared/hooks/UseMediaQuery';\nimport { PartialLoadingHelper } from 'libs/shared/utils/PartialLoadingHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { SvgContainer, SvgContainerSize } from '../svg-container/SvgContainer';\n\nconst namespace = 'shared.breadcrumbComponent';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst COLLAPSE_CHARACTER_COUNT = 64;\nconst MAX_SEGMENT_LENGTH = 48;\n\nexport interface Breadcrumb {\n name: string;\n appLink?: Core.AppLink;\n active?: boolean;\n}\n\ninterface BreadcrumbItemProps {\n breadcrumb: Breadcrumb;\n withBackIcon?: boolean;\n}\n\nexport const BreadcrumbItem = React.forwardRef((\n props: BreadcrumbItemProps,\n ref: React.ForwardedRef<HTMLElement>\n) => {\n const { breadcrumb: { name, appLink, active }, withBackIcon } = props;\n\n let trimmedName = name;\n let title: string = null;\n\n if (trimmedName.length > MAX_SEGMENT_LENGTH) {\n trimmedName = name.slice(0, MAX_SEGMENT_LENGTH) + '...';\n\n // Only setting the title when we trim, because otherwise it's really not needed - Sha\n title = name;\n }\n\n return (\n <li\n className={`breadcrumb-item${active ? ' active' : ''}`}\n title={title}\n >\n {active\n ? <strong>{trimmedName}</strong>\n : <AppLink appLink={appLink} ref={ref}>\n {withBackIcon && <SvgContainer svgName={cvSvgLibrary.ChevronLeft} size={SvgContainerSize.Small} />}\n <span className={withBackIcon ? 'ms-2' : ''}>{trimmedName}</span>\n </AppLink>\n }\n </li>\n );\n});\n\ninterface BreadcrumbsProps {\n breadcrumbs: Breadcrumb[];\n}\n\nexport const Breadcrumbs = ({ breadcrumbs }: BreadcrumbsProps) => {\n const isMobile = useMediaQuery(MediaQueryStrings.XS);\n\n const length = breadcrumbs?.length || 0;\n \n const [ collapse, setCollapse ] = React.useState(false);\n const [ shouldFocus, setShouldFocus ] = React.useState(false);\n const expandRef = React.useRef<HTMLElement>();\n\n React.useEffect(() => {\n const characterLength = breadcrumbs?.reduce((prev, next) => prev + next.name.length, 0) ?? 0;\n\n if (length > 4 && characterLength > COLLAPSE_CHARACTER_COUNT)\n setCollapse(true);\n }, [breadcrumbs?.length]);\n\n /**\n * Focus our first expanded item the first time it appears.\n */\n React.useLayoutEffect(() => {\n if (shouldFocus)\n expandRef.current?.focus();\n }, [ expandRef.current, shouldFocus ]);\n\n function onClickExpand() {\n setCollapse(false);\n setShouldFocus(true);\n }\n\n if (!length || (isMobile && length < 2))\n return <></>;\n\n if (isMobile)\n return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n <BreadcrumbItem breadcrumb={breadcrumbs[length - 2]} withBackIcon />\n </ol>\n </nav>\n );\n\n const first = <BreadcrumbItem breadcrumb={breadcrumbs[0]} />;\n const second = length > 2 ? <BreadcrumbItem breadcrumb={breadcrumbs[1]} /> : <></>;\n const secondLast = length > 3 ? <BreadcrumbItem breadcrumb={breadcrumbs[length - 2]} /> : <></>;\n const last = length > 1 ? <BreadcrumbItem breadcrumb={breadcrumbs[length - 1]} /> : <></>;\n const rest = breadcrumbs.slice(2, length - 2);\n\n return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n {first}\n {second}\n {collapse ?\n <li className='breadcrumb-item'>\n <button\n className='btn-link'\n onClick={onClickExpand}\n aria-label={getPhrase('expand')}\n >\n ...\n </button>\n </li> :\n rest.map((breadcrumb, idx) => (\n <BreadcrumbItem\n key={idx}\n breadcrumb={breadcrumb}\n ref={idx === 0 ? expandRef : null}\n />\n ))\n }\n {secondLast}\n {last}\n </ol>\n </nav>\n );\n};\n\nexport const PartialBreadcrumbs = React.memo(function({ numItems = 3 }: { numItems?: number; }) {\n const isMobile = useMediaQuery(MediaQueryStrings.XS);\n\n if (isMobile) {\n return (\n <div className='partial-loading-background' style={{ height: '1.3125rem', width: '6rem' }} />\n );\n }\n\n return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n {PartialLoadingHelper.getPartialLoadingItems({ numItems }).map(({ width }, idx) => (\n <li key={idx} className='breadcrumb-item'>\n <span className='d-inline-block partial-loading-background' style={{ width }} dangerouslySetInnerHTML={{ __html: ' ' }} />\n </li>\n ))}\n </ol>\n </nav>\n );\n});","// extracted by mini-css-extract-plugin\nexport default {\"container\":\"VwD1b\",\"spinner\":\"eJ85e\"};","import * as React from 'react';\nimport { Spinner } from 'react-bootstrap';\nimport { useInView } from 'react-intersection-observer';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './infinite-scroll-footer.scss';\n\ninterface InfiniteScrollFooterProps {\n isFetching: boolean;\n fetchNext?: (nextCursor: string) => void;\n nextCursor?: string;\n fetchOnScroll?: boolean;\n}\n\nInfiniteScrollFooter.defaultProps = {\n fetchOnScroll: false\n};\n\nexport function InfiniteScrollFooter(props: InfiniteScrollFooterProps): React.ReactElement {\n const [ ref, inView ] = useInView();\n\n React.useEffect(() => {\n if (!props.fetchOnScroll)\n return;\n\n if (!inView || props.isFetching)\n return;\n\n props.fetchNext?.(props.nextCursor);\n }, [ inView, props.isFetching ]);\n\n return (\n <div className={`p-3 text-center ${styles.container}`} ref={ref}>\n {props.isFetching\n ? <Spinner as='span' animation='border' role='status' className={styles.spinner} />\n : (\n <SvgContainer\n svgName={cvSvgLibrary.ChevronDown}\n className='svg-container cursor-pointer'\n size={SvgContainerSize.Large}\n onClick={() => props.fetchNext?.(props.nextCursor)}\n />\n )\n }\n </div>\n );\n}","import { BaseError } from 'libs/common/backbone/core/BaseError';\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Core } from 'libs/common/core';\n\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { PrivateResourceError } from 'libs/shared/errors/general/private-resource/PrivateResourceError';\nimport { RegionLockedResourceError } from 'libs/shared/errors/general/region-locked-resource/RegionLockedResourceError';\nimport { UnspecifiedError } from 'libs/shared/errors/general/unspecified-error/UnspecifiedError';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nexport interface HttpErrorMap {\n notFound?: new () => BaseError;\n forbidden?: {\n rating?: new (description: string) => BaseError;\n yearLevel?: new (description: string) => BaseError;\n region?: new () => BaseError;\n privacy?: new (video?: VideoTypes) => BaseError;\n };\n badRequest?: new () => BaseError;\n internalServerError?: new () => BaseError;\n}\n\nexport type IgnoreHttpErrorMap = {\n [key in keyof HttpErrorMap]: boolean;\n};\n\nconst defaultErrors: HttpErrorMap = {\n notFound: NotFoundError,\n forbidden: {\n rating: PrivateResourceError,\n yearLevel: PrivateResourceError,\n region: RegionLockedResourceError,\n privacy: PrivateResourceError\n },\n badRequest: UnspecifiedError,\n internalServerError: UnspecifiedError\n};\n\nexport function handleHttpError(\n info: HttpStatus | Xhr,\n customErrorMap: HttpErrorMap = {},\n /**\n * Prevent certain errors in the errorMap from being thrown\n * so that you may implement your own handler\n */\n ignoreMap: IgnoreHttpErrorMap = {}\n): void {\n if (!info)\n return;\n\n let statusCode: HttpStatus;\n\n if (typeof(info) === 'number') {\n statusCode = info;\n } else {\n statusCode = info.status;\n }\n\n const errorMap = {\n ...defaultErrors,\n ...customErrorMap\n };\n\n if (!statusCode)\n return;\n\n if (!Core.ErrorHelper.isStatusCodeError(statusCode))\n return;\n\n if (statusCode === HttpStatus.InternalServer) {\n if (!ignoreMap.internalServerError)\n Core.ErrorHelper.throw(new UnspecifiedError());\n return;\n }\n\n if (statusCode === HttpStatus.NotFound) {\n if (!ignoreMap.notFound)\n Core.ErrorHelper.throw(new errorMap.notFound());\n return;\n }\n\n if (statusCode === HttpStatus.Forbidden) {\n /**\n * TODO: Work out how to go about handling all forbidden errors, such as region locking, year levels,\n * ratings, and privacy.\n */\n if (!ignoreMap.forbidden)\n Core.ErrorHelper.throw(new errorMap.forbidden.privacy());\n return;\n }\n\n if (!ignoreMap.badRequest)\n Core.ErrorHelper.throw(new errorMap.badRequest());\n}\n\nexport function handleXhrError(xhr: Xhr, customErrorMap?: HttpErrorMap): void {\n handleHttpError(xhr.status, customErrorMap);\n}","import { useEffect } from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nconst SCROLL_TOLERANCE = 400; // value in px\n\ninterface UseInfiniteScrollOptions {\n fetchNextPage: () => void;\n hasMore: boolean;\n isFetching: boolean;\n scrollContainer?: HTMLElement;\n}\n\nexport function useInfiniteScroll(options: UseInfiniteScrollOptions): void {\n const handleScroll = (): void => {\n if (options.isFetching)\n return;\n\n if (!options.scrollContainer) {\n const currentScrollHeight = window.innerHeight + document.documentElement.scrollTop;\n \n const totalHeight = document.documentElement.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n } else {\n const { scrollContainer } = options;\n const currentScrollHeight = scrollContainer.getBoundingClientRect().height + scrollContainer.scrollTop;\n \n const totalHeight = scrollContainer.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n }\n\n options.fetchNextPage();\n };\n\n useEffect(() => {\n const onScroll = FunctionHelper.throttle(handleScroll, 200);\n\n const scrollContainer = options.scrollContainer || window;\n\n if (options.hasMore)\n scrollContainer.addEventListener('scroll', onScroll);\n\n return () => scrollContainer.removeEventListener('scroll', onScroll);\n }, [ options.hasMore, options.fetchNextPage, options.scrollContainer ]);\n}","import { useEffect, useState } from 'react';\n\nimport { HttpStatus, HttpStatusClass } from 'libs/common/backbone/enums/HttpStatus';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Flight } from 'libs/common/flight';\n\nimport { BaseObject, BasePaginatedCollection } from 'libs/shared/interfaces';\n\nimport { useInfiniteScroll } from './UseInfiniteScroll';\nimport { useSelectAllPages } from './UseSelectAllPages';\n\nexport interface UseInfiniteListResult<T extends BaseObject> {\n items: T[];\n hasMore: boolean;\n isFetching: boolean;\n nextCursor: string;\n totalItems?: number;\n hasFirstPageCompleted: boolean;\n}\n\n/**\n * Hook to extract an infinite list from the application state,\n * save it locally in state and only update when new data\n * is fetched.\n * \n * @param getRequest - callback function to get the request for each page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n * \n * @param fetchNext - callback function to fetch a page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n */\nexport function useInfiniteList<TObject = BaseObject, TResponse = BasePaginatedCollection<TObject>>(\n getRequest: ((cursor?: string) => Flight.Request) | false,\n fetchNext: ((cursor?: string) => void) | false,\n onError?: (pageNumber: number, statusCode: HttpStatus) => void,\n getItems?: (responseData: TResponse) => TObject[],\n getCursor?: (responseData: TResponse) => string,\n scrollContainer?: HTMLElement\n): UseInfiniteListResult<TObject> {\n const [ pagesFetched, setPagesFetched ] = useState(0);\n\n const fetchNextFn = fetchNext as (cursor?: string) => void;\n\n function getKey(cursor?: string): string {\n if (!getRequest)\n return null;\n\n const request = getRequest(cursor);\n\n if (!request)\n return null;\n\n return request.key;\n }\n\n const response = useSelectAllPages<TObject, TResponse>(\n getKey,\n getItems,\n getCursor\n );\n\n function fetchNextPage(): void {\n if (!fetchNext || !getRequest || !response)\n return;\n\n setPagesFetched(currentVal => currentVal + 1);\n return fetchNextFn(response.nextCursor);\n }\n\n useInfiniteScroll({\n fetchNextPage,\n hasMore: !!response?.nextCursor,\n isFetching: response?.isFetching,\n scrollContainer\n });\n\n useEffect(() => {\n if (!response)\n return;\n\n if (response.shouldInitialFetch && fetchNext) {\n fetchNextFn();\n setPagesFetched(currentVal => currentVal + 1);\n }\n }, [ response?.shouldInitialFetch, fetchNext ]);\n\n useEffect(() => {\n if (!response?.statusCode || !FunctionHelper.isFunction(onError))\n return;\n\n const httpStatusClass: HttpStatusClass = +(response.statusCode?.toString()?.substr(0, 1));\n\n if (httpStatusClass !== HttpStatusClass.ClientError && httpStatusClass !== HttpStatusClass.ServerError)\n return;\n\n onError(pagesFetched, response.statusCode);\n }, [response?.statusCode]);\n\n return {\n items: response?.items,\n hasMore: !!response?.nextCursor,\n nextCursor: response?.nextCursor,\n isFetching: response?.isFetching,\n totalItems: response?.totalItems,\n hasFirstPageCompleted: response?.hasFirstPageCompleted\n };\n}","import React from 'react';\n\nimport { Breadcrumb } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { BreadcrumbService } from 'libs/shared/services/BreadcrumbService';\n\nexport function useBreadcrumbs(current: Breadcrumb): Breadcrumb[] {\n const [ match, useBuilder ] = React.useMemo(() => BreadcrumbService.getBuilder(), []);\n\n const breadcrumbs = useBuilder(match);\n\n if (!breadcrumbs || !current)\n return breadcrumbs;\n\n return [ ...breadcrumbs, { ...current, active: true }];\n}\n\n","const DEFAULT_PARTIAL_LOADING_OPTIONS: PartialLoadingOptions = {\n numItems: 5,\n minWidth: 50, // px\n maxWidth: 100 // px\n};\n\nexport interface PartialLoadingOptions {\n numItems?: number;\n minWidth?: number;\n maxWidth?: number;\n}\n\ninterface PartialLoadingItem {\n width: string;\n}\n\nexport const PartialLoadingHelper = {\n getPartialLoadingItems(options: PartialLoadingOptions = {}): PartialLoadingItem[] {\n const opts = {\n ...DEFAULT_PARTIAL_LOADING_OPTIONS,\n ...options\n };\n\n const getRandomFilterWidth = () => Math.max(Math.floor(Math.random() * opts.maxWidth), opts.minWidth);\n\n return [...Array(opts.numItems)].map(() => ({ width: `${getRandomFilterWidth()}px` }));\n }\n};","import { Flight } from 'libs/common/react/index';\n\nimport { AudienceRequests } from 'libs/shared/flight-requests/AudienceRequests';\nimport { PresentationAudience } from 'libs/shared/interfaces';\n\nimport { usePresentation } from 'shared/hooks/usePresentation';\n\nexport const usePresentationAudiences = () => {\n const { activePresentation, getFallbackPresentation } = usePresentation({ redirectOnError: true });\n\n const presentation = activePresentation || getFallbackPresentation();\n\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(\n !!presentation &&\n AudienceRequests.presentationAudiences(presentation.id)\n );\n\n return audiences;\n};","import React from 'react';\n\nimport { Flight } from 'libs/common/flight';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { ClassificationRequests } from 'libs/shared/flight-requests/ClassificationRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { Clip, ClipCollection, CurrentUser, Video, VideoCollection } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nconst CHUNK_SIZE = 50;\n\ntype Types = Video[] | VideoCollection | Clip[] | ClipCollection;\n\nfunction getValidObjects(objects: Types): (Video | Clip)[] {\n if (!objects)\n return [];\n\n if (Array.isArray(objects))\n return objects.filter(o => !!o && (VideoHelper.isVideo(o) || VideoHelper.isClip(o)));\n\n if ('data' in objects)\n return objects.data.filter(o => !!o && (VideoHelper.isVideo(o) || VideoHelper.isClip(o)));\n\n return [];\n}\n\ninterface VideoMixinOptions {\n /**\n * If the videos that are having new data mixed into are sitting on an explicit Flight namespace,\n * providing that namespace here is required\n */\n flightNamespace?: string;\n}\n\nexport function useVideoMixin(objects: Types, options: VideoMixinOptions = {}): void {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const hydratedVideos = React.useRef<Set<string>>(new Set<string>());\n\n const videos = getValidObjects(objects);\n\n const videoIds = videos.map(v => v.id);\n\n const [ request, setRequest ] = React.useState<Flight.Request[]>([]);\n\n React.useEffect(() => {\n if (!videoIds?.length || !currentUser.hasCompleted)\n return;\n\n const unhydratedVideos: string[] = [];\n\n videoIds.forEach(id => {\n if (!hydratedVideos.current.has(id)) {\n unhydratedVideos.push(id);\n hydratedVideos.current.add(id);\n }\n });\n \n if (!unhydratedVideos.length)\n return;\n\n setRequest(r => {\n const newRequests = [...r] ;\n\n ArrayHelper.chunk<string>(unhydratedVideos, CHUNK_SIZE).forEach(chunk => {\n newRequests.push(VideoRequests.videoMixinAssocs(chunk, options.flightNamespace));\n\n if (currentUser.data?.isAuthenticated)\n newRequests.push(ClassificationRequests.hasCurriculumLinks(chunk, null, options.flightNamespace));\n });\n\n return newRequests;\n });\n }, [ videoIds?.length, currentUser.hasCompleted ]);\n\n Flight.useBasicFetchAll(request);\n}","// extracted by mini-css-extract-plugin\nexport default {\"image\":\"ZfpQv\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EntityType, LocationContext, SignUpDescriptors, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport styles from './favourites-empty-state.scss';\n\nconst namespace = 'shared.favouritesEmptyState';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function FavouritesEmptyState(): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image\n src={ImageUrls.EmptyStates.FAVOURITED_VIDEOS}\n altText={getPhrase('info')}\n className={styles.image}\n />\n\n <EmptyState.Heading className='h3'>\n <Text phrase='heading' />\n </EmptyState.Heading>\n\n <EmptyState.Info><Text phrase='info' /></EmptyState.Info>\n\n <EmptyState.Cta\n text={LanguageService.getPhrase(namespace, 'cta')}\n appLink={{\n application: AppChannels.DASHBOARD,\n action: Actions.Dashboard.HOME\n }}\n />\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}\n\nexport function FavouritesPublicEmptyState(): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={ImageUrls.EmptyStates.FAVOURITED_VIDEOS_PUBLIC} altText={getPhrase('publicInfo')} />\n <EmptyState.Heading><Text phrase='publicHeading' /></EmptyState.Heading>\n <EmptyState.Info><Text phrase='publicInfo' /></EmptyState.Info>\n <EmptyState.Cta\n text={LanguageService.getPhrase(namespace, 'publicCta')}\n appLink={{\n application: AppChannels.SIGN_UP,\n action: Actions.SignUp.SIGN_UP\n }}\n analyticsData={{}}\n analyticsOptions={{\n actionType: UserAction.Click,\n location: LocationContext.MyFavouritesLanding,\n entity: EntityType.AppLink,\n workflowPhase: WorkflowPhase.Start,\n descriptor: SignUpDescriptors.SignUp\n }}\n />\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\nimport { useLiteFavourites } from 'shared/hooks/useLiteFavourites';\n\nconst namespace = 'shared.favourites';\n\nexport function useFavouritesVideoActions() {\n const videoActions = useVideoActions({ location: VideoActionsLocation.VideoItem });\n const { setFavourite } = useLiteFavourites(LocationContext.VideoThumbnail);\n\n const getVideoActions = (video: VideoTypes) => {\n const { canConsume } = VideoHelper.getCanBeConsumed(video);\n\n if (!canConsume) {\n return [{\n label: LanguageService.getPhrase(namespace, 'removeFromFavourites'),\n svgName: cvSvgLibrary.Delete,\n button: false,\n className: 'btn btn-link text-danger',\n onClick: () => setFavourite(video, false)\n }];\n }\n\n return videoActions.getVideoActions(video);\n };\n\n return {\n ...videoActions,\n getVideoActions\n };\n}","// extracted by mini-css-extract-plugin\nexport default {\"banner\":\"FEWd3\"};","import * as React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { BannerHeader } from 'libs/shared/components/banner-header/BannerHeader';\nimport { Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { InfiniteScrollFooter } from 'libs/shared/components/infinite-scroll-footer/InfiniteScrollFooter';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { PartialVideoList } from 'libs/shared/components/video-list/partial-loading/PartialVideoList';\nimport { VideoList } from 'libs/shared/components/video-list/VideoList';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { LocalPermissionName } from 'libs/shared/enums/PermissionName';\nimport { handleHttpError } from 'libs/shared/errors/handlers/HttpErrorHandlers';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { FavouriteRequests } from 'libs/shared/flight-requests/FavouriteRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useBreadcrumbs } from 'libs/shared/hooks/useBreadcrumbs';\nimport { useInfiniteList } from 'libs/shared/hooks/UseInfiniteList';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Config, CurrentUser, VideoTypes, YearGroup } from 'libs/shared/interfaces';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { usePluginHelper } from 'shared/hooks/use-plugin-helper/usePluginHelper';\nimport { useLiteFavourites } from 'shared/hooks/useLiteFavourites';\nimport { usePresentationAudiences } from 'shared/hooks/usePresentationAudiences';\nimport { useVideoMixin } from 'shared/hooks/useVideoMixin';\nimport { InteractiveHelpers } from 'shared/utils/InteractiveHelper';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nimport { SeriesAppLinkHelper } from 'apps/series/SeriesAppLinkHelper';\n\nimport { FavouritesEmptyState, FavouritesPublicEmptyState } from './empty-state/FavouritesEmptyState';\nimport { useFavouritesCount } from './hooks/useFavouritesCount';\nimport { useFavouritesVideoActions } from './FavouritesViewUtils';\n\nimport styles from './favourites-view.scss';\n\nconst namespace = 'shared.favourites';\n\nexport function FavouritesView(): JSX.Element {\n const dispatch = useDispatch();\n const alerts = useAlerts();\n const { setFavourite, canFavourite } = useLiteFavourites(LocationContext.VideoThumbnail);\n const { isPlugin } = usePluginHelper();\n const videoActions = useFavouritesVideoActions();\n\n useSetPageMetadata({ title: LanguageService.getPhrase(namespace, 'pageTitle') });\n const { hasLocalPermissions, hasPermissions } = usePermissions();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const getRequest = (cursor?: string) => {\n return FavouriteRequests.getFavourites(currentUser.data.id, cursor);\n };\n\n const fetchNext = (cursor?: string) => {\n return Flight.getFetch(dispatch)(getRequest(cursor));\n };\n\n const shouldFetch = !hasLocalPermissions(LocalPermissionName.ViewMyFavouritesLanding) && currentUser.hasCompleted;\n\n const {\n items,\n hasMore,\n isFetching\n } = useInfiniteList<VideoTypes>(shouldFetch ? getRequest : false, fetchNext, onError);\n\n useVideoMixin(items);\n \n const audiences = usePresentationAudiences();\n\n const breadcrumbs = useBreadcrumbs({ name: LanguageService.getPhrase(namespace, 'header') });\n\n function onError(pageNumber: number, httpStatus: HttpStatus): void {\n if (pageNumber === 1)\n return handleHttpError(httpStatus);\n\n alerts.error(LanguageService.getPhrase(namespace, 'error'));\n }\n\n const { count, isLoading } = useFavouritesCount(currentUser.data?.id);\n if (isLoading)\n return <></>;\n\n if (hasLocalPermissions(LocalPermissionName.ViewMyFavouritesLanding))\n return <FavouritesPublicEmptyState />;\n\n return (\n <VideoActionsContext.Provider value={videoActions}>\n <div className='p-3'>\n <BannerHeader\n heading={LanguageService.getPhrase(namespace, 'header')}\n banner={{ url: ImageUrls.FAVOURITES_PLAYLIST.FAV_PLAYLIST_BANNER }}\n bannerClassName={`${styles.banner} bg-pink`}\n imageCdnUrl={config.data?.imageCdnUrl}\n detailsComponent={() => (\n <div className='mb-n1 font-size-normal fw-normal mt-1'>\n <Text namespace={namespace} phrase='videos' options={{ smartCount: count }} />\n </div>\n )}\n />\n {breadcrumbs?.length &&\n <div className='border-bottom pb-3'>\n <Breadcrumbs breadcrumbs={breadcrumbs} />\n </div>\n }\n \n {(() => {\n if (!items)\n return <PartialVideoList />;\n\n if (!items.length)\n return <FavouritesEmptyState />;\n\n return (\n <div className='mt-2'>\n <VideoList\n videos={items}\n yearGroups={yearGroups.data}\n getVideoAppLink={VideoAppLinkHelper.getAppLink}\n hasPermissions={hasPermissions}\n getSubTextAppLink={video => SeriesAppLinkHelper.getSeriesAppLink(video.series)}\n setFavourite={setFavourite}\n canFavourite={canFavourite}\n presentationAudiences={audiences.data}\n getPreviewQuestionsAppLink={interactive => InteractiveHelpers.getPreviewQuestionsAppLink(interactive)}\n isPlugin={isPlugin}\n getClassroomGuideAppLink={VideoAppLinkHelper.getClassroomGuideAppLink}\n getInteractiveGuidanceAppLink={VideoAppLinkHelper.getInteractiveGuidanceAppLink}\n getResourceGuidanceAppLink={VideoAppLinkHelper.getResourceGuidanceAppLink}\n />\n {(hasMore || isFetching) && <InfiniteScrollFooter isFetching={isFetching} fetchNext={fetchNext} />}\n </div>\n );\n })()}\n </div>\n </VideoActionsContext.Provider>\n );\n}","\nimport { Flight } from 'libs/common/flight';\n\nimport { FavouriteRequests } from 'libs/shared/flight-requests/FavouriteRequests';\nimport { FavouritesCountResponse } from 'libs/shared/interfaces';\n\nexport function useFavouritesCount(userId?: string) {\n// todo there is a beckend bug that we cannot group fetch these three number\n const favouriteVideosCount = Flight.useBasicFetch<FavouritesCountResponse>(userId &&\n FavouriteRequests.getFavouritesVideosCount(userId));\n const favouriteClipsCount = Flight.useBasicFetch<FavouritesCountResponse>(userId &&\n FavouriteRequests.getFavouritesClipsCount(userId));\n const favouriteInteractivesCount = Flight.useBasicFetch<FavouritesCountResponse>(userId &&\n FavouriteRequests.getFavouritesInteractivesCount(userId));\n \n const totalCount = favouriteVideosCount.data?.count\n + favouriteInteractivesCount.data?.count\n + favouriteClipsCount.data?.count;\n\n const favourites = [\n ...(favouriteVideosCount.data?.data || []),\n ...(favouriteClipsCount.data?.data || []),\n ...(favouriteInteractivesCount.data?.data || [])\n ];\n\n return {\n count: totalCount,\n favourites,\n isLoading: !favouriteVideosCount.data?.data\n || !favouriteClipsCount.data?.data\n || !favouriteInteractivesCount.data?.data\n };\n}","\"use client\";\n\nimport classNames from 'classnames';\nimport * as React from 'react';\nimport { useBootstrapPrefix, useBootstrapBreakpoints, useBootstrapMinBreakpoint } from './ThemeProvider';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst Row = /*#__PURE__*/React.forwardRef(({\n bsPrefix,\n className,\n // Need to define the default \"as\" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595\n as: Component = 'div',\n ...props\n}, ref) => {\n const decoratedBsPrefix = useBootstrapPrefix(bsPrefix, 'row');\n const breakpoints = useBootstrapBreakpoints();\n const minBreakpoint = useBootstrapMinBreakpoint();\n const sizePrefix = `${decoratedBsPrefix}-cols`;\n const classes = [];\n breakpoints.forEach(brkPoint => {\n const propValue = props[brkPoint];\n delete props[brkPoint];\n let cols;\n if (propValue != null && typeof propValue === 'object') {\n ({\n cols\n } = propValue);\n } else {\n cols = propValue;\n }\n const infix = brkPoint !== minBreakpoint ? `-${brkPoint}` : '';\n if (cols != null) classes.push(`${sizePrefix}${infix}-${cols}`);\n });\n return /*#__PURE__*/_jsx(Component, {\n ref: ref,\n ...props,\n className: classNames(className, decoratedBsPrefix, ...classes)\n });\n});\nRow.displayName = 'Row';\nexport default Row;"],"names":["PortalHelper","renderInPortalIfExists","component","portalContainer","createPortal","namespace","ComingSoonTag","props","Tooltip","title","LanguageService","spanHackClassName","spanHack","className","SvgContainer","svgName","onlyIcon","GenericCalendarDate","AppLink","appLink","getAppLink","theme","border","analyticsData","analyticsOptions","background","label","body","type","getBodyClass","text","month","BackButton","textShadow","backToName","color","extraClasses","backPhrase","colorClass","textShadowClass","size","S","defaultProps","RATIO","width","height","getSizeClass","heading","length","BannerHeader","banner","imageCdnUrl","actions","sortComponent","blockColourClass","specialEvent","portalContainerContext","BannerPortalContext","imageWidth","useBreakpoints","xxl","specialEventIsToday","showComingSoon","today","DateHelper","Date","endDate","startDate","imageOptions","ratio","resizeType","url","ImageHelper","fallbackBaseUrl","fallbackCategoryName","containerProps","bannerClassName","style","backgroundImage","DetailsComponent","detailsComponent","backButtonAppLink","backButtonText","backButtonClasses","alignLogoLeft","logo","getSpecialEventMonthText","calendarTheme","Text","phrase","LazyImage","src","Actions","actionsDropdownClassName","container","prevProps","nextProps","PartialBannerHeader","getPhrase","BreadcrumbItem","ref","breadcrumb","name","active","withBackIcon","trimmedName","slice","Breadcrumbs","breadcrumbs","isMobile","collapse","setCollapse","shouldFocus","setShouldFocus","expandRef","characterLength","reduce","prev","next","current","focus","first","second","secondLast","last","rest","onClick","map","idx","key","PartialBreadcrumbs","numItems","dangerouslySetInnerHTML","__html","InfiniteScrollFooter","inView","fetchOnScroll","isFetching","fetchNext","nextCursor","Spinner","as","animation","role","defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","internalServerError","handleHttpError","info","customErrorMap","ignoreMap","statusCode","status","errorMap","SCROLL_TOLERANCE","useInfiniteList","getRequest","onError","getItems","getCursor","scrollContainer","options","handleScroll","useState","pagesFetched","setPagesFetched","fetchNextFn","response","cursor","request","fetchNextPage","currentVal","hasMore","getBoundingClientRect","scrollTop","scrollHeight","window","innerHeight","document","documentElement","useEffect","onScroll","FunctionHelper","addEventListener","removeEventListener","shouldInitialFetch","httpStatusClass","toString","substr","HttpStatus","items","totalItems","hasFirstPageCompleted","useBreadcrumbs","match","useBuilder","DEFAULT_PARTIAL_LOADING_OPTIONS","minWidth","maxWidth","PartialLoadingHelper","getPartialLoadingItems","opts","Array","Math","max","floor","random","usePresentationAudiences","redirectOnError","activePresentation","getFallbackPresentation","presentation","id","CHUNK_SIZE","useVideoMixin","objects","currentUser","hydratedVideos","Set","videos","isArray","filter","o","data","getValidObjects","videoIds","v","setRequest","hasCompleted","unhydratedVideos","forEach","has","push","add","r","newRequests","chunk","flightNamespace","isAuthenticated","FavouritesEmptyState","value","EmptyState","ImageUrls","altText","application","action","FavouritesPublicEmptyState","actionType","location","entity","workflowPhase","descriptor","SignUp","FavouritesView","dispatch","alerts","useLiteFavourites","u","setFavourite","canFavourite","isPlugin","usePluginHelper","videoActions","useVideoActions","getVideoActions","video","VideoHelper","canConsume","button","useFavouritesVideoActions","useSetPageMetadata","usePermissions","hasLocalPermissions","hasPermissions","UserRequests","yearGroups","CustomerRequests","customerId","config","ConfigRequests","FavouriteRequests","shouldFetch","pageNumber","httpStatus","error","audiences","useFavouritesCount","count","isLoading","VideoActionsContext","smartCount","VideoList","getVideoAppLink","VideoAppLinkHelper","getSubTextAppLink","SeriesAppLinkHelper","series","presentationAudiences","getPreviewQuestionsAppLink","interactive","InteractiveHelper","getClassroomGuideAppLink","getInteractiveGuidanceAppLink","getResourceGuidanceAppLink","PartialVideoList","userId","favouriteVideosCount","favouriteClipsCount","favouriteInteractivesCount","favourites","Row","bsPrefix","Component","decoratedBsPrefix","breakpoints","minBreakpoint","sizePrefix","classes","brkPoint","propValue","cols","infix","displayName"],"sourceRoot":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/2788-eca70707c6-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/analytics/utils/AnalyticsFilterUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/AnonymiseUserUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/AudienceUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/DateRangeUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/views/generate-report/GenerateInteractiveResultsReportView.tsx","file:///app/packages/libs/shared/src/components/percentage-indicator/PercentageIndicator.tsx","file:///app/packages/libs/shared/src/components/percentage-indicator/PercentageIndicatorUtils.ts","file:///app/packages/libs/shared/src/constants/ScoreThresholds.ts","file:///app/packages/libs/shared/src/errors/handlers/HttpErrorHandlers.ts","file:///app/packages/libs/shared/src/hooks/UseHandleObjectError.ts","file:///app/packages/libs/shared/src/utils/AnalyticsRequestUtils.ts","file:///app/packages/libs/shared/src/utils/AppRouteHelper.ts","file:///app/packages/libs/shared/src/components/percentage-indicator/percentage-indicator.scss"],"sourcesContent":["import { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { AudienceQueryParams } from 'libs/shared/apps/analytics/interfaces/AudienceQueryParams';\nimport { DateRangeQueryParams } from 'libs/shared/apps/analytics/interfaces/DateRangeQueryParams';\nimport { ContextService } from 'libs/shared/services/ContextService';\n\nexport const AnalyticsFilterHelper = {\n getAudienceAppLinkParams: () => {\n const { appLink } = ContextService.getCurrentRoute();\n const params = ObjectHelper.isObject(appLink.params) ? appLink.params as HashObject : {};\n const { users, classrooms, classroomGroups } = params;\n\n const getParam = (key: keyof AudienceQueryParams) => {\n const param = params[key];\n\n if (!param)\n return;\n\n return Array.isArray(param) ? param : [param];\n };\n\n const audienceFilters: AudienceQueryParams = {};\n\n if (users)\n audienceFilters.users = getParam('users');\n\n if (classrooms)\n audienceFilters.classrooms = getParam('classrooms');\n\n if (classroomGroups)\n audienceFilters.classroomGroups = getParam('classroomGroups');\n\n return audienceFilters;\n },\n getDateRangeAppLinkParams: () => {\n const { appLink } = ContextService.getCurrentRoute();\n const params = ObjectHelper.isObject(appLink.params) ? appLink.params as HashObject : {};\n const { from, to, rangeName } = params;\n\n const dateRangeFilters: DateRangeQueryParams = {};\n\n if (from)\n dateRangeFilters.from = from;\n\n if (to)\n dateRangeFilters.to = to;\n\n if (rangeName)\n dateRangeFilters.rangeName = rangeName;\n\n return dateRangeFilters;\n }\n};","import { animals, colors, Config as UniqueNamesConfig, uniqueNamesGenerator } from 'unique-names-generator';\n\nimport { User } from 'libs/shared/interfaces';\nimport { PublicInteractiveUser } from 'libs/shared/interfaces/models/interactive-results/PublicInteractiveUser';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\n\nfunction getUniqueNamesConfig(id: string): UniqueNamesConfig {\n /**\n * Generate a seed that is unique to each user but changes every 5 minutes.\n * \n * We use a seed so that if the same user's name is anonymised multiple times\n * in quick succession (e.g. multiple renders), the same name will be returned each time.\n * \n * We change the seed every 5 minutes so that students don't always have the same name.\n */\n const seed = +`${id}${Math.floor((new Date()).getMinutes() / 5)}`;\n\n return {\n dictionaries: [ colors, animals ],\n separator: ' ',\n length: 2,\n style: 'capital',\n seed\n };\n}\n\nexport function anonymiseUserName(user: User | PublicInteractiveUser, shouldAnonymise: boolean): string {\n if (!user)\n return '';\n\n if (!shouldAnonymise)\n return 'profileId' in user ? user.name : UserHelper.getFullName(user);\n\n return uniqueNamesGenerator(getUniqueNamesConfig('profileId' in user ? user.profileId : user.id));\n}\n","import { AudienceQueryParams } from 'libs/shared/apps/analytics/interfaces/AudienceQueryParams';\n\nexport const getAudienceParams = (queryParams: AudienceQueryParams) => {\n const userId: string[] = [];\n const groupId: string[] = [];\n\n if (queryParams.users)\n userId.push(...queryParams.users);\n\n if (queryParams.classrooms)\n groupId.push(...queryParams.classrooms);\n\n if (queryParams.classroomGroups)\n groupId.push(...queryParams.classroomGroups);\n return {\n userId,\n groupId\n };\n};","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { DateRangeQueryParams } from 'libs/shared/apps/analytics/interfaces/DateRangeQueryParams';\nimport { FilterQueryParams } from 'libs/shared/apps/analytics/interfaces/FilterQueryParams';\nimport { DateRange } from 'libs/shared/interfaces';\nimport { AppRouteHelper } from 'libs/shared/utils/AppRouteHelper';\n\nconst namespace = 'shared.analyticsUtils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function convertDateToUtcDateTimeString(date: Date): string {\n const utc = DateHelper.convertDateToUTC(date);\n return DateHelper.format(utc, 'YYYY-MM-DDTHH:mm:ss');\n}\n\nexport function getMinDate(): Date {\n return new Date(2021, 0, 1);\n}\n\nexport function getMaxDate(): Date {\n return new Date();\n}\n\nexport function getDefaultDateRange(dateRangePresets: DateRange[]): DateRange {\n return dateRangePresets.find(range => !!range.default);\n}\n\nexport function getPresetRangeByName(dateRangePresetss: DateRange[], rangeName: string): DateRange | undefined {\n if (!rangeName)\n return;\n\n const presets = dateRangePresetss;\n \n return presets.find(p => p.name === rangeName);\n}\n\nexport function getGenericDateRangePresets(): DateRange[] {\n const minDate = getMinDate();\n const currentYear = (new Date()).getFullYear();\n\n const isMinDateThisYear = currentYear === minDate.getFullYear();\n\n return [\n {\n name: getPhrase('today'),\n startDate: new Date(),\n endDate: new Date()\n },\n {\n name: getPhrase('thisMonth'),\n startDate: new Date(currentYear, new Date().getMonth(), 1),\n endDate: new Date()\n },\n {\n name: getPhrase('lastThreeMonths'),\n startDate: new Date(currentYear, new Date().getMonth() - 2, 1),\n endDate: new Date()\n },\n {\n name: getPhrase('lastSixMonths'),\n startDate: new Date(currentYear, new Date().getMonth() - 5, 1),\n endDate: new Date(),\n default: true\n },\n {\n name: getPhrase('thisYear'),\n startDate: new Date(currentYear, 0, 1),\n endDate: new Date()\n },\n {\n name: getPhrase('lastYear'),\n startDate: new Date(currentYear - 1, 0, 1),\n endDate: new Date(currentYear, 0, 0),\n disabled: isMinDateThisYear,\n tooltip: isMinDateThisYear ? getPhrase('lastYearDisabled') : ''\n }\n ];\n}\n\nexport function getInsightsDateRangePresets(): DateRange[] {\n const minDate = getMinDate();\n const currentYear = (new Date()).getFullYear();\n\n const isMinDateThisYear = currentYear === minDate.getFullYear();\n\n return [\n {\n name: getPhrase('today'),\n startDate: new Date(),\n endDate: new Date()\n },\n {\n name: getPhrase('thisMonth'),\n startDate: new Date(currentYear, new Date().getMonth(), 1),\n endDate: new Date()\n },\n {\n name: getPhrase('lastThreeMonths'),\n startDate: new Date(currentYear, new Date().getMonth() - 2, 1),\n endDate: new Date()\n },\n {\n name: getPhrase('lastSixMonths'),\n startDate: new Date(currentYear, new Date().getMonth() - 5, 1),\n endDate: new Date()\n },\n {\n name: getPhrase('thisYear'),\n startDate: new Date(currentYear, 0, 1),\n endDate: new Date()\n },\n {\n name: getPhrase('lastYear'),\n startDate: new Date(currentYear - 1, 0, 1),\n endDate: new Date(currentYear, 0, 0),\n disabled: isMinDateThisYear,\n tooltip: isMinDateThisYear ? getPhrase('lastYearDisabled') : ''\n },\n {\n name: getPhrase('allTime'),\n startDate: DateHelper.subtract(new Date(), 5, 'years'),\n endDate: new Date(),\n default: true\n }\n ];\n}\n\nexport function formatDateQueryParam(date: Date): string {\n return DateHelper.format(date, 'YYYY-MM-DD');\n}\n\nexport function getRouteQueryParams(dateRange: DateRange): DateRangeQueryParams {\n if (dateRange.name)\n return { rangeName: dateRange.name };\n\n return {\n from: formatDateQueryParam(dateRange.startDate),\n to: formatDateQueryParam(dateRange.endDate)\n };\n}\n\nexport function useGetDateRangeFromQueryParams(\n dateRangePresets: DateRange[],\n dateRangeQueryParams: DateRangeQueryParams\n): DateRange | null {\n const { to, from, rangeName } = dateRangeQueryParams;\n \n const presetRange = getPresetRangeByName(dateRangePresets, rangeName);\n\n if (presetRange) {\n if (!from && !to)\n return presetRange;\n\n /**\n * If a rangeName has been set, we don't use to and from so we remove them from the url params.\n */\n AppRouteHelper.updateParams(\n getRouteQueryParams(presetRange),\n { replace: true, merge: true, keysToRemove: [ 'from', 'to' ]}\n );\n return;\n }\n\n const defaultDateRange = getDefaultDateRange(dateRangePresets);\n\n /**\n * If a param is missing, or one of them isn't a valid date, short-circuit the logic below.\n */\n if (!from || !to || !DateHelper.isValid(from) || !DateHelper.isValid(to)) {\n AppRouteHelper.updateParams(\n getRouteQueryParams(defaultDateRange),\n { replace: true, merge: true, keysToRemove: ['rangeName']}\n );\n return;\n }\n\n let initialDateRangeValid = true;\n\n let startDate = DateHelper.convertDateToUTC(new Date(from));\n let endDate = DateHelper.convertDateToUTC(new Date(to));\n\n if (DateHelper.isBefore(startDate, getMinDate(), 'day')) {\n startDate = getMinDate();\n initialDateRangeValid = false;\n }\n\n if (DateHelper.isAfter(endDate, getMaxDate(), 'day')) {\n endDate = getMaxDate();\n initialDateRangeValid = false;\n }\n\n if (DateHelper.isAfter(startDate, endDate)) {\n startDate = defaultDateRange.startDate;\n endDate = defaultDateRange.endDate;\n initialDateRangeValid = false;\n }\n\n const dateRange: DateRange = { startDate, endDate, name: initialDateRangeValid ? rangeName : '' };\n\n if (initialDateRangeValid)\n return dateRange;\n\n /**\n * If one or both of the date params were invalid, we trigger a route update.\n */\n AppRouteHelper.updateParams(getRouteQueryParams(dateRange), { replace: true, merge: true, keysToRemove: ['rangeName']});\n}\n\nexport function getStartEndParams(\n dateRangePresetss: DateRange[],\n filterParams: FilterQueryParams\n): { start: string; end: string } {\n const getStartDate = (date: string) => convertDateToUtcDateTimeString(DateHelper.startOf(date, 'day'));\n const getEndDate = (date: string) => convertDateToUtcDateTimeString(DateHelper.endOf(date, 'day'));\n\n const presetRange = getPresetRangeByName(dateRangePresetss, filterParams.rangeName);\n\n /**\n * If the user has chosen a preset range, lookup the start and end dates as they won't be\n * in the query params.\n */\n if (presetRange)\n return {\n start: getStartDate(formatDateQueryParam(presetRange.startDate)),\n end: getEndDate(formatDateQueryParam(presetRange.endDate))\n };\n\n /**\n * If they have chosen a custom date range, use their chosen start and end dates.\n */\n if (filterParams.from && filterParams.to)\n return {\n start: getStartDate(filterParams.from),\n end: getEndDate(filterParams.to)\n };\n\n /**\n * The below should never be hit\n */\n const defaultRange = getDefaultDateRange(dateRangePresetss);\n\n return {\n start: getStartDate(formatDateQueryParam(defaultRange.startDate)),\n end: getEndDate(formatDateQueryParam(defaultRange.endDate))\n };\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { useGetResultsTableData } from 'libs/shared/apps/analytics/components/student-results/student-results-table/StudentResultsTableUtils';\nimport { InteractiveResultsRequests } from 'libs/shared/apps/analytics/flight-requests/InteractiveResultsRequests';\nimport { useFetchInteractiveResults } from 'libs/shared/apps/analytics/hooks/UseFetchInteractiveResults';\nimport { InteractiveResultsReport } from 'libs/shared/apps/analytics/interfaces/requests/InteractiveResultsReport';\nimport { AnalyticsFilterHelper } from 'libs/shared/apps/analytics/utils/AnalyticsFilterUtils';\nimport { getAudienceParams } from 'libs/shared/apps/analytics/utils/AudienceUtils';\nimport { getInsightsDateRangePresets, getStartEndParams } from 'libs/shared/apps/analytics/utils/DateRangeUtils';\nimport { getFormattedPercentage, getPercentageToFixed } from 'libs/shared/components/percentage-indicator/PercentageIndicatorUtils';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { CurrentUser, Interactive, InteractiveMetadata, PopupViewProps } from 'libs/shared/interfaces';\nimport { InteractiveCorrectnessHelper } from 'libs/shared/utils/InteractiveCorrectnessHelper';\nimport { getInteractions, getStudentResult } from 'libs/shared/utils/InteractiveHelper';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nconst namespace = 'shared.generateReport';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getReportFriendlyDate(date: string): string {\n const localDate = DateHelper.convertUTCToLocal(date).toString();\n return DateHelper.format(localDate, 'Do MMMM YYYY');\n}\n\ninterface GenerateInteractiveResultsReportViewProps extends PopupViewProps {\n interactiveId: string;\n}\n\nexport function GenerateInteractiveResultsReportView(props: GenerateInteractiveResultsReportViewProps): JSX.Element {\n const [anonymiseUsers] = useViewModel<boolean>(SharedViewModelKeys.ANONYMISE_USERS);\n\n const alerts = useAlerts();\n const fetchAsync = Flight.useGetFetchAsync();\n\n const audienceAppLinkParams = AnalyticsFilterHelper.getAudienceAppLinkParams();\n const dateRangeAppLinkParams = AnalyticsFilterHelper.getDateRangeAppLinkParams();\n const startEndParams = getStartEndParams(getInsightsDateRangePresets(), dateRangeAppLinkParams);\n\n const [ showSpinner, setShowSpinner ] = React.useState(false);\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(\n InteractiveRequests.interactiveMetadata(props.interactiveId)\n );\n const interactive = Flight.useBasicFetch<Interactive>(interactiveMetadata.data?.interactiveId ?\n InteractiveRequests.interactive(interactiveMetadata.data.interactiveId) : null);\n const results = useFetchInteractiveResults(props.interactiveId, {\n ...startEndParams,\n ...getAudienceParams(audienceAppLinkParams)\n });\n\n useHandleObjectError([ interactive, interactiveMetadata, results ]);\n\n const interactions = getInteractions(interactive.data);\n\n const answerData = useGetResultsTableData(interactive.data, results.data, false, anonymiseUsers);\n\n function onClickGenerate(): void {\n setShowSpinner(true);\n\n const body: InteractiveResultsReport = {\n interactiveName: interactiveMetadata.data.name,\n userId: currentUser.data.id,\n customerId: currentUser.data.customerId,\n questions: interactions.map(i => i.name),\n rows: answerData.map(answer => {\n return {\n name: UserHelper.getFullName(answer.user),\n unanswered: answer.summary.unanswered,\n percentage: getFormattedPercentage(getPercentageToFixed(answer.summary.percentCorrect)),\n correct: answer.summary.correct,\n totalQuestions: answer.summary.answered + answer.summary.unanswered,\n results: interactions.map(interaction => {\n const correctness = InteractiveCorrectnessHelper.isInteractionCorrect(\n interaction,\n getStudentResult(answer)\n );\n\n switch (correctness) {\n case InteractionCorrectness.Correct:\n return getPhrase('correct');\n\n case InteractionCorrectness.Incorrect:\n return getPhrase('incorrect');\n\n case InteractionCorrectness.NotApplicable:\n return '-';\n\n case InteractionCorrectness.AwaitingMarking:\n return getPhrase('awaitingMarking');\n\n case InteractionCorrectness.UnAnswered:\n case InteractionCorrectness.Answered:\n default:\n return '';\n }\n })\n };\n })\n };\n\n fetchAsync(InteractiveResultsRequests.interactiveResultsReport(body))\n .then(() => {\n alerts.success(getPhrase('success'));\n })\n .catch(() => {\n alerts.error(getPhrase('error'));\n })\n .finally(props.closePopup);\n }\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <Popup\n title={getPhrase('title')}\n showLoadingSpinner={!currentUser.hasCompleted}\n closePopup={props.closePopup}\n >\n <>\n <p>\n <Text phrase='description' />\n </p>\n <p>\n <Text phrase='dateRange' options={({\n dateFrom: getReportFriendlyDate(startEndParams.start),\n dateTo: getReportFriendlyDate(startEndParams.end)\n })} />\n </p>\n <p>\n <Text phrase='emailDescription' options={({ email: currentUser.data?.email })} />\n </p>\n <PopupButtons>\n <PopupButtons.Cancel onClick={props.closePopup} />\n <PopupButtons.Submit\n variant='dark'\n onClick={onClickGenerate}\n text={getPhrase('generateReport')}\n showSpinner={showSpinner}\n />\n </PopupButtons>\n </>\n </Popup>\n </LanguageNamespaceContext.Provider>\n );\n}","import React from 'react';\n\nimport { ScoreThresholds } from 'libs/shared/constants/ScoreThresholds';\n\nimport {\n getCircleClassName,\n getCircleContainerClassName,\n getCircleRadius,\n getColouredLabelClassName,\n getFormattedPercentage,\n getPercentageToFixed,\n isPending,\n ProgressCircleSize\n} from './PercentageIndicatorUtils';\n\nimport styles from './percentage-indicator.scss';\n\ninterface ProgressCircleProps {\n size: ProgressCircleSize;\n scoreThresholds?: ScoreThresholds;\n percentage?: number;\n}\n\nfunction ProgressCircle(props: ProgressCircleProps): JSX.Element {\n const ref = React.useCallback((circle: SVGCircleElement) => {\n if (!circle)\n return;\n\n const radius = circle.r.baseVal.value;\n const circumference = 2 * Math.PI * radius;\n const offset = circumference - props.percentage * circumference;\n\n circle.style.strokeDasharray = `${circumference} ${circumference}`;\n circle.style.strokeDashoffset = offset.toString();\n }, [props.percentage]);\n\n return (\n <svg>\n <circle r={getCircleRadius(props.size)} className={styles.backgroundCircle} />\n {!isPending(props.percentage) &&\n <circle\n ref={ref}\n r={getCircleRadius(props.size)}\n className={getCircleClassName(props.percentage, props.scoreThresholds)}\n />\n }\n </svg>\n );\n}\n\nexport enum PercentageIndicatorLayout {\n CircleOnly = 'circle_only',\n LabelOnly = 'label_only',\n LabelBefore = 'label_before',\n LabelInside = 'label_inside'\n}\n\ninterface PercentageIndicatorProps {\n layout: PercentageIndicatorLayout;\n percentage?: number; // Between 0 and 1 or undefined for pending\n className?: string;\n customLabel?: string;\n scoreThresholds?: ScoreThresholds;\n size?: ProgressCircleSize;\n}\n\nPercentageIndicator.defaultProps = {\n layout: PercentageIndicatorLayout.CircleOnly\n};\n\nexport function PercentageIndicator(props: PercentageIndicatorProps): JSX.Element {\n const percentageToFixed = getPercentageToFixed(props.percentage);\n\n const size = props.size ||\n (props.layout === PercentageIndicatorLayout.LabelInside\n ? ProgressCircleSize.Large\n : ProgressCircleSize.Small\n );\n\n const label = props.customLabel || getFormattedPercentage(percentageToFixed);\n\n if (props.layout === PercentageIndicatorLayout.LabelOnly)\n return (\n <span className={getColouredLabelClassName(percentageToFixed)}>\n {label}\n </span>\n );\n\n return (\n <div className={`d-flex align-items-center justify-content-between ${props.className ?? ''}`}>\n {props.layout === PercentageIndicatorLayout.LabelBefore &&\n <span className='me-2'>\n {label}\n </span>\n }\n <div className={getCircleContainerClassName(size, percentageToFixed)}>\n <ProgressCircle percentage={percentageToFixed} size={size} scoreThresholds={props.scoreThresholds} />\n {props.layout === PercentageIndicatorLayout.LabelInside &&\n <span className={styles.centredPercentageText}>\n {label}\n </span>\n }\n </div>\n </div>\n );\n}","import { ScoreThresholdDefaults, ScoreThresholds } from 'libs/shared/constants/ScoreThresholds';\n\nimport styles from './percentage-indicator.scss';\n\n/**\n * Values for width and strokeWidth are taken from progress-circle.scss.\n * If either are changed, they must be updated in both places.\n */\nconst CIRCLE_WIDTH = 2; // rem\nconst CIRCLE_WIDTH_LG = 5.8; // rem\nconst CIRCLE_STROKE_WIDTH = 0.2; // rem\nconst CIRCLE_STROKE_WIDTH_LG = 0.36; // rem\n \nexport enum ProgressCircleSize {\n Small = 'small',\n Large = 'large',\n ExtraSmall = 'extraSmall'\n}\n\nconst ProgressCircleSizeMap = {\n [ProgressCircleSize.ExtraSmall]: {\n size: CIRCLE_WIDTH\n },\n [ProgressCircleSize.Small]: {\n size: CIRCLE_WIDTH\n },\n [ProgressCircleSize.Large]: {\n size: CIRCLE_WIDTH_LG\n }\n};\n\n/**\n * radius = width / 2 - strokeWidth * 2\n */\nexport function getCircleRadius(size: ProgressCircleSize): string {\n const width = ProgressCircleSizeMap[size].size;\n const strokeWidth = size === ProgressCircleSize.Large ? CIRCLE_STROKE_WIDTH_LG : CIRCLE_STROKE_WIDTH;\n return `${width / 2 - strokeWidth * 2}rem`;\n}\n \nexport function getCircleClassName(\n percentage: number,\n scoreThresholds: ScoreThresholds = ScoreThresholdDefaults\n): string {\n if (percentage >= scoreThresholds.HIGH)\n return styles.circleSuccess;\n \n if (percentage >= scoreThresholds.MODERATE)\n return styles.circleWarning;\n \n return styles.circleDanger;\n}\n \nexport function getColouredLabelClassName(\n percentage: number,\n scoreThresholds: ScoreThresholds = ScoreThresholdDefaults\n): string {\n if (percentage >= scoreThresholds.HIGH)\n return 'text-success';\n \n if (percentage >= scoreThresholds.MODERATE)\n return 'text-warning';\n \n return 'text-danger';\n}\n \nexport function getCircleContainerClassName(size: ProgressCircleSize, percentage?: number): string {\n let className = `d-inline-block ${styles.circleContainer}`;\n \n if (size === ProgressCircleSize.Large)\n className += ` ${styles.lgCircleContainer}`;\n\n if (size === ProgressCircleSize.ExtraSmall)\n className += ` ${styles.xsCircleContainer}`;\n\n if (isPending(percentage))\n className += ` ${styles.pendingCircle}`;\n \n return className;\n}\n\nexport function getPercentageToFixed(percentage?: number): number | undefined {\n if (isPending(percentage))\n return;\n \n return +percentage.toFixed(2);\n}\n \nexport function getFormattedPercentage(percentage?: number): string {\n if (isPending(percentage))\n return `--%`;\n\n return `${Math.round(percentage * 100)}%`;\n}\n\nexport function isPending(percentage?: number): boolean {\n return typeof percentage !== 'number';\n}","export interface ScoreThresholds {\n HIGH: number;\n MODERATE: number;\n}\n\nexport const ScoreThresholdDefaults: ScoreThresholds = {\n HIGH: 0.75,\n MODERATE: 0.5\n};\n\nexport const ScoreThresholdInsights: ScoreThresholds = {\n HIGH: 0.7,\n MODERATE: 0.7\n};","import { BaseError } from 'libs/common/backbone/core/BaseError';\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Core } from 'libs/common/core';\n\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { PrivateResourceError } from 'libs/shared/errors/general/private-resource/PrivateResourceError';\nimport { RegionLockedResourceError } from 'libs/shared/errors/general/region-locked-resource/RegionLockedResourceError';\nimport { UnspecifiedError } from 'libs/shared/errors/general/unspecified-error/UnspecifiedError';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nexport interface HttpErrorMap {\n notFound?: new () => BaseError;\n forbidden?: {\n rating?: new (description: string) => BaseError;\n yearLevel?: new (description: string) => BaseError;\n region?: new () => BaseError;\n privacy?: new (video?: VideoTypes) => BaseError;\n };\n badRequest?: new () => BaseError;\n internalServerError?: new () => BaseError;\n}\n\nexport type IgnoreHttpErrorMap = {\n [key in keyof HttpErrorMap]: boolean;\n};\n\nconst defaultErrors: HttpErrorMap = {\n notFound: NotFoundError,\n forbidden: {\n rating: PrivateResourceError,\n yearLevel: PrivateResourceError,\n region: RegionLockedResourceError,\n privacy: PrivateResourceError\n },\n badRequest: UnspecifiedError,\n internalServerError: UnspecifiedError\n};\n\nexport function handleHttpError(\n info: HttpStatus | Xhr,\n customErrorMap: HttpErrorMap = {},\n /**\n * Prevent certain errors in the errorMap from being thrown\n * so that you may implement your own handler\n */\n ignoreMap: IgnoreHttpErrorMap = {}\n): void {\n if (!info)\n return;\n\n let statusCode: HttpStatus;\n\n if (typeof(info) === 'number') {\n statusCode = info;\n } else {\n statusCode = info.status;\n }\n\n const errorMap = {\n ...defaultErrors,\n ...customErrorMap\n };\n\n if (!statusCode)\n return;\n\n if (!Core.ErrorHelper.isStatusCodeError(statusCode))\n return;\n\n if (statusCode === HttpStatus.InternalServer) {\n if (!ignoreMap.internalServerError)\n Core.ErrorHelper.throw(new UnspecifiedError());\n return;\n }\n\n if (statusCode === HttpStatus.NotFound) {\n if (!ignoreMap.notFound)\n Core.ErrorHelper.throw(new errorMap.notFound());\n return;\n }\n\n if (statusCode === HttpStatus.Forbidden) {\n /**\n * TODO: Work out how to go about handling all forbidden errors, such as region locking, year levels,\n * ratings, and privacy.\n */\n if (!ignoreMap.forbidden)\n Core.ErrorHelper.throw(new errorMap.forbidden.privacy());\n return;\n }\n\n if (!ignoreMap.badRequest)\n Core.ErrorHelper.throw(new errorMap.badRequest());\n}\n\nexport function handleXhrError(xhr: Xhr, customErrorMap?: HttpErrorMap): void {\n handleHttpError(xhr.status, customErrorMap);\n}","import { useEffect } from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { handleHttpError, HttpErrorMap, IgnoreHttpErrorMap } from 'libs/shared/errors/handlers/HttpErrorHandlers';\n\nfunction generateCacheKey(flightObjs: Array<Flight.Response<any>>): string {\n return flightObjs.map(obj => obj.statusCode).join(':');\n}\n\n// TODO: Change this to just `useHandleHttpError` and only accept a status code.\nexport function useHandleObjectError(\n _flightObjs: Flight.Response<any> | Array<Flight.Response<any>>,\n customErrors?: HttpErrorMap,\n ignoreErrors?: IgnoreHttpErrorMap\n): void {\n const flightObjs = Array.isArray(_flightObjs) ? _flightObjs : [_flightObjs];\n\n useEffect(() => {\n flightObjs.forEach(obj => {\n handleHttpError(obj.statusCode, customErrors, ignoreErrors);\n });\n }, [ generateCacheKey(flightObjs), customErrors, ignoreErrors ]);\n}","import { AnalyticsRequestFilter } from 'libs/shared/interfaces';\n\nexport function getAnalyticsRequestKey(baseKey: string, filter: AnalyticsRequestFilter, sharerId?: string): string {\n let key = `${baseKey}:${filter.start}:${filter.end}`;\n\n const userIdKey = Array.isArray(filter.userId) ? filter.userId.sort().join(':') : filter.userId;\n const groupIdKey = Array.isArray(filter.groupId) ? filter.groupId.sort().join(':') : filter.groupId;\n\n if (userIdKey)\n key += `:${userIdKey}`;\n\n if (groupIdKey)\n key += `:${groupIdKey}`;\n\n if (sharerId)\n key += `:${sharerId}`;\n\n return key;\n}","import { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { ContextService } from 'libs/shared/services/ContextService';\n\ninterface UpdateParamsOptions extends Core.AppLinkOptions {\n merge?: boolean;\n keysToRemove?: string[]\n}\n\nexport const AppRouteHelper = {\n /**\n * Utility to update the params on the current appRoute.\n * \n * This is built on top of ContextService rather than build into AppLink\n * as we will generally only want to update params on appRoutes, not appLinks.\n */\n updateParams(params: HashObject, options?: UpdateParamsOptions): void {\n const { appLink } = ContextService.getCurrentRoute();\n\n let currentParams = typeof(appLink.params) === 'string'\n ? Core.LocationUtils.DeserializeQueryParams(appLink.params)\n : appLink.params as HashObject;\n\n if (options.keysToRemove)\n currentParams = ObjectHelper.omit(currentParams, options.keysToRemove);\n\n const updatedParams = options?.merge\n ? { ...currentParams, ...params }\n : params;\n\n const updatedAppLink = {\n ...appLink,\n params: updatedParams\n };\n\n /**\n * This prevents us pointlessly re-triggering if we're already on the right applink.\n */\n if (ObjectHelper.isEqual(appLink, updatedAppLink))\n return;\n \n Core.AppLinkHelper.trigger(updatedAppLink, ObjectHelper.omit(options, [ 'merge', 'keysToRemove' ]));\n }\n};","// extracted by mini-css-extract-plugin\nexport default {\"circleContainer\":\"p8Vgz\",\"backgroundCircle\":\"asGGE\",\"circleSuccess\":\"PXLNj\",\"circleWarning\":\"ZckRN\",\"circleDanger\":\"slBRg\",\"lgCircleContainer\":\"N8KCI\",\"xsCircleContainer\":\"RPqZ2\",\"pendingCircle\":\"DKrcq\",\"centredPercentageText\":\"tpmLR\"};"],"names":["AnalyticsFilterHelper","getAudienceAppLinkParams","appLink","params","users","classrooms","classroomGroups","getParam","key","param","Array","isArray","audienceFilters","getDateRangeAppLinkParams","from","to","rangeName","dateRangeFilters","anonymiseUserName","user","shouldAnonymise","id","profileId","seed","Math","floor","Date","getMinutes","dictionaries","separator","length","style","name","getAudienceParams","queryParams","userId","groupId","push","getPhrase","convertDateToUtcDateTimeString","date","utc","getMinDate","getMaxDate","getDefaultDateRange","dateRangePresets","find","range","getPresetRangeByName","dateRangePresetss","p","getInsightsDateRangePresets","minDate","currentYear","getFullYear","isMinDateThisYear","startDate","endDate","getMonth","disabled","tooltip","default","formatDateQueryParam","getRouteQueryParams","dateRange","useGetDateRangeFromQueryParams","dateRangeQueryParams","presetRange","replace","merge","keysToRemove","defaultDateRange","initialDateRangeValid","getStartEndParams","filterParams","getStartDate","getEndDate","start","end","defaultRange","namespace","getReportFriendlyDate","localDate","toString","GenerateInteractiveResultsReportView","props","anonymiseUsers","alerts","fetchAsync","audienceAppLinkParams","dateRangeAppLinkParams","startEndParams","showSpinner","setShowSpinner","currentUser","interactiveMetadata","interactiveId","interactive","data","results","interactions","answerData","value","title","showLoadingSpinner","hasCompleted","closePopup","phrase","options","dateFrom","dateTo","email","onClick","variant","body","interactiveName","customerId","questions","map","i","rows","answer","unanswered","summary","percentage","percentCorrect","correct","totalQuestions","answered","interaction","I","then","success","error","text","PercentageIndicatorLayout","ProgressCircle","ref","circle","radius","r","baseVal","circumference","PI","offset","strokeDasharray","strokeDashoffset","size","className","scoreThresholds","PercentageIndicator","percentageToFixed","layout","LabelInside","label","customLabel","LabelOnly","LabelBefore","defaultProps","CircleOnly","ProgressCircleSize","CIRCLE_STROKE_WIDTH","CIRCLE_STROKE_WIDTH_LG","ProgressCircleSizeMap","ExtraSmall","Small","Large","getCircleRadius","width","strokeWidth","getCircleClassName","HIGH","MODERATE","getColouredLabelClassName","getCircleContainerClassName","isPending","getPercentageToFixed","toFixed","getFormattedPercentage","round","ScoreThresholdDefaults","ScoreThresholdInsights","defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","internalServerError","handleHttpError","info","customErrorMap","ignoreMap","statusCode","status","errorMap","generateCacheKey","flightObjs","obj","join","useHandleObjectError","_flightObjs","customErrors","ignoreErrors","useEffect","forEach","getAnalyticsRequestKey","baseKey","filter","sharerId","userIdKey","sort","groupIdKey","AppRouteHelper","updateParams","currentParams","updatedParams","updatedAppLink"],"sourceRoot":""}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[3180],{66122:(e,t,n)=>{n.d(t,{A:()=>r});var a=n(32735);function r(e){return a.createElement("span",{id:"".concat(e.name,"Error"),className:"".concat(e.className," invalid-feedback d-block"),role:"status"},e.children)}},59536:(e,t,n)=>{n.d(t,{o:()=>f});var a=n(32735);function r(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];if(!t.length)return"";var a=t.filter((function(e){return!!e}));return a.length?a.join(" "):""}var l=n(2786),c=n(4594);const o="s6wnJ",i="UFQ2T",s="Tp9_3";function u(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,r,l,c,o=[],i=!0,s=!1;try{if(l=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;i=!1}else for(;!(i=(a=l.call(n)).done)&&(o.push(a.value),o.length!==t);i=!0);}catch(e){s=!0,r=e}finally{try{if(!i&&null!=n.return&&(c=n.return(),Object(c)!==c))return}finally{if(s)throw r}}return o}}(e,t)||function(e,t){if(e){if("string"==typeof e)return m(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?m(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function m(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}function d(e){switch(e){case c.E.Video:case c.E.Interactive:case c.E.Clip:return"y0V3Z";case c.E.Subject:case c.E.Playlist:return"x3h8F";case c.E.Series:return"Wrg5x";default:return""}}function f(e){return a.createElement("div",{className:"d-flex"},e.children)}var b={cover:s,full:"AlF2T"},g={base:"uQ2rm",full:""};f.NarrowContent=function(e){return a.createElement("div",{className:"".concat("INvJ0"," mx-auto w-100 ").concat(e.className?e.className:"")},e.children)},f.Left=function(e){return a.createElement("div",{className:"".concat(o," ").concat(e.className?e.className:"")},e.children)},f.LeftImage=function(e){var t=u(a.useState(!1),2),n=t[0],r=t[1],l=u(a.useState(""),2),c=l[0],m=l[1];return a.useEffect((function(){if(e.imageUrl){var t=new Image;return t.onload=function(){return r(!0)},t.src=e.imageUrl,function(){return t.onload=null}}var n=e.fallbackImages[Math.floor(Math.random()*e.fallbackImages.length)];m(n.bgUrl)}),[e.imageUrl]),a.createElement("div",{className:"".concat(o," ").concat(i," ").concat(s," bg-light"),style:{backgroundImage:"url('".concat(c,"')")}},n&&a.createElement(a.Fragment,null,a.createElement("div",{className:"Mtlg9",style:{backgroundImage:"url('".concat(e.imageUrl,"')")}}),a.createElement("div",{className:"".concat("NxEjh"," ").concat(d(e.objectType))},a.createElement("div",{className:"NN9cV"},a.createElement("img",{className:"PkJ8J",src:e.imageUrl,alt:e.title})))))},f.LeftImageWithBackground=function(e){var t={backgroundImage:'url("'.concat(e.imageUrl,'")')};return e.backgroundColor&&(t.backgroundColor=e.backgroundColor),a.createElement("div",{className:"".concat(o," ").concat(i," ").concat(b[e.imageSize||"cover"]," d-flex align-items-center"),style:t,title:e.title})},f.Right=function(e){return a.createElement("div",{className:"".concat("eoZzJ"," ").concat(e.className?e.className:"")},e.children)},f.Header=function(e){var t=(null==e?void 0:e.logoComponent)||l.$S;return a.createElement("div",{className:"position-relative"},a.createElement("div",{className:"".concat("YHNgA"," position-absolute")},a.createElement(t,null)),e.children)},f.Content=function(e){return a.createElement("div",{className:r("RVyLM","d-flex flex-column justify-content-center h-100",null==e?void 0:e.className)},e.children)},f.ContentBody=function(e){var t=g[e.width||"base"];return a.createElement("div",{className:r("aLd5V",t,"m-auto p-3",e.className)},e.children)},f.Buttons=function(e){return a.createElement("div",{className:r("position-fixed bg-white d-flex align-items-center","ZW85Q",null==e?void 0:e.className)},e.children)}},63180:(e,t,n)=>{n.r(t),n.d(t,{SelectAnonUserView:()=>P});var a=n(32735),r=n(81886),l=n(20354),c=n(75896),o=n(30439),i=n(64249),s=n(11607),u=n(66122),m=n(75163),d=n(59536),f=n(83345),b=n(54610),g=n(67453),h=n(31908),v=n(83421),p=n(13746),E=n(71214),N=n(75608);const y={aviBackground:"oHeDN",aviContainer:"J3O78",aviIcon:"vNvft"};var C=["🐵","🐒","🦍","🦧","🐶","🐕","🦮","🐕🦺","🐩","🐺","🦊","🦝","🐱","🐈","🐈⬛","🦁","🐯","🐅","🐆","🐴","🐎","🦄","🦓","🦌","🐮","🐂","🐃","🐄","🐷","🐖","🐗","🐽","🐏","🐑","🐐","🦙","🦒","🐘","🦣","🦏","🦛","🦘","🦥","🦦","🦨","🦡","🐇","🐁","🐀","🦔","🐿️","🦇","🐉","🦎","🐍","🐢","🐊","🦖","🦕","🐙","🦑","🦐","🦞","🦀","🦪","🐡","🐠","🐟","🐬","🐳","🐋","🦈","🦭","🐾"],k=["bg-orange","bg-indigo","bg-teal","bg-cyan","bg-purple","bg-pink","bg-red","bg-yellow","bg-green","bg-blue"];function U(e,t){for(var n,a=0,r=0;null!==(n=r<(null==e?void 0:e.length))&&void 0!==n&&n;r++)a+=e.charCodeAt(r);return t[a%t.length]}function I(e){return a.createElement("span",{className:"h1 d-block mb-0 position-relative ".concat(y.aviContainer)},a.createElement("span",{className:"\n ".concat(U(e.recipient.publicName,k),"\n rounded-circle\n position-absolute\n top-0\n start-0\n bottom-0\n end-0\n ").concat(y.aviBackground,"\n ")}),a.createElement("span",{className:"\n ".concat(y.aviIcon,"\n position-absolute\n top-50\n start-50\n ")},U(e.recipient.publicName,C)))}const w={confirmationContainer:"TIEUw"};function j(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,r,l,c,o=[],i=!0,s=!1;try{if(l=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;i=!1}else for(;!(i=(a=l.call(n)).done)&&(o.push(a.value),o.length!==t);i=!0);}catch(e){s=!0,r=e}finally{try{if(!i&&null!=n.return&&(c=n.return(),Object(c)!==c))return}finally{if(s)throw r}}return o}}(e,t)||function(e,t){if(e){if("string"==typeof e)return x(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?x(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function x(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var S="launchpad.selectAnonUser";function P(e){var t,n=j(a.useState(E.h.getPublicUser()||""),2),y=n[0],C=n[1],k=j(a.useState(!!E.h.getPublicUser()),2),U=k[0],x=k[1],P=j(a.useState(""),2),A=P[0],L=P[1],B=j(a.useState("enter-name"),2),O=B[0],T=B[1],_=j(a.useState(null),2),W=_[0],F=_[1],R=j(a.useState(null),2),G=R[0],M=R[1],D=(0,N.a)(e.shareId),V=l.a.useBasicFetch(o.o.getShareRecipients(e.shareId));function J(e){e.preventDefault(),(null==y?void 0:y.trim())?(W||F("enter-name"),T("confirm")):L("Please provide a name")}if(a.useLayoutEffect((function(){p.R.remove()}),[]),a.useEffect((function(){var e,t;if(V.hasCompleted)return E.h.getPublicUser()?(T("confirm"),void F((null===(e=V.data)||void 0===e?void 0:e.length)?"select-user":"enter-name")):void((null===(t=V.data)||void 0===t?void 0:t.length)&&T("select-user"))}),[V.hasCompleted]),!D||!V.hasCompleted)return a.createElement(a.Fragment,null);var H=g.j.createUrl(i.I.getImageUrl(D),{size:b.h2.Large});return a.createElement(d.o,null,a.createElement(d.o.LeftImage,{title:D.name,imageUrl:H,objectType:D.typeId,fallbackImages:v.Hq}),a.createElement(d.o.Right,null,a.createElement(d.o.Header,null),a.createElement(d.o.Content,null,a.createElement("div",{className:"mb-auto text-center"},h.M.isInteractive(D)&&a.createElement("div",{className:"mb-3 d-lg-none d-block w-75 mx-auto"},a.createElement(m.Z,{data:h.M.getThumbnail(D),imageType:b.__.Thumbnails,className:"rounded-3 overflow-hidden"})),a.createElement("h1",{className:"h2"},D.name)),"enter-name"===O&&a.createElement(a.Fragment,null,a.createElement(d.o.NarrowContent,{className:"mb-auto"},a.createElement("form",{onSubmit:J},a.createElement("div",{className:"form-group"},a.createElement("label",{className:"h2",htmlFor:"name"},"Enter your name"),a.createElement("input",{className:"form-control form-control-lg ".concat(A?"is-invalid":""),type:"text","aria-label":"Enter your name...",placeholder:"Enter your name...",autoFocus:!0,value:y,onChange:function(e){C(e.target.value),L("")},autoComplete:"off",autoCorrect:"off",autoCapitalize:"none",spellCheck:"false",name:"name",id:"name"}),!!A&&a.createElement(u.A,{name:"name"},A)))),a.createElement(d.o.Buttons,null,!!(null===(t=V.data)||void 0===t?void 0:t.length)&&a.createElement("button",{className:"btn btn-link btn-lg",onClick:function(){return T("select-user")}},a.createElement(f.x,{namespace:S,phrase:"back"})),a.createElement("div",{className:"d-flex justify-content-end w-100"},a.createElement("button",{className:"btn btn-lg btn-dark",onClick:J},a.createElement(f.x,{namespace:S,phrase:"continue"}))))),"select-user"===O&&a.createElement(a.Fragment,null,a.createElement(d.o.NarrowContent,{className:"mb-auto"},a.createElement("h2",null,a.createElement(f.x,{namespace:S,phrase:"selectName"})),a.createElement("ul",{className:"list-unstyled row"},c.m.sortBy(V.data,(function(e){return e.publicName})).map((function(e,t){return a.createElement("li",{key:t,className:"col-3 p-2"},a.createElement(s.L,{className:"text-center rounded border py-2 ".concat((null==G?void 0:G.id)===e.id?"border-info bg-light-blue":""),onClick:function(){return function(e){M(e)}(e)}},a.createElement("div",{className:"px-3"},a.createElement(I,{recipient:e})),a.createElement("p",{className:"mb-0 mt-2 fw-semibold text-truncate"},e.publicName)))})))),a.createElement(d.o.Buttons,null,a.createElement("div",{className:"d-flex justify-content-between w-100"},a.createElement("button",{className:"btn btn-lg btn-link",onClick:function(){M(null),T("enter-name"),F("select-user")}},a.createElement(f.x,{namespace:S,phrase:"cantFindName"})),a.createElement("button",{className:"btn btn-lg btn-dark",onClick:function(){G&&(F("select-user"),T("confirm"))},disabled:!G},a.createElement(f.x,{namespace:S,phrase:"continue"}))))),"confirm"===O&&a.createElement(d.o.NarrowContent,{className:"mb-auto text-center"},G&&a.createElement("div",{className:"".concat(w.confirmationContainer," mx-auto")},a.createElement(I,{recipient:G})),a.createElement("p",{className:"h2"},a.createElement(f.x,{namespace:S,phrase:U?"welcome":"hi",options:{name:(null==G?void 0:G.publicName)||y}})),a.createElement("p",{className:"h2 mb-4"},a.createElement(f.x,{namespace:S,phrase:"ready"})),a.createElement("button",{className:"btn btn-lg btn-dark w-100 mb-3",onClick:function(){var t;E.h.setPublicUser((null==G?void 0:G.publicName)||y.trim());var n=r.Q.C$.getHref(Object.assign(Object.assign({},e.appLink),{params:Object.assign(Object.assign({},null!==(t=e.appLink.params)&&void 0!==t?t:{}),{anonUserSelected:!0})}));r.Q.Ab.PageLoad(n)}},a.createElement(f.x,{namespace:S,phrase:"start"})),a.createElement("button",{className:"btn btn-lg btn-link w-100",onClick:function(){C(""),T(W),x(!1)}},a.createElement(f.x,{namespace:S,phrase:"notMyName"}))))))}},75608:(e,t,n)=>{n.d(t,{a:()=>f});var a=n(20354),r=n(30439),l=n(4594),c=n(21750),o=n(43012),i=n(20768),s=n(5112),u=n(60011),m=n(31949),d=n(1575);function f(e){var t=a.a.useBasicFetch(m.N.currentUser()),n=a.a.useBasicFetch(r.o.getShareObject(e)),f=function(){if(!n.data||!t.data)return null;switch(n.data.objectTypeId){case l.E.Video:return d.R.publicVideo(n.data.objectId,e);case l.E.Clip:return o.e.publicClip(n.data.objectId,e);case l.E.Interactive:return i.b.publicInteractiveMetadata(n.data.objectId,e);case l.E.Playlist:return s.C.getSharedPlaylist(n.data.objectId,e);case l.E.Subject:return c.x.classification(n.data.objectId,t.data.id);case l.E.Series:return u.J.sharedSeries(n.data.objectId,e)}}();return a.a.useBasicFetch(f).data}},83421:(e,t,n)=>{n.d(t,{Hq:()=>m,Zf:()=>b});var a=n(32735),r=n(54610),l=n(4594),c=n(67453),o=n(99742);const i={left:"vIypY",leftTextImage:"YViNj",right:"MkD4u",blur:"X6mCh",imageContainer:"bc7kz",imagePosition:"JOhEj",image:"Ef2QR",thumbnail:"Gdurb",tallposter:"fjVNK",cover:"o3j31",linksContainer:"AT9Dk"};function s(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,r,l,c,o=[],i=!0,s=!1;try{if(l=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;i=!1}else for(;!(i=(a=l.call(n)).done)&&(o.push(a.value),o.length!==t);i=!0);}catch(e){s=!0,r=e}finally{try{if(!i&&null!=n.return&&(c=n.return(),Object(c)!==c))return}finally{if(s)throw r}}return o}}(e,t)||function(e,t){if(e){if("string"==typeof e)return u(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?u(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function u(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var m=[{bgUrl:o.W.LaunchPad.BG_1},{bgUrl:o.W.LaunchPad.BG_2},{bgUrl:o.W.LaunchPad.BG_3},{bgUrl:o.W.LaunchPad.BG_4},{bgUrl:o.W.LaunchPad.BG_5}],d=[{bgUrl:o.W.LaunchPad.PRODUCT.BG_1},{bgUrl:o.W.LaunchPad.PRODUCT.BG_2},{bgUrl:o.W.LaunchPad.PRODUCT.BG_3},{bgUrl:o.W.LaunchPad.PRODUCT.BG_4},{bgUrl:o.W.LaunchPad.PRODUCT.BG_5},{bgUrl:o.W.LaunchPad.PRODUCT.BG_6},{bgUrl:o.W.LaunchPad.PRODUCT.BG_7},{bgUrl:o.W.LaunchPad.PRODUCT.BG_8},{bgUrl:o.W.LaunchPad.PRODUCT.BG_9}];function f(e){switch(e){case l.E.Video:case l.E.Interactive:case l.E.Clip:return i.thumbnail;case l.E.Subject:case l.E.Playlist:return i.cover;case l.E.Series:return i.tallposter;default:return""}}function b(e){var t,n=s(a.useState(!1),2),l=n[0],o=n[1],u=s(a.useState(""),2),m=u[0],b=u[1],g=c.j.createUrl(e.imageUrl,{size:r.h2.Large}),h=d;return a.useEffect((function(){if(!g&&h&&0!==h.length){var e,t=(e=h)[Math.floor(Math.random()*e.length)];t.bgUrl&&b(t.bgUrl)}}),[]),a.useEffect((function(){if(g){var e=new Image;return e.onload=function(){return o(!0)},e.src=g,function(){return e.onload=null}}}),[]),a.createElement("div",{className:"d-flex"},e.leftComponent?e.leftComponent():a.createElement("div",{className:"".concat(i.left," ").concat(m?"bg-blue d-flex align-items-center":"bg-light")},m?a.createElement("img",{className:"img-fluid",src:m,draggable:!1}):l&&a.createElement(a.Fragment,null,a.createElement("div",{className:i.blur,style:{backgroundImage:"url('".concat(g,"')")}}),a.createElement("div",{className:"".concat(i.imageContainer," ").concat(f(e.objectType))},a.createElement("div",{className:i.imagePosition},a.createElement("img",{className:i.image,src:g,alt:e.title}))))),a.createElement("div",{className:"".concat(i.right," bg-white d-flex flex-column")},a.createElement("div",{className:"position-absolute d-flex align-items-center ".concat(i.linksContainer)},null===(t=e.links)||void 0===t?void 0:t.map((function(e,t){return e.hide?a.createElement(a.Fragment,{key:t}):a.createElement("a",{key:t,href:e.url,className:"info-link fw-semibold",onClick:e.onClick},e.text)}))),e.children))}}}]);
|
|
2
|
-
//# sourceMappingURL=3180-22edf4c9fc-lite.chunk.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/3180-22edf4c9fc-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/components/forms/form-feedback/FormFeedback.tsx","file:///app/packages/libs/common/src/react/utils/ClassNameHelper.ts","file:///app/packages/libs/shared/src/components/launchpad/v2/launchpad-v2.scss","file:///app/packages/libs/shared/src/components/launchpad/v2/LaunchpadV2.tsx","file:///app/packages/projects/lite/src/apps/launchpad/views/select-anon-user/components/emoji-avi.scss","file:///app/packages/projects/lite/src/apps/launchpad/views/select-anon-user/components/EmojiAvi.tsx","file:///app/packages/projects/lite/src/apps/launchpad/views/select-anon-user/select-anon-user.scss","file:///app/packages/projects/lite/src/apps/launchpad/views/select-anon-user/SelectAnonUserView.tsx","file:///app/packages/projects/lite/src/apps/share/hooks/useFetchSharedResource.ts","file:///app/packages/projects/lite/src/shared/components/launchpad/launchpad.scss","file:///app/packages/projects/lite/src/shared/components/launchpad/Launchpad.tsx"],"sourcesContent":["import React from 'react';\n\ninterface FormFeedbackProps extends React.PropsWithChildren {\n name: string;\n className?: string;\n}\n\nexport function FormFeedback(props: FormFeedbackProps) {\n return (\n <span id={`${props.name}Error`} className={`${props.className} invalid-feedback d-block`} role='status'>{props.children}</span>\n );\n}","type ValidParams = string | boolean | undefined | null;\n\n/**\n * Helper to append classNames.\n * Filters any falsy values before returning classNames.\n * \n * @param ...classNames Array<string | boolean | undefined | null>\n * @returns string\n */\nexport function classNames(...classNames: Array<ValidParams>): string {\n if (!classNames.length) return '';\n\n const filteredClassNames = classNames.filter(className => !!className);\n \n if (!filteredClassNames.length) return '';\n \n return filteredClassNames.join(' ');\n}","// extracted by mini-css-extract-plugin\nexport default {\"left\":\"s6wnJ\",\"leftWithImage\":\"UFQ2T\",\"bgCover\":\"Tp9_3\",\"bgFull\":\"AlF2T\",\"right\":\"eoZzJ\",\"rightContent\":\"RVyLM\",\"narrowContent\":\"INvJ0\",\"logo\":\"YHNgA\",\"buttonContainer\":\"ZW85Q\",\"blur\":\"Mtlg9\",\"imageContainer\":\"NxEjh\",\"imagePosition\":\"NN9cV\",\"image\":\"PkJ8J\",\"thumbnail\":\"y0V3Z\",\"tallposter\":\"Wrg5x\",\"cover\":\"x3h8F\",\"contentBody\":\"aLd5V\",\"contentBodyBase\":\"uQ2rm\"};","import React from 'react';\n\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { ClickViewLogo } from 'libs/shared/components/svgs/clickview-logo/ClickViewLogo';\nimport { MasterType } from 'libs/shared/enums/MasterType';\n\nimport styles from './launchpad-v2.scss';\n\nfunction mapObjectTypeToImageClass(objectType: MasterType): string {\n switch (objectType) {\n case MasterType.Video:\n case MasterType.Interactive:\n case MasterType.Clip:\n return styles.thumbnail;\n\n case MasterType.Subject:\n case MasterType.Playlist:\n return styles.cover;\n\n case MasterType.Series:\n return styles.tallposter;\n\n default:\n return '';\n }\n}\n\ninterface LaunchpadV2Props {\n}\n\nexport function LaunchpadV2(props: React.PropsWithChildren<LaunchpadV2Props>): JSX.Element {\n return (\n <div className='d-flex'>\n {props.children}\n </div>\n );\n}\n\ninterface LeftPanelProps {\n className?: string;\n}\n\n\nfunction LeftPanel(props: React.PropsWithChildren<LeftPanelProps>): JSX.Element {\n return (\n <div className={`${styles.left} ${props.className ? props.className : ''}`}>\n {props.children}\n </div>\n );\n}\n\ninterface LeftImageProps {\n objectType?: MasterType;\n title?: string;\n imageUrl?: string;\n fallbackImages: LaunchImage[];\n}\n\ninterface LaunchImage {\n bgUrl: string;\n}\n\nfunction LeftImage(props: LeftImageProps): JSX.Element {\n const [ showImage, setShowImage ] = React.useState(false);\n const [ image, setImage ] = React.useState<string>('');\n\n React.useEffect(() => {\n if (!props.imageUrl) {\n const image = props.fallbackImages[Math.floor(Math.random() * props.fallbackImages.length)];\n setImage(image.bgUrl);\n return;\n }\n\n const img = new Image();\n img.onload = () => setShowImage(true);\n img.src = props.imageUrl;\n return () => img.onload = null;\n }, [props.imageUrl]);\n\n return (\n <div\n className={`${styles.left} ${styles.leftWithImage} ${styles.bgCover} bg-light`}\n style={{ backgroundImage: `url('${image}')` }}\n >\n {showImage &&\n <>\n <div className={styles.blur} style={{ backgroundImage: `url('${props.imageUrl}')` }} />\n <div className={`${styles.imageContainer} ${mapObjectTypeToImageClass(props.objectType)}`}>\n <div className={styles.imagePosition}>\n <img className={styles.image} src={props.imageUrl} alt={props.title} />\n </div>\n </div>\n </>\n }\n </div>\n );\n}\n\ntype ImageSizeType = 'cover' | 'full';\n\ninterface LeftImageWithBackgroundProps {\n imageUrl: string;\n imageSize?: ImageSizeType;\n backgroundColor?: string;\n title?: string;\n}\n\nconst imageSizeMap: {[key in ImageSizeType]: string} = {\n cover: styles.bgCover,\n full: styles.bgFull\n};\n\nfunction LeftImageWithBackground(props: LeftImageWithBackgroundProps): JSX.Element {\n const bgStyles: React.CSSProperties = {\n backgroundImage: `url(\"${props.imageUrl}\")`\n };\n\n if (props.backgroundColor)\n bgStyles.backgroundColor = props.backgroundColor;\n \n return (\n <div\n className={`${styles.left} ${styles.leftWithImage} ${imageSizeMap[props.imageSize || 'cover']} d-flex align-items-center`}\n style={bgStyles}\n title={props.title}\n />\n );\n}\n\ninterface RightPanelProps {\n className?: string;\n}\n\nexport function RightPanel(props: React.PropsWithChildren<RightPanelProps>): JSX.Element {\n return (\n <div className={`${styles.right} ${props.className ? props.className : ''}`}>\n {props.children}\n </div>\n );\n}\n\ninterface HeaderProps {\n logoComponent?: () => JSX.Element;\n}\n\n\nfunction Header(props: React.PropsWithChildren<HeaderProps>): JSX.Element {\n const LogoComponent = props?.logoComponent || ClickViewLogo;\n \n return (\n <div className='position-relative'>\n <div className={`${styles.logo} position-absolute`}>\n <LogoComponent />\n </div>\n {props.children}\n </div>\n );\n}\n\ninterface ContentProps {\n className?: string;\n}\n\nfunction Content(props: React.PropsWithChildren<ContentProps>): JSX.Element {\n return (\n <div className={classNames(styles.rightContent, 'd-flex flex-column justify-content-center h-100', props?.className)}>\n {props.children}\n </div>\n );\n}\n\ninterface ContentBodyProps {\n className?: string;\n width?: 'base' | 'full';\n}\n\nconst widthClassNameMap: {[key in ContentBodyProps['width']]: string} = {\n base: styles.contentBodyBase,\n full: ''\n};\n\nfunction ContentBody(props: React.PropsWithChildren<ContentBodyProps>): JSX.Element {\n const widthClassName = widthClassNameMap[props.width || 'base'];\n return (\n <div className={classNames(styles.contentBody, widthClassName, 'm-auto p-3', props.className)}>\n {props.children}\n </div>\n );\n}\n\ninterface NarrowContentProps {\n className?: string;\n}\n\nLaunchpadV2.NarrowContent = NarrowContent;\nfunction NarrowContent(props: React.PropsWithChildren<NarrowContentProps>): JSX.Element {\n return (\n <div className={`${styles.narrowContent} mx-auto w-100 ${props.className ? props.className : ''}`}>\n {props.children}\n </div>\n );\n}\n\ninterface ButtonsProps {\n className?: string;\n}\n\nfunction Buttons(props: React.PropsWithChildren<ButtonsProps>): JSX.Element {\n return (\n <div className={classNames('position-fixed bg-white d-flex align-items-center', styles.buttonContainer, props?.className)}>\n {props.children}\n </div>\n );\n}\n\n/**\n * Intended ussage below:\n * \n * <LaunchpadV2>\n * <LaunchpadV2.Left>\n * // Your LHS content here\n * </LaunchpadV2.Left>\n * <LaunchpadV2.Right>\n * <LaunchpadV2.Header />\n * <LaunchpadV2.Content>\n * // Can omit this if it needs to be full width\n * <LaunchpadV2.ContentBody width=\"...\">\n * // Your main content here\n * </LaunchpadV2.ContentBody>\n * </LaunchpadV2.Content>\n * \n * // Omit this and put your buttons in content\n * // if you want your buttons immediately under your content rather \n * // than at the bottom of the screen\n * <LaunchpadV2.Buttons />\n * \n * </LaunchpadV2.Right>\n * </LaunchpadV2>\n * \n * - Sha\n */\n\nLaunchpadV2.Left = LeftPanel;\nLaunchpadV2.LeftImage = LeftImage;\nLaunchpadV2.LeftImageWithBackground = LeftImageWithBackground;\nLaunchpadV2.Right = RightPanel;\nLaunchpadV2.Header = Header;\nLaunchpadV2.Content = Content;\nLaunchpadV2.ContentBody = ContentBody;\nLaunchpadV2.Buttons = Buttons;\n","// extracted by mini-css-extract-plugin\nexport default {\"aviBackground\":\"oHeDN\",\"aviContainer\":\"J3O78\",\"aviIcon\":\"vNvft\"};","import React from 'react';\n\nimport { AnonymisedUser } from 'libs/shared/apps/share/interfaces/AnonymisedUser';\n\nimport styles from './emoji-avi.scss';\n\nconst AVIS = [\n '🐵', '🐒', '🦍', '🦧', '🐶', '🐕', '🦮', '🐕🦺', '🐩', '🐺',\n '🦊', '🦝', '🐱', '🐈', '🐈⬛', '🦁', '🐯', '🐅', '🐆', '🐴',\n '🐎', '🦄', '🦓', '🦌', '🐮', '🐂', '🐃', '🐄', '🐷', '🐖',\n '🐗', '🐽', '🐏', '🐑', '🐐', '🦙', '🦒', '🐘', '🦣', '🦏',\n '🦛', '🦘', '🦥', '🦦', '🦨', '🦡', '🐇', '🐁', '🐀', '🦔',\n '🐿️', '🦇', '🐉', '🦎', '🐍', '🐢', '🐊', '🦖', '🦕', '🐙',\n '🦑', '🦐', '🦞', '🦀', '🦪', '🐡', '🐠', '🐟', '🐬', '🐳',\n '🐋', '🦈', '🦭', '🐾'\n];\n\nconst BACKGROUNDS = [\n 'bg-orange',\n 'bg-indigo',\n 'bg-teal',\n 'bg-cyan',\n 'bg-purple',\n 'bg-pink',\n 'bg-red',\n 'bg-yellow',\n 'bg-green',\n 'bg-blue'\n];\n\nfunction getRandom(name: string, collection: string[]): string {\n let charCode = 0;\n\n for (let i = 0; i < name?.length ?? 0; i++) {\n charCode += name.charCodeAt(i);\n }\n \n return collection[charCode % collection.length];\n}\n\ninterface EmojiAviProps {\n recipient: AnonymisedUser;\n}\n\nexport function EmojiAvi(props: EmojiAviProps): JSX.Element {\n return (\n <span className={`h1 d-block mb-0 position-relative ${styles.aviContainer}`}>\n <span\n className={`\n ${getRandom(props.recipient.publicName, BACKGROUNDS)}\n rounded-circle\n position-absolute\n top-0\n start-0\n bottom-0\n end-0\n ${styles.aviBackground}\n `}\n ></span>\n <span\n className={`\n ${styles.aviIcon}\n position-absolute\n top-50\n start-50\n `}\n >\n {getRandom(props.recipient.publicName, AVIS)}\n </span>\n </span>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"confirmationContainer\":\"TIEUw\"};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { Flight } from 'libs/common/react/index';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { AnonymisedUser } from 'libs/shared/apps/share/interfaces/AnonymisedUser';\nimport { SharableEntity, ShareViewHelper } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { FormFeedback } from 'libs/shared/components/forms/form-feedback/FormFeedback';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { LaunchpadV2 } from 'libs/shared/components/launchpad/v2/LaunchpadV2';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ImageSize, ImageType } from 'libs/shared/enums/Images';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { LAUNCHPAD_FALLBACK_IMAGES } from 'shared/components/launchpad/Launchpad';\n\nimport { EmbedPlaceHolderHelper } from 'apps/embed/utils/EmbedPlaceholderHelper';\nimport { ShareLinkFilterHelpers } from 'apps/share/filters/share-link-filter/ShareLinkFilterHelpers';\nimport { useFetchSharedResource } from 'apps/share/hooks/useFetchSharedResource';\n\nimport { EmojiAvi } from './components/EmojiAvi';\n\nimport styles from './select-anon-user.scss';\n\nconst namespace = 'launchpad.selectAnonUser';\n\ntype Step = 'enter-name' | 'select-user' | 'confirm';\n\ninterface SelectAnonUserViewProps {\n shareId: string;\n appLink: Core.AppLink;\n}\n\n// eslint-disable-next-line rulesdir/require-view-title\nexport function SelectAnonUserView(props: SelectAnonUserViewProps): JSX.Element {\n const [ name, setName ] = React.useState(ShareLinkFilterHelpers.getPublicUser() || '');\n const [ isReturning, setIsReturning ] = React.useState(!!ShareLinkFilterHelpers.getPublicUser());\n const [ error, setError ] = React.useState('');\n const [ step, setStep ] = React.useState<Step>('enter-name');\n const [ backStep, setBackStep ] = React.useState<Step>(null);\n const [ selectedUser, setSelectedUser ] = React.useState<AnonymisedUser>(null);\n \n const sharedResource = useFetchSharedResource<SharableEntity>(props.shareId);\n const shareRecipients = Flight.useBasicFetch<AnonymisedUser[]>(ShareRequests.getShareRecipients(props.shareId));\n\n function onSetName(e: React.ChangeEvent<HTMLInputElement>): void {\n setName(e.target.value);\n setError('');\n }\n\n React.useLayoutEffect(() => {\n EmbedPlaceHolderHelper.remove();\n }, []);\n \n React.useEffect(() => {\n if (!shareRecipients.hasCompleted)\n return;\n\n if (ShareLinkFilterHelpers.getPublicUser()) {\n setStep('confirm');\n setBackStep(shareRecipients.data?.length ? 'select-user' : 'enter-name');\n return;\n }\n\n if (shareRecipients.data?.length)\n setStep('select-user');\n }, [shareRecipients.hasCompleted]);\n\n function onClickGoToQuiz(): void {\n ShareLinkFilterHelpers.setPublicUser(selectedUser?.publicName || name.trim());\n const href = Core.AppLinkHelper.getHref({\n ...props.appLink,\n params: {\n ...(props.appLink.params as object ?? {}),\n anonUserSelected: true\n }\n });\n Core.LocationUtils.PageLoad(href);\n }\n\n function onSubmit(e: React.FormEvent): void {\n e.preventDefault();\n\n if (!name?.trim()) {\n setError('Please provide a name');\n return;\n }\n\n if (!backStep)\n setBackStep('enter-name');\n setStep('confirm');\n }\n\n function onContinueAvi(): void {\n if (!selectedUser) return;\n\n setBackStep('select-user');\n setStep('confirm');\n }\n\n function onClickRecipient(recipient: AnonymisedUser): void {\n setSelectedUser(recipient);\n }\n\n const hasCompleted = (\n sharedResource &&\n shareRecipients.hasCompleted\n );\n\n if (!hasCompleted)\n return <></>;\n\n const leftImageUrl = ImageHelper.createUrl(ShareViewHelper.getImageUrl(sharedResource), { size: ImageSize.Large });\n\n return (\n <LaunchpadV2>\n <LaunchpadV2.LeftImage\n title={sharedResource.name}\n imageUrl={leftImageUrl}\n objectType={sharedResource.typeId}\n fallbackImages={LAUNCHPAD_FALLBACK_IMAGES}\n />\n <LaunchpadV2.Right>\n <LaunchpadV2.Header />\n <LaunchpadV2.Content>\n <div className='mb-auto text-center'>\n {VideoHelper.isInteractive(sharedResource) && (\n <div className='mb-3 d-lg-none d-block w-75 mx-auto'>\n <BaseImage\n data={VideoHelper.getThumbnail(sharedResource)}\n imageType={ImageType.Thumbnails}\n className='rounded-3 overflow-hidden'\n />\n </div>\n )}\n \n <h1 className='h2'>\n {sharedResource.name}\n </h1>\n </div>\n\n {step === 'enter-name' && (\n <>\n <LaunchpadV2.NarrowContent className='mb-auto'>\n <form onSubmit={onSubmit}>\n <div className='form-group'>\n <label className='h2' htmlFor='name'>Enter your name</label>\n <input\n className={`form-control form-control-lg ${error ? 'is-invalid' : ''}`}\n type='text'\n aria-label='Enter your name...'\n placeholder='Enter your name...'\n autoFocus\n value={name}\n onChange={onSetName}\n autoComplete='off'\n autoCorrect='off'\n autoCapitalize='none'\n spellCheck='false'\n name={'name'}\n id='name'\n />\n {!!error && <FormFeedback name='name'>{error}</FormFeedback>}\n </div>\n </form>\n </LaunchpadV2.NarrowContent>\n <LaunchpadV2.Buttons>\n {!!shareRecipients.data?.length &&\n <button\n className='btn btn-link btn-lg'\n onClick={() => setStep('select-user')}\n >\n <Text namespace={namespace} phrase='back' />\n </button>\n }\n <div className='d-flex justify-content-end w-100'>\n <button\n className='btn btn-lg btn-dark'\n onClick={onSubmit}\n >\n <Text namespace={namespace} phrase='continue' />\n </button>\n </div>\n </LaunchpadV2.Buttons>\n </>\n )}\n\n {step === 'select-user' && (\n <>\n <LaunchpadV2.NarrowContent className='mb-auto'>\n <h2><Text namespace={namespace} phrase='selectName' /></h2>\n <ul className='list-unstyled row'>\n {ArrayHelper.sortBy(shareRecipients.data, a => a.publicName).map((recipient, index) => {\n return (\n <li key={index} className='col-3 p-2'>\n <DivButton\n className={`text-center rounded border py-2 ${selectedUser?.id === recipient.id ? 'border-info bg-light-blue' : ''}`}\n onClick={() => onClickRecipient(recipient)}\n >\n <div className='px-3'>\n <EmojiAvi recipient={recipient} />\n </div>\n \n <p className='mb-0 mt-2 fw-semibold text-truncate'>{recipient.publicName}</p>\n </DivButton>\n </li>\n );\n })}\n </ul>\n </LaunchpadV2.NarrowContent>\n <LaunchpadV2.Buttons>\n <div className='d-flex justify-content-between w-100'>\n <button\n className='btn btn-lg btn-link'\n onClick={() => {\n setSelectedUser(null);\n setStep('enter-name');\n setBackStep('select-user');\n }}\n >\n <Text namespace={namespace} phrase='cantFindName' />\n </button>\n <button\n className='btn btn-lg btn-dark'\n onClick={onContinueAvi}\n disabled={!selectedUser}\n >\n <Text namespace={namespace} phrase='continue' />\n </button>\n </div>\n </LaunchpadV2.Buttons>\n </>\n )}\n\n {step === 'confirm' && (\n <LaunchpadV2.NarrowContent className='mb-auto text-center'>\n {selectedUser &&\n <div className={`${styles.confirmationContainer} mx-auto`}>\n <EmojiAvi recipient={selectedUser} />\n </div>\n }\n <p className='h2'>\n <Text\n namespace={namespace}\n phrase={isReturning ? 'welcome' : 'hi'}\n options={{ name: selectedUser?.publicName || name }}\n />\n </p>\n \n <p className='h2 mb-4'><Text namespace={namespace} phrase='ready' /></p>\n <button\n className='btn btn-lg btn-dark w-100 mb-3'\n onClick={onClickGoToQuiz}\n >\n <Text namespace={namespace} phrase='start' />\n </button>\n <button\n className='btn btn-lg btn-link w-100'\n onClick={() => {\n setName('');\n setStep(backStep);\n setIsReturning(false);\n }}\n >\n <Text namespace={namespace} phrase='notMyName' />\n </button>\n </LaunchpadV2.NarrowContent>\n )}\n </LaunchpadV2.Content>\n </LaunchpadV2.Right>\n </LaunchpadV2>\n );\n}\n\n","import { Flight } from 'libs/common/flight';\n\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ClassificationRequests } from 'libs/shared/flight-requests/ClassificationRequests';\nimport { ClipRequests } from 'libs/shared/flight-requests/ClipRequests';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { PlaylistRequests } from 'libs/shared/flight-requests/PlaylistRequests';\nimport { SeriesRequests } from 'libs/shared/flight-requests/SeriesRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { CurrentUser, ShareLink } from 'libs/shared/interfaces';\n\nexport function useFetchSharedResource<T>(shareId: string): T {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const shareLink = Flight.useBasicFetch<ShareLink>(ShareRequests.getShareObject(shareId));\n\n function getResourceRequest(): Flight.Request {\n if (!shareLink.data || !currentUser.data)\n return null;\n\n switch (shareLink.data.objectTypeId) {\n case MasterType.Video:\n return VideoRequests.publicVideo(shareLink.data.objectId, shareId);\n case MasterType.Clip:\n return ClipRequests.publicClip(shareLink.data.objectId, shareId);\n case MasterType.Interactive:\n return InteractiveRequests.publicInteractiveMetadata(shareLink.data.objectId, shareId);\n case MasterType.Playlist:\n return PlaylistRequests.getSharedPlaylist(shareLink.data.objectId, shareId);\n case MasterType.Subject:\n return ClassificationRequests.classification(shareLink.data.objectId, currentUser.data.id);\n case MasterType.Series:\n return SeriesRequests.sharedSeries(shareLink.data.objectId, shareId);\n }\n }\n\n const resourceRequest = getResourceRequest();\n const resource = Flight.useBasicFetch<T>(resourceRequest);\n\n return resource.data;\n}","// extracted by mini-css-extract-plugin\nexport default {\"left\":\"vIypY\",\"leftTextImage\":\"YViNj\",\"right\":\"MkD4u\",\"blur\":\"X6mCh\",\"imageContainer\":\"bc7kz\",\"imagePosition\":\"JOhEj\",\"image\":\"Ef2QR\",\"thumbnail\":\"Gdurb\",\"tallposter\":\"fjVNK\",\"cover\":\"o3j31\",\"linksContainer\":\"AT9Dk\"};","import React from 'react';\n\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nimport styles from './launchpad.scss';\n\nexport const LAUNCHPAD_FALLBACK_IMAGES = [\n { bgUrl: ImageUrls.LaunchPad.BG_1 },\n { bgUrl: ImageUrls.LaunchPad.BG_2 },\n { bgUrl: ImageUrls.LaunchPad.BG_3 },\n { bgUrl: ImageUrls.LaunchPad.BG_4 },\n { bgUrl: ImageUrls.LaunchPad.BG_5 }\n];\n\nexport const LAUNCHPAD_PRODUCT_FALLBACK_IMAGES = [\n { bgUrl: ImageUrls.LaunchPad.PRODUCT.BG_1 },\n { bgUrl: ImageUrls.LaunchPad.PRODUCT.BG_2 },\n { bgUrl: ImageUrls.LaunchPad.PRODUCT.BG_3 },\n { bgUrl: ImageUrls.LaunchPad.PRODUCT.BG_4 },\n { bgUrl: ImageUrls.LaunchPad.PRODUCT.BG_5 },\n { bgUrl: ImageUrls.LaunchPad.PRODUCT.BG_6 },\n { bgUrl: ImageUrls.LaunchPad.PRODUCT.BG_7 },\n { bgUrl: ImageUrls.LaunchPad.PRODUCT.BG_8 },\n { bgUrl: ImageUrls.LaunchPad.PRODUCT.BG_9 }\n];\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst XMAS_URLS: LaunchImage[] = [\n { bgUrl: '/images/launchpad/xmas/2024-promo1-bg.png' },\n { bgUrl: '/images/launchpad/xmas/2024-promo2-bg.png' },\n { bgUrl: '/images/launchpad/xmas/2024-promo3-bg.png' },\n { bgUrl: '/images/launchpad/xmas/2024-promo4-bg.png' },\n { bgUrl: '/images/launchpad/xmas/2024-promo5-bg.png' }\n];\n\nfunction mapObjectTypeToImageClass(objectType: MasterType): string {\n switch (objectType) {\n case MasterType.Video:\n case MasterType.Interactive:\n case MasterType.Clip:\n return styles.thumbnail;\n\n case MasterType.Subject:\n case MasterType.Playlist:\n return styles.cover;\n\n case MasterType.Series:\n return styles.tallposter;\n\n default:\n return '';\n }\n}\n\ninterface LaunchpadLink {\n url: string;\n text: string;\n onClick?: () => void;\n hide?: boolean;\n}\n\ninterface LaunchpadProps {\n objectType?: MasterType;\n title?: string;\n imageUrl?: string;\n links?: LaunchpadLink[];\n leftComponent?: () => JSX.Element;\n}\n\ninterface LaunchImage {\n bgUrl: string;\n}\n\nfunction getRandomImage(urlLists: LaunchImage[]): LaunchImage {\n return urlLists[Math.floor(Math.random() * urlLists.length)];\n}\n\nexport function Launchpad(props: React.PropsWithChildren<LaunchpadProps>): JSX.Element {\n const [ showImage, setShowImage ] = React.useState(false);\n const [ image, setImage ] = React.useState<string>('');\n\n const imageUrl = ImageHelper.createUrl(props.imageUrl, { size: ImageSize.Large });\n const IMAGE_URLS = LAUNCHPAD_PRODUCT_FALLBACK_IMAGES;\n\n React.useEffect(() => {\n if (imageUrl || !IMAGE_URLS || IMAGE_URLS.length === 0)\n return;\n\n const image = getRandomImage(IMAGE_URLS);\n\n if (image.bgUrl) {\n setImage(image.bgUrl);\n }\n }, []);\n\n React.useEffect(() => {\n if (!imageUrl)\n return;\n\n const img = new Image();\n img.onload = () => setShowImage(true);\n img.src = imageUrl;\n return () => img.onload = null;\n }, []);\n\n return (\n <div className='d-flex'>\n { props.leftComponent ?\n props.leftComponent()\n :\n <div\n className={`${styles.left} ${image ? 'bg-blue d-flex align-items-center' : 'bg-light'}`}\n >\n {image ?\n <img className='img-fluid' src={image} draggable={false} /> :\n (showImage &&\n <>\n <div className={styles.blur} style={{ backgroundImage: `url('${imageUrl}')` }} />\n <div className={`${styles.imageContainer} ${mapObjectTypeToImageClass(props.objectType)}`}>\n <div className={styles.imagePosition}>\n <img className={styles.image} src={imageUrl} alt={props.title} />\n </div>\n </div>\n </>\n )\n }\n </div>\n }\n <div className={`${styles.right} bg-white d-flex flex-column`}>\n <div className={`position-absolute d-flex align-items-center ${styles.linksContainer}`}>\n {props.links?.map((link, key) => {\n if (link.hide)\n return <React.Fragment key={key}></React.Fragment>;\n\n return (\n <a key={key} href={link.url} className='info-link fw-semibold' onClick={link.onClick}>\n {link.text}\n </a>\n );\n })}\n </div>\n\n {props.children}\n </div>\n </div>\n );\n}"],"names":["FormFeedback","props","id","name","className","role","children","classNames","length","filteredClassNames","filter","join","mapObjectTypeToImageClass","objectType","MasterType","LaunchpadV2","imageSizeMap","cover","full","widthClassNameMap","base","NarrowContent","Left","LeftImage","showImage","setShowImage","image","setImage","imageUrl","img","Image","onload","src","fallbackImages","Math","floor","random","bgUrl","style","backgroundImage","alt","title","LeftImageWithBackground","bgStyles","backgroundColor","imageSize","Right","Header","LogoComponent","logoComponent","ClickViewLogo","Content","ContentBody","widthClassName","width","Buttons","AVIS","BACKGROUNDS","getRandom","collection","charCode","i","charCodeAt","EmojiAvi","recipient","publicName","namespace","SelectAnonUserView","ShareLinkFilterHelpers","setName","isReturning","setIsReturning","error","setError","step","setStep","backStep","setBackStep","selectedUser","setSelectedUser","sharedResource","useFetchSharedResource","shareId","shareRecipients","ShareRequests","onSubmit","e","preventDefault","trim","hasCompleted","data","leftImageUrl","ImageHelper","ShareViewHelper","size","typeId","VideoHelper","BaseImage","imageType","htmlFor","type","placeholder","autoFocus","value","onChange","target","autoComplete","autoCorrect","autoCapitalize","spellCheck","onClick","Text","phrase","ArrayHelper","a","map","index","key","DivButton","onClickRecipient","disabled","options","href","appLink","params","anonUserSelected","currentUser","shareLink","resourceRequest","objectTypeId","objectId","getResourceRequest","LAUNCHPAD_FALLBACK_IMAGES","ImageUrls","LAUNCHPAD_PRODUCT_FALLBACK_IMAGES","Launchpad","IMAGE_URLS","urlLists","leftComponent","draggable","links","link","hide","url","text"],"sourceRoot":""}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[3549],{71051:(e,a,t)=>{t.r(a),t.d(a,{VideoInsightsOverviewView:()=>$});var n=t(32735),s=t(23481),i=t(2948),r=t(20354),l=t(75896),c=t(42642),d=t(94652),o=t(25216),m=t(461),u=t(35223),g=s.T.encloseNamespace("shared.insightStudentsNotWatched");function v(e){var a,t=(null===(a=e.students)||void 0===a?void 0:a.filter((function(a){var t;return!(null===(t=e.watchedIds)||void 0===t?void 0:t.includes(a.id))})))||[];return n.createElement(o.L,{title:g("title"),svgName:u.vn.Trending,svgClassName:"bg-light-teal text-teal"},n.createElement(m.y,{students:t,imageCdnUrl:e.imageCdnUrl,imageUrl:e.imageUrl,description:g("studentsDisplay"),anonymiseUsers:e.anonymiseUsers}))}var p=s.T.encloseNamespace("shared.insightStudentsWatched");function h(e){return n.createElement(o.L,{title:p("title"),svgName:u.vn.Flag,svgClassName:"bg-light-indigo text-indigo",count:e.students.length},n.createElement(m.y,{students:e.students,imageCdnUrl:e.imageCdnUrl,imageUrl:e.imageUrl,description:p("studentsDisplay"),appLink:e.heatmapAppLink,appLinkText:p("viewAll"),anonymiseUsers:e.anonymiseUsers}))}var E=t(26025),f=t(74901),I=t(40003),b=t(30439),N=t(83345),y=t(38143),A=t(4594),k=t(39151),U=t(31949),w=t(17913),C=t(91286),L=t(93322),S=t(79612),B=t(37802),O=t(31908),F=t(99742),j=t(88630),T=t(49673),x=t(5672),R=t(93116);const V={partialInsights:"ImBB3"};function D(){return n.createElement("div",null,n.createElement("h2",{className:"h4 w-25 partial-loading-background"}," "),n.createElement("div",{className:"row g-3 mb-5"},n.createElement("div",{className:"col-12"},n.createElement("div",{className:"".concat(V.partialInsights," rounded partial-loading-background")}))),n.createElement("h2",{className:"h4 w-25 partial-loading-background"}," "),n.createElement("div",{className:"row g-3 mb-5"},n.createElement("div",{className:"col-6"},n.createElement("div",{className:"".concat(V.partialInsights," rounded partial-loading-background")})),n.createElement("div",{className:"col-6"},n.createElement("div",{className:"".concat(V.partialInsights," rounded partial-loading-background")}))))}var _=t(14070),M=t(97291);function P(e,a){(null==a||a>e.length)&&(a=e.length);for(var t=0,n=Array(a);t<a;t++)n[t]=e[t];return n}var W="insights.videoInsightsOverview",H=s.T.encloseNamespace(W);function $(e){var a,t,s,o,m,u,g,p=(u=(0,i.D)(y.g.ANONYMISE_USERS),g=1,function(e){if(Array.isArray(e))return e}(u)||function(e,a){var t=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=t){var n,s,i,r,l=[],c=!0,d=!1;try{if(i=(t=t.call(e)).next,0===a){if(Object(t)!==t)return;c=!1}else for(;!(c=(n=i.call(t)).done)&&(l.push(n.value),l.length!==a);c=!0);}catch(e){d=!0,s=e}finally{try{if(!c&&null!=t.return&&(r=t.return(),Object(r)!==r))return}finally{if(d)throw s}}return l}}(u,g)||function(e,a){if(e){if("string"==typeof e)return P(e,a);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?P(e,a):void 0}}(u,g)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[0];(0,L.F)();var V=(0,B.r)(null).hasClassrooms,$=r.a.useBasicFetch(U.N.currentUser()),G=r.a.useBasicFetch(k.L.config()),q=O.M.getVideoRequest(e.videoId,e.typeId),K=r.a.useBasicFetch(q),Y=E.B.getAudienceAppLinkParams(),z=E.B.getDateRangeAppLinkParams(),J=Object.assign(Object.assign({},(0,I.wO)((0,I.Hb)(),z)),(0,f.K)(Y));(0,S.M)({title:K.data?H("pageTitle",{video:null===(a=K.data)||void 0===a?void 0:a.name}):null}),(0,C.v)(K);var Q=r.a.useBasicFetch(w.u.aggregateEngagement(e.videoId,J,$.data.id)),X=1===(null===(t=Y.classrooms)||void 0===t?void 0:t.length)&&!(null===(s=Y.classroomGroups)||void 0===s?void 0:s.length),Z=r.a.useBasicFetch(X&&j.F.getClassroomStudents(l.m.first(Y.classrooms))),ee=r.a.useBasicFetch((null===(o=Q.data)||void 0===o?void 0:o.userIds)&&b.o.getRecipientsById(Q.data.userIds,$.data.customerId)),ae=r.a.useBasicFetch($.data&&w.u.views(J,e.videoId,$.data.id)),te=r.a.useBasicFetch(b.o.getShareLinkByObjectId(e.videoId)),ne=r.a.useBasicFetch(b.o.getSentDirectShareByObjectId(e.videoId)),se=!(!te.data&&!ne.data);function ie(){return ee.data?Object.values(ee.data):[]}var re=$.data&&G.data&&K.data&&Q.data&&(!X||Z.data),le=Object.assign(Object.assign({},Y),z),ce=function(e,a){return{heatmapAppLink:{application:M.O.INSIGHTS,action:_.e.Insights.VIDEO_HEATMAP,args:[e],params:a}}}(e.videoId,le);return n.createElement("div",{className:"px-3"},n.createElement(R.m,{video:K.data,audienceAppLinkParams:Y,dateRangeAppLinkParams:z,tabs:function(){var e,a,t;return(null===(e=K.data)||void 0===e?void 0:e.typeId)===A.E.Clip?(0,x.$o)(null===(a=K.data)||void 0===a?void 0:a.id,"insights",le):(0,x.$6)(null===(t=K.data)||void 0===t?void 0:t.id,"insights",le)}()}),!re&&n.createElement(D,null),re&&n.createElement(T.u,{video:K.data,hasShared:se},n.createElement("section",{className:"mb-5"},n.createElement("h2",{className:"h4"},n.createElement(N.x,{namespace:W,phrase:"studentViewing"}),n.createElement("span",null,": ",ie().length,Z.data?"/".concat(Z.data.data.length):"")),n.createElement("div",{className:"row g-3"},X&&n.createElement("div",{className:"col-12 col-md"},n.createElement(v,{students:Z.data.data,watchedIds:Q.data.userIds,imageCdnUrl:G.data.imageCdnUrl,heatmapAppLink:ce.heatmapAppLink,imageUrl:F.W.Insights.AVATAR,anonymiseUsers:p})),n.createElement("div",{className:"col-12 col-md"},n.createElement(h,{students:ie(),imageCdnUrl:G.data.imageCdnUrl,heatmapAppLink:ce.heatmapAppLink,imageUrl:F.W.Insights.AVATAR,anonymiseUsers:p})))),n.createElement("section",{className:"mb-5"},n.createElement("h2",{className:"h4"},n.createElement(N.x,{namespace:W,phrase:V?"classEngagement":"engagement"})),n.createElement("div",{className:"row g-3"},n.createElement("div",{className:"col-12 col-md-6"},n.createElement(c.i,{osCount:null===(m=ae.data)||void 0===m?void 0:m.osCount})),n.createElement("div",{className:"col-12 col-md-6"},n.createElement(d.b,{engagement:Q.data,heatmapAppLink:ce.heatmapAppLink}))))))}}}]);
|
|
2
|
-
//# sourceMappingURL=3549-30d3b1cd05-lite.chunk.js.map
|