@clickview/lite 0.48.0-rc.7 → 0.48.0
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/scripts/{170-1f815b85a1-lite.chunk.js → 170-2d124965b7-lite.chunk.js} +2 -2
- package/dist/scripts/{170-1f815b85a1-lite.chunk.js.map → 170-2d124965b7-lite.chunk.js.map} +1 -1
- package/dist/scripts/{1818-b9f9297d6d-lite.chunk.js → 1818-72409e60a9-lite.chunk.js} +1 -1
- package/dist/scripts/{1818-b9f9297d6d-lite.chunk.js.map → 1818-72409e60a9-lite.chunk.js.map} +1 -1
- package/dist/scripts/{1863-cf9df40052-lite.chunk.js → 1863-e7c4a6f342-lite.chunk.js} +1 -1
- package/dist/scripts/{1863-cf9df40052-lite.chunk.js.map → 1863-e7c4a6f342-lite.chunk.js.map} +1 -1
- package/dist/scripts/{1958-9889c1ad24-lite.chunk.js → 1958-5336189397-lite.chunk.js} +1 -1
- package/dist/scripts/{1958-9889c1ad24-lite.chunk.js.map → 1958-5336189397-lite.chunk.js.map} +1 -1
- package/dist/scripts/{2086-a247f6e201-lite.chunk.js → 2086-f7082703d0-lite.chunk.js} +1 -1
- package/dist/scripts/{2086-a247f6e201-lite.chunk.js.map → 2086-f7082703d0-lite.chunk.js.map} +1 -1
- package/dist/scripts/{2118-462a279c5a-lite.chunk.js → 2118-ec2a5f1e9b-lite.chunk.js} +2 -2
- package/dist/scripts/{2118-462a279c5a-lite.chunk.js.map → 2118-ec2a5f1e9b-lite.chunk.js.map} +1 -1
- package/dist/scripts/{2182-5c9db07f5b-lite.chunk.js → 2182-8e4d603a1b-lite.chunk.js} +1 -1
- package/dist/scripts/{2182-5c9db07f5b-lite.chunk.js.map → 2182-8e4d603a1b-lite.chunk.js.map} +1 -1
- package/dist/scripts/{2279-5e92c84310-lite.chunk.js → 2279-252e92e1d8-lite.chunk.js} +1 -1
- package/dist/scripts/{2279-5e92c84310-lite.chunk.js.map → 2279-252e92e1d8-lite.chunk.js.map} +1 -1
- package/dist/scripts/{2355-6cd89fa80d-lite.chunk.js → 2355-c588dc3ce2-lite.chunk.js} +1 -1
- package/dist/scripts/{2355-6cd89fa80d-lite.chunk.js.map → 2355-c588dc3ce2-lite.chunk.js.map} +1 -1
- package/dist/scripts/{2469-aa5bbbb17f-lite.chunk.js → 2469-46411b862e-lite.chunk.js} +1 -1
- package/dist/scripts/{2469-aa5bbbb17f-lite.chunk.js.map → 2469-46411b862e-lite.chunk.js.map} +1 -1
- package/dist/scripts/{2672-0fc559f1d1-lite.chunk.js → 2672-b01985cee8-lite.chunk.js} +1 -1
- package/dist/scripts/{2672-0fc559f1d1-lite.chunk.js.map → 2672-b01985cee8-lite.chunk.js.map} +1 -1
- package/dist/scripts/{2734-6c6d57d0f3-lite.chunk.js → 2734-6a7beb2ce2-lite.chunk.js} +1 -1
- package/dist/scripts/{2734-6c6d57d0f3-lite.chunk.js.map → 2734-6a7beb2ce2-lite.chunk.js.map} +1 -1
- package/dist/scripts/{287-ba98be7f21-lite.chunk.js → 287-3cbed16363-lite.chunk.js} +1 -1
- package/dist/scripts/{287-ba98be7f21-lite.chunk.js.map → 287-3cbed16363-lite.chunk.js.map} +1 -1
- package/dist/scripts/{2875-0e5f209e47-lite.chunk.js → 2875-aefd69a61f-lite.chunk.js} +1 -1
- package/dist/scripts/{2875-0e5f209e47-lite.chunk.js.map → 2875-aefd69a61f-lite.chunk.js.map} +1 -1
- package/dist/scripts/{3042-6650521d8b-lite.chunk.js → 3042-7c1b5e4ff7-lite.chunk.js} +1 -1
- package/dist/scripts/{3042-6650521d8b-lite.chunk.js.map → 3042-7c1b5e4ff7-lite.chunk.js.map} +1 -1
- package/dist/scripts/{3158-31baada6cc-lite.chunk.js → 3158-2147de456d-lite.chunk.js} +1 -1
- package/dist/scripts/{3158-31baada6cc-lite.chunk.js.map → 3158-2147de456d-lite.chunk.js.map} +1 -1
- package/dist/scripts/{3296-6d80e4dd56-lite.chunk.js → 3296-f3732c93d9-lite.chunk.js} +1 -1
- package/dist/scripts/{3296-6d80e4dd56-lite.chunk.js.map → 3296-f3732c93d9-lite.chunk.js.map} +1 -1
- package/dist/scripts/{3541-7ebd9db295-lite.chunk.js → 3541-15581012d3-lite.chunk.js} +1 -1
- package/dist/scripts/{3541-7ebd9db295-lite.chunk.js.map → 3541-15581012d3-lite.chunk.js.map} +1 -1
- package/dist/scripts/{3841-95df66e647-lite.chunk.js → 3841-bfae79638b-lite.chunk.js} +2 -2
- package/dist/scripts/{3841-95df66e647-lite.chunk.js.map → 3841-bfae79638b-lite.chunk.js.map} +1 -1
- package/dist/scripts/{3888-0bee9a9309-lite.chunk.js → 3888-87c1075a1b-lite.chunk.js} +1 -1
- package/dist/scripts/{3888-0bee9a9309-lite.chunk.js.map → 3888-87c1075a1b-lite.chunk.js.map} +1 -1
- package/dist/scripts/{4138-75a2bb69ab-lite.chunk.js → 4138-b9b03c9900-lite.chunk.js} +1 -1
- package/dist/scripts/{4138-75a2bb69ab-lite.chunk.js.map → 4138-b9b03c9900-lite.chunk.js.map} +1 -1
- package/dist/scripts/{4778-ebe369973c-lite.chunk.js → 4778-3c9f2b7f76-lite.chunk.js} +2 -2
- package/dist/scripts/{4778-ebe369973c-lite.chunk.js.map → 4778-3c9f2b7f76-lite.chunk.js.map} +1 -1
- package/dist/scripts/{4942-a27a31e79e-lite.chunk.js → 4942-acce40b333-lite.chunk.js} +2 -2
- package/dist/scripts/{4942-a27a31e79e-lite.chunk.js.map → 4942-acce40b333-lite.chunk.js.map} +1 -1
- package/dist/scripts/{5075-f8719465be-lite.chunk.js → 5075-53172298fe-lite.chunk.js} +1 -1
- package/dist/scripts/{5075-f8719465be-lite.chunk.js.map → 5075-53172298fe-lite.chunk.js.map} +1 -1
- package/dist/scripts/{5157-cd12e2e443-lite.chunk.js → 5157-47a0f5c088-lite.chunk.js} +1 -1
- package/dist/scripts/{5157-cd12e2e443-lite.chunk.js.map → 5157-47a0f5c088-lite.chunk.js.map} +1 -1
- package/dist/scripts/{5268-f4db3933ff-lite.chunk.js → 5268-9b7560f3b1-lite.chunk.js} +2 -2
- package/dist/scripts/{5268-f4db3933ff-lite.chunk.js.map → 5268-9b7560f3b1-lite.chunk.js.map} +1 -1
- package/dist/scripts/{5442-01ffd95162-lite.chunk.js → 5442-5ddfa2d951-lite.chunk.js} +1 -1
- package/dist/scripts/{5442-01ffd95162-lite.chunk.js.map → 5442-5ddfa2d951-lite.chunk.js.map} +1 -1
- package/dist/scripts/{5591-98cfe6c6e5-lite.chunk.js → 5591-119d72ede5-lite.chunk.js} +1 -1
- package/dist/scripts/{5591-98cfe6c6e5-lite.chunk.js.map → 5591-119d72ede5-lite.chunk.js.map} +1 -1
- package/dist/scripts/{5595-3763b14d77-lite.chunk.js → 5595-628d4f252c-lite.chunk.js} +2 -2
- package/dist/scripts/5595-628d4f252c-lite.chunk.js.map +1 -0
- package/dist/scripts/{6102-4d948a5e48-lite.chunk.js → 6102-751dbbbf33-lite.chunk.js} +3 -3
- package/dist/scripts/{6102-4d948a5e48-lite.chunk.js.map → 6102-751dbbbf33-lite.chunk.js.map} +1 -1
- package/dist/scripts/{6158-0c5e44f800-lite.chunk.js → 6158-d123add596-lite.chunk.js} +1 -1
- package/dist/scripts/{6158-0c5e44f800-lite.chunk.js.map → 6158-d123add596-lite.chunk.js.map} +1 -1
- package/dist/scripts/{6263-8957d50afe-lite.chunk.js → 6263-24e67b7df2-lite.chunk.js} +1 -1
- package/dist/scripts/{6263-8957d50afe-lite.chunk.js.map → 6263-24e67b7df2-lite.chunk.js.map} +1 -1
- package/dist/scripts/{6330-c66465bd6d-lite.chunk.js → 6330-9a2a5fc07e-lite.chunk.js} +1 -1
- package/dist/scripts/{6330-c66465bd6d-lite.chunk.js.map → 6330-9a2a5fc07e-lite.chunk.js.map} +1 -1
- package/dist/scripts/{671-003843ca84-lite.chunk.js → 671-5571f33165-lite.chunk.js} +1 -1
- package/dist/scripts/{671-003843ca84-lite.chunk.js.map → 671-5571f33165-lite.chunk.js.map} +1 -1
- package/dist/scripts/{7167-efe85af16e-lite.chunk.js → 7167-dc4c954c2b-lite.chunk.js} +1 -1
- package/dist/scripts/{7167-efe85af16e-lite.chunk.js.map → 7167-dc4c954c2b-lite.chunk.js.map} +1 -1
- package/dist/scripts/7293-58f4a7cf47-lite.chunk.js +2 -0
- package/dist/scripts/{7293-afd3349468-lite.chunk.js.map → 7293-58f4a7cf47-lite.chunk.js.map} +1 -1
- package/dist/scripts/{7301-f20e4bdb8f-lite.chunk.js → 7301-7c9342ef0c-lite.chunk.js} +1 -1
- package/dist/scripts/{7301-f20e4bdb8f-lite.chunk.js.map → 7301-7c9342ef0c-lite.chunk.js.map} +1 -1
- package/dist/scripts/{7708-ece31b78a9-lite.chunk.js → 7708-e91903481a-lite.chunk.js} +1 -1
- package/dist/scripts/{7708-ece31b78a9-lite.chunk.js.map → 7708-e91903481a-lite.chunk.js.map} +1 -1
- package/dist/scripts/{771-eb60e33941-lite.chunk.js → 771-5612b4ffc2-lite.chunk.js} +2 -2
- package/dist/scripts/{771-eb60e33941-lite.chunk.js.map → 771-5612b4ffc2-lite.chunk.js.map} +1 -1
- package/dist/scripts/{7855-37bcdd134e-lite.chunk.js → 7855-4b69540a71-lite.chunk.js} +1 -1
- package/dist/scripts/{7855-37bcdd134e-lite.chunk.js.map → 7855-4b69540a71-lite.chunk.js.map} +1 -1
- package/dist/scripts/{8024-66413cc05b-lite.chunk.js → 8024-765a4170c7-lite.chunk.js} +2 -2
- package/dist/scripts/{8024-66413cc05b-lite.chunk.js.map → 8024-765a4170c7-lite.chunk.js.map} +1 -1
- package/dist/scripts/{823-58d27c255b-lite.chunk.js → 823-33c5207c68-lite.chunk.js} +1 -1
- package/dist/scripts/{823-58d27c255b-lite.chunk.js.map → 823-33c5207c68-lite.chunk.js.map} +1 -1
- package/dist/scripts/8261-69854ff4d5-lite.chunk.js +2 -0
- package/dist/scripts/8261-69854ff4d5-lite.chunk.js.map +1 -0
- package/dist/scripts/{8466-ee9d40ee97-lite.chunk.js → 8466-cea62163e8-lite.chunk.js} +1 -1
- package/dist/scripts/{8466-ee9d40ee97-lite.chunk.js.map → 8466-cea62163e8-lite.chunk.js.map} +1 -1
- package/dist/scripts/{8681-41edd08b98-lite.chunk.js → 8681-49db3daae6-lite.chunk.js} +2 -2
- package/dist/scripts/{8681-41edd08b98-lite.chunk.js.map → 8681-49db3daae6-lite.chunk.js.map} +1 -1
- package/dist/scripts/{8772-9ae4d77363-lite.chunk.js → 8772-6c11095cea-lite.chunk.js} +1 -1
- package/dist/scripts/{8772-9ae4d77363-lite.chunk.js.map → 8772-6c11095cea-lite.chunk.js.map} +1 -1
- package/dist/scripts/{8906-b75b51bd0f-lite.chunk.js → 8906-2f6b5e4c5c-lite.chunk.js} +2 -2
- package/dist/scripts/{8906-b75b51bd0f-lite.chunk.js.map → 8906-2f6b5e4c5c-lite.chunk.js.map} +1 -1
- package/dist/scripts/{920-4de8efbcf1-lite.chunk.js → 920-acc6596891-lite.chunk.js} +1 -1
- package/dist/scripts/{920-4de8efbcf1-lite.chunk.js.map → 920-acc6596891-lite.chunk.js.map} +1 -1
- package/dist/scripts/{9212-8f95fbd9b9-lite.chunk.js → 9212-cc987a13bf-lite.chunk.js} +1 -1
- package/dist/scripts/{9212-8f95fbd9b9-lite.chunk.js.map → 9212-cc987a13bf-lite.chunk.js.map} +1 -1
- package/dist/scripts/{9242-2e533bdc0d-lite.chunk.js → 9242-144e7728ad-lite.chunk.js} +1 -1
- package/dist/scripts/{9242-2e533bdc0d-lite.chunk.js.map → 9242-144e7728ad-lite.chunk.js.map} +1 -1
- package/dist/scripts/{9264-d2285d4310-lite.chunk.js → 9264-518952f13f-lite.chunk.js} +1 -1
- package/dist/scripts/{9264-d2285d4310-lite.chunk.js.map → 9264-518952f13f-lite.chunk.js.map} +1 -1
- package/dist/scripts/{9478-8eacf2fe47-lite.chunk.js → 9478-4b3c088537-lite.chunk.js} +2 -2
- package/dist/scripts/{9478-8eacf2fe47-lite.chunk.js.map → 9478-4b3c088537-lite.chunk.js.map} +1 -1
- package/dist/scripts/{9484-be04a34bbf-lite.chunk.js → 9484-b85011dbea-lite.chunk.js} +2 -2
- package/dist/scripts/{9484-be04a34bbf-lite.chunk.js.map → 9484-b85011dbea-lite.chunk.js.map} +1 -1
- package/dist/scripts/{bundle-8f540a1154.min.js → bundle-c158cdd3a9.min.js} +3 -3
- package/dist/scripts/{bundle-8f540a1154.min.js.map → bundle-c158cdd3a9.min.js.map} +1 -1
- package/package.json +1 -1
- package/dist/scripts/5595-3763b14d77-lite.chunk.js.map +0 -1
- package/dist/scripts/7293-afd3349468-lite.chunk.js +0 -2
- package/dist/scripts/8261-72453f1978-lite.chunk.js +0 -2
- package/dist/scripts/8261-72453f1978-lite.chunk.js.map +0 -1
- /package/dist/scripts/{170-1f815b85a1-lite.chunk.js.LICENSE.txt → 170-2d124965b7-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{2118-462a279c5a-lite.chunk.js.LICENSE.txt → 2118-ec2a5f1e9b-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{3841-95df66e647-lite.chunk.js.LICENSE.txt → 3841-bfae79638b-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{4778-ebe369973c-lite.chunk.js.LICENSE.txt → 4778-3c9f2b7f76-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{4942-a27a31e79e-lite.chunk.js.LICENSE.txt → 4942-acce40b333-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{5268-f4db3933ff-lite.chunk.js.LICENSE.txt → 5268-9b7560f3b1-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{6102-4d948a5e48-lite.chunk.js.LICENSE.txt → 6102-751dbbbf33-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{771-eb60e33941-lite.chunk.js.LICENSE.txt → 771-5612b4ffc2-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{8024-66413cc05b-lite.chunk.js.LICENSE.txt → 8024-765a4170c7-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{8681-41edd08b98-lite.chunk.js.LICENSE.txt → 8681-49db3daae6-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{8906-b75b51bd0f-lite.chunk.js.LICENSE.txt → 8906-2f6b5e4c5c-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{9478-8eacf2fe47-lite.chunk.js.LICENSE.txt → 9478-4b3c088537-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{9484-be04a34bbf-lite.chunk.js.LICENSE.txt → 9484-b85011dbea-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{bundle-8f540a1154.min.js.LICENSE.txt → bundle-c158cdd3a9.min.js.LICENSE.txt} +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[920],{71020:(e,t,a)=>{a.d(t,{_:()=>u});var n=a(32735),r=a(80247),i=a(34152),l=a(83914),c=a(35223);const o={container:"VwD1b",spinner:"eJ85e"};function s(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,n=new Array(t);a<t;a++)n[a]=e[a];return n}function u(e){var t,a,u=(t=(0,i.YD)(),a=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var a=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var n,r,i,l,c=[],o=!0,s=!1;try{if(i=(a=a.call(e)).next,0===t){if(Object(a)!==a)return;o=!1}else for(;!(o=(n=i.call(a)).done)&&(c.push(n.value),c.length!==t);o=!0);}catch(e){s=!0,r=e}finally{try{if(!o&&null!=a.return&&(l=a.return(),Object(l)!==l))return}finally{if(s)throw r}}return c}}(t,a)||function(e,t){if(e){if("string"==typeof e)return s(e,t);var a=Object.prototype.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?s(e,t):void 0}}(t,a)||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.")}()),m=u[0],d=u[1];return n.useEffect((function(){var t;e.fetchOnScroll&&d&&!e.isFetching&&(null===(t=e.fetchNext)||void 0===t||t.call(e,e.nextCursor))}),[d,e.isFetching]),n.createElement("div",{className:"p-3 text-center ".concat(o.container),ref:m},e.isFetching?n.createElement(r.Z,{as:"span",animation:"border",role:"status",className:o.spinner}):n.createElement(l.x,{svgName:c.vn.ChevronDown,className:"svg-container cursor-pointer",size:l.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}},74696:(e,t,a)=>{a.d(t,{S:()=>s});var n=a(32735),r=a(68050),i=a(69111),l=a(9977),c=a(79967);const o={partialOptions:"Gufgq",partialName:"SicQQ",partialDescription:"dPGMq",partialThumbnail:"vZrnb",partialDragHandle:"iq73R"};function s(e){return n.createElement("div",{className:"mx-2"},Array(e.numVideos).fill(null).map((function(t,a){return n.createElement("div",{className:"d-flex",key:a},e.allowBulkActions&&n.createElement("div",{className:"form-check pe-3 pe-sm-2 mx-0 mx-md-2"}),n.createElement(u,Object.assign({},e)))})))}function u(e){var t=(0,c.k)(),a="sm"===l.O.getSize(t,"md"),s=e.withReordering&&!t.xs;return n.createElement(r.Z,{className:"".concat(a?"":"py-2"," flex-grow-1")},n.createElement(i.Z,Object.assign({},l.O.getThumbnailColumns(),{className:"flex-column align-items-flex-start ".concat(a?"pb-2 pe-1":"mb-1 pe-3 pe-md-2")}),n.createElement(r.Z,null,!!s&&n.createElement("div",{className:"d-flex align-items-center justify-content-center col-2"},n.createElement("div",{className:"partial-loading-background ".concat(o.partialDragHandle)})),n.createElement(i.Z,{xs:l.O.getThumbnailColSize(s)},n.createElement("div",{className:"partial-loading-background ".concat(a?"rounded":"rounded-3"," ").concat(o.partialThumbnail)})))),n.createElement(i.Z,Object.assign({},l.O.getDetailsColumns(),{className:a?"pb-2":"px-2"}),n.createElement("div",{className:"partial-loading-background mb-1 ".concat(o.partialName)}),n.createElement("div",{className:"partial-loading-background ".concat(o.partialDescription)})))}s.defaultProps={numVideos:15}},3133:(e,t,a)=>{a.d(t,{R:()=>s});var n=a(32735),r=a(20789),i=a(86794),l=a(2786),c=a(64818);const o={avatarContainer:"kd18L",cvIcon:"smUBc"};function s(e){var t;if(!e.owner&&!e.isClickViewCurated)return n.createElement(n.Fragment,null);if(e.isClickViewCurated)return n.createElement("div",{className:"clamp-1 d-flex align-items-center"},n.createElement("div",{className:"".concat(o.avatarContainer," me-1 border rounded-circle position-relative")},n.createElement(i.b,{className:"me-1 ".concat(o.cvIcon)},n.createElement(l.Sd,null))),"ClickView");var a=c.l.getCommunityName(e.owner);return a?n.createElement("div",{className:"d-flex align-items-center"},n.createElement("div",{className:"".concat(o.avatarContainer," me-1")},n.createElement(r.q,{imageCdnUrl:e.imageCdnUrl,initials:c.l.getInitials(e.owner.name,e.owner.surname),imageUrl:null===(t=e.owner.avatar)||void 0===t?void 0:t.url})),n.createElement("div",{className:"clamp-1"},a)):n.createElement(n.Fragment,null)}},47862:(e,t,a)=>{a.d(t,{K:()=>m});var n=a(32735),r=a(65858),i=a(36848),l=a(83345),c=a(72355),o=a(3133),s=a(54610),u=a(68626);var m=n.memo((function(e){var t,a=Object.assign(Object.assign({},e.questionsAppLink),{args:[e.data.id]});return n.createElement("div",{className:"flex-shrink-0 px-1 ".concat("rXatl")},n.createElement("div",{className:"row m-0 border rounded p-2 h-100"},n.createElement("div",{className:"col-6 p-0"},n.createElement(c.u,{video:e.data,appLink:e.getAppLink(e.data),type:"cosmetic",imageOptions:{size:s.h2.Small},textPosition:u.z.Independent,preload:!0,analyticsOptions:{location:r.LZ.SlidingListItem}})),n.createElement("div",{className:"col-6 p-0"},n.createElement("div",{className:"ps-2"},n.createElement(i.F,{appLink:e.getAppLink(e.data)},n.createElement("h3",{className:"h6 mb-1"},n.createElement("span",{className:"clamp-2"},e.data.name))),n.createElement(o.R,{owner:e.data.owner,isClickViewCurated:null===(t=e.data._isClickViewCurated)||void 0===t?void 0:t.value,imageCdnUrl:e.imageCdnUrl}),n.createElement(i.F,{className:"info-link",appLink:a},n.createElement(l.x,{namespace:"shared.interactiveWidgetItem",phrase:"previewQuestions"}))))))}))},26492:(e,t,a)=>{a.d(t,{T:()=>u});var n=a(32735),r=a(23481),i=a(65858),l=a(83914),c=a(4594),o=a(35223),s="shared.playPage";function u(e){var t=r.T.encloseNamespace(s),a=function(e){switch(e){case c.E.Video:return"video";case c.E.Clip:return"clip";case c.E.Interactive:return"interactive";default:return""}}(e.typeId);return n.createElement("div",{className:"alert bg-light-blue p-3 rounded-3 d-flex justify-content-between align-items-center"},n.createElement(l.x,{svgName:o.vn.Archive,size:l.S.Standard,className:"me-2 svg-container"}),n.createElement("div",{className:"w-100"},n.createElement("p",{className:"fw-semibold mb-0"},t("archivedInfoTitle",{type:a})),(!e.hasStudentExperience||a===i.py.Video)&&n.createElement("p",{className:"mb-1"},t("archivedInfo",{type:"".concat(a,"s")}))))}},47938:(e,t,a)=>{a.d(t,{W:()=>d});var n=a(32735),r=a(36848),i=a(83914),l=a(83345),c=a(5345),o=a(26361),s=a(14070),u=a(97291),m="shared.playPage";function d(e){var t,a;if(!(null===(a=null===(t=e.restrictions)||void 0===t?void 0:t.value)||void 0===a?void 0:a.length)||!e.yearGroups||!e.canManageVideoAccess)return n.createElement(n.Fragment,null);if(o.l.getWeightedRestriction(e.restrictions.value).type!==c.c.Custom)return n.createElement(n.Fragment,null);var d=o.l.mapRestrictionToClass(e.restrictions),p="".concat(d," fw-semibold p-2 rounded mb-3 d-flex justify-content-between align-items-center");return n.createElement("div",{className:p},n.createElement("div",{className:"d-flex align-items-center"},n.createElement(i.x,{svgName:o.l.mapRestrictionToSvg(e.restrictions),size:i.S.Large}),n.createElement("span",{className:"ps-1"},o.l.mapRestrictionToText(e.restrictions,e.yearGroups))),n.createElement(r.F,{appLink:{application:u.O.DEFAULT,action:s.e.Default.APPROVE_VIDEO,params:{objectId:e.objectId,objectTypeId:e.objectTypeId}},className:"btn btn-outline-dark"},n.createElement(l.x,{namespace:m,phrase:"approve"})))}},78166:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(32735),r=a(71020),i=a(83345),l=a(74696),c=a(13231),o=a(51365),s=a(22902),u=a(31908),m=a(10671),d=a(10741),p=a(82431),v="shared.relatedVideos";function f(e){var t,a,f=(0,m._)({location:m.i.VideoItem}),g=(0,s.T)().hasPermissions;if(!(null===(t=e.currentUser)||void 0===t?void 0:t.isAuthenticated))return n.createElement(n.Fragment,null);if(e.relatedVideos.hasError)return n.createElement(n.Fragment,null);if(e.relatedVideos.hasCompleted&&!(null===(a=e.relatedVideos.videos)||void 0===a?void 0:a.length))return n.createElement(n.Fragment,null);if(!e.relatedVideos.isFetching&&!e.relatedVideos.hasCompleted)return n.createElement(n.Fragment,null);var h=!u.M.isInteractive(e.currentVideo);return n.createElement(o.M.Provider,{value:f},n.createElement("h2",{className:"h4 mb-0"},n.createElement(i.x,{namespace:v,phrase:h?"upNext":"relatedVideos"})),e.relatedVideos.hasCompleted?n.createElement(c.E4,{videos:e.relatedVideos.videos,yearGroups:e.yearGroups,getSubTextAppLink:function(t){return p.j.getSeriesAppLink(t.series,e.moviesAndTv?{mtv:!0}:null)},getVideoAppLink:e.getVideoAppLink,hasPermissions:g,setFavourite:e.setFavourite,canFavourite:e.canFavourite,presentationAudiences:e.audiences,getPreviewQuestionsAppLink:function(e){return d.j.getPreviewQuestionsAppLink(e)}}):n.createElement(l.S,null),e.relatedVideos.hasMore&&n.createElement(r._,{isFetching:e.relatedVideos.isFetching,fetchNext:e.relatedVideos.fetchNext}))}},97816:(e,t,a)=>{a.d(t,{V:()=>u});var n=a(32735),r=a(20354),i=a(21750),l=a(31949),c=a(1575);function o(e,t){if(e){if("string"==typeof e)return s(e,t);var a=Object.prototype.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?s(e,t):void 0}}function s(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,n=new Array(t);a<t;a++)n[a]=e[a];return n}function u(e){var t,a,u,m=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},d=r.a.useBasicFetch(l.N.currentUser()),p=n.useRef(new Set),v=e&&(Array.isArray(e)?e.filter(Boolean).map((function(e){return e.id})):e.data.filter(Boolean).map((function(e){return e.id}))),f=(a=n.useState([]),u=2,function(e){if(Array.isArray(e))return e}(a)||function(e,t){var a=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var n,r,i,l,c=[],o=!0,s=!1;try{if(i=(a=a.call(e)).next,0===t){if(Object(a)!==a)return;o=!1}else for(;!(o=(n=i.call(a)).done)&&(c.push(n.value),c.length!==t);o=!0);}catch(e){s=!0,r=e}finally{try{if(!o&&null!=a.return&&(l=a.return(),Object(l)!==l))return}finally{if(s)throw r}}return c}}(a,u)||o(a,u)||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.")}()),g=f[0],h=f[1];n.useEffect((function(){var e;if((null==v?void 0:v.length)&&(null===(e=d.data)||void 0===e?void 0:e.isAuthenticated)){var t=[];v.forEach((function(e){p.current.has(e)||(t.push(e),p.current.add(e))})),t.length&&h((function(e){return[].concat(function(e){return function(e){if(Array.isArray(e))return s(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.")}()}(e),[i.x.hasCurriculumLinks(t,null,m.flightNamespace),c.R.videoMixinAssocs(t,m.flightNamespace)])}))}}),[null==v?void 0:v.length,null===(t=d.data)||void 0===t?void 0:t.isAuthenticated]),r.a.useBasicFetchAll(g)}}}]);
|
|
2
|
-
//# sourceMappingURL=920-
|
|
2
|
+
//# sourceMappingURL=920-acc6596891-lite.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/920-4de8efbcf1-lite.chunk.js","mappings":"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","sources":["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/components/video-list/partial-loading/partial-video-list.scss","file:///app/packages/libs/shared/src/components/video-list/partial-loading/PartialVideoList.tsx","file:///app/packages/libs/shared/src/components/video-owner-text/video-owner-text.scss","file:///app/packages/libs/shared/src/components/video-owner-text/VideoOwnerText.tsx","file:///app/packages/libs/shared/src/components/widgets/items/interactive-widget-item/InteractiveWidgetItem.tsx","file:///app/packages/libs/shared/src/components/widgets/items/interactive-widget-item/interactive-widget-item.scss","file:///app/packages/projects/lite/src/shared/components/play-page/ArchivedBanner.tsx","file:///app/packages/projects/lite/src/shared/components/play-page/RestrictionBanner.tsx","file:///app/packages/projects/lite/src/shared/components/related-videos/RelatedVideos.tsx","file:///app/packages/projects/lite/src/shared/hooks/useVideoMixin.ts"],"sourcesContent":["// 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}","// extracted by mini-css-extract-plugin\nexport default {\"partialOptions\":\"Gufgq\",\"partialName\":\"SicQQ\",\"partialDescription\":\"dPGMq\",\"partialThumbnail\":\"vZrnb\",\"partialDragHandle\":\"iq73R\"};","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { VideoListHelper } from 'libs/shared/components/video-list/VideoListHelper';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\n\nimport styles from './partial-video-list.scss';\n\ninterface PartialVideoListProps {\n withReordering?: boolean;\n numVideos?: number;\n allowBulkActions?: boolean;\n}\n\nPartialVideoList.defaultProps = {\n numVideos: 15\n};\n\nexport function PartialVideoList(props: PartialVideoListProps): JSX.Element {\n return (\n <div className='mx-2'>\n {Array(props.numVideos).fill(null).map((_, i) => (\n <div className='d-flex' key={i}>\n {props.allowBulkActions && <div className='form-check pe-3 pe-sm-2 mx-0 mx-md-2' />}\n <PartialVideoItem {...props} />\n </div>\n ))}\n </div>\n );\n}\n\nexport function PartialVideoItem(props: PartialVideoListProps): JSX.Element {\n const breakpoints = useBreakpoints();\n\n const size = VideoListHelper.getSize(breakpoints, 'md');\n const isSmall = size === 'sm';\n\n const withDragHandle = props.withReordering && !breakpoints.xs;\n\n return (\n <Row className={`${isSmall ? '' : 'py-2'} flex-grow-1`}>\n <Col {...VideoListHelper.getThumbnailColumns()} className={`flex-column align-items-flex-start ${isSmall ? `pb-2 pe-1` : 'mb-1 pe-3 pe-md-2'}`}>\n <Row>\n {!!withDragHandle && (\n <div className='d-flex align-items-center justify-content-center col-2'>\n <div className={`partial-loading-background ${styles.partialDragHandle}`} />\n </div>\n )}\n <Col xs={VideoListHelper.getThumbnailColSize(withDragHandle)}>\n <div className={`partial-loading-background ${isSmall ? 'rounded' : 'rounded-3'} ${styles.partialThumbnail}`} />\n </Col>\n </Row>\n </Col>\n <Col {...VideoListHelper.getDetailsColumns()} className={isSmall ? 'pb-2' : 'px-2'}>\n <div className={`partial-loading-background mb-1 ${styles.partialName}`} />\n <div className={`partial-loading-background ${styles.partialDescription}`} />\n </Col>\n </Row>\n );\n}\n\n","// extracted by mini-css-extract-plugin\nexport default {\"avatarContainer\":\"kd18L\",\"cvIcon\":\"smUBc\"};","import React from 'react';\n\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { SvgContainer2 } from 'libs/shared/components/svg-container/SvgContainer2';\nimport { ClickViewPlayLogo } from 'libs/shared/components/svgs/clickview-logo/ClickViewLogo';\nimport { User } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport styles from './video-owner-text.scss';\n\ninterface VideoOwnerTextProps {\n owner: User;\n isClickViewCurated: boolean;\n imageCdnUrl: string;\n}\n\nexport function VideoOwnerText(props: VideoOwnerTextProps): JSX.Element {\n if (!props.owner && !props.isClickViewCurated)\n return <></>;\n\n if (props.isClickViewCurated) {\n return (\n <div className='clamp-1 d-flex align-items-center'>\n <div className={`${styles.avatarContainer} me-1 border rounded-circle position-relative`}>\n <SvgContainer2 className={`me-1 ${styles.cvIcon}`}>\n <ClickViewPlayLogo />\n </SvgContainer2>\n </div>\n ClickView\n </div>\n );\n }\n\n const name = UserHelper.getCommunityName(props.owner);\n\n if (!name)\n return <></>;\n\n return (\n <div className='d-flex align-items-center'>\n <div className={`${styles.avatarContainer} me-1`}>\n <Avatar\n imageCdnUrl={props.imageCdnUrl}\n initials={UserHelper.getInitials(props.owner.name, props.owner.surname)}\n imageUrl={props.owner.avatar?.url}\n />\n </div>\n <div className='clamp-1'>\n {name}\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoThumbnail } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { VideoOwnerText } from 'libs/shared/components/video-owner-text/VideoOwnerText';\nimport { FixedWidgetItemProps } from 'libs/shared/components/widgets/items/FixedWidgetItemProps';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { ThumbnailTextPosition } from 'libs/shared/enums/ThumbnailTextPosition';\nimport { Clip, InteractiveMetadata, Video } from 'libs/shared/interfaces';\n\nimport styles from './interactive-widget-item.scss';\n\nconst namespace = 'shared.interactiveWidgetItem';\n\nexport interface InteractiveWidgetItemProps extends FixedWidgetItemProps<InteractiveMetadata> {\n video: Video | Clip;\n questionsAppLink: Core.AppLink;\n imageCdnUrl: string;\n}\n\nexport const InteractiveWidgetItem = React.memo(function(props: InteractiveWidgetItemProps): JSX.Element {\n const questionsAppLink: Core.AppLink = {\n ...props.questionsAppLink,\n args: [props.data.id]\n };\n\n return (\n <div className={`flex-shrink-0 px-1 ${styles.item}`}>\n <div className='row m-0 border rounded p-2 h-100'>\n <div className='col-6 p-0'>\n <VideoThumbnail\n video={props.data}\n appLink={props.getAppLink(props.data)}\n type='cosmetic'\n imageOptions={{ size: ImageSize.Small }}\n textPosition={ThumbnailTextPosition.Independent}\n preload\n analyticsOptions={{ location: LocationContext.SlidingListItem }}\n />\n </div>\n\n <div className='col-6 p-0'>\n <div className='ps-2'>\n <AppLink appLink={props.getAppLink(props.data)}>\n <h3 className='h6 mb-1'><span className='clamp-2'>{props.data.name}</span></h3>\n </AppLink>\n\n <VideoOwnerText\n owner={props.data.owner}\n isClickViewCurated={props.data._isClickViewCurated?.value}\n imageCdnUrl={props.imageCdnUrl}\n />\n\n <AppLink className='info-link' appLink={questionsAppLink}>\n <Text namespace={namespace} phrase='previewQuestions' />\n </AppLink>\n </div>\n </div>\n </div>\n </div>\n );\n});\n","// extracted by mini-css-extract-plugin\nexport default {\"item\":\"rXatl\",\"thumbnail\":\"WHqSi\",\"smallItemIconWidth\":\"Pq45z\",\"smallItemInfoWidth\":\"rjvTM\",\"smallProgressBarContainer\":\"W_aym\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EntityType } from 'libs/analytics/interfaces';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.playPage';\n\ninterface ArchivedBannerProps {\n typeId: MasterType;\n hasStudentExperience: boolean;\n}\n\nfunction mapTypeId(typeId: MasterType): string {\n switch (typeId) {\n case MasterType.Video:\n return 'video';\n case MasterType.Clip:\n return 'clip';\n case MasterType.Interactive:\n return 'interactive';\n default:\n return '';\n }\n}\n\nexport function ArchivedBanner(props: ArchivedBannerProps): JSX.Element {\n const getPhrase = LanguageService.encloseNamespace(namespace);\n const type = mapTypeId(props.typeId);\n\n return (\n <div className='alert bg-light-blue p-3 rounded-3 d-flex justify-content-between align-items-center'>\n <SvgContainer\n svgName={cvSvgLibrary.Archive}\n size={SvgContainerSize.Standard}\n className='me-2 svg-container'\n />\n \n <div className='w-100'>\n <p className='fw-semibold mb-0'>{getPhrase('archivedInfoTitle', { type })}</p>\n {(!props.hasStudentExperience || type === EntityType.Video) && (\n <p className='mb-1'>{getPhrase('archivedInfo', { type: `${type}s` })}</p>\n )}\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { RestrictionType } from 'libs/shared/enums/RestrictionType';\nimport { Restrictions, YearGroup } from 'libs/shared/interfaces';\nimport { RestrictionHelper } from 'libs/shared/utils/RestrictionHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'shared.playPage';\n\ninterface RestrictionBannerProps {\n restrictions: Restrictions;\n yearGroups: YearGroup[];\n objectId: string;\n objectTypeId: MasterType;\n canManageVideoAccess: boolean;\n}\n\nexport function RestrictionBanner(props: RestrictionBannerProps): JSX.Element {\n if (!props.restrictions?.value?.length || !props.yearGroups || !props.canManageVideoAccess)\n return <></>;\n\n const restriction = RestrictionHelper.getWeightedRestriction(props.restrictions.value);\n\n if (restriction.type !== RestrictionType.Custom)\n return <></>;\n\n const baseClassName = RestrictionHelper.mapRestrictionToClass(props.restrictions);\n const className = `${baseClassName} fw-semibold p-2 rounded mb-3 d-flex justify-content-between align-items-center`;\n\n return (\n <div className={className}>\n <div className='d-flex align-items-center'>\n <SvgContainer\n svgName={RestrictionHelper.mapRestrictionToSvg(props.restrictions)}\n size={SvgContainerSize.Large}\n />\n <span className='ps-1'>\n {RestrictionHelper.mapRestrictionToText(props.restrictions, props.yearGroups)}\n </span>\n </div>\n \n <AppLink\n appLink={{\n application: AppChannels.DEFAULT,\n action: Actions.Default.APPROVE_VIDEO,\n params: {\n objectId: props.objectId,\n objectTypeId: props.objectTypeId\n }\n }}\n className='btn btn-outline-dark'\n >\n <Text namespace={namespace} phrase='approve' />\n </AppLink>\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\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 { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { CanFavouriteFunc, CurrentUser, FavouriteFunc, PresentationAudience, VideoTypes, YearGroup } from 'libs/shared/interfaces';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\nimport { RelatedVideosHash } from 'shared/hooks/useGetRelatedVideos';\nimport { InteractiveHelpers } from 'shared/utils/InteractiveHelper';\n\nimport { SeriesAppLinkHelper } from 'apps/series/SeriesAppLinkHelper';\n\nconst namespace = 'shared.relatedVideos';\n\ninterface RelatedVideosProps {\n currentVideo: VideoTypes;\n yearGroups: YearGroup[];\n relatedVideos: RelatedVideosHash;\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n currentUser: CurrentUser;\n audiences: PresentationAudience[];\n getVideoAppLink: (video: VideoTypes, opts: GetVideoAppLinkOptions) => Core.AppLink;\n moviesAndTv: boolean;\n}\n\nexport function RelatedVideos(props: RelatedVideosProps): JSX.Element {\n const videoActions = useVideoActions({ location: VideoActionsLocation.VideoItem });\n const { hasPermissions } = usePermissions();\n\n if (!props.currentUser?.isAuthenticated) // Don't render if user is unauthenticated\n return <></>;\n\n if (props.relatedVideos.hasError) // Don't render if request has errored\n return <></>;\n\n if (props.relatedVideos.hasCompleted && !props.relatedVideos.videos?.length) // Don't render if response is empty\n return <></>;\n\n if (!props.relatedVideos.isFetching && !props.relatedVideos.hasCompleted) // Don't render if request is never made\n return <></>;\n\n // We don't support autoplaying from interactives. This means the related videos heading won't say \"Up next\"\n const canAutoplay = !VideoHelper.isInteractive(props.currentVideo);\n\n return (\n <VideoActionsContext.Provider value={videoActions}>\n <h2 className='h4 mb-0'>\n <Text namespace={namespace} phrase={canAutoplay ? 'upNext' : 'relatedVideos'} />\n </h2>\n {props.relatedVideos.hasCompleted\n ? (\n <VideoList\n videos={props.relatedVideos.videos}\n yearGroups={props.yearGroups}\n getSubTextAppLink={video => {\n return SeriesAppLinkHelper.getSeriesAppLink(video.series, props.moviesAndTv ? { mtv: true } : null);\n }}\n getVideoAppLink={props.getVideoAppLink}\n hasPermissions={hasPermissions}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n presentationAudiences={props.audiences}\n getPreviewQuestionsAppLink={interactive => InteractiveHelpers.getPreviewQuestionsAppLink(interactive)}\n />\n ) : <PartialVideoList />\n }\n {props.relatedVideos.hasMore &&\n <InfiniteScrollFooter\n isFetching={props.relatedVideos.isFetching}\n fetchNext={props.relatedVideos.fetchNext}\n />\n }\n </VideoActionsContext.Provider>\n );\n}","import React from 'react';\n\nimport { Flight } from 'libs/common/flight';\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 { CurrentUser, Video, VideoCollection } from 'libs/shared/interfaces';\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(videos: VideoCollection | Video[], 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 videoIds = videos && (Array.isArray(videos)\n ? videos.filter(Boolean).map(v => v.id)\n : videos.data.filter(Boolean).map(v => v.id));\n\n const [ request, setRequest ] = React.useState<Flight.Request[]>([]);\n\n React.useEffect(() => {\n if (!videoIds?.length || !currentUser.data?.isAuthenticated)\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 ...r,\n ClassificationRequests.hasCurriculumLinks(unhydratedVideos, null, options.flightNamespace),\n VideoRequests.videoMixinAssocs(unhydratedVideos, options.flightNamespace)\n ]);\n }, [ videoIds?.length, currentUser.data?.isAuthenticated ]);\n\n Flight.useBasicFetchAll(request);\n}"],"names":["InfiniteScrollFooter","props","ref","inView","fetchOnScroll","isFetching","fetchNext","nextCursor","className","Spinner","as","animation","role","SvgContainer","svgName","size","S","onClick","defaultProps","PartialVideoList","Array","numVideos","fill","map","_","i","key","allowBulkActions","PartialVideoItem","breakpoints","useBreakpoints","isSmall","VideoListHelper","withDragHandle","withReordering","xs","Row","Col","VideoOwnerText","owner","isClickViewCurated","SvgContainer2","name","UserHelper","Avatar","imageCdnUrl","initials","surname","imageUrl","avatar","url","InteractiveWidgetItem","questionsAppLink","args","data","id","VideoThumbnail","video","appLink","getAppLink","type","imageOptions","textPosition","ThumbnailTextPosition","preload","analyticsOptions","location","AppLink","_isClickViewCurated","value","Text","namespace","phrase","ArchivedBanner","getPhrase","typeId","mapTypeId","hasStudentExperience","RestrictionBanner","restrictions","length","yearGroups","canManageVideoAccess","baseClassName","application","action","params","objectId","objectTypeId","RelatedVideos","videoActions","hasPermissions","currentUser","isAuthenticated","relatedVideos","hasError","hasCompleted","videos","canAutoplay","currentVideo","getSubTextAppLink","series","moviesAndTv","mtv","getVideoAppLink","setFavourite","canFavourite","presentationAudiences","audiences","getPreviewQuestionsAppLink","interactive","hasMore","useVideoMixin","options","hydratedVideos","Set","videoIds","isArray","filter","Boolean","v","request","setRequest","unhydratedVideos","forEach","current","has","push","add","r","flightNamespace"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"scripts/920-acc6596891-lite.chunk.js","mappings":"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","sources":["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/components/video-list/partial-loading/partial-video-list.scss","file:///app/packages/libs/shared/src/components/video-list/partial-loading/PartialVideoList.tsx","file:///app/packages/libs/shared/src/components/video-owner-text/video-owner-text.scss","file:///app/packages/libs/shared/src/components/video-owner-text/VideoOwnerText.tsx","file:///app/packages/libs/shared/src/components/widgets/items/interactive-widget-item/InteractiveWidgetItem.tsx","file:///app/packages/libs/shared/src/components/widgets/items/interactive-widget-item/interactive-widget-item.scss","file:///app/packages/projects/lite/src/shared/components/play-page/ArchivedBanner.tsx","file:///app/packages/projects/lite/src/shared/components/play-page/RestrictionBanner.tsx","file:///app/packages/projects/lite/src/shared/components/related-videos/RelatedVideos.tsx","file:///app/packages/projects/lite/src/shared/hooks/useVideoMixin.ts"],"sourcesContent":["// 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}","// extracted by mini-css-extract-plugin\nexport default {\"partialOptions\":\"Gufgq\",\"partialName\":\"SicQQ\",\"partialDescription\":\"dPGMq\",\"partialThumbnail\":\"vZrnb\",\"partialDragHandle\":\"iq73R\"};","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { VideoListHelper } from 'libs/shared/components/video-list/VideoListHelper';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\n\nimport styles from './partial-video-list.scss';\n\ninterface PartialVideoListProps {\n withReordering?: boolean;\n numVideos?: number;\n allowBulkActions?: boolean;\n}\n\nPartialVideoList.defaultProps = {\n numVideos: 15\n};\n\nexport function PartialVideoList(props: PartialVideoListProps): JSX.Element {\n return (\n <div className='mx-2'>\n {Array(props.numVideos).fill(null).map((_, i) => (\n <div className='d-flex' key={i}>\n {props.allowBulkActions && <div className='form-check pe-3 pe-sm-2 mx-0 mx-md-2' />}\n <PartialVideoItem {...props} />\n </div>\n ))}\n </div>\n );\n}\n\nexport function PartialVideoItem(props: PartialVideoListProps): JSX.Element {\n const breakpoints = useBreakpoints();\n\n const size = VideoListHelper.getSize(breakpoints, 'md');\n const isSmall = size === 'sm';\n\n const withDragHandle = props.withReordering && !breakpoints.xs;\n\n return (\n <Row className={`${isSmall ? '' : 'py-2'} flex-grow-1`}>\n <Col {...VideoListHelper.getThumbnailColumns()} className={`flex-column align-items-flex-start ${isSmall ? `pb-2 pe-1` : 'mb-1 pe-3 pe-md-2'}`}>\n <Row>\n {!!withDragHandle && (\n <div className='d-flex align-items-center justify-content-center col-2'>\n <div className={`partial-loading-background ${styles.partialDragHandle}`} />\n </div>\n )}\n <Col xs={VideoListHelper.getThumbnailColSize(withDragHandle)}>\n <div className={`partial-loading-background ${isSmall ? 'rounded' : 'rounded-3'} ${styles.partialThumbnail}`} />\n </Col>\n </Row>\n </Col>\n <Col {...VideoListHelper.getDetailsColumns()} className={isSmall ? 'pb-2' : 'px-2'}>\n <div className={`partial-loading-background mb-1 ${styles.partialName}`} />\n <div className={`partial-loading-background ${styles.partialDescription}`} />\n </Col>\n </Row>\n );\n}\n\n","// extracted by mini-css-extract-plugin\nexport default {\"avatarContainer\":\"kd18L\",\"cvIcon\":\"smUBc\"};","import React from 'react';\n\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { SvgContainer2 } from 'libs/shared/components/svg-container/SvgContainer2';\nimport { ClickViewPlayLogo } from 'libs/shared/components/svgs/clickview-logo/ClickViewLogo';\nimport { User } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport styles from './video-owner-text.scss';\n\ninterface VideoOwnerTextProps {\n owner: User;\n isClickViewCurated: boolean;\n imageCdnUrl: string;\n}\n\nexport function VideoOwnerText(props: VideoOwnerTextProps): JSX.Element {\n if (!props.owner && !props.isClickViewCurated)\n return <></>;\n\n if (props.isClickViewCurated) {\n return (\n <div className='clamp-1 d-flex align-items-center'>\n <div className={`${styles.avatarContainer} me-1 border rounded-circle position-relative`}>\n <SvgContainer2 className={`me-1 ${styles.cvIcon}`}>\n <ClickViewPlayLogo />\n </SvgContainer2>\n </div>\n ClickView\n </div>\n );\n }\n\n const name = UserHelper.getCommunityName(props.owner);\n\n if (!name)\n return <></>;\n\n return (\n <div className='d-flex align-items-center'>\n <div className={`${styles.avatarContainer} me-1`}>\n <Avatar\n imageCdnUrl={props.imageCdnUrl}\n initials={UserHelper.getInitials(props.owner.name, props.owner.surname)}\n imageUrl={props.owner.avatar?.url}\n />\n </div>\n <div className='clamp-1'>\n {name}\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoThumbnail } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { VideoOwnerText } from 'libs/shared/components/video-owner-text/VideoOwnerText';\nimport { FixedWidgetItemProps } from 'libs/shared/components/widgets/items/FixedWidgetItemProps';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { ThumbnailTextPosition } from 'libs/shared/enums/ThumbnailTextPosition';\nimport { Clip, InteractiveMetadata, Video } from 'libs/shared/interfaces';\n\nimport styles from './interactive-widget-item.scss';\n\nconst namespace = 'shared.interactiveWidgetItem';\n\nexport interface InteractiveWidgetItemProps extends FixedWidgetItemProps<InteractiveMetadata> {\n video: Video | Clip;\n questionsAppLink: Core.AppLink;\n imageCdnUrl: string;\n}\n\nexport const InteractiveWidgetItem = React.memo(function(props: InteractiveWidgetItemProps): JSX.Element {\n const questionsAppLink: Core.AppLink = {\n ...props.questionsAppLink,\n args: [props.data.id]\n };\n\n return (\n <div className={`flex-shrink-0 px-1 ${styles.item}`}>\n <div className='row m-0 border rounded p-2 h-100'>\n <div className='col-6 p-0'>\n <VideoThumbnail\n video={props.data}\n appLink={props.getAppLink(props.data)}\n type='cosmetic'\n imageOptions={{ size: ImageSize.Small }}\n textPosition={ThumbnailTextPosition.Independent}\n preload\n analyticsOptions={{ location: LocationContext.SlidingListItem }}\n />\n </div>\n\n <div className='col-6 p-0'>\n <div className='ps-2'>\n <AppLink appLink={props.getAppLink(props.data)}>\n <h3 className='h6 mb-1'><span className='clamp-2'>{props.data.name}</span></h3>\n </AppLink>\n\n <VideoOwnerText\n owner={props.data.owner}\n isClickViewCurated={props.data._isClickViewCurated?.value}\n imageCdnUrl={props.imageCdnUrl}\n />\n\n <AppLink className='info-link' appLink={questionsAppLink}>\n <Text namespace={namespace} phrase='previewQuestions' />\n </AppLink>\n </div>\n </div>\n </div>\n </div>\n );\n});\n","// extracted by mini-css-extract-plugin\nexport default {\"item\":\"rXatl\",\"thumbnail\":\"WHqSi\",\"smallItemIconWidth\":\"Pq45z\",\"smallItemInfoWidth\":\"rjvTM\",\"smallProgressBarContainer\":\"W_aym\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EntityType } from 'libs/analytics/interfaces';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.playPage';\n\ninterface ArchivedBannerProps {\n typeId: MasterType;\n hasStudentExperience: boolean;\n}\n\nfunction mapTypeId(typeId: MasterType): string {\n switch (typeId) {\n case MasterType.Video:\n return 'video';\n case MasterType.Clip:\n return 'clip';\n case MasterType.Interactive:\n return 'interactive';\n default:\n return '';\n }\n}\n\nexport function ArchivedBanner(props: ArchivedBannerProps): JSX.Element {\n const getPhrase = LanguageService.encloseNamespace(namespace);\n const type = mapTypeId(props.typeId);\n\n return (\n <div className='alert bg-light-blue p-3 rounded-3 d-flex justify-content-between align-items-center'>\n <SvgContainer\n svgName={cvSvgLibrary.Archive}\n size={SvgContainerSize.Standard}\n className='me-2 svg-container'\n />\n \n <div className='w-100'>\n <p className='fw-semibold mb-0'>{getPhrase('archivedInfoTitle', { type })}</p>\n {(!props.hasStudentExperience || type === EntityType.Video) && (\n <p className='mb-1'>{getPhrase('archivedInfo', { type: `${type}s` })}</p>\n )}\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { RestrictionType } from 'libs/shared/enums/RestrictionType';\nimport { Restrictions, YearGroup } from 'libs/shared/interfaces';\nimport { RestrictionHelper } from 'libs/shared/utils/RestrictionHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'shared.playPage';\n\ninterface RestrictionBannerProps {\n restrictions: Restrictions;\n yearGroups: YearGroup[];\n objectId: string;\n objectTypeId: MasterType;\n canManageVideoAccess: boolean;\n}\n\nexport function RestrictionBanner(props: RestrictionBannerProps): JSX.Element {\n if (!props.restrictions?.value?.length || !props.yearGroups || !props.canManageVideoAccess)\n return <></>;\n\n const restriction = RestrictionHelper.getWeightedRestriction(props.restrictions.value);\n\n if (restriction.type !== RestrictionType.Custom)\n return <></>;\n\n const baseClassName = RestrictionHelper.mapRestrictionToClass(props.restrictions);\n const className = `${baseClassName} fw-semibold p-2 rounded mb-3 d-flex justify-content-between align-items-center`;\n\n return (\n <div className={className}>\n <div className='d-flex align-items-center'>\n <SvgContainer\n svgName={RestrictionHelper.mapRestrictionToSvg(props.restrictions)}\n size={SvgContainerSize.Large}\n />\n <span className='ps-1'>\n {RestrictionHelper.mapRestrictionToText(props.restrictions, props.yearGroups)}\n </span>\n </div>\n \n <AppLink\n appLink={{\n application: AppChannels.DEFAULT,\n action: Actions.Default.APPROVE_VIDEO,\n params: {\n objectId: props.objectId,\n objectTypeId: props.objectTypeId\n }\n }}\n className='btn btn-outline-dark'\n >\n <Text namespace={namespace} phrase='approve' />\n </AppLink>\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\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 { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { CanFavouriteFunc, CurrentUser, FavouriteFunc, PresentationAudience, VideoTypes, YearGroup } from 'libs/shared/interfaces';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\nimport { RelatedVideosHash } from 'shared/hooks/useGetRelatedVideos';\nimport { InteractiveHelpers } from 'shared/utils/InteractiveHelper';\n\nimport { SeriesAppLinkHelper } from 'apps/series/SeriesAppLinkHelper';\n\nconst namespace = 'shared.relatedVideos';\n\ninterface RelatedVideosProps {\n currentVideo: VideoTypes;\n yearGroups: YearGroup[];\n relatedVideos: RelatedVideosHash;\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n currentUser: CurrentUser;\n audiences: PresentationAudience[];\n getVideoAppLink: (video: VideoTypes, opts: GetVideoAppLinkOptions) => Core.AppLink;\n moviesAndTv: boolean;\n}\n\nexport function RelatedVideos(props: RelatedVideosProps): JSX.Element {\n const videoActions = useVideoActions({ location: VideoActionsLocation.VideoItem });\n const { hasPermissions } = usePermissions();\n\n if (!props.currentUser?.isAuthenticated) // Don't render if user is unauthenticated\n return <></>;\n\n if (props.relatedVideos.hasError) // Don't render if request has errored\n return <></>;\n\n if (props.relatedVideos.hasCompleted && !props.relatedVideos.videos?.length) // Don't render if response is empty\n return <></>;\n\n if (!props.relatedVideos.isFetching && !props.relatedVideos.hasCompleted) // Don't render if request is never made\n return <></>;\n\n // We don't support autoplaying from interactives. This means the related videos heading won't say \"Up next\"\n const canAutoplay = !VideoHelper.isInteractive(props.currentVideo);\n\n return (\n <VideoActionsContext.Provider value={videoActions}>\n <h2 className='h4 mb-0'>\n <Text namespace={namespace} phrase={canAutoplay ? 'upNext' : 'relatedVideos'} />\n </h2>\n {props.relatedVideos.hasCompleted\n ? (\n <VideoList\n videos={props.relatedVideos.videos}\n yearGroups={props.yearGroups}\n getSubTextAppLink={video => {\n return SeriesAppLinkHelper.getSeriesAppLink(video.series, props.moviesAndTv ? { mtv: true } : null);\n }}\n getVideoAppLink={props.getVideoAppLink}\n hasPermissions={hasPermissions}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n presentationAudiences={props.audiences}\n getPreviewQuestionsAppLink={interactive => InteractiveHelpers.getPreviewQuestionsAppLink(interactive)}\n />\n ) : <PartialVideoList />\n }\n {props.relatedVideos.hasMore &&\n <InfiniteScrollFooter\n isFetching={props.relatedVideos.isFetching}\n fetchNext={props.relatedVideos.fetchNext}\n />\n }\n </VideoActionsContext.Provider>\n );\n}","import React from 'react';\n\nimport { Flight } from 'libs/common/flight';\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 { CurrentUser, Video, VideoCollection } from 'libs/shared/interfaces';\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(videos: VideoCollection | Video[], 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 videoIds = videos && (Array.isArray(videos)\n ? videos.filter(Boolean).map(v => v.id)\n : videos.data.filter(Boolean).map(v => v.id));\n\n const [ request, setRequest ] = React.useState<Flight.Request[]>([]);\n\n React.useEffect(() => {\n if (!videoIds?.length || !currentUser.data?.isAuthenticated)\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 ...r,\n ClassificationRequests.hasCurriculumLinks(unhydratedVideos, null, options.flightNamespace),\n VideoRequests.videoMixinAssocs(unhydratedVideos, options.flightNamespace)\n ]);\n }, [ videoIds?.length, currentUser.data?.isAuthenticated ]);\n\n Flight.useBasicFetchAll(request);\n}"],"names":["InfiniteScrollFooter","props","ref","inView","fetchOnScroll","isFetching","fetchNext","nextCursor","className","Spinner","as","animation","role","SvgContainer","svgName","size","S","onClick","defaultProps","PartialVideoList","Array","numVideos","fill","map","_","i","key","allowBulkActions","PartialVideoItem","breakpoints","useBreakpoints","isSmall","VideoListHelper","withDragHandle","withReordering","xs","Row","Col","VideoOwnerText","owner","isClickViewCurated","SvgContainer2","name","UserHelper","Avatar","imageCdnUrl","initials","surname","imageUrl","avatar","url","InteractiveWidgetItem","questionsAppLink","args","data","id","VideoThumbnail","video","appLink","getAppLink","type","imageOptions","textPosition","ThumbnailTextPosition","preload","analyticsOptions","location","AppLink","_isClickViewCurated","value","Text","namespace","phrase","ArchivedBanner","getPhrase","typeId","mapTypeId","hasStudentExperience","RestrictionBanner","restrictions","length","yearGroups","canManageVideoAccess","baseClassName","application","action","params","objectId","objectTypeId","RelatedVideos","videoActions","hasPermissions","currentUser","isAuthenticated","relatedVideos","hasError","hasCompleted","videos","canAutoplay","currentVideo","getSubTextAppLink","series","moviesAndTv","mtv","getVideoAppLink","setFavourite","canFavourite","presentationAudiences","audiences","getPreviewQuestionsAppLink","interactive","hasMore","useVideoMixin","options","hydratedVideos","Set","videoIds","isArray","filter","Boolean","v","request","setRequest","unhydratedVideos","forEach","current","has","push","add","r","flightNamespace"],"sourceRoot":""}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[9212],{94644:(e,t,a)=>{a.d(t,{r:()=>d});var i=a(50242),n=a(81886),r=a(67058),o=a(14553),c=a(49267),s=a(49075),l={notFound:r.d,forbidden:{rating:o.q,yearLevel:o.q,region:c.a,privacy:o.q},badRequest:s._};function d(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(e){var r;r="number"==typeof e?e:e.status;var o=Object.assign(Object.assign({},l),t);r&&n.Q.Ry.isStatusCodeError(r)&&(r!==i.o.NotFound?r!==i.o.Forbidden?a.badRequest||n.Q.Ry.throw(new o.badRequest):a.forbidden||n.Q.Ry.throw(new o.forbidden.privacy):a.notFound||n.Q.Ry.throw(new o.notFound))}}},91286:(e,t,a)=>{a.d(t,{v:()=>o});var i=a(32735),n=a(94644);function r(e){return e.map((function(e){return e.statusCode})).join(":")}function o(e,t,a){var o=Array.isArray(e)?e:[e];(0,i.useEffect)((function(){o.forEach((function(e){(0,n.r)(e.statusCode,t,a)}))}),[r(o),t,a])}},56871:(e,t,a)=>{a.d(t,{N:()=>W});var i=a(32735),n=a(23481),r=a(28400),o=a(65858),c=a(83345),s=a(19670),l=a(32614),d=a(13231),u=a(11518),p=a(15446),v=a(47862),m=a(9098),g=a(10439),f=a(35429),y=a(51365),h=a(4594),I=a(16714),C=a(12754),E=a(58704),P=a(22902),b=a(9907),A=a(59598),V=a(31908),w=a(26492),O=a(57654),T=a(99092),k=a(47938),x=a(81024),F=a(78166),R=a(99719),S=a(42571),N=a(99742),L=a(14070),q=a(97291),U=a(10671),j=a(10741),_=a(22490);function M(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,i=new Array(t);a<t;a++)i[a]=e[a];return i}var G=function(e,t,a){return function(i){return a?{application:q.O.VIDEOS,action:L.e.Videos.PREVIEW_PDF,args:[i.id],params:{videoId:e,shareId:t}}:{application:q.O.SIGN_UP,action:L.e.SignUp.SIGN_UP}}},B="shared.playClip",D=n.T.encloseNamespace(B);function W(e){var t,a,n,W,H,Q,z,K,Y,Z,X,$,J,ee,te,ae=(0,f.g)(),ie=(0,P.T)().hasPermissions,ne=V.M.getCanBeConsumed(e.clip).canConsume,re=(0,U._)({location:U.i.VideoItem}),oe=i.useRef(null),ce=i.useRef(null);(0,b.P)([oe.current,ce.current],e.tableOfContentsId);var se,le,de=V.M.isVideoTypeArchived(e.clip),ue=ie(I.C.StudentExperience),pe=i.useRef(!1),ve=(0,l.Wp)(e.clip,e.glanceTheme)&&e.featureAccess.canViewGlance,me=(se=i.useState({view:"loading",referrer:null}),le=2,function(e){if(Array.isArray(e))return e}(se)||function(e,t){var a=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var i,n,r,o,c=[],s=!0,l=!1;try{if(r=(a=a.call(e)).next,0===t){if(Object(a)!==a)return;s=!1}else for(;!(s=(i=r.call(a)).done)&&(c.push(i.value),c.length!==t);s=!0);}catch(e){l=!0,n=e}finally{try{if(!s&&null!=a.return&&(o=a.return(),Object(o)!==o))return}finally{if(l)throw n}}return c}}(se,le)||function(e,t){if(e){if("string"==typeof e)return M(e,t);var a=Object.prototype.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?M(e,t):void 0}}(se,le)||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.")}()),ge=me[0],fe=me[1];function ye(){var t;return!(null===(t=e.currentUser)||void 0===t?void 0:t.isAuthenticated)||!e.hasProduct(C.x.Primary)||!!ue}i.useEffect((function(){e.glanceLoaded&&fe({view:e.glanceTheme?"v@g":"details",referrer:null})}),[e.glanceLoaded,e.glanceTheme]);var he=e.originalVideo&&!ye()&&!!(null===(t=e.clip._canBeConsumed)||void 0===t?void 0:t.value),Ie="picture-in-picture"===ae.mode||e.featureAccess.canViewPublicLayout,Ce=(0,T.jh)(e.clip,ue),Ee=null!==(H=null===(W=null===(n=null===(a=e.originalVideo)||void 0===a?void 0:a.clips)||void 0===n?void 0:n.data)||void 0===W?void 0:W.filter((function(t){return t.id.toString()!==e.clip.id.toString()})))&&void 0!==H?H:[];return i.createElement("div",{className:"px-4"},i.createElement(k.W,{restrictions:e.clip._restrictions,yearGroups:e.yearGroups,objectId:e.clip.id,objectTypeId:h.E.Clip,canManageVideoAccess:e.canManageVideoAccess}),de&&i.createElement(w.T,{typeId:e.clip.typeId,hasStudentExperience:ue}),i.createElement("section",{className:"mb-2"},ne&&i.createElement(g.r,{key:e.clip.id,objectId:e.clip.id,objectTypeId:e.clip.typeId,shareId:e.shareId,context:null===(Q=e.queryParams)||void 0===Q?void 0:Q.context,contextId:null===(z=e.queryParams)||void 0===z?void 0:z.contextId,moviesAndTv:null===(K=e.queryParams)||void 0===K?void 0:K.mtv,playNext:null===(Y=e.queryParams)||void 0===Y?void 0:Y.playNext,startTime:null!==(X=null===(Z=e.queryParams)||void 0===Z?void 0:Z.t)&&void 0!==X?X:null===($=e.queryParams)||void 0===$?void 0:$.startTime,mode:"default",location:"play-page"}),i.createElement("div",{className:Ie?"":"d-none"},i.createElement(x.S,{video:e.clip,type:"pip"}))),i.createElement(O.v,{media:e.clip,yearGroups:e.yearGroups,audiences:e.audiences,originalVideoAppLink:he?{application:q.O.VIDEOS,action:L.e.Videos.PLAY_VIDEO,args:[e.originalVideo.id,r.m.slugify(e.originalVideo.name)]}:null,featureAccess:e.featureAccess,shareId:e.shareId}),i.createElement("section",{className:"".concat("v@g"===ge.view?"d-block":"d-none")},i.createElement(s.o,{theme:e.glanceTheme,video:e.clip,pointsOfInterest:e.pointsOfInterest,onClickShowDescription:function(){return fe({view:"details",referrer:"v@g"})},setStartTime:function(e){var t;return null===(t=ae.playerRef.current)||void 0===t?void 0:t.currentTime(e)},getTagAppLink:function(e){return{application:q.O.SEARCH,action:L.e.Search.HOME,params:{tagOrClassification:e.name}}},suppressInteractivity:e.featureAccess.canViewPublicLayout})),i.createElement("section",{className:"".concat("details"===ge.view?"d-block":"d-none")},i.createElement(R.X,{video:e.clip,onLaunchImmersiveReader:function(){var e,t,a,i;pe.current=!(null===(t=null===(e=null==ae?void 0:ae.playerRef)||void 0===e?void 0:e.current)||void 0===t?void 0:t.isPaused()),null===(i=null===(a=null==ae?void 0:ae.playerRef)||void 0===a?void 0:a.current)||void 0===i||i.pause()},onExitImmersiveReader:function(){var e,t;pe.current&&(null===(t=null===(e=null==ae?void 0:ae.playerRef)||void 0===e?void 0:e.current)||void 0===t||t.play())},onClickClose:ve&&function(){return fe({view:"v@g",referrer:"details"})},getTagAppLink:function(e){return{application:q.O.SEARCH,action:L.e.Search.HOME,params:{tagOrClassification:e.name}}},hideTags:ve,suppressInteractivity:e.featureAccess.canViewPublicLayout})),i.createElement("section",{className:"".concat("loading"===ge.view?"d-block":"d-none")},i.createElement(S.H,null)),!!(null==Ce?void 0:Ce.length)&&i.createElement("section",{className:"pb-3",id:A.K.Resources,ref:oe},i.createElement(u.kM,{name:D("resources",{count:Ce.length}),contents:E.z.PlayPageResources,collection:Ce,prefetched:!0,childComponent:m.R,extraChildComponentProps:{imageCdnUrl:e.imageCdnUrl,imageErrorFallbackUrl:N.W.Fallbacks.RESOURCE_THUMBNAIL,actionBehaviour:e.featureAccess.canViewResourceItems?"normal":"public",location:"play-page",titlePosition:"above",hideTypeBadge:!0},getChildAppLink:G(null===(J=e.clip)||void 0===J?void 0:J.id,e.shareId,e.featureAccess.canViewResourceItems),analyticsOptions:e.featureAccess.canViewResourceItems?{}:{workflowPhase:o.eu.Start,descriptor:o.Yu.SignUp},analyticsData:{widgetId:"resources"}})),!(!(null==Ee?void 0:Ee.length)||ye())&&i.createElement("div",{className:"pb-3"},i.createElement(u.kM,{name:D("otherClips",{count:Ee.length}),contents:E.z.Clips,collection:Ee,prefetched:!0,getChildAppLink:function(e){return{application:q.O.CLIPS,action:L.e.Clips.PLAY_CLIP,args:[e.id,r.m.slugify(e.name)]}},childComponent:p.C,extraChildComponentProps:{video:e.originalVideo,imageCdnUrl:e.imageCdnUrl},analyticsData:{widgetId:"clips"}})),!(!(null===(te=null===(ee=e.clip.interactives)||void 0===ee?void 0:ee.data)||void 0===te?void 0:te.length)||ye())&&i.createElement("div",{className:"pb-3",id:A.K.Interactives,ref:ce},i.createElement(u.kM,{name:D("interactives",{count:e.clip.interactives.data.length}),contents:E.z.Interactives,collection:e.clip.interactives.data,prefetched:!0,getChildAppLink:function(e){return{application:q.O.INTERACTIVES,action:L.e.Interactives.VIEW_INTERACTIVE,args:[e.id,r.m.slugify(e.name)]}},childComponent:v.K,extraChildComponentProps:{video:e.clip,questionsAppLink:{application:q.O.INTERACTIVES,action:L.e.Interactives.PREVIEW_QUESTIONS},imageCdnUrl:e.imageCdnUrl},analyticsData:{widgetId:"interactives"}})),!!he&&i.createElement("section",{className:"pb-2 pt-1"},i.createElement("h2",{className:"h4 mb-0"},i.createElement(c.x,{namespace:B,phrase:"clippedFrom"})),i.createElement(y.M.Provider,{value:re},i.createElement(d.E4,{videos:[e.originalVideo],yearGroups:e.yearGroups,setFavourite:e.setFavourite,canFavourite:e.canFavourite,getVideoAppLink:function(t,a){return _.W.getAppLink(t,Object.assign(Object.assign({},a),{context:e.queryParams.context,contextId:e.queryParams.contextId,playNext:e.queryParams.playNext,shareId:e.shareId,moviesAndTv:e.queryParams.mtv}))},hasPermissions:ie,presentationAudiences:e.audiences,getPreviewQuestionsAppLink:function(e){return j.j.getPreviewQuestionsAppLink(e)}}))),i.createElement("section",null,i.createElement(F.Z,{currentVideo:e.clip,yearGroups:e.yearGroups,relatedVideos:e.relatedVideos,setFavourite:e.setFavourite,canFavourite:e.canFavourite,currentUser:e.currentUser,audiences:e.audiences,getVideoAppLink:function(t,a){return _.W.getAppLink(t,Object.assign(Object.assign({},a),{context:e.queryParams.context,contextId:e.queryParams.contextId,playNext:e.queryParams.playNext,shareId:e.shareId,moviesAndTv:e.queryParams.mtv}))},moviesAndTv:e.queryParams.mtv})))}},44110:(e,t,a)=>{a.d(t,{i:()=>o});var i=a(20354),n=a(89454),r=a(86698),o=function(){var e=(0,r.y)({redirectOnError:!0}),t=e.activePresentation,a=e.getFallbackPresentation,o=t||a();return i.a.useBasicFetch(!!o&&n.O.presentationAudiences(o.id))}},27478:(e,t,a)=>{a.r(t),a.d(t,{PlayClipView:()=>N});var i=a(32735),n=a(50242),r=a(23481),o=a(20354),c=a(65858),s=a(78417),l=a(16714),d=a(67058),u=a(33803),p=a(43012),v=a(39151),m=a(1666),g=a(28907),f=a(31949),y=a(1575),h=a(27995),I=a(91286),C=a(22902),E=a(15311),P=a(79612),b=a(76753),A=a(56871),V=a(7179),w=a(49948),O=a(36873),T=a(27638),k=a(44110),x=a(35014),F=a(97816),R=r.T.encloseNamespace("shared.playClip"),S={notFound:d.d,forbidden:{privacy:u.G}};function N(e){var t,a,r,d,u,N,L=e.queryParams,q=L.context,U=L.contextId,j=L.mtv,_=(0,E.r)().hasProduct,M=(0,T.u)(c.LZ.PlayClip),G=M.setFavourite,B=M.canFavourite,D=(0,C.T)().hasPermissions,W=o.a.useBasicFetch(f.N.currentUser()),H=o.a.useBasicFetch(v.L.config()),Q=o.a.useBasicFetch(p.e.clip(e.id)),z=o.a.useBasicFetch(!!(null===(t=Q.data)||void 0===t?void 0:t._parentVideo)&&y.R.video(Q.data._parentVideo.id)),K=o.a.useBasicFetch(Q.statusCode===n.o.Forbidden&&p.e.clip(e.id,s.r.StripMetadata)),Y=(0,O.k)({video:z.data,context:q,contextId:U,moviesAndTv:j,currentUser:W.data}),Z=(0,k.i)(),X=o.a.useBasicFetch((null===(a=W.data)||void 0===a?void 0:a.isAuthenticated)&&m.h.yearGroups(W.data.customerId)),$=D(l.C.ViewVideoGlance)&&(null===(d=null===(r=Q.data)||void 0===r?void 0:r.glance)||void 0===d?void 0:d.theme),J=o.a.useBasicFetch($&&g.r.themeImages(Q.data.glance.theme,Q.data.glance.type)),ee=(0,w.l)(e.id,!0),te=(0,x.I)();return(0,P.M)(b.CG.getClipMetadata({content:Q.data,phraseContext:{phraseHandler:R,titlePhrase:"pageTitle",descriptionPhrase:"pageDescription"}})),(0,I.v)(Q,S,{forbidden:!0}),(0,F.V)(null!==(u=Y.videos)&&void 0!==u?u:[]),(0,h.b)(K),(0,V.P)({id:e.id,app:"clips"}),Q.data&&W.hasCompleted&&H.hasCompleted&&ee.hasCompleted?i.createElement(A.N,{clip:Q.data,originalVideo:z.data,currentUser:W.data,yearGroups:X.data,relatedVideos:"playlist"===q?Y:Object.assign(Object.assign({},Y),{videos:[]}),canFavourite:B,setFavourite:G,hasProduct:_,queryParams:e.queryParams,audiences:Z.data,imageCdnUrl:H.data.imageCdnUrl,canManageVideoAccess:D(l.C.ManageVideoAccess),pointsOfInterest:ee.items,glanceTheme:J.data,glanceLoaded:!$||J.hasCompleted,featureAccess:te,tableOfContentsId:null===(N=e.queryParams)||void 0===N?void 0:N.scrollTo}):i.createElement(i.Fragment,null)}N.defaultProps={queryParams:{}}}}]);
|
|
2
|
-
//# sourceMappingURL=9212-
|
|
2
|
+
//# sourceMappingURL=9212-cc987a13bf-lite.chunk.js.map
|
package/dist/scripts/{9212-8f95fbd9b9-lite.chunk.js.map → 9212-cc987a13bf-lite.chunk.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/9212-8f95fbd9b9-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/errors/handlers/HttpErrorHandlers.ts","file:///app/packages/libs/shared/src/hooks/UseHandleObjectError.ts","file:///app/packages/projects/lite/src/shared/components/play-clip/PlayClip.tsx","file:///app/packages/projects/lite/src/shared/hooks/usePresentationAudiences.ts","file:///app/packages/projects/lite/src/shared/views/play-clip/PlayClipView.tsx"],"sourcesContent":["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}\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};\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.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 React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { SignUpDescriptors, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoAtAGlance } from 'libs/shared/components/video-at-a-glance/VideoAtAGlance';\nimport { hasGlanceData } from 'libs/shared/components/video-at-a-glance/VideoAtAGlanceUtils';\nimport { VideoList } from 'libs/shared/components/video-list/VideoList';\nimport { FixedWidget } from 'libs/shared/components/widgets/fixed-widget';\nimport { ClipWidgetItem, ClipWidgetItemProps } from 'libs/shared/components/widgets/items/clip-widget-item/ClipWidgetItem';\nimport { InteractiveWidgetItem, InteractiveWidgetItemProps } from 'libs/shared/components/widgets/items/interactive-widget-item/InteractiveWidgetItem';\nimport { ResourceWidgetItem, ResourceWidgetItemProps } from 'libs/shared/components/widgets/items/resource-widget-item/ResourceWidgetItem';\nimport { GlobalPlayerConsumer } from 'libs/shared/context/player-context/components/GlobalPlayerConsumer';\nimport { usePlayerContext } from 'libs/shared/context/player-context/PlayerContext';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { WidgetContents } from 'libs/shared/enums/WidgetContents';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { HasProductFunc } from 'libs/shared/hooks/UseProducts';\nimport { useTableOfContentsScroll } from 'libs/shared/hooks/useTableOfContentsScroll';\nimport { CanFavouriteFunc, Clip, CurrentUser, FavouriteFunc, Interactive, Link, PointOfInterest, PresentationAudience, Resource, Theme, Video, YearGroup } from 'libs/shared/interfaces';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\nimport { PlayViewQueryParams } from 'libs/shared/interfaces/query-params/PlayViewQueryParams';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { ArchivedBanner } from 'shared/components/play-page/ArchivedBanner';\nimport { PlayPageTitleAndActions } from 'shared/components/play-page/components/PlayPageTitleAndActions';\nimport { getResources } from 'shared/components/play-page/PlayPageUtils';\nimport { RestrictionBanner } from 'shared/components/play-page/RestrictionBanner';\nimport { PlayerPlaceholder } from 'shared/components/player-placeholder/PlayerPlaceholder';\nimport { RelatedVideos } from 'shared/components/related-videos/RelatedVideos';\nimport { VideoDetailsWithScrollbar } from 'shared/components/video-details/VideoDetails';\nimport { VideoDetailsPartial } from 'shared/components/video-details/VideoDetailsPartial';\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\nimport { RelatedVideosHash } from 'shared/hooks/useGetRelatedVideos';\nimport { VideoFeaturesHash } from 'shared/hooks/useVideoFeatureAccess';\nimport { InteractiveHelpers } from 'shared/utils/InteractiveHelper';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nconst getResourceAppLink = (videoId: string, shareId: string, canViewResource: boolean) =>\n (resource: Resource | Link) => {\n if (!canViewResource) {\n return {\n application: AppChannels.SIGN_UP,\n action: Actions.SignUp.SIGN_UP\n };\n }\n\n return {\n application: AppChannels.VIDEOS,\n action: Actions.Videos.PREVIEW_PDF,\n args: [resource.id],\n params: {\n videoId: videoId,\n shareId: shareId\n }\n };\n };\n\nconst namespace = 'shared.playClip';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ntype DetailsViewType = {\n view: 'v@g' | 'details' | 'loading';\n referrer: 'v@g' | 'details';\n};\n\ninterface PlayClipProps {\n clip: Clip;\n originalVideo: Video;\n currentUser: CurrentUser;\n yearGroups: YearGroup[];\n relatedVideos: RelatedVideosHash;\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n queryParams: PlayViewQueryParams;\n hasProduct: HasProductFunc;\n audiences: PresentationAudience[];\n imageCdnUrl: string;\n shareId?: string;\n canManageVideoAccess: boolean;\n pointsOfInterest?: PointOfInterest[];\n featureAccess: VideoFeaturesHash;\n glanceTheme?: Theme;\n glanceLoaded: boolean;\n tableOfContentsId: string;\n}\n\nexport function PlayClip(props: PlayClipProps): JSX.Element {\n const playerContext = usePlayerContext();\n\n const { hasPermissions } = usePermissions();\n const { canConsume } = VideoHelper.getCanBeConsumed(props.clip);\n \n const videoActions = useVideoActions({ location: VideoActionsLocation.VideoItem });\n\n const resourcesRef = React.useRef<HTMLDivElement>(null);\n const interactivesRef = React.useRef<HTMLDivElement>(null);\n\n useTableOfContentsScroll([\n resourcesRef.current,\n interactivesRef.current\n ], props.tableOfContentsId);\n\n const isArchived = VideoHelper.isVideoTypeArchived(props.clip);\n const hasStudentExperience = hasPermissions(PermissionName.StudentExperience);\n /**\n * Need to use a ref because if we use state, onExitImmersiveReader will have a stale\n * reference of the state. This is because the state is changed in onLaunchImmersiveReader\n * which is passed in at the same time as onExitImmersiveReader\n */\n const shouldPlayOnExitImmersiveReader = React.useRef(false);\n\n const hasGlance = hasGlanceData(props.clip, props.glanceTheme) && props.featureAccess.canViewGlance;\n\n const [ detailsView, setDetailsView ] = React.useState<DetailsViewType>({\n view: 'loading',\n referrer: null\n });\n\n React.useEffect(() => {\n if (!props.glanceLoaded)\n return;\n\n setDetailsView({\n view: props.glanceTheme ? 'v@g' : 'details',\n referrer: null\n });\n }, [ props.glanceLoaded, props.glanceTheme ]);\n\n function onLaunchImmersiveReader(): void {\n shouldPlayOnExitImmersiveReader.current = !playerContext?.playerRef?.current?.isPaused();\n playerContext?.playerRef?.current?.pause();\n }\n\n function onExitImmersiveReader(): void {\n if (!shouldPlayOnExitImmersiveReader.current)\n return;\n\n playerContext?.playerRef?.current?.play();\n }\n\n function limitAccess(): boolean {\n if (!props.currentUser?.isAuthenticated)\n return true;\n\n if (!props.hasProduct(ProductId.Primary))\n return true;\n\n if (hasStudentExperience)\n return true;\n\n return false;\n }\n\n const canAccessOriginal = props.originalVideo && !limitAccess() && !!props.clip._canBeConsumed?.value;\n\n function getOriginalVideoAppLink(): Core.AppLink {\n if (!canAccessOriginal)\n return null;\n \n return {\n application: AppChannels.VIDEOS,\n action: Actions.Videos.PLAY_VIDEO,\n args: [ props.originalVideo.id, TextHelper.slugify(props.originalVideo.name) ]\n };\n }\n\n const showPlayerPlaceholder = playerContext.mode === 'picture-in-picture' || props.featureAccess.canViewPublicLayout;\n\n const resourcesWidget = getResources(props.clip, hasStudentExperience);\n\n const otherClips = props.originalVideo?.clips?.data?.filter(c => c.id.toString() !== props.clip.id.toString()) ?? [];\n\n return (\n <div className='px-4'>\n <RestrictionBanner\n restrictions={props.clip._restrictions}\n yearGroups={props.yearGroups}\n objectId={props.clip.id}\n objectTypeId={MasterType.Clip}\n canManageVideoAccess={props.canManageVideoAccess}\n />\n\n {isArchived && (\n <ArchivedBanner\n typeId={props.clip.typeId}\n hasStudentExperience={hasStudentExperience}\n />\n )}\n\n <section className={`mb-2`}>\n {canConsume &&\n <GlobalPlayerConsumer\n key={props.clip.id}\n objectId={props.clip.id}\n objectTypeId={props.clip.typeId}\n shareId={props.shareId}\n context={props.queryParams?.context}\n contextId={props.queryParams?.contextId}\n moviesAndTv={props.queryParams?.mtv}\n playNext={props.queryParams?.playNext}\n startTime={props.queryParams?.t ?? props.queryParams?.startTime}\n mode='default'\n location='play-page'\n />\n }\n <div className={showPlayerPlaceholder ? '' : 'd-none'}>\n <PlayerPlaceholder\n video={props.clip}\n type='pip'\n />\n </div>\n </section>\n\n <PlayPageTitleAndActions\n media={props.clip}\n yearGroups={props.yearGroups}\n audiences={props.audiences}\n originalVideoAppLink={getOriginalVideoAppLink()}\n featureAccess={props.featureAccess}\n shareId={props.shareId}\n />\n\n {/* \n * Toggling between display 'block' and 'none' is *deliberate* done here to facilitate exposure of our content to bots for SEO.\n * The markup of all 3 components should be available in the DOM from the first render. If you're going to refactor,\n * please don't neglect this usecase - Mike\n */}\n <section className={`${detailsView.view === 'v@g' ? 'd-block' : 'd-none'}`}>\n <VideoAtAGlance\n theme={props.glanceTheme}\n video={props.clip}\n pointsOfInterest={props.pointsOfInterest}\n onClickShowDescription={() => setDetailsView({ view: 'details', referrer: 'v@g' })}\n setStartTime={(time: number) => playerContext.playerRef.current?.currentTime(time)}\n getTagAppLink={tag => ({\n application: AppChannels.SEARCH,\n action: Actions.Search.HOME,\n params: { tagOrClassification: tag.name }\n })}\n suppressInteractivity={props.featureAccess.canViewPublicLayout}\n />\n </section>\n\n <section className={`${detailsView.view === 'details' ? 'd-block' : 'd-none'}`}>\n <VideoDetailsWithScrollbar\n video={props.clip}\n onLaunchImmersiveReader={onLaunchImmersiveReader}\n onExitImmersiveReader={onExitImmersiveReader}\n onClickClose={hasGlance && (() => setDetailsView({ view: 'v@g', referrer: 'details' }))}\n getTagAppLink={tag => ({\n application: AppChannels.SEARCH,\n action: Actions.Search.HOME,\n params: { tagOrClassification: tag.name }\n })}\n hideTags={hasGlance}\n suppressInteractivity={props.featureAccess.canViewPublicLayout}\n />\n </section>\n\n <section className={`${detailsView.view === 'loading' ? 'd-block' : 'd-none'}`}>\n <VideoDetailsPartial />\n </section>\n\n {!!resourcesWidget?.length && (\n <section className='pb-3' id={PlayPageAnchor.Resources} ref={resourcesRef}>\n <FixedWidget<ResourceWidgetItemProps>\n name={getPhrase('resources', { count: resourcesWidget.length })}\n contents={WidgetContents.PlayPageResources}\n collection={resourcesWidget}\n prefetched\n childComponent={ResourceWidgetItem}\n extraChildComponentProps={{\n imageCdnUrl: props.imageCdnUrl,\n imageErrorFallbackUrl: ImageUrls.Fallbacks.RESOURCE_THUMBNAIL,\n actionBehaviour: props.featureAccess.canViewResourceItems ? 'normal' : 'public',\n location: 'play-page',\n titlePosition: 'above',\n hideTypeBadge: true\n }}\n getChildAppLink={getResourceAppLink(\n props.clip?.id,\n props.shareId,\n props.featureAccess.canViewResourceItems\n )}\n analyticsOptions={(() => {\n if (props.featureAccess.canViewResourceItems)\n return {};\n\n return {\n workflowPhase: WorkflowPhase.Start,\n descriptor: SignUpDescriptors.SignUp\n };\n })()}\n analyticsData={{ widgetId: 'resources' }}\n />\n </section>\n )}\n\n {!!(otherClips?.length && !limitAccess()) && (\n <div className='pb-3'>\n <FixedWidget<ClipWidgetItemProps>\n name={getPhrase('otherClips', { count: otherClips.length })}\n contents={WidgetContents.Clips}\n collection={otherClips}\n prefetched\n getChildAppLink={(clip: Clip) => {\n return {\n application: AppChannels.CLIPS,\n action: Actions.Clips.PLAY_CLIP,\n args: [ clip.id, TextHelper.slugify(clip.name) ]\n };\n }}\n childComponent={ClipWidgetItem}\n extraChildComponentProps={{ video: props.originalVideo, imageCdnUrl: props.imageCdnUrl }}\n analyticsData={{ widgetId: 'clips' }}\n />\n </div>\n )}\n\n {!!(props.clip.interactives?.data?.length && !limitAccess()) && (\n <div className='pb-3' id={PlayPageAnchor.Interactives} ref={interactivesRef}>\n <FixedWidget<InteractiveWidgetItemProps>\n name={getPhrase('interactives', { count: props.clip.interactives.data.length })}\n contents={WidgetContents.Interactives}\n collection={props.clip.interactives.data}\n prefetched\n getChildAppLink={(interactive: Interactive) => {\n return {\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.VIEW_INTERACTIVE,\n args: [ interactive.id, TextHelper.slugify(interactive.name) ]\n };\n }}\n childComponent={InteractiveWidgetItem}\n extraChildComponentProps={{\n video: props.clip,\n questionsAppLink: {\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.PREVIEW_QUESTIONS\n },\n imageCdnUrl: props.imageCdnUrl\n }}\n analyticsData={{ widgetId: 'interactives' }}\n />\n </div>\n )}\n\n {!!canAccessOriginal && (\n <section className='pb-2 pt-1'>\n <h2 className='h4 mb-0'><Text namespace={namespace} phrase='clippedFrom' /></h2>\n <VideoActionsContext.Provider value={videoActions}>\n <VideoList\n videos={[props.originalVideo]}\n yearGroups={props.yearGroups}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n getVideoAppLink={(v, opts) => VideoAppLinkHelper.getAppLink(v, {\n ...opts,\n context: props.queryParams.context,\n contextId: props.queryParams.contextId,\n playNext: props.queryParams.playNext,\n shareId: props.shareId,\n moviesAndTv: props.queryParams.mtv\n })}\n hasPermissions={hasPermissions}\n presentationAudiences={props.audiences}\n getPreviewQuestionsAppLink={interactive => InteractiveHelpers.getPreviewQuestionsAppLink(interactive)}\n />\n </VideoActionsContext.Provider>\n </section>\n )}\n\n <section>\n <RelatedVideos\n currentVideo={props.clip}\n yearGroups={props.yearGroups}\n relatedVideos={props.relatedVideos}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n currentUser={props.currentUser}\n audiences={props.audiences}\n getVideoAppLink={(v, opts) => VideoAppLinkHelper.getAppLink(v, {\n ...opts,\n context: props.queryParams.context,\n contextId: props.queryParams.contextId,\n playNext: props.queryParams.playNext,\n shareId: props.shareId,\n moviesAndTv: props.queryParams.mtv\n })}\n moviesAndTv={props.queryParams.mtv}\n />\n </section>\n </div>\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 * as React from 'react';\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 { PermissionFilterOption } from 'libs/shared/enums/PermissionFilterOption';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { VideoPrivateError } from 'libs/shared/errors/videos/video-private/VideoPrivateError';\nimport { ClipRequests } from 'libs/shared/flight-requests/ClipRequests';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { ThemeRequests } from 'libs/shared/flight-requests/ThemeRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { useCannotConsumeError } from 'libs/shared/hooks/useCannotConsumeError';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useProducts } from 'libs/shared/hooks/UseProducts';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Clip, Config, CurrentUser, Theme, Video, YearGroup } from 'libs/shared/interfaces';\nimport { PlayViewQueryParams } from 'libs/shared/interfaces/query-params/PlayViewQueryParams';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\n\nimport { PlayClip } from 'shared/components/play-clip/PlayClip';\nimport { useDeepLinks } from 'shared/hooks/useDeepLinks';\nimport { useFetchPointsOfInterest } from 'shared/hooks/useFetchPointsOfInterest';\nimport { useGetRelatedVideos } from 'shared/hooks/useGetRelatedVideos';\nimport { useLiteFavourites } from 'shared/hooks/useLiteFavourites';\nimport { usePresentationAudiences } from 'shared/hooks/usePresentationAudiences';\nimport { useVideoFeatureAccess } from 'shared/hooks/useVideoFeatureAccess';\nimport { useVideoMixin } from 'shared/hooks/useVideoMixin';\n\nconst namespace = 'shared.playClip';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst clipErrors = {\n notFound: NotFoundError,\n forbidden: {\n privacy: VideoPrivateError\n }\n};\n\ninterface PlayClipViewProps {\n id: string;\n queryParams: PlayViewQueryParams;\n}\n\nPlayClipView.defaultProps = {\n queryParams: {}\n};\n\nexport function PlayClipView(props: PlayClipViewProps): JSX.Element {\n const { context, contextId, mtv } = props.queryParams;\n\n const { hasProduct } = useProducts();\n const { setFavourite, canFavourite } = useLiteFavourites(LocationContext.PlayClip);\n const { hasPermissions } = usePermissions();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const clip = Flight.useBasicFetch<Clip>(ClipRequests.clip(props.id));\n const video = Flight.useBasicFetch<Video>(!!clip.data?._parentVideo &&\n VideoRequests.video(clip.data._parentVideo.id));\n const strippedClip = Flight.useBasicFetch<Clip>(clip.statusCode === HttpStatus.Forbidden &&\n ClipRequests.clip(props.id, PermissionFilterOption.StripMetadata));\n const relatedVideos = useGetRelatedVideos({\n video: video.data,\n context,\n contextId,\n moviesAndTv: mtv,\n currentUser: currentUser.data\n });\n const audiences = usePresentationAudiences();\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n const shouldFetchTheme = hasPermissions(PermissionName.ViewVideoGlance) &&\n clip.data?.glance?.theme;\n \n const glanceTheme = Flight.useBasicFetch<Theme>(\n shouldFetchTheme &&\n ThemeRequests.themeImages(clip.data.glance.theme, clip.data.glance.type)\n );\n const pointsOfInterest = useFetchPointsOfInterest(props.id, true);\n \n const featureAccess = useVideoFeatureAccess();\n\n useSetPageMetadata(PageMetadataHelper.getClipMetadata({\n content: clip.data,\n phraseContext: {\n phraseHandler: getPhrase,\n titlePhrase: 'pageTitle',\n descriptionPhrase: 'pageDescription'\n }\n }));\n\n useHandleObjectError(clip, clipErrors, { forbidden: true });\n useVideoMixin(relatedVideos.videos ?? []);\n useCannotConsumeError(strippedClip);\n useDeepLinks({ id: props.id, app: 'clips' });\n\n const hasLoaded = (\n clip.data &&\n currentUser.hasCompleted &&\n config.hasCompleted &&\n pointsOfInterest.hasCompleted\n );\n\n if (!hasLoaded)\n return <></>;\n\n return (\n <PlayClip\n clip={clip.data}\n originalVideo={video.data}\n currentUser={currentUser.data}\n yearGroups={yearGroups.data}\n // we only show up next videos for clips in a playlist\n relatedVideos={context === 'playlist' ? relatedVideos : { ...relatedVideos, videos: []}}\n canFavourite={canFavourite}\n setFavourite={setFavourite}\n hasProduct={hasProduct}\n queryParams={props.queryParams}\n audiences={audiences.data}\n imageCdnUrl={config.data.imageCdnUrl}\n canManageVideoAccess={hasPermissions(PermissionName.ManageVideoAccess)}\n pointsOfInterest={pointsOfInterest.items}\n glanceTheme={glanceTheme.data}\n glanceLoaded={!shouldFetchTheme || glanceTheme.hasCompleted}\n featureAccess={featureAccess}\n tableOfContentsId={props.queryParams?.scrollTo}\n />\n );\n}"],"names":["defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","handleHttpError","info","customErrorMap","ignoreMap","statusCode","status","errorMap","generateCacheKey","flightObjs","map","obj","join","useHandleObjectError","_flightObjs","customErrors","ignoreErrors","Array","isArray","useEffect","forEach","getResourceAppLink","videoId","shareId","canViewResource","resource","application","action","args","id","params","namespace","getPhrase","PlayClip","props","playerContext","hasPermissions","canConsume","clip","videoActions","location","resourcesRef","interactivesRef","current","tableOfContentsId","isArchived","hasStudentExperience","shouldPlayOnExitImmersiveReader","hasGlance","glanceTheme","featureAccess","canViewGlance","view","referrer","detailsView","setDetailsView","limitAccess","currentUser","isAuthenticated","hasProduct","glanceLoaded","canAccessOriginal","originalVideo","_canBeConsumed","value","showPlayerPlaceholder","mode","canViewPublicLayout","resourcesWidget","otherClips","clips","data","filter","c","toString","className","restrictions","_restrictions","yearGroups","objectId","objectTypeId","canManageVideoAccess","typeId","key","context","queryParams","contextId","moviesAndTv","mtv","playNext","startTime","t","video","type","media","audiences","originalVideoAppLink","name","theme","pointsOfInterest","onClickShowDescription","setStartTime","time","playerRef","currentTime","getTagAppLink","tag","tagOrClassification","suppressInteractivity","onLaunchImmersiveReader","isPaused","pause","onExitImmersiveReader","play","onClickClose","hideTags","length","ref","count","contents","collection","prefetched","childComponent","R","extraChildComponentProps","imageCdnUrl","imageErrorFallbackUrl","actionBehaviour","canViewResourceItems","titlePosition","hideTypeBadge","getChildAppLink","analyticsOptions","workflowPhase","descriptor","SignUp","analyticsData","widgetId","C","interactives","interactive","questionsAppLink","phrase","videos","setFavourite","canFavourite","getVideoAppLink","v","opts","presentationAudiences","getPreviewQuestionsAppLink","currentVideo","relatedVideos","usePresentationAudiences","redirectOnError","activePresentation","getFallbackPresentation","presentation","clipErrors","PlayClipView","u","config","_parentVideo","strippedClip","customerId","shouldFetchTheme","glance","content","phraseContext","phraseHandler","titlePhrase","descriptionPhrase","app","hasCompleted","items","scrollTo","defaultProps"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"scripts/9212-cc987a13bf-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/errors/handlers/HttpErrorHandlers.ts","file:///app/packages/libs/shared/src/hooks/UseHandleObjectError.ts","file:///app/packages/projects/lite/src/shared/components/play-clip/PlayClip.tsx","file:///app/packages/projects/lite/src/shared/hooks/usePresentationAudiences.ts","file:///app/packages/projects/lite/src/shared/views/play-clip/PlayClipView.tsx"],"sourcesContent":["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}\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};\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.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 React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { SignUpDescriptors, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoAtAGlance } from 'libs/shared/components/video-at-a-glance/VideoAtAGlance';\nimport { hasGlanceData } from 'libs/shared/components/video-at-a-glance/VideoAtAGlanceUtils';\nimport { VideoList } from 'libs/shared/components/video-list/VideoList';\nimport { FixedWidget } from 'libs/shared/components/widgets/fixed-widget';\nimport { ClipWidgetItem, ClipWidgetItemProps } from 'libs/shared/components/widgets/items/clip-widget-item/ClipWidgetItem';\nimport { InteractiveWidgetItem, InteractiveWidgetItemProps } from 'libs/shared/components/widgets/items/interactive-widget-item/InteractiveWidgetItem';\nimport { ResourceWidgetItem, ResourceWidgetItemProps } from 'libs/shared/components/widgets/items/resource-widget-item/ResourceWidgetItem';\nimport { GlobalPlayerConsumer } from 'libs/shared/context/player-context/components/GlobalPlayerConsumer';\nimport { usePlayerContext } from 'libs/shared/context/player-context/PlayerContext';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { WidgetContents } from 'libs/shared/enums/WidgetContents';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { HasProductFunc } from 'libs/shared/hooks/UseProducts';\nimport { useTableOfContentsScroll } from 'libs/shared/hooks/useTableOfContentsScroll';\nimport { CanFavouriteFunc, Clip, CurrentUser, FavouriteFunc, Interactive, Link, PointOfInterest, PresentationAudience, Resource, Theme, Video, YearGroup } from 'libs/shared/interfaces';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\nimport { PlayViewQueryParams } from 'libs/shared/interfaces/query-params/PlayViewQueryParams';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { ArchivedBanner } from 'shared/components/play-page/ArchivedBanner';\nimport { PlayPageTitleAndActions } from 'shared/components/play-page/components/PlayPageTitleAndActions';\nimport { getResources } from 'shared/components/play-page/PlayPageUtils';\nimport { RestrictionBanner } from 'shared/components/play-page/RestrictionBanner';\nimport { PlayerPlaceholder } from 'shared/components/player-placeholder/PlayerPlaceholder';\nimport { RelatedVideos } from 'shared/components/related-videos/RelatedVideos';\nimport { VideoDetailsWithScrollbar } from 'shared/components/video-details/VideoDetails';\nimport { VideoDetailsPartial } from 'shared/components/video-details/VideoDetailsPartial';\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\nimport { RelatedVideosHash } from 'shared/hooks/useGetRelatedVideos';\nimport { VideoFeaturesHash } from 'shared/hooks/useVideoFeatureAccess';\nimport { InteractiveHelpers } from 'shared/utils/InteractiveHelper';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nconst getResourceAppLink = (videoId: string, shareId: string, canViewResource: boolean) =>\n (resource: Resource | Link) => {\n if (!canViewResource) {\n return {\n application: AppChannels.SIGN_UP,\n action: Actions.SignUp.SIGN_UP\n };\n }\n\n return {\n application: AppChannels.VIDEOS,\n action: Actions.Videos.PREVIEW_PDF,\n args: [resource.id],\n params: {\n videoId: videoId,\n shareId: shareId\n }\n };\n };\n\nconst namespace = 'shared.playClip';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ntype DetailsViewType = {\n view: 'v@g' | 'details' | 'loading';\n referrer: 'v@g' | 'details';\n};\n\ninterface PlayClipProps {\n clip: Clip;\n originalVideo: Video;\n currentUser: CurrentUser;\n yearGroups: YearGroup[];\n relatedVideos: RelatedVideosHash;\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n queryParams: PlayViewQueryParams;\n hasProduct: HasProductFunc;\n audiences: PresentationAudience[];\n imageCdnUrl: string;\n shareId?: string;\n canManageVideoAccess: boolean;\n pointsOfInterest?: PointOfInterest[];\n featureAccess: VideoFeaturesHash;\n glanceTheme?: Theme;\n glanceLoaded: boolean;\n tableOfContentsId: string;\n}\n\nexport function PlayClip(props: PlayClipProps): JSX.Element {\n const playerContext = usePlayerContext();\n\n const { hasPermissions } = usePermissions();\n const { canConsume } = VideoHelper.getCanBeConsumed(props.clip);\n \n const videoActions = useVideoActions({ location: VideoActionsLocation.VideoItem });\n\n const resourcesRef = React.useRef<HTMLDivElement>(null);\n const interactivesRef = React.useRef<HTMLDivElement>(null);\n\n useTableOfContentsScroll([\n resourcesRef.current,\n interactivesRef.current\n ], props.tableOfContentsId);\n\n const isArchived = VideoHelper.isVideoTypeArchived(props.clip);\n const hasStudentExperience = hasPermissions(PermissionName.StudentExperience);\n /**\n * Need to use a ref because if we use state, onExitImmersiveReader will have a stale\n * reference of the state. This is because the state is changed in onLaunchImmersiveReader\n * which is passed in at the same time as onExitImmersiveReader\n */\n const shouldPlayOnExitImmersiveReader = React.useRef(false);\n\n const hasGlance = hasGlanceData(props.clip, props.glanceTheme) && props.featureAccess.canViewGlance;\n\n const [ detailsView, setDetailsView ] = React.useState<DetailsViewType>({\n view: 'loading',\n referrer: null\n });\n\n React.useEffect(() => {\n if (!props.glanceLoaded)\n return;\n\n setDetailsView({\n view: props.glanceTheme ? 'v@g' : 'details',\n referrer: null\n });\n }, [ props.glanceLoaded, props.glanceTheme ]);\n\n function onLaunchImmersiveReader(): void {\n shouldPlayOnExitImmersiveReader.current = !playerContext?.playerRef?.current?.isPaused();\n playerContext?.playerRef?.current?.pause();\n }\n\n function onExitImmersiveReader(): void {\n if (!shouldPlayOnExitImmersiveReader.current)\n return;\n\n playerContext?.playerRef?.current?.play();\n }\n\n function limitAccess(): boolean {\n if (!props.currentUser?.isAuthenticated)\n return true;\n\n if (!props.hasProduct(ProductId.Primary))\n return true;\n\n if (hasStudentExperience)\n return true;\n\n return false;\n }\n\n const canAccessOriginal = props.originalVideo && !limitAccess() && !!props.clip._canBeConsumed?.value;\n\n function getOriginalVideoAppLink(): Core.AppLink {\n if (!canAccessOriginal)\n return null;\n \n return {\n application: AppChannels.VIDEOS,\n action: Actions.Videos.PLAY_VIDEO,\n args: [ props.originalVideo.id, TextHelper.slugify(props.originalVideo.name) ]\n };\n }\n\n const showPlayerPlaceholder = playerContext.mode === 'picture-in-picture' || props.featureAccess.canViewPublicLayout;\n\n const resourcesWidget = getResources(props.clip, hasStudentExperience);\n\n const otherClips = props.originalVideo?.clips?.data?.filter(c => c.id.toString() !== props.clip.id.toString()) ?? [];\n\n return (\n <div className='px-4'>\n <RestrictionBanner\n restrictions={props.clip._restrictions}\n yearGroups={props.yearGroups}\n objectId={props.clip.id}\n objectTypeId={MasterType.Clip}\n canManageVideoAccess={props.canManageVideoAccess}\n />\n\n {isArchived && (\n <ArchivedBanner\n typeId={props.clip.typeId}\n hasStudentExperience={hasStudentExperience}\n />\n )}\n\n <section className={`mb-2`}>\n {canConsume &&\n <GlobalPlayerConsumer\n key={props.clip.id}\n objectId={props.clip.id}\n objectTypeId={props.clip.typeId}\n shareId={props.shareId}\n context={props.queryParams?.context}\n contextId={props.queryParams?.contextId}\n moviesAndTv={props.queryParams?.mtv}\n playNext={props.queryParams?.playNext}\n startTime={props.queryParams?.t ?? props.queryParams?.startTime}\n mode='default'\n location='play-page'\n />\n }\n <div className={showPlayerPlaceholder ? '' : 'd-none'}>\n <PlayerPlaceholder\n video={props.clip}\n type='pip'\n />\n </div>\n </section>\n\n <PlayPageTitleAndActions\n media={props.clip}\n yearGroups={props.yearGroups}\n audiences={props.audiences}\n originalVideoAppLink={getOriginalVideoAppLink()}\n featureAccess={props.featureAccess}\n shareId={props.shareId}\n />\n\n {/* \n * Toggling between display 'block' and 'none' is *deliberate* done here to facilitate exposure of our content to bots for SEO.\n * The markup of all 3 components should be available in the DOM from the first render. If you're going to refactor,\n * please don't neglect this usecase - Mike\n */}\n <section className={`${detailsView.view === 'v@g' ? 'd-block' : 'd-none'}`}>\n <VideoAtAGlance\n theme={props.glanceTheme}\n video={props.clip}\n pointsOfInterest={props.pointsOfInterest}\n onClickShowDescription={() => setDetailsView({ view: 'details', referrer: 'v@g' })}\n setStartTime={(time: number) => playerContext.playerRef.current?.currentTime(time)}\n getTagAppLink={tag => ({\n application: AppChannels.SEARCH,\n action: Actions.Search.HOME,\n params: { tagOrClassification: tag.name }\n })}\n suppressInteractivity={props.featureAccess.canViewPublicLayout}\n />\n </section>\n\n <section className={`${detailsView.view === 'details' ? 'd-block' : 'd-none'}`}>\n <VideoDetailsWithScrollbar\n video={props.clip}\n onLaunchImmersiveReader={onLaunchImmersiveReader}\n onExitImmersiveReader={onExitImmersiveReader}\n onClickClose={hasGlance && (() => setDetailsView({ view: 'v@g', referrer: 'details' }))}\n getTagAppLink={tag => ({\n application: AppChannels.SEARCH,\n action: Actions.Search.HOME,\n params: { tagOrClassification: tag.name }\n })}\n hideTags={hasGlance}\n suppressInteractivity={props.featureAccess.canViewPublicLayout}\n />\n </section>\n\n <section className={`${detailsView.view === 'loading' ? 'd-block' : 'd-none'}`}>\n <VideoDetailsPartial />\n </section>\n\n {!!resourcesWidget?.length && (\n <section className='pb-3' id={PlayPageAnchor.Resources} ref={resourcesRef}>\n <FixedWidget<ResourceWidgetItemProps>\n name={getPhrase('resources', { count: resourcesWidget.length })}\n contents={WidgetContents.PlayPageResources}\n collection={resourcesWidget}\n prefetched\n childComponent={ResourceWidgetItem}\n extraChildComponentProps={{\n imageCdnUrl: props.imageCdnUrl,\n imageErrorFallbackUrl: ImageUrls.Fallbacks.RESOURCE_THUMBNAIL,\n actionBehaviour: props.featureAccess.canViewResourceItems ? 'normal' : 'public',\n location: 'play-page',\n titlePosition: 'above',\n hideTypeBadge: true\n }}\n getChildAppLink={getResourceAppLink(\n props.clip?.id,\n props.shareId,\n props.featureAccess.canViewResourceItems\n )}\n analyticsOptions={(() => {\n if (props.featureAccess.canViewResourceItems)\n return {};\n\n return {\n workflowPhase: WorkflowPhase.Start,\n descriptor: SignUpDescriptors.SignUp\n };\n })()}\n analyticsData={{ widgetId: 'resources' }}\n />\n </section>\n )}\n\n {!!(otherClips?.length && !limitAccess()) && (\n <div className='pb-3'>\n <FixedWidget<ClipWidgetItemProps>\n name={getPhrase('otherClips', { count: otherClips.length })}\n contents={WidgetContents.Clips}\n collection={otherClips}\n prefetched\n getChildAppLink={(clip: Clip) => {\n return {\n application: AppChannels.CLIPS,\n action: Actions.Clips.PLAY_CLIP,\n args: [ clip.id, TextHelper.slugify(clip.name) ]\n };\n }}\n childComponent={ClipWidgetItem}\n extraChildComponentProps={{ video: props.originalVideo, imageCdnUrl: props.imageCdnUrl }}\n analyticsData={{ widgetId: 'clips' }}\n />\n </div>\n )}\n\n {!!(props.clip.interactives?.data?.length && !limitAccess()) && (\n <div className='pb-3' id={PlayPageAnchor.Interactives} ref={interactivesRef}>\n <FixedWidget<InteractiveWidgetItemProps>\n name={getPhrase('interactives', { count: props.clip.interactives.data.length })}\n contents={WidgetContents.Interactives}\n collection={props.clip.interactives.data}\n prefetched\n getChildAppLink={(interactive: Interactive) => {\n return {\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.VIEW_INTERACTIVE,\n args: [ interactive.id, TextHelper.slugify(interactive.name) ]\n };\n }}\n childComponent={InteractiveWidgetItem}\n extraChildComponentProps={{\n video: props.clip,\n questionsAppLink: {\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.PREVIEW_QUESTIONS\n },\n imageCdnUrl: props.imageCdnUrl\n }}\n analyticsData={{ widgetId: 'interactives' }}\n />\n </div>\n )}\n\n {!!canAccessOriginal && (\n <section className='pb-2 pt-1'>\n <h2 className='h4 mb-0'><Text namespace={namespace} phrase='clippedFrom' /></h2>\n <VideoActionsContext.Provider value={videoActions}>\n <VideoList\n videos={[props.originalVideo]}\n yearGroups={props.yearGroups}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n getVideoAppLink={(v, opts) => VideoAppLinkHelper.getAppLink(v, {\n ...opts,\n context: props.queryParams.context,\n contextId: props.queryParams.contextId,\n playNext: props.queryParams.playNext,\n shareId: props.shareId,\n moviesAndTv: props.queryParams.mtv\n })}\n hasPermissions={hasPermissions}\n presentationAudiences={props.audiences}\n getPreviewQuestionsAppLink={interactive => InteractiveHelpers.getPreviewQuestionsAppLink(interactive)}\n />\n </VideoActionsContext.Provider>\n </section>\n )}\n\n <section>\n <RelatedVideos\n currentVideo={props.clip}\n yearGroups={props.yearGroups}\n relatedVideos={props.relatedVideos}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n currentUser={props.currentUser}\n audiences={props.audiences}\n getVideoAppLink={(v, opts) => VideoAppLinkHelper.getAppLink(v, {\n ...opts,\n context: props.queryParams.context,\n contextId: props.queryParams.contextId,\n playNext: props.queryParams.playNext,\n shareId: props.shareId,\n moviesAndTv: props.queryParams.mtv\n })}\n moviesAndTv={props.queryParams.mtv}\n />\n </section>\n </div>\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 * as React from 'react';\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 { PermissionFilterOption } from 'libs/shared/enums/PermissionFilterOption';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { VideoPrivateError } from 'libs/shared/errors/videos/video-private/VideoPrivateError';\nimport { ClipRequests } from 'libs/shared/flight-requests/ClipRequests';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { ThemeRequests } from 'libs/shared/flight-requests/ThemeRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { useCannotConsumeError } from 'libs/shared/hooks/useCannotConsumeError';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useProducts } from 'libs/shared/hooks/UseProducts';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Clip, Config, CurrentUser, Theme, Video, YearGroup } from 'libs/shared/interfaces';\nimport { PlayViewQueryParams } from 'libs/shared/interfaces/query-params/PlayViewQueryParams';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\n\nimport { PlayClip } from 'shared/components/play-clip/PlayClip';\nimport { useDeepLinks } from 'shared/hooks/useDeepLinks';\nimport { useFetchPointsOfInterest } from 'shared/hooks/useFetchPointsOfInterest';\nimport { useGetRelatedVideos } from 'shared/hooks/useGetRelatedVideos';\nimport { useLiteFavourites } from 'shared/hooks/useLiteFavourites';\nimport { usePresentationAudiences } from 'shared/hooks/usePresentationAudiences';\nimport { useVideoFeatureAccess } from 'shared/hooks/useVideoFeatureAccess';\nimport { useVideoMixin } from 'shared/hooks/useVideoMixin';\n\nconst namespace = 'shared.playClip';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst clipErrors = {\n notFound: NotFoundError,\n forbidden: {\n privacy: VideoPrivateError\n }\n};\n\ninterface PlayClipViewProps {\n id: string;\n queryParams: PlayViewQueryParams;\n}\n\nPlayClipView.defaultProps = {\n queryParams: {}\n};\n\nexport function PlayClipView(props: PlayClipViewProps): JSX.Element {\n const { context, contextId, mtv } = props.queryParams;\n\n const { hasProduct } = useProducts();\n const { setFavourite, canFavourite } = useLiteFavourites(LocationContext.PlayClip);\n const { hasPermissions } = usePermissions();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const clip = Flight.useBasicFetch<Clip>(ClipRequests.clip(props.id));\n const video = Flight.useBasicFetch<Video>(!!clip.data?._parentVideo &&\n VideoRequests.video(clip.data._parentVideo.id));\n const strippedClip = Flight.useBasicFetch<Clip>(clip.statusCode === HttpStatus.Forbidden &&\n ClipRequests.clip(props.id, PermissionFilterOption.StripMetadata));\n const relatedVideos = useGetRelatedVideos({\n video: video.data,\n context,\n contextId,\n moviesAndTv: mtv,\n currentUser: currentUser.data\n });\n const audiences = usePresentationAudiences();\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n const shouldFetchTheme = hasPermissions(PermissionName.ViewVideoGlance) &&\n clip.data?.glance?.theme;\n \n const glanceTheme = Flight.useBasicFetch<Theme>(\n shouldFetchTheme &&\n ThemeRequests.themeImages(clip.data.glance.theme, clip.data.glance.type)\n );\n const pointsOfInterest = useFetchPointsOfInterest(props.id, true);\n \n const featureAccess = useVideoFeatureAccess();\n\n useSetPageMetadata(PageMetadataHelper.getClipMetadata({\n content: clip.data,\n phraseContext: {\n phraseHandler: getPhrase,\n titlePhrase: 'pageTitle',\n descriptionPhrase: 'pageDescription'\n }\n }));\n\n useHandleObjectError(clip, clipErrors, { forbidden: true });\n useVideoMixin(relatedVideos.videos ?? []);\n useCannotConsumeError(strippedClip);\n useDeepLinks({ id: props.id, app: 'clips' });\n\n const hasLoaded = (\n clip.data &&\n currentUser.hasCompleted &&\n config.hasCompleted &&\n pointsOfInterest.hasCompleted\n );\n\n if (!hasLoaded)\n return <></>;\n\n return (\n <PlayClip\n clip={clip.data}\n originalVideo={video.data}\n currentUser={currentUser.data}\n yearGroups={yearGroups.data}\n // we only show up next videos for clips in a playlist\n relatedVideos={context === 'playlist' ? relatedVideos : { ...relatedVideos, videos: []}}\n canFavourite={canFavourite}\n setFavourite={setFavourite}\n hasProduct={hasProduct}\n queryParams={props.queryParams}\n audiences={audiences.data}\n imageCdnUrl={config.data.imageCdnUrl}\n canManageVideoAccess={hasPermissions(PermissionName.ManageVideoAccess)}\n pointsOfInterest={pointsOfInterest.items}\n glanceTheme={glanceTheme.data}\n glanceLoaded={!shouldFetchTheme || glanceTheme.hasCompleted}\n featureAccess={featureAccess}\n tableOfContentsId={props.queryParams?.scrollTo}\n />\n );\n}"],"names":["defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","handleHttpError","info","customErrorMap","ignoreMap","statusCode","status","errorMap","generateCacheKey","flightObjs","map","obj","join","useHandleObjectError","_flightObjs","customErrors","ignoreErrors","Array","isArray","useEffect","forEach","getResourceAppLink","videoId","shareId","canViewResource","resource","application","action","args","id","params","namespace","getPhrase","PlayClip","props","playerContext","hasPermissions","canConsume","clip","videoActions","location","resourcesRef","interactivesRef","current","tableOfContentsId","isArchived","hasStudentExperience","shouldPlayOnExitImmersiveReader","hasGlance","glanceTheme","featureAccess","canViewGlance","view","referrer","detailsView","setDetailsView","limitAccess","currentUser","isAuthenticated","hasProduct","glanceLoaded","canAccessOriginal","originalVideo","_canBeConsumed","value","showPlayerPlaceholder","mode","canViewPublicLayout","resourcesWidget","otherClips","clips","data","filter","c","toString","className","restrictions","_restrictions","yearGroups","objectId","objectTypeId","canManageVideoAccess","typeId","key","context","queryParams","contextId","moviesAndTv","mtv","playNext","startTime","t","video","type","media","audiences","originalVideoAppLink","name","theme","pointsOfInterest","onClickShowDescription","setStartTime","time","playerRef","currentTime","getTagAppLink","tag","tagOrClassification","suppressInteractivity","onLaunchImmersiveReader","isPaused","pause","onExitImmersiveReader","play","onClickClose","hideTags","length","ref","count","contents","collection","prefetched","childComponent","R","extraChildComponentProps","imageCdnUrl","imageErrorFallbackUrl","actionBehaviour","canViewResourceItems","titlePosition","hideTypeBadge","getChildAppLink","analyticsOptions","workflowPhase","descriptor","SignUp","analyticsData","widgetId","C","interactives","interactive","questionsAppLink","phrase","videos","setFavourite","canFavourite","getVideoAppLink","v","opts","presentationAudiences","getPreviewQuestionsAppLink","currentVideo","relatedVideos","usePresentationAudiences","redirectOnError","activePresentation","getFallbackPresentation","presentation","clipErrors","PlayClipView","u","config","_parentVideo","strippedClip","customerId","shouldFetchTheme","glance","content","phraseContext","phraseHandler","titlePhrase","descriptionPhrase","app","hasCompleted","items","scrollTo","defaultProps"],"sourceRoot":""}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[9242],{9242:(e,t,n)=>{n.r(t),n.d(t,{JoinClassroomPromptView:()=>F});var r=n(32735),o=n(70680),a=n(23481),u=n(81886),i=n(20354);const c={input:"Aptlf",codeInputContainer:"cRvSA"};function l(e){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},l(e)}function f(e,t,n){var r;return r=function(e,t){if("object"!=l(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,"string");if("object"!=l(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(t),(t="symbol"==l(r)?r:r+"")in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}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 r,o,a,u,i=[],c=!0,l=!1;try{if(a=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=a.call(n)).done)&&(i.push(r.value),i.length!==t);c=!0);}catch(e){l=!0,o=e}finally{try{if(!c&&null!=n.return&&(u=n.return(),Object(u)!==u))return}finally{if(l)throw o}}return i}}(e,t)||m(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){if(e){if("string"==typeof e)return v(e,t);var n=Object.prototype.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)?v(e,t):void 0}}function v(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}var d,y=/^[0-9]$/,b=/^\d+$/,g=8;function p(e){var t=s(r.useState(""),2),n=t[0],o=t[1],a=s(r.useState(""),2),u=a[0],i=a[1],l=s(r.useState(""),2),v=l[0],p=l[1],h=s(r.useState(""),2),S=h[0],E=h[1],w=s(r.useState(""),2),C=w[0],N=w[1],x=r.useRef(null),k=r.useRef(null),O=r.useRef(null),j=r.useRef(null),A=r.useRef(null);r.useEffect((function(){var t=(n||"X")+(u||"X")+(v||"X")+(S||"X")+(C||"X");e.onChange(t)}),[n,u,v,S,C]);var I=f(f(f(f(f({},d.One,{getNext:function(){return I[d.Two]},getPrevious:function(){return null},value:n,setState:o,focus:function(){return x.current.focus()}}),d.Two,{getNext:function(){return I[d.Three]},getPrevious:function(){return I[d.One]},value:u,setState:i,focus:function(){return k.current.focus()}}),d.Three,{getNext:function(){return I[d.Four]},getPrevious:function(){return I[d.Two]},value:v,setState:p,focus:function(){return O.current.focus()}}),d.Four,{getNext:function(){return I[d.Five]},getPrevious:function(){return I[d.Three]},value:S,setState:E,focus:function(){return j.current.focus()}}),d.Five,{getNext:function(){return null},getPrevious:function(){return I[d.Four]},value:C,setState:N,focus:function(){return A.current.focus()}});function P(e,t){var n,r;if(y.test(e.key)||e.keyCode===g){var o=I[t];if(e.keyCode===g)return o.setState(""),void(null===(n=o.getPrevious())||void 0===n||n.focus());if(e.currentTarget.selectionStart>0){var a=o.getNext();if(!a)return;return a.setState(e.key),void(a.getNext()?a.getNext().focus():a.focus())}o.setState(e.key),null===(r=o.getNext())||void 0===r||r.focus()}}function T(e,t){e.preventDefault();var n=e.clipboardData.getData("text").trim();if(b.test(n)){var r=n.split("");if(6!==r.length){var o=I[t];o.value&&o.getNext()&&(o=o.getNext());do{o.focus(),o.setState(r.shift()),o=o.getNext()}while(r.length&&o)}else{var a,u=I[d.One],i=function(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=m(e))){n&&(e=n);var r=0,o=function(){};return{s:o,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,u=!0,i=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return u=e.done,e},e:function(e){i=!0,a=e},f:function(){try{u||null==n.return||n.return()}finally{if(i)throw a}}}}(r);try{for(i.s();!(a=i.n()).done;){var c=a.value;u.setState(c),null==(u=u.getNext())||u.focus()}}catch(e){i.e(e)}finally{i.f()}}}}var D={className:"form-control h-100 fw-semibold mx-1 text-center ".concat(c.input," ").concat(e.hasError?"is-invalid":""),autoCorrect:"off",inputMode:"numeric",pattern:"[0-9]*",autoCapitalize:"off",autoComplete:"off"};return r.createElement("div",{className:"".concat(c.codeInputContainer," d-flex justify-content-between")},r.createElement("input",Object.assign({onPaste:function(e){return T(e,d.One)},onKeyDown:function(e){return P(e,d.One)},value:n,ref:x,onChange:function(){},autoComplete:"off"},D)),r.createElement("input",Object.assign({onPaste:function(e){return T(e,d.Two)},onKeyDown:function(e){return P(e,d.Two)},value:u,ref:k,onChange:function(){}},D)),r.createElement("input",Object.assign({onPaste:function(e){return T(e,d.Three)},onKeyDown:function(e){return P(e,d.Three)},value:v,ref:O,onChange:function(){}},D)),r.createElement("input",Object.assign({onPaste:function(e){return T(e,d.Four)},onKeyDown:function(e){return P(e,d.Four)},value:S,ref:j,onChange:function(){}},D)),r.createElement("input",Object.assign({onPaste:function(e){return T(e,d.Five)},onKeyDown:function(e){return P(e,d.Five)},value:C,ref:A,onChange:function(){}},D)))}!function(e){e.One="verify-1",e.Two="verify-2",e.Three="verify-3",e.Four="verify-4",e.Five="verify-5"}(d||(d={}));var h=n(10874),S=n(2102),E=n(2786),w=n(31949),C=n(35223),N=n(83421),x=n(14070),k=n(97291),O=n(88630);const j={logo:"FSXXf",formContainer:"yEBMm",backButton:"DRrEn",codeInputContainer:"gSuIK"};function A(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,o,a,u,i=[],c=!0,l=!1;try{if(a=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=a.call(n)).done)&&(i.push(r.value),i.length!==t);c=!0);}catch(e){l=!0,o=e}finally{try{if(!c&&null!=n.return&&(u=n.return(),Object(u)!==u))return}finally{if(l)throw o}}return i}}(e,t)||function(e,t){if(e){if("string"==typeof e)return I(e,t);var n=Object.prototype.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,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 I(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}var P=a.T.encloseNamespace("classrooms.joinClassroomPrompt"),T={application:k.O.LAUNCHPAD,action:x.e.Launchpad.LOGIN_LANDING,params:{showJoinCode:!0}},D={application:k.O.DASHBOARD,action:x.e.Dashboard.HOME},U="X";function F(){var e,t=(0,o.I0)(),n=A(r.useState(""),2),a=n[0],c=n[1],l=A(r.useState(""),2),f=l[0],s=l[1],m=A(r.useState(!1),2),v=m[0],d=m[1],y=i.a.useBasicFetch(w.N.currentUser());function b(){u.Q.C$.trigger({application:k.O.LAUNCHPAD,action:x.e.Launchpad.JOIN_CLASSROOM,args:[a]})}function g(){s(P("invalid")),d(!1)}return r.createElement(N.Z,null,r.createElement("div",{className:"".concat(j.formContainer," m-auto")},r.createElement("form",{onSubmit:function(e){e.preventDefault(),d(!0),i.a.fetch(t,O.F.checkJoinCode(a,b,g))}},r.createElement("div",{className:"text-center position-relative mb-3"},r.createElement("span",{className:"".concat(j.backButton," position-absolute")},r.createElement(h.h,{appLink:(null===(e=y.data)||void 0===e?void 0:e.isAuthenticated)?D:T,svgName:C.vn.ChevronLeft})),r.createElement("span",{className:"".concat(j.logo," d-inline-block")},r.createElement(E.$S,null))),r.createElement("p",{className:"text-center"},P("enterClassCode")),r.createElement("div",{className:"mx-4"},r.createElement(p,{onChange:function(e){s(""),c(e)},hasError:!!f}),!!f&&r.createElement("div",{className:"d-block invalid-feedback"},f)),r.createElement(S.m,{showSpinner:v,className:"d-block w-75 mt-3 mx-auto btn-lg",variant:"dark",type:"submit",disabled:a.includes(U)},P("next")))))}},83421:(e,t,n)=>{n.d(t,{Z:()=>v});var r=n(32735),o=n(54610),a=n(4594),u=n(67453),i=n(99742);const c={left:"vIypY",leftTextImage:"YViNj",right:"MkD4u",blur:"X6mCh",imageContainer:"bc7kz",imagePosition:"JOhEj",image:"Ef2QR",thumbnail:"Gdurb",tallposter:"fjVNK",cover:"o3j31",linksContainer:"AT9Dk"};function l(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,o,a,u,i=[],c=!0,l=!1;try{if(a=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=a.call(n)).done)&&(i.push(r.value),i.length!==t);c=!0);}catch(e){l=!0,o=e}finally{try{if(!c&&null!=n.return&&(u=n.return(),Object(u)!==u))return}finally{if(l)throw o}}return i}}(e,t)||function(e,t){if(e){if("string"==typeof e)return f(e,t);var n=Object.prototype.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)?f(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 f(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}var s=[{bgUrl:i.W.LaunchPad.BG_1},{bgUrl:i.W.LaunchPad.BG_2},{bgUrl:i.W.LaunchPad.BG_3},{bgUrl:i.W.LaunchPad.BG_4},{bgUrl:i.W.LaunchPad.BG_5}];function m(e){switch(e){case a.E.Video:case a.E.Interactive:case a.E.Clip:return c.thumbnail;case a.E.Subject:case a.E.Playlist:return c.cover;case a.E.Series:return c.tallposter;default:return""}}function v(e){var t,n=l(r.useState(!1),2),a=n[0],i=n[1],f=l(r.useState(""),2),v=f[0],d=f[1],y=l(r.useState(""),2),b=y[0],g=y[1],p=u.j.createUrl(e.imageUrl,{size:o.h2.Large}),h=s;return r.useEffect((function(){if(!p&&h&&0!==h.length){var e,t=(e=h)[Math.floor(Math.random()*e.length)];t.bgUrl&&d(t.bgUrl),t.textUrl&&g(t.textUrl)}}),[]),r.useEffect((function(){if(p){var e=new Image;return e.onload=function(){return i(!0)},e.src=p,function(){return e.onload=null}}}),[]),r.createElement("div",{className:"d-flex"},e.leftComponent?e.leftComponent():r.createElement("div",{className:"".concat(c.left," bg-light"),style:{backgroundImage:"url('".concat(v,"')")}},b&&r.createElement("div",{className:c.leftTextImage,style:{backgroundImage:"url('".concat(b,"')")}}),a&&r.createElement(r.Fragment,null,r.createElement("div",{className:c.blur,style:{backgroundImage:"url('".concat(p,"')")}}),r.createElement("div",{className:"".concat(c.imageContainer," ").concat(m(e.objectType))},r.createElement("div",{className:c.imagePosition},r.createElement("img",{className:c.image,src:p,alt:e.title}))))),r.createElement("div",{className:"".concat(c.right," bg-white d-flex flex-column")},r.createElement("div",{className:"position-absolute d-flex align-items-center ".concat(c.linksContainer)},null===(t=e.links)||void 0===t?void 0:t.map((function(e,t){return e.hide?r.createElement(r.Fragment,{key:t}):r.createElement("a",{key:t,href:e.url,className:"info-link fw-semibold",onClick:e.onClick},e.text)}))),e.children))}}}]);
|
|
2
|
-
//# sourceMappingURL=9242-
|
|
2
|
+
//# sourceMappingURL=9242-144e7728ad-lite.chunk.js.map
|
package/dist/scripts/{9242-2e533bdc0d-lite.chunk.js.map → 9242-144e7728ad-lite.chunk.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/9242-2e533bdc0d-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/components/code-input/code-input.scss","file:///app/packages/libs/shared/src/components/code-input/CodeInput.tsx","file:///app/packages/projects/lite/src/apps/launchpad/views/join-classroom-prompt/join-classroom-prompt.scss","file:///app/packages/projects/lite/src/apps/launchpad/views/join-classroom-prompt/JoinClassroomPromptView.tsx","file:///app/packages/projects/lite/src/shared/components/launchpad/launchpad.scss","file:///app/packages/projects/lite/src/shared/components/launchpad/Launchpad.tsx"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport default {\"input\":\"Aptlf\",\"codeInputContainer\":\"cRvSA\"};","import React from 'react';\n\nimport styles from './code-input.scss';\n\nconst singleDigitRegEx = /^[0-9]$/;\nconst numberRegEx = /^\\d+$/;\n\nconst BACKSPACE_KEY_CODE = 8;\n\nenum FieldIds {\n One = 'verify-1',\n Two = 'verify-2',\n Three = 'verify-3',\n Four = 'verify-4',\n Five = 'verify-5',\n}\n\ninterface InputField {\n getNext: () => InputField;\n getPrevious: () => InputField;\n value: string;\n setState: (code: string) => void;\n focus: () => void;\n}\n\ntype InputFields = {\n [key in FieldIds]: InputField;\n};\n\ninterface CodeInputProps {\n onChange: (code: string) => void;\n hasError?: boolean;\n}\n\nexport function CodeInput(props: CodeInputProps): JSX.Element {\n const [ fieldOneValue, setFieldOneValue ] = React.useState('');\n const [ fieldTwoValue, setFieldTwoValue ] = React.useState('');\n const [ fieldThreeValue, setFieldThreeValue ] = React.useState('');\n const [ fieldFourValue, setFieldFourValue ] = React.useState('');\n const [ fieldFiveValue, setFieldFiveValue ] = React.useState('');\n\n const fieldOneRef = React.useRef(null);\n const fieldTwoRef = React.useRef(null);\n const fieldThreeRef = React.useRef(null);\n const fieldFourRef = React.useRef(null);\n const fieldFiveRef = React.useRef(null);\n\n React.useEffect(() => {\n const code = (fieldOneValue || 'X')\n + (fieldTwoValue || 'X')\n + (fieldThreeValue || 'X')\n + (fieldFourValue || 'X')\n + (fieldFiveValue || 'X');\n\n props.onChange(code);\n }, [ fieldOneValue, fieldTwoValue, fieldThreeValue, fieldFourValue, fieldFiveValue ]);\n\n const fields: InputFields = {\n [FieldIds.One]: {\n getNext: () => fields[FieldIds.Two],\n getPrevious: () => null,\n value: fieldOneValue,\n setState: setFieldOneValue,\n focus: () => fieldOneRef.current.focus()\n },\n [FieldIds.Two]: {\n getNext: () => fields[FieldIds.Three],\n getPrevious: () => fields[FieldIds.One],\n value: fieldTwoValue,\n setState: setFieldTwoValue,\n focus: () => fieldTwoRef.current.focus()\n },\n [FieldIds.Three]: {\n getNext: () => fields[FieldIds.Four],\n getPrevious: () => fields[FieldIds.Two],\n value: fieldThreeValue,\n setState: setFieldThreeValue,\n focus: () => fieldThreeRef.current.focus()\n },\n [FieldIds.Four]: {\n getNext: () => fields[FieldIds.Five],\n getPrevious: () => fields[FieldIds.Three],\n value: fieldFourValue,\n setState: setFieldFourValue,\n focus: () => fieldFourRef.current.focus()\n },\n [FieldIds.Five]: {\n getNext: () => null,\n getPrevious: () => fields[FieldIds.Four],\n value: fieldFiveValue,\n setState: setFieldFiveValue,\n focus: () => fieldFiveRef.current.focus()\n }\n };\n\n function onKeyDown(event: React.KeyboardEvent<HTMLInputElement>, id: FieldIds): void {\n // Only listen to single digit inputs, or backspaces\n if (!singleDigitRegEx.test(event.key) && event.keyCode !== BACKSPACE_KEY_CODE)\n return;\n\n const field = fields[id];\n\n // On backspace: empty the target input field and focus the previous field if one exists\n if (event.keyCode === BACKSPACE_KEY_CODE) {\n field.setState('');\n field.getPrevious()?.focus();\n return;\n }\n\n /**\n * `event.currentTarget.selectionStart` === 0 when your cursor is at the beginning of the input field.\n * It's > 0 when your cursor is not at the beginning. In this case, when the user types we want to\n * update the next input field over if it exists instead of the focused one. This is mimicing Twitch's\n * component exactly.\n */\n if (event.currentTarget.selectionStart > 0) {\n const next = field.getNext();\n\n if (!next)\n return;\n\n next.setState(event.key);\n\n if (!next.getNext()) {\n next.focus();\n } else {\n next.getNext().focus();\n }\n\n return;\n }\n\n // Update the target input field, and focus the next one if it exists\n field.setState(event.key);\n field.getNext()?.focus();\n }\n\n function onPaste(event: React.ClipboardEvent<HTMLInputElement>, id: FieldIds): void {\n event.preventDefault();\n\n const data = event.clipboardData.getData('text').trim();\n\n // Only listen to paste events with all numbers\n if (!numberRegEx.test(data))\n return;\n\n const chars = data.split('');\n\n // If the user pastes 6 chars, update all inputs.\n if (chars.length === 6) {\n let currentEl = fields[FieldIds.One];\n\n for (const char of chars) {\n currentEl.setState(char);\n currentEl = currentEl.getNext();\n\n currentEl?.focus();\n }\n\n return;\n }\n\n const field = fields[id];\n\n let currentField = field;\n if (currentField.value && currentField.getNext())\n currentField = currentField.getNext();\n\n /**\n * Starting from the input field that the user pasted into: update from left to right one by one\n * until there are no more input fields to the right OR there are no more characters on the clipboard.\n */\n do {\n currentField.focus();\n currentField.setState(chars.shift());\n currentField = currentField.getNext();\n } while (chars.length && currentField);\n }\n\n // Share props. Ripped from Twitch\n const genericProps: React.DetailedHTMLProps<React.InputHTMLAttributes<HTMLInputElement>, HTMLInputElement> = {\n className: `form-control h-100 fw-semibold mx-1 text-center ${styles.input} ${props.hasError ? 'is-invalid' : ''}`,\n autoCorrect: 'off',\n inputMode: 'numeric',\n pattern: '[0-9]*',\n autoCapitalize: 'off',\n autoComplete: 'off'\n };\n\n return (\n <div className={`${styles.codeInputContainer} d-flex justify-content-between`}>\n <input\n onPaste={e => onPaste(e, FieldIds.One)}\n onKeyDown={e => onKeyDown(e, FieldIds.One)}\n value={fieldOneValue}\n ref={fieldOneRef}\n // React requires an onChange on any input with a `value` field, even though we dont need it\n onChange={() => {}}\n autoComplete='off'\n {...genericProps}\n />\n <input\n onPaste={e => onPaste(e, FieldIds.Two)}\n onKeyDown={e => onKeyDown(e, FieldIds.Two)}\n value={fieldTwoValue}\n ref={fieldTwoRef}\n onChange={() => {}}\n {...genericProps}\n />\n <input\n onPaste={e => onPaste(e, FieldIds.Three)}\n onKeyDown={e => onKeyDown(e, FieldIds.Three)}\n value={fieldThreeValue}\n ref={fieldThreeRef}\n onChange={() => {}}\n {...genericProps}\n />\n <input\n onPaste={e => onPaste(e, FieldIds.Four)}\n onKeyDown={e => onKeyDown(e, FieldIds.Four)}\n value={fieldFourValue}\n ref={fieldFourRef}\n onChange={() => {}}\n {...genericProps}\n />\n <input\n onPaste={e => onPaste(e, FieldIds.Five)}\n onKeyDown={e => onKeyDown(e, FieldIds.Five)}\n value={fieldFiveValue}\n ref={fieldFiveRef}\n onChange={() => {}}\n {...genericProps}\n />\n </div>\n );\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"logo\":\"FSXXf\",\"formContainer\":\"yEBMm\",\"backButton\":\"DRrEn\",\"codeInputContainer\":\"gSuIK\"};","import React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\n\nimport { CodeInput } from 'libs/shared/components/code-input/CodeInput';\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { SpinnerButton } from 'libs/shared/components/spinner-button/SpinnerButton';\nimport { ClickViewLogo } from 'libs/shared/components/svgs/clickview-logo/ClickViewLogo';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { OnlineCurrentUser } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { Launchpad } from 'shared/components/launchpad/Launchpad';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\n\nimport styles from './join-classroom-prompt.scss';\n\nconst namespace = 'classrooms.joinClassroomPrompt';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst loginAppLink = {\n application: AppChannels.LAUNCHPAD,\n action: Actions.Launchpad.LOGIN_LANDING,\n params: {\n showJoinCode: true\n }\n};\n\nconst dashboardAppLink = {\n application: AppChannels.DASHBOARD, action: Actions.Dashboard.HOME\n};\n\nconst EMPTY_CODE = 'X';\n\nexport function JoinClassroomPromptView(): React.ReactElement {\n const dispatch = useDispatch();\n\n const [ code, setCode ] = React.useState('');\n const [ error, setError ] = React.useState('');\n const [ spinner, setSpinner ] = React.useState(false);\n const user = Flight.useBasicFetch<OnlineCurrentUser>(UserRequests.currentUser());\n\n function onChangeCodeInput(inputCode: string): void {\n setError('');\n setCode(inputCode);\n }\n\n function onSuccess(): void {\n Core.AppLinkHelper.trigger({\n application: AppChannels.LAUNCHPAD,\n action: Actions.Launchpad.JOIN_CLASSROOM,\n args: [code]\n });\n }\n\n function onError(): void {\n setError(getPhrase('invalid'));\n setSpinner(false);\n }\n\n function checkCode(e: React.FormEvent): void {\n e.preventDefault();\n setSpinner(true);\n Flight.fetch(dispatch, ClassroomRequests.checkJoinCode(code, onSuccess, onError));\n }\n\n return (\n <Launchpad>\n <div className={`${styles.formContainer} m-auto`}>\n <form onSubmit={checkCode}>\n <div className='text-center position-relative mb-3'>\n <span className={`${styles.backButton} position-absolute`}>\n <IconButton\n appLink={user.data?.isAuthenticated ? dashboardAppLink : loginAppLink}\n svgName={cvSvgLibrary.ChevronLeft}\n />\n </span>\n <span className={`${styles.logo} d-inline-block`}>\n <ClickViewLogo />\n </span>\n </div>\n <p className='text-center'>{getPhrase('enterClassCode')}</p>\n <div className='mx-4'>\n <CodeInput onChange={onChangeCodeInput} hasError={!!error} />\n {!!error && <div className='d-block invalid-feedback'>{error}</div>}\n </div>\n <SpinnerButton\n showSpinner={spinner}\n className='d-block w-75 mt-3 mx-auto btn-lg'\n variant='dark'\n type='submit'\n disabled={code.includes(EMPTY_CODE)}\n >{getPhrase('next')}</SpinnerButton>\n </form>\n </div>\n </Launchpad>\n );\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\nconst FALLBACK_IMAGES = [\n {\n bgUrl: ImageUrls.LaunchPad.BG_1\n },\n {\n bgUrl: ImageUrls.LaunchPad.BG_2\n },\n {\n bgUrl: ImageUrls.LaunchPad.BG_3\n },\n {\n bgUrl: ImageUrls.LaunchPad.BG_4\n },\n {\n bgUrl: ImageUrls.LaunchPad.BG_5\n }\n];\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst XMAS_URLS: LaunchImage[] = [\n {\n bgUrl: '/images/launchpad/xmas/2024-promo1-bg.png'\n },\n {\n bgUrl: '/images/launchpad/xmas/2024-promo2-bg.png'\n },\n {\n bgUrl: '/images/launchpad/xmas/2024-promo3-bg.png'\n },\n {\n bgUrl: '/images/launchpad/xmas/2024-promo4-bg.png'\n },\n {\n bgUrl: '/images/launchpad/xmas/2024-promo5-bg.png'\n }\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 textUrl?: 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 const [ textImage, setTextImage ] = React.useState<string>('');\n\n const imageUrl = ImageHelper.createUrl(props.imageUrl, { size: ImageSize.Large });\n const IMAGE_URLS = 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 if (image.textUrl) {\n setTextImage(image.textUrl);\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 className={`${styles.left} bg-light`} style={{ backgroundImage: `url('${image}')` }}>\n { textImage && (\n <div className={styles.leftTextImage} style={{ backgroundImage: `url('${textImage}')` }} />\n )}\n \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 </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":["FieldIds","singleDigitRegEx","numberRegEx","BACKSPACE_KEY_CODE","CodeInput","props","fieldOneValue","setFieldOneValue","fieldTwoValue","setFieldTwoValue","fieldThreeValue","setFieldThreeValue","fieldFourValue","setFieldFourValue","fieldFiveValue","setFieldFiveValue","fieldOneRef","fieldTwoRef","fieldThreeRef","fieldFourRef","fieldFiveRef","code","onChange","fields","One","getNext","Two","getPrevious","value","setState","focus","current","Three","Four","Five","event","id","test","key","keyCode","field","currentTarget","selectionStart","next","preventDefault","data","clipboardData","getData","trim","chars","split","length","currentField","shift","currentEl","genericProps","className","hasError","autoCorrect","inputMode","pattern","autoCapitalize","autoComplete","onPaste","e","onKeyDown","ref","getPhrase","LanguageService","loginAppLink","application","action","params","showJoinCode","dashboardAppLink","EMPTY_CODE","JoinClassroomPromptView","dispatch","setCode","error","setError","spinner","setSpinner","user","UserRequests","onSuccess","args","onError","Launchpad","onSubmit","ClassroomRequests","IconButton","appLink","isAuthenticated","svgName","ClickViewLogo","inputCode","SpinnerButton","showSpinner","variant","type","disabled","includes","FALLBACK_IMAGES","bgUrl","ImageUrls","mapObjectTypeToImageClass","objectType","MasterType","showImage","setShowImage","image","setImage","textImage","setTextImage","imageUrl","ImageHelper","size","IMAGE_URLS","urlLists","Math","floor","random","textUrl","img","Image","onload","src","leftComponent","style","backgroundImage","alt","title","links","map","link","hide","href","url","onClick","text","children"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"scripts/9242-144e7728ad-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/components/code-input/code-input.scss","file:///app/packages/libs/shared/src/components/code-input/CodeInput.tsx","file:///app/packages/projects/lite/src/apps/launchpad/views/join-classroom-prompt/join-classroom-prompt.scss","file:///app/packages/projects/lite/src/apps/launchpad/views/join-classroom-prompt/JoinClassroomPromptView.tsx","file:///app/packages/projects/lite/src/shared/components/launchpad/launchpad.scss","file:///app/packages/projects/lite/src/shared/components/launchpad/Launchpad.tsx"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport default {\"input\":\"Aptlf\",\"codeInputContainer\":\"cRvSA\"};","import React from 'react';\n\nimport styles from './code-input.scss';\n\nconst singleDigitRegEx = /^[0-9]$/;\nconst numberRegEx = /^\\d+$/;\n\nconst BACKSPACE_KEY_CODE = 8;\n\nenum FieldIds {\n One = 'verify-1',\n Two = 'verify-2',\n Three = 'verify-3',\n Four = 'verify-4',\n Five = 'verify-5',\n}\n\ninterface InputField {\n getNext: () => InputField;\n getPrevious: () => InputField;\n value: string;\n setState: (code: string) => void;\n focus: () => void;\n}\n\ntype InputFields = {\n [key in FieldIds]: InputField;\n};\n\ninterface CodeInputProps {\n onChange: (code: string) => void;\n hasError?: boolean;\n}\n\nexport function CodeInput(props: CodeInputProps): JSX.Element {\n const [ fieldOneValue, setFieldOneValue ] = React.useState('');\n const [ fieldTwoValue, setFieldTwoValue ] = React.useState('');\n const [ fieldThreeValue, setFieldThreeValue ] = React.useState('');\n const [ fieldFourValue, setFieldFourValue ] = React.useState('');\n const [ fieldFiveValue, setFieldFiveValue ] = React.useState('');\n\n const fieldOneRef = React.useRef(null);\n const fieldTwoRef = React.useRef(null);\n const fieldThreeRef = React.useRef(null);\n const fieldFourRef = React.useRef(null);\n const fieldFiveRef = React.useRef(null);\n\n React.useEffect(() => {\n const code = (fieldOneValue || 'X')\n + (fieldTwoValue || 'X')\n + (fieldThreeValue || 'X')\n + (fieldFourValue || 'X')\n + (fieldFiveValue || 'X');\n\n props.onChange(code);\n }, [ fieldOneValue, fieldTwoValue, fieldThreeValue, fieldFourValue, fieldFiveValue ]);\n\n const fields: InputFields = {\n [FieldIds.One]: {\n getNext: () => fields[FieldIds.Two],\n getPrevious: () => null,\n value: fieldOneValue,\n setState: setFieldOneValue,\n focus: () => fieldOneRef.current.focus()\n },\n [FieldIds.Two]: {\n getNext: () => fields[FieldIds.Three],\n getPrevious: () => fields[FieldIds.One],\n value: fieldTwoValue,\n setState: setFieldTwoValue,\n focus: () => fieldTwoRef.current.focus()\n },\n [FieldIds.Three]: {\n getNext: () => fields[FieldIds.Four],\n getPrevious: () => fields[FieldIds.Two],\n value: fieldThreeValue,\n setState: setFieldThreeValue,\n focus: () => fieldThreeRef.current.focus()\n },\n [FieldIds.Four]: {\n getNext: () => fields[FieldIds.Five],\n getPrevious: () => fields[FieldIds.Three],\n value: fieldFourValue,\n setState: setFieldFourValue,\n focus: () => fieldFourRef.current.focus()\n },\n [FieldIds.Five]: {\n getNext: () => null,\n getPrevious: () => fields[FieldIds.Four],\n value: fieldFiveValue,\n setState: setFieldFiveValue,\n focus: () => fieldFiveRef.current.focus()\n }\n };\n\n function onKeyDown(event: React.KeyboardEvent<HTMLInputElement>, id: FieldIds): void {\n // Only listen to single digit inputs, or backspaces\n if (!singleDigitRegEx.test(event.key) && event.keyCode !== BACKSPACE_KEY_CODE)\n return;\n\n const field = fields[id];\n\n // On backspace: empty the target input field and focus the previous field if one exists\n if (event.keyCode === BACKSPACE_KEY_CODE) {\n field.setState('');\n field.getPrevious()?.focus();\n return;\n }\n\n /**\n * `event.currentTarget.selectionStart` === 0 when your cursor is at the beginning of the input field.\n * It's > 0 when your cursor is not at the beginning. In this case, when the user types we want to\n * update the next input field over if it exists instead of the focused one. This is mimicing Twitch's\n * component exactly.\n */\n if (event.currentTarget.selectionStart > 0) {\n const next = field.getNext();\n\n if (!next)\n return;\n\n next.setState(event.key);\n\n if (!next.getNext()) {\n next.focus();\n } else {\n next.getNext().focus();\n }\n\n return;\n }\n\n // Update the target input field, and focus the next one if it exists\n field.setState(event.key);\n field.getNext()?.focus();\n }\n\n function onPaste(event: React.ClipboardEvent<HTMLInputElement>, id: FieldIds): void {\n event.preventDefault();\n\n const data = event.clipboardData.getData('text').trim();\n\n // Only listen to paste events with all numbers\n if (!numberRegEx.test(data))\n return;\n\n const chars = data.split('');\n\n // If the user pastes 6 chars, update all inputs.\n if (chars.length === 6) {\n let currentEl = fields[FieldIds.One];\n\n for (const char of chars) {\n currentEl.setState(char);\n currentEl = currentEl.getNext();\n\n currentEl?.focus();\n }\n\n return;\n }\n\n const field = fields[id];\n\n let currentField = field;\n if (currentField.value && currentField.getNext())\n currentField = currentField.getNext();\n\n /**\n * Starting from the input field that the user pasted into: update from left to right one by one\n * until there are no more input fields to the right OR there are no more characters on the clipboard.\n */\n do {\n currentField.focus();\n currentField.setState(chars.shift());\n currentField = currentField.getNext();\n } while (chars.length && currentField);\n }\n\n // Share props. Ripped from Twitch\n const genericProps: React.DetailedHTMLProps<React.InputHTMLAttributes<HTMLInputElement>, HTMLInputElement> = {\n className: `form-control h-100 fw-semibold mx-1 text-center ${styles.input} ${props.hasError ? 'is-invalid' : ''}`,\n autoCorrect: 'off',\n inputMode: 'numeric',\n pattern: '[0-9]*',\n autoCapitalize: 'off',\n autoComplete: 'off'\n };\n\n return (\n <div className={`${styles.codeInputContainer} d-flex justify-content-between`}>\n <input\n onPaste={e => onPaste(e, FieldIds.One)}\n onKeyDown={e => onKeyDown(e, FieldIds.One)}\n value={fieldOneValue}\n ref={fieldOneRef}\n // React requires an onChange on any input with a `value` field, even though we dont need it\n onChange={() => {}}\n autoComplete='off'\n {...genericProps}\n />\n <input\n onPaste={e => onPaste(e, FieldIds.Two)}\n onKeyDown={e => onKeyDown(e, FieldIds.Two)}\n value={fieldTwoValue}\n ref={fieldTwoRef}\n onChange={() => {}}\n {...genericProps}\n />\n <input\n onPaste={e => onPaste(e, FieldIds.Three)}\n onKeyDown={e => onKeyDown(e, FieldIds.Three)}\n value={fieldThreeValue}\n ref={fieldThreeRef}\n onChange={() => {}}\n {...genericProps}\n />\n <input\n onPaste={e => onPaste(e, FieldIds.Four)}\n onKeyDown={e => onKeyDown(e, FieldIds.Four)}\n value={fieldFourValue}\n ref={fieldFourRef}\n onChange={() => {}}\n {...genericProps}\n />\n <input\n onPaste={e => onPaste(e, FieldIds.Five)}\n onKeyDown={e => onKeyDown(e, FieldIds.Five)}\n value={fieldFiveValue}\n ref={fieldFiveRef}\n onChange={() => {}}\n {...genericProps}\n />\n </div>\n );\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"logo\":\"FSXXf\",\"formContainer\":\"yEBMm\",\"backButton\":\"DRrEn\",\"codeInputContainer\":\"gSuIK\"};","import React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\n\nimport { CodeInput } from 'libs/shared/components/code-input/CodeInput';\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { SpinnerButton } from 'libs/shared/components/spinner-button/SpinnerButton';\nimport { ClickViewLogo } from 'libs/shared/components/svgs/clickview-logo/ClickViewLogo';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { OnlineCurrentUser } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { Launchpad } from 'shared/components/launchpad/Launchpad';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\n\nimport styles from './join-classroom-prompt.scss';\n\nconst namespace = 'classrooms.joinClassroomPrompt';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst loginAppLink = {\n application: AppChannels.LAUNCHPAD,\n action: Actions.Launchpad.LOGIN_LANDING,\n params: {\n showJoinCode: true\n }\n};\n\nconst dashboardAppLink = {\n application: AppChannels.DASHBOARD, action: Actions.Dashboard.HOME\n};\n\nconst EMPTY_CODE = 'X';\n\nexport function JoinClassroomPromptView(): React.ReactElement {\n const dispatch = useDispatch();\n\n const [ code, setCode ] = React.useState('');\n const [ error, setError ] = React.useState('');\n const [ spinner, setSpinner ] = React.useState(false);\n const user = Flight.useBasicFetch<OnlineCurrentUser>(UserRequests.currentUser());\n\n function onChangeCodeInput(inputCode: string): void {\n setError('');\n setCode(inputCode);\n }\n\n function onSuccess(): void {\n Core.AppLinkHelper.trigger({\n application: AppChannels.LAUNCHPAD,\n action: Actions.Launchpad.JOIN_CLASSROOM,\n args: [code]\n });\n }\n\n function onError(): void {\n setError(getPhrase('invalid'));\n setSpinner(false);\n }\n\n function checkCode(e: React.FormEvent): void {\n e.preventDefault();\n setSpinner(true);\n Flight.fetch(dispatch, ClassroomRequests.checkJoinCode(code, onSuccess, onError));\n }\n\n return (\n <Launchpad>\n <div className={`${styles.formContainer} m-auto`}>\n <form onSubmit={checkCode}>\n <div className='text-center position-relative mb-3'>\n <span className={`${styles.backButton} position-absolute`}>\n <IconButton\n appLink={user.data?.isAuthenticated ? dashboardAppLink : loginAppLink}\n svgName={cvSvgLibrary.ChevronLeft}\n />\n </span>\n <span className={`${styles.logo} d-inline-block`}>\n <ClickViewLogo />\n </span>\n </div>\n <p className='text-center'>{getPhrase('enterClassCode')}</p>\n <div className='mx-4'>\n <CodeInput onChange={onChangeCodeInput} hasError={!!error} />\n {!!error && <div className='d-block invalid-feedback'>{error}</div>}\n </div>\n <SpinnerButton\n showSpinner={spinner}\n className='d-block w-75 mt-3 mx-auto btn-lg'\n variant='dark'\n type='submit'\n disabled={code.includes(EMPTY_CODE)}\n >{getPhrase('next')}</SpinnerButton>\n </form>\n </div>\n </Launchpad>\n );\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\nconst FALLBACK_IMAGES = [\n {\n bgUrl: ImageUrls.LaunchPad.BG_1\n },\n {\n bgUrl: ImageUrls.LaunchPad.BG_2\n },\n {\n bgUrl: ImageUrls.LaunchPad.BG_3\n },\n {\n bgUrl: ImageUrls.LaunchPad.BG_4\n },\n {\n bgUrl: ImageUrls.LaunchPad.BG_5\n }\n];\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst XMAS_URLS: LaunchImage[] = [\n {\n bgUrl: '/images/launchpad/xmas/2024-promo1-bg.png'\n },\n {\n bgUrl: '/images/launchpad/xmas/2024-promo2-bg.png'\n },\n {\n bgUrl: '/images/launchpad/xmas/2024-promo3-bg.png'\n },\n {\n bgUrl: '/images/launchpad/xmas/2024-promo4-bg.png'\n },\n {\n bgUrl: '/images/launchpad/xmas/2024-promo5-bg.png'\n }\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 textUrl?: 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 const [ textImage, setTextImage ] = React.useState<string>('');\n\n const imageUrl = ImageHelper.createUrl(props.imageUrl, { size: ImageSize.Large });\n const IMAGE_URLS = 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 if (image.textUrl) {\n setTextImage(image.textUrl);\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 className={`${styles.left} bg-light`} style={{ backgroundImage: `url('${image}')` }}>\n { textImage && (\n <div className={styles.leftTextImage} style={{ backgroundImage: `url('${textImage}')` }} />\n )}\n \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 </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":["FieldIds","singleDigitRegEx","numberRegEx","BACKSPACE_KEY_CODE","CodeInput","props","fieldOneValue","setFieldOneValue","fieldTwoValue","setFieldTwoValue","fieldThreeValue","setFieldThreeValue","fieldFourValue","setFieldFourValue","fieldFiveValue","setFieldFiveValue","fieldOneRef","fieldTwoRef","fieldThreeRef","fieldFourRef","fieldFiveRef","code","onChange","fields","One","getNext","Two","getPrevious","value","setState","focus","current","Three","Four","Five","event","id","test","key","keyCode","field","currentTarget","selectionStart","next","preventDefault","data","clipboardData","getData","trim","chars","split","length","currentField","shift","currentEl","genericProps","className","hasError","autoCorrect","inputMode","pattern","autoCapitalize","autoComplete","onPaste","e","onKeyDown","ref","getPhrase","LanguageService","loginAppLink","application","action","params","showJoinCode","dashboardAppLink","EMPTY_CODE","JoinClassroomPromptView","dispatch","setCode","error","setError","spinner","setSpinner","user","UserRequests","onSuccess","args","onError","Launchpad","onSubmit","ClassroomRequests","IconButton","appLink","isAuthenticated","svgName","ClickViewLogo","inputCode","SpinnerButton","showSpinner","variant","type","disabled","includes","FALLBACK_IMAGES","bgUrl","ImageUrls","mapObjectTypeToImageClass","objectType","MasterType","showImage","setShowImage","image","setImage","textImage","setTextImage","imageUrl","ImageHelper","size","IMAGE_URLS","urlLists","Math","floor","random","textUrl","img","Image","onload","src","leftComponent","style","backgroundImage","alt","title","links","map","link","hide","href","url","onClick","text","children"],"sourceRoot":""}
|