@clickview/lite 0.70.1-dev.1 → 0.70.1-dev.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundles.json +1 -1
- package/dist/scripts/4377-001a8ee263-lite.chunk.js +2 -0
- package/dist/scripts/4377-001a8ee263-lite.chunk.js.map +1 -0
- package/dist/scripts/549-2d591052e3-lite.chunk.js +2 -0
- package/dist/scripts/549-2d591052e3-lite.chunk.js.map +1 -0
- package/dist/scripts/5721-2141ed4fb6-lite.chunk.js +2 -0
- package/dist/scripts/5721-2141ed4fb6-lite.chunk.js.map +1 -0
- package/dist/scripts/5797-f84ce545b9-lite.chunk.js +2 -0
- package/dist/scripts/5797-f84ce545b9-lite.chunk.js.map +1 -0
- package/dist/scripts/5829-5b395badf2-lite.chunk.js +3 -0
- package/dist/scripts/5829-5b395badf2-lite.chunk.js.map +1 -0
- package/dist/scripts/6046-5652117548-lite.chunk.js +2 -0
- package/dist/scripts/6046-5652117548-lite.chunk.js.map +1 -0
- package/dist/scripts/{6629-3ea157aef8-lite.chunk.js → 6629-910e316a83-lite.chunk.js} +3 -3
- package/dist/scripts/6629-910e316a83-lite.chunk.js.map +1 -0
- package/dist/scripts/7428-6dd787bc07-lite.chunk.js +2 -0
- package/dist/scripts/7428-6dd787bc07-lite.chunk.js.map +1 -0
- package/dist/scripts/7757-9b72774917-lite.chunk.js +2 -0
- package/dist/scripts/{7757-e4d91d7fac-lite.chunk.js.map → 7757-9b72774917-lite.chunk.js.map} +1 -1
- package/dist/scripts/8191-ff27deee6c-lite.chunk.js +2 -0
- package/dist/scripts/8191-ff27deee6c-lite.chunk.js.map +1 -0
- package/dist/scripts/{bundle-4735d8d159.min.js → bundle-4b10174000.min.js} +3 -3
- package/dist/scripts/{bundle-4735d8d159.min.js.map → bundle-4b10174000.min.js.map} +1 -1
- package/package.json +1 -1
- package/dist/scripts/4377-f6e641f39a-lite.chunk.js +0 -2
- package/dist/scripts/4377-f6e641f39a-lite.chunk.js.map +0 -1
- package/dist/scripts/52-d91751eafb-lite.chunk.js +0 -2
- package/dist/scripts/52-d91751eafb-lite.chunk.js.map +0 -1
- package/dist/scripts/549-f06f2dab2b-lite.chunk.js +0 -2
- package/dist/scripts/549-f06f2dab2b-lite.chunk.js.map +0 -1
- package/dist/scripts/5721-bfd734f968-lite.chunk.js +0 -2
- package/dist/scripts/5721-bfd734f968-lite.chunk.js.map +0 -1
- package/dist/scripts/5797-04d8a61b80-lite.chunk.js +0 -2
- package/dist/scripts/5797-04d8a61b80-lite.chunk.js.map +0 -1
- package/dist/scripts/5829-1c696c8446-lite.chunk.js +0 -3
- package/dist/scripts/5829-1c696c8446-lite.chunk.js.map +0 -1
- package/dist/scripts/6046-339bc1b2e1-lite.chunk.js +0 -2
- package/dist/scripts/6046-339bc1b2e1-lite.chunk.js.map +0 -1
- package/dist/scripts/6629-3ea157aef8-lite.chunk.js.map +0 -1
- package/dist/scripts/7757-e4d91d7fac-lite.chunk.js +0 -2
- package/dist/scripts/8191-d5f68d2463-lite.chunk.js +0 -2
- package/dist/scripts/8191-d5f68d2463-lite.chunk.js.map +0 -1
- /package/dist/css/{52-lite-e2d7497beb.chunk.css → 7428-lite-e2d7497beb.chunk.css} +0 -0
- /package/dist/scripts/{5829-1c696c8446-lite.chunk.js.LICENSE.txt → 5829-5b395badf2-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{6629-3ea157aef8-lite.chunk.js.LICENSE.txt → 6629-910e316a83-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{bundle-4735d8d159.min.js.LICENSE.txt → bundle-4b10174000.min.js.LICENSE.txt} +0 -0
package/dist/bundles.json
CHANGED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[4377],{70376:(e,t,n)=>{n.d(t,{W:()=>o});var r=n(32735),i=n(91967);function a(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var s=5e3;function o(e){var t,n,o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:s,u=(t=r.useState(!1),n=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,i,a,s,o=[],u=!0,l=!1;try{if(a=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;u=!1}else for(;!(u=(r=a.call(n)).done)&&(o.push(r.value),o.length!==t);u=!0);}catch(e){l=!0,i=e}finally{try{if(!u&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(l)throw i}}return o}}(t,n)||function(e,t){if(e){if("string"==typeof e)return a(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?a(e,t):void 0}}(t,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),l=u[0],c=u[1],d=r.useRef(null),m=function(){c((function(e){return!e})),d.current=window.setTimeout(m,o)};return r.useEffect((function(){d.current=window.setTimeout(m,o)}),[]),r.useEffect((function(){i.q.isFunction(e)&&e()}),[l]),function(){return window.clearTimeout(d.current)}}},5255:(e,t,n)=>{n.d(t,{Y:()=>o});var r=n(70376),i=n(20354),a=n(30439);function s(e){return s="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},s(e)}function o(e){var t,n=i.a.useGetFetch(),o=e&&a.o.getAnonSessions(e),u=i.a.useBasicFetch(o);return(0,r.W)((function(){return n(o)}),5e3),(null===(t=u.data)||void 0===t?void 0:t.length)?u.data.reduce((function(e,t){return Object.assign(Object.assign({},e),(n={},r=t.sessionId,i=t,(r=function(e){var t=function(e){if("object"!=s(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=s(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==s(t)?t:t+""}(r))in n?Object.defineProperty(n,r,{value:i,enumerable:!0,configurable:!0,writable:!0}):n[r]=i,n));var n,r,i}),{}):{}}},26136:(e,t,n)=>{n.d(t,{B2:()=>o,DV:()=>l,jP:()=>u});var r=n(76198),i=n(23481),a=n(64818),s=i.T.encloseNamespace("shared.analyticsUtils");function o(e,t){return e?t?(0,r._8)((n="sessionId"in e?e.sessionName:e.id,i=+"".concat(n).concat(Math.floor((new Date).getMinutes()/5)),{dictionaries:[r.O9,r.yd],separator:" ",length:2,style:"capital",seed:i})):"sessionId"in e?e.sessionName:a.l.getFullName(e):"";var n,i}function u(e,t){var n={sessionId:e,sessionName:s("anonymousUser")};return e&&t&&t[e]||n}function l(e,t){return e.user?e.user:u(e.sessionId,t)}},3218:(e,t,n)=>{n.d(t,{R:()=>S});var r=n(32735),i=n(69087),a=n(26136),s=n(39157),o=n(69186),u=n(86572),l=n(28972),c=n(83140),d=n(80845),m=n(23481),f=n(2102),v=n(36532),y=m.T.encloseNamespace("interactives.studentResponseList");function b(e){var t=Object.keys(e.markedAnswers).length;return r.createElement("div",{className:"d-flex justify-content-end pt-3"},r.createElement("div",null,!e.showSubmitButtonSpinner&&r.createElement("button",{className:"btn btn-link",onClick:e.onClickClose},y("close")),!!e.interactionsToMark.length&&r.createElement(r.Fragment,null,e.isDemo?r.createElement(v.u,{id:"submitAnswers",title:y("demoOnly"),spanHack:!0,spanHackClassName:"d-inline-flex"},r.createElement("button",{className:"btn btn-outline-dark pointer-events-none",disabled:!t},y("submitAnswers"))):r.createElement(f.m,{variant:"outline-dark",onClick:e.onClickSubmit,disabled:!t,showSpinner:e.showSubmitButtonSpinner},y("submitAnswers")))))}var g=m.T.encloseNamespace("interactives.studentResponseList");function p(e){var t=Object.keys(e.markedAnswers).length;return r.createElement("div",{className:"d-flex justify-content-between pb-3"},r.createElement("div",{className:"d-flex"},!!e.summary.unanswered&&r.createElement("div",{className:"bg-light rounded p-2 me-2"},r.createElement("strong",{className:"me-2"},g("unanswered")),e.summary.unanswered),r.createElement("div",{className:"bg-light rounded p-2 me-2"},r.createElement("strong",{className:"me-2"},g("score")),e.summary.awaitingMarking?r.createElement("em",null,g("pending")):"".concat(Math.round(100*e.summary.percentCorrect),"%"))),!!e.interactionsToMark.length&&r.createElement(r.Fragment,null,e.isDemo?r.createElement(v.u,{id:"submitAnswers",title:g("demoOnly"),spanHack:!0},r.createElement("button",{className:"btn btn-outline-dark pointer-events-none",disabled:!t},g("submitAnswers"))):r.createElement(f.m,{variant:"outline-dark",onClick:e.onClickSubmit,disabled:!t,showSpinner:e.showSubmitButtonSpinner},g("submitAnswers"))))}const h={awaitingMarking:"MvGb5"};function w(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,i,a,s,o=[],u=!0,l=!1;try{if(a=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;u=!1}else for(;!(u=(r=a.call(n)).done)&&(o.push(r.value),o.length!==t);u=!0);}catch(e){l=!0,i=e}finally{try{if(!u&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(l)throw i}}return o}}(e,t)||function(e,t){if(e){if("string"==typeof e)return k(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?k(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 k(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function S(e){var t,n,m,f,v=w(r.useState(!1),2),y=v[0],g=v[1],k=(t=r.useRef(null),n=w(r.useState(!1),2),m=n[0],f=n[1],r.useEffect((function(){t.current&&!m&&(f(!0),requestAnimationFrame((function(){return t.current.scrollIntoView({behavior:"smooth",block:"center"})})))}),[t.current,m]),t),S=(0,s.Rt)(e.interactive,e.studentResults),A=(0,d.Q)(e.interactive),E=function(e,t){return e.filter((function(e){return c.A.isInteractionCorrect(e,(0,d.j_)(t))===l.w.AwaitingMarking}))}(A,e.studentResults);function I(){g(!0),e.submitMarkedAnswers()}return r.createElement(r.Fragment,null,r.createElement(p,{summary:S,interactionsToMark:E,markedAnswers:e.markedAnswers,onClickSubmit:I,showSubmitButtonSpinner:y,isDemo:e.isDemo}),r.createElement("ul",{className:"list-unstyled"},A.map((function(t,n){var l,c=t.id.toString()===(null===(l=e.selectedInteractionId)||void 0===l?void 0:l.toString()),d=E.some((function(e){return e.id===t.id})),m=(0,a.B2)((0,a.DV)(e.studentResults,e.anonSessions),e.anonymiseUsers),f="p-2 mb-3 rounded";return c&&(f+=" border-2 border-info shadow"),f+=d?" ".concat(h.awaitingMarking):" border",r.createElement("li",{key:n,className:f,ref:c?k:null},r.createElement("div",{className:"d-flex mb-2"},r.createElement(u.y,{interaction:t,iconClassName:"flex-shrink-0"})),e.reportsStyling?r.createElement(o.O,{interaction:t,studentResults:e.studentResults,markedStatus:(0,s.HI)(t.id,e.studentResults,e.markedAnswers),markInteraction:e.addMarkedAnswers,imageCdnUrl:e.imageCdnUrl,anonymisedUserName:m,className:"bg-light ps-2",showFeedback:!0,reportsStyling:!0,responseComponentClass:"mx-n2"}):r.createElement(i.d,{interaction:t,studentResults:e.studentResults,markedStatus:(0,s.HI)(t.id,e.studentResults,e.markedAnswers),markInteraction:e.addMarkedAnswers,imageCdnUrl:e.imageCdnUrl,anonymisedUserName:m,showFeedback:!0}))}))),r.createElement(b,{interactionsToMark:E,markedAnswers:e.markedAnswers,onClickSubmit:I,onClickClose:e.onClickClose,showSubmitButtonSpinner:y,isDemo:e.isDemo}))}},94892:(e,t,n)=>{n.d(t,{T:()=>i,i:()=>r});var r={HIGH:.75,MODERATE:.5},i={HIGH:.7,MODERATE:.7}},94644:(e,t,n)=>{n.d(t,{r:()=>c});var r=n(50242),i=n(81886),a=n(67058),s=n(14553),o=n(49267),u=n(49075),l={notFound:a.d,forbidden:{rating:s.q,yearLevel:s.q,region:o.a,privacy:s.q},badRequest:u._,internalServerError:u._};function c(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(e){var a;a="number"==typeof e?e:e.status;var s=Object.assign(Object.assign({},l),t);a&&i.Q.Ry.isStatusCodeError(a)&&(a!==r.o.InternalServer?a!==r.o.NotFound?a!==r.o.Forbidden?n.badRequest||i.Q.Ry.throw(new s.badRequest):n.forbidden||i.Q.Ry.throw(new s.forbidden.privacy):n.notFound||i.Q.Ry.throw(new s.notFound):n.internalServerError||i.Q.Ry.throw(new u._))}}},54405:(e,t,n)=>{n.d(t,{X:()=>r});var r={interactive:function(){return{url:"/mocks/insights/interactive.json",key:"demo:interactive",normalize:!1}},interactiveMetadata:function(){return{url:"/mocks/insights/interactive-metadata.json",key:"demo:interactive:metadata",normalize:!1}},interactiveResults:function(){return{url:"/mocks/insights/interactive-results.json",key:"demo:interactive:results",normalize:!1}},videoViews:function(){return{url:"/mocks/insights/video-views.json",key:"demo:video:views",normalize:!1}},users:function(){return{url:"/mocks/insights/users.json",key:"demo:users",normalize:!1}},individualHeatmap:function(){return{url:"/mocks/insights/individual-heatmap.json",key:"demo:individual:heatmap",normalize:!1}},aggregateHeatmap:function(){return{url:"/mocks/insights/aggregate-heatmap.json",key:"demo:aggregate:heatmap",normalize:!1}}}},91286:(e,t,n)=>{n.d(t,{v:()=>s});var r=n(32735),i=n(94644);function a(e){return e.map((function(e){return e.statusCode})).join(":")}function s(e,t,n){var s=Array.isArray(e)?e:[e];(0,r.useEffect)((function(){s.forEach((function(e){(0,i.r)(e.statusCode,t,n)}))}),[a(s),t,n])}},62875:(e,t,n)=>{function r(e,t,n){var r="".concat(e,":").concat(t.start,":").concat(t.end),i=Array.isArray(t.userId)?t.userId.sort().join(":"):t.userId,a=Array.isArray(t.groupId)?t.groupId.sort().join(":"):t.groupId;return i&&(r+=":".concat(i)),a&&(r+=":".concat(a)),n&&(r+=":".concat(n)),r}n.d(t,{H:()=>r})},55588:(e,t,n)=>{n.r(t),n.d(t,{InteractiveStudentResultsDemoView:()=>w});var r=n(32735),i=n(23481),a=n(20354),s=n(2948),o=n(5255),u=n(9193),l=n(26136),c=n(3218),d=n(9111),m=n(38143),f=n(39151),v=n(54405),y=n(26304),b=n(91286),g=n(93322);function p(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var h=i.T.encloseNamespace("shared.interactiveStudentResults");function w(e){var t,n,i,w,k,S=(w=(0,s.D)(m.g.ANONYMISE_USERS),k=1,function(e){if(Array.isArray(e))return e}(w)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,i,a,s,o=[],u=!0,l=!1;try{if(a=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;u=!1}else for(;!(u=(r=a.call(n)).done)&&(o.push(r.value),o.length!==t);u=!0);}catch(e){l=!0,i=e}finally{try{if(!u&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(l)throw i}}return o}}(w,k)||function(e,t){if(e){if("string"==typeof e)return p(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?p(e,t):void 0}}(w,k)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[0];(0,g.F)();var A=a.a.useBasicFetch(v.X.interactiveMetadata()),E=a.a.useBasicFetch(v.X.interactive()),I=a.a.useBasicFetch(v.X.interactiveResults()),j=a.a.useBasicFetch(f.L.config()),C=(0,o.Y)(e.shareId);(0,b.v)([A,I]),(0,y.b)(A);var R=(0,u.D)(null===(t=E.data)||void 0===t?void 0:t.id,null===(n=A.data)||void 0===n?void 0:n.id,e.closePopup),N=R.markedAnswers,M=R.addMarkedAnswers,O=R.submitMarkedAnswers,F=null===(i=I.data)||void 0===i?void 0:i.students.find((function(t){var n,r,i,a,s;return e.userId?(null===(r=null===(n=t.user)||void 0===n?void 0:n.id)||void 0===r?void 0:r.toString())===(null===(i=e.userId)||void 0===i?void 0:i.toString()):!!e.sessionId&&(null===(a=t.sessionId)||void 0===a?void 0:a.toString())===(null===(s=e.sessionId)||void 0===s?void 0:s.toString())})),T=F?h("heading",{studentName:(0,l.B2)((0,l.DV)(F,C),S)}):"",D=!!E.data&&!!I.data&&!!j.data;return r.createElement(d.G,{title:T,showLoadingSpinner:!D,closePopup:e.closePopup,size:"lg"},D&&r.createElement(c.R,{interactive:E.data,studentResults:F,markedAnswers:N,addMarkedAnswers:M,submitMarkedAnswers:O,imageCdnUrl:j.data.imageCdnUrl,selectedInteractionId:e.interactionId,onClickClose:e.closePopup,anonymiseUsers:S,reportsStyling:e.reportsStyling,isDemo:!0}))}}}]);
|
|
2
|
+
//# sourceMappingURL=4377-001a8ee263-lite.chunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scripts/4377-001a8ee263-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/common/src/react/hooks/UsePolling.ts","file:///app/packages/libs/shared/src/apps/analytics/hooks/UseAnonSessions.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/AnonymiseUserUtils.ts","file:///app/packages/libs/shared/src/apps/student-response-list/StudentResponseListFooter.tsx","file:///app/packages/libs/shared/src/apps/student-response-list/StudentResponseListHeader.tsx","file:///app/packages/libs/shared/src/apps/student-response-list/student-response-list.scss","file:///app/packages/libs/shared/src/apps/student-response-list/StudentResponseList.tsx","file:///app/packages/libs/shared/src/constants/ScoreThresholds.ts","file:///app/packages/libs/shared/src/errors/handlers/HttpErrorHandlers.ts","file:///app/packages/libs/shared/src/flight-requests/InsightsDemoRequests.ts","file:///app/packages/libs/shared/src/hooks/UseHandleObjectError.ts","file:///app/packages/libs/shared/src/utils/AnalyticsRequestUtils.ts","file:///app/packages/projects/lite/src/apps/my-shares/views/demo/interactive-student-results/InteractiveStudentResultsDemoView.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nconst DEFAULT_POLLING_INTERVAL = 5000; // 5 seconds.\n\n/**\n * Hook to fire a callback at a set interval.\n * @param callback \n * @param pollingInterval \n * \n * Returns a function to clear the timeout.\n */\nexport function usePolling(callback: () => void, pollingInterval: number = DEFAULT_POLLING_INTERVAL): () => void {\n const [ pollingTrigger, setPollingTrigger ] = React.useState(false);\n\n const timeoutRef = React.useRef<number>(null);\n\n const poll = () => {\n setPollingTrigger(t => !t);\n\n timeoutRef.current = window.setTimeout(poll, pollingInterval);\n };\n\n React.useEffect(() => {\n timeoutRef.current = window.setTimeout(poll, pollingInterval);\n }, []);\n\n React.useEffect(() => {\n if (FunctionHelper.isFunction(callback))\n callback();\n }, [pollingTrigger]);\n\n return () => window.clearTimeout(timeoutRef.current);\n}","import { usePolling } from 'libs/common/react/hooks/UsePolling';\nimport { Flight } from 'libs/common/react/index';\n\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\n\nexport interface AnonSession {\n sessionId: string;\n sessionName: string;\n}\n\nexport interface AnonSessions extends Record<string, AnonSession> {}\n\nexport function useAnonSessions(shareId: string): AnonSessions {\n const fetch = Flight.useGetFetch();\n const anonSessionsRequest = shareId && ShareRequests.getAnonSessions(shareId);\n const anonSessionsResponse = Flight.useBasicFetch<AnonSession[]>(anonSessionsRequest);\n\n usePolling(() => fetch(anonSessionsRequest), 5000);\n\n if (!anonSessionsResponse.data?.length)\n return {};\n\n return anonSessionsResponse.data.reduce((prev, current) => ({ ...prev, [current.sessionId]: current }), {});\n}","import { animals, colors, Config as UniqueNamesConfig, uniqueNamesGenerator } from 'unique-names-generator';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AnonSession, AnonSessions } from 'libs/shared/apps/analytics/hooks/UseAnonSessions';\nimport { UserOrAnonSession } from 'libs/shared/apps/analytics/interfaces/UserOrAnonSession';\nimport { StudentResults } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nconst namespace = 'shared.analyticsUtils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getUniqueNamesConfig(id: string): UniqueNamesConfig {\n /**\n * Generate a seed that is unique to each user but changes every 5 minutes.\n * \n * We use a seed so that if the same user's name is anonymised multiple times\n * in quick succession (e.g. multiple renders), the same name will be returned each time.\n * \n * We change the seed every 5 minutes so that students don't always have the same name.\n */\n const seed = +`${id}${Math.floor((new Date()).getMinutes() / 5)}`;\n\n return {\n dictionaries: [ colors, animals ],\n separator: ' ',\n length: 2,\n style: 'capital',\n seed\n };\n}\n\nexport function anonymiseUserName(user: UserOrAnonSession, shouldAnonymise: boolean): string {\n if (!user)\n return '';\n\n if (!shouldAnonymise)\n return 'sessionId' in user ? user.sessionName : UserHelper.getFullName(user);\n\n return uniqueNamesGenerator(getUniqueNamesConfig('sessionId' in user ? user.sessionName : user.id));\n}\n\nexport function getAnonSession(sessionId: string, anonSessions: AnonSessions): AnonSession {\n const fallback = {\n sessionId: sessionId,\n sessionName: getPhrase('anonymousUser')\n };\n\n if (!sessionId || !anonSessions)\n return fallback;\n\n const anonSession = anonSessions[sessionId];\n\n if (anonSession)\n return anonSession;\n\n return fallback;\n}\n\nexport function getUserOrAnonSession(result: StudentResults, anonSessions: AnonSessions): UserOrAnonSession {\n if (result.user)\n return result.user;\n\n return getAnonSession(result.sessionId, anonSessions);\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { MarkedAnswerHash } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { SpinnerButton } from 'libs/shared/components/spinner-button/SpinnerButton';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { Interaction } from 'libs/shared/interfaces';\n\nconst namespace = 'interactives.studentResponseList';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface StudentResponseListFooterProps {\n interactionsToMark: Interaction[];\n markedAnswers: MarkedAnswerHash;\n onClickSubmit: () => void;\n onClickClose: () => void;\n showSubmitButtonSpinner: boolean;\n isDemo?: boolean;\n}\n\nexport function StudentResponseListFooter(props: StudentResponseListFooterProps): JSX.Element {\n const numMarkedAnswers = Object.keys(props.markedAnswers).length;\n\n return (\n <div className='d-flex justify-content-end pt-3'>\n <div>\n {!props.showSubmitButtonSpinner &&\n <button className='btn btn-link' onClick={props.onClickClose}>\n {getPhrase('close')}\n </button>\n }\n {!!props.interactionsToMark.length && (\n <>\n {props.isDemo ? (\n <Tooltip\n id='submitAnswers'\n title={getPhrase('demoOnly')}\n spanHack\n spanHackClassName='d-inline-flex'\n >\n <button\n className='btn btn-outline-dark pointer-events-none'\n disabled={!numMarkedAnswers}\n >\n {getPhrase('submitAnswers')}\n </button>\n </Tooltip>\n ) : (\n <SpinnerButton\n variant='outline-dark'\n onClick={props.onClickSubmit}\n disabled={!numMarkedAnswers}\n showSpinner={props.showSubmitButtonSpinner}\n >\n {getPhrase('submitAnswers')}\n </SpinnerButton>\n )}\n </>\n )}\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { MarkedAnswerHash } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { ResultsSummary } from 'libs/shared/apps/analytics/interfaces/ResultsSummary';\nimport { SpinnerButton } from 'libs/shared/components/spinner-button/SpinnerButton';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { Interaction } from 'libs/shared/interfaces';\n\nconst namespace = 'interactives.studentResponseList';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface StudentResponseListHeaderProps {\n summary: ResultsSummary;\n interactionsToMark: Interaction[];\n markedAnswers: MarkedAnswerHash;\n onClickSubmit: () => void;\n showSubmitButtonSpinner: boolean;\n isDemo?: boolean;\n}\n\nexport function StudentResponseListHeader(props: StudentResponseListHeaderProps): JSX.Element {\n const numMarkedAnswers = Object.keys(props.markedAnswers).length;\n\n return (\n <div className='d-flex justify-content-between pb-3'>\n <div className='d-flex'>\n {!!props.summary.unanswered &&\n <div className='bg-light rounded p-2 me-2'>\n <strong className='me-2'>{getPhrase('unanswered')}</strong>\n {props.summary.unanswered}\n </div>\n }\n <div className='bg-light rounded p-2 me-2'>\n <strong className='me-2'>{getPhrase('score')}</strong>\n {props.summary.awaitingMarking\n ? <em>{getPhrase('pending')}</em>\n : `${Math.round(props.summary.percentCorrect * 100)}%`\n }\n </div>\n </div>\n {!!props.interactionsToMark.length && (\n <>\n {props.isDemo ? (\n <Tooltip id='submitAnswers' title={getPhrase('demoOnly')} spanHack>\n <button\n className='btn btn-outline-dark pointer-events-none'\n disabled={!numMarkedAnswers}\n >\n {getPhrase('submitAnswers')}\n </button>\n </Tooltip>\n ) : (\n <SpinnerButton\n variant='outline-dark'\n onClick={props.onClickSubmit}\n disabled={!numMarkedAnswers}\n showSpinner={props.showSubmitButtonSpinner}\n >\n {getPhrase('submitAnswers')}\n </SpinnerButton>\n )}\n </>\n )}\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"awaitingMarking\":\"MvGb5\"};","import React from 'react';\n\nimport { InteractionResponseItem } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/InteractionResponseItem';\nimport { AnonSessions } from 'libs/shared/apps/analytics/hooks/UseAnonSessions';\nimport { MarkedAnswerHash } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { anonymiseUserName, getUserOrAnonSession } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { getMarkedStatus, getStudentResultsSummary } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { InteractionResponse } from 'libs/shared/components/interaction-response/InteractionResponse';\nimport { InteractionLabel } from 'libs/shared/components/interactive-questions/InteractionLabel';\nimport { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interaction, Interactive, StudentAnswer, StudentResults } from 'libs/shared/interfaces';\nimport { InteractiveCorrectnessHelper } from 'libs/shared/utils/InteractiveCorrectnessHelper';\nimport { getInteractions, getStudentResult } from 'libs/shared/utils/InteractiveHelper';\n\nimport { StudentResponseListFooter } from './StudentResponseListFooter';\nimport { StudentResponseListHeader } from './StudentResponseListHeader';\n\nimport styles from './student-response-list.scss';\n\nfunction getInteractionsToMark(\n interactions: Interaction[],\n studentResults: StudentResults\n): Interaction[] {\n return interactions.filter(i => {\n return InteractiveCorrectnessHelper.isInteractionCorrect(\n i,\n getStudentResult(studentResults)\n ) === InteractionCorrectness.AwaitingMarking;\n });\n}\n\n// eslint-disable-next-line rulesdir/require-view-title\nfunction useScrollSelectedInteractionIntoView(): React.MutableRefObject<HTMLLIElement> {\n const ref = React.useRef<HTMLLIElement>(null);\n const [ scrolled, setScrolled ] = React.useState(false);\n\n // Only scroll once\n React.useEffect(() => {\n if (!ref.current || scrolled)\n return;\n\n setScrolled(true);\n requestAnimationFrame(() => ref.current.scrollIntoView({ behavior: 'smooth', block: 'center' }));\n }, [ ref.current, scrolled ]);\n\n return ref;\n}\n\ninterface StudentResponseListProps {\n interactive: Interactive;\n markedAnswers: MarkedAnswerHash;\n studentResults: StudentResults;\n addMarkedAnswers: (answer: StudentAnswer[], status: InteractiveAnswerStatus) => void;\n submitMarkedAnswers: () => void;\n onClickClose: () => void;\n imageCdnUrl: string;\n selectedInteractionId?: string;\n anonymiseUsers: boolean;\n reportsStyling?: boolean;\n isDemo?: boolean;\n anonSessions?: AnonSessions;\n}\n\nexport function StudentResponseList(props: StudentResponseListProps): JSX.Element {\n const [ showSpinner, setShowSpinner ] = React.useState(false);\n const selectedInteractionRef = useScrollSelectedInteractionIntoView();\n\n const summary = getStudentResultsSummary(props.interactive, props.studentResults);\n const interactions = getInteractions(props.interactive);\n const questionsToMark = getInteractionsToMark(interactions, props.studentResults);\n\n function onClickSubmit(): void {\n setShowSpinner(true);\n props.submitMarkedAnswers();\n }\n\n return (\n <>\n <StudentResponseListHeader\n summary={summary}\n interactionsToMark={questionsToMark}\n markedAnswers={props.markedAnswers}\n onClickSubmit={onClickSubmit}\n showSubmitButtonSpinner={showSpinner}\n isDemo={props.isDemo}\n />\n <ul className='list-unstyled'>\n {interactions.map((interaction, idx) => {\n const isSelected = interaction.id.toString() === props.selectedInteractionId?.toString();\n const markingRequired = questionsToMark.some(q => q.id === interaction.id);\n const anonymisedUserName = anonymiseUserName(\n getUserOrAnonSession(props.studentResults, props.anonSessions),\n props.anonymiseUsers\n );\n\n let className = 'p-2 mb-3 rounded';\n\n if (isSelected)\n className += ' border-2 border-info shadow';\n\n if (markingRequired)\n className += ` ${styles.awaitingMarking}`;\n else\n className += ' border';\n\n return (\n <li key={idx} className={className} ref={isSelected ? selectedInteractionRef : null}>\n <div className='d-flex mb-2'>\n <InteractionLabel\n interaction={interaction}\n iconClassName='flex-shrink-0'\n />\n </div>\n {props.reportsStyling ? (\n <InteractionResponse\n interaction={interaction}\n studentResults={props.studentResults}\n markedStatus={getMarkedStatus(interaction.id, props.studentResults, props.markedAnswers)}\n markInteraction={props.addMarkedAnswers}\n imageCdnUrl={props.imageCdnUrl}\n anonymisedUserName={anonymisedUserName}\n className='bg-light ps-2'\n showFeedback\n reportsStyling\n responseComponentClass='mx-n2'\n />\n ) : (\n <InteractionResponseItem\n interaction={interaction}\n studentResults={props.studentResults}\n markedStatus={getMarkedStatus(interaction.id, props.studentResults, props.markedAnswers)}\n markInteraction={props.addMarkedAnswers}\n imageCdnUrl={props.imageCdnUrl}\n anonymisedUserName={anonymisedUserName}\n showFeedback\n />\n )}\n </li>\n );\n })}\n </ul>\n <StudentResponseListFooter\n interactionsToMark={questionsToMark}\n markedAnswers={props.markedAnswers}\n onClickSubmit={onClickSubmit}\n onClickClose={props.onClickClose}\n showSubmitButtonSpinner={showSpinner}\n isDemo={props.isDemo}\n />\n </>\n );\n}","export interface ScoreThresholds {\n HIGH: number;\n MODERATE: number;\n}\n\nexport const ScoreThresholdDefaults: ScoreThresholds = {\n HIGH: 0.75,\n MODERATE: 0.5\n};\n\nexport const ScoreThresholdInsights: ScoreThresholds = {\n HIGH: 0.7,\n MODERATE: 0.7\n};","import { BaseError } from 'libs/common/backbone/core/BaseError';\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Core } from 'libs/common/core';\n\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { PrivateResourceError } from 'libs/shared/errors/general/private-resource/PrivateResourceError';\nimport { RegionLockedResourceError } from 'libs/shared/errors/general/region-locked-resource/RegionLockedResourceError';\nimport { UnspecifiedError } from 'libs/shared/errors/general/unspecified-error/UnspecifiedError';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nexport interface HttpErrorMap {\n notFound?: new () => BaseError;\n forbidden?: {\n rating?: new (description: string) => BaseError;\n yearLevel?: new (description: string) => BaseError;\n region?: new () => BaseError;\n privacy?: new (video?: VideoTypes) => BaseError;\n };\n badRequest?: new () => BaseError;\n internalServerError?: new () => BaseError;\n}\n\nexport type IgnoreHttpErrorMap = {\n [key in keyof HttpErrorMap]: boolean;\n};\n\nconst defaultErrors: HttpErrorMap = {\n notFound: NotFoundError,\n forbidden: {\n rating: PrivateResourceError,\n yearLevel: PrivateResourceError,\n region: RegionLockedResourceError,\n privacy: PrivateResourceError\n },\n badRequest: UnspecifiedError,\n internalServerError: UnspecifiedError\n};\n\nexport function handleHttpError(\n info: HttpStatus | Xhr,\n customErrorMap: HttpErrorMap = {},\n /**\n * Prevent certain errors in the errorMap from being thrown\n * so that you may implement your own handler\n */\n ignoreMap: IgnoreHttpErrorMap = {}\n): void {\n if (!info)\n return;\n\n let statusCode: HttpStatus;\n\n if (typeof(info) === 'number') {\n statusCode = info;\n } else {\n statusCode = info.status;\n }\n\n const errorMap = {\n ...defaultErrors,\n ...customErrorMap\n };\n\n if (!statusCode)\n return;\n\n if (!Core.ErrorHelper.isStatusCodeError(statusCode))\n return;\n\n if (statusCode === HttpStatus.InternalServer) {\n if (!ignoreMap.internalServerError)\n Core.ErrorHelper.throw(new UnspecifiedError());\n return;\n }\n\n if (statusCode === HttpStatus.NotFound) {\n if (!ignoreMap.notFound)\n Core.ErrorHelper.throw(new errorMap.notFound());\n return;\n }\n\n if (statusCode === HttpStatus.Forbidden) {\n /**\n * TODO: Work out how to go about handling all forbidden errors, such as region locking, year levels,\n * ratings, and privacy.\n */\n if (!ignoreMap.forbidden)\n Core.ErrorHelper.throw(new errorMap.forbidden.privacy());\n return;\n }\n\n if (!ignoreMap.badRequest)\n Core.ErrorHelper.throw(new errorMap.badRequest());\n}\n\nexport function handleXhrError(xhr: Xhr, customErrorMap?: HttpErrorMap): void {\n handleHttpError(xhr.status, customErrorMap);\n}","import { Flight } from 'libs/common/react/index';\n\nexport const InsightsDemoRequests = {\n interactive(): Flight.Request {\n return {\n url: `/mocks/insights/interactive.json`,\n key: `demo:interactive`,\n normalize: false\n };\n },\n\n interactiveMetadata(): Flight.Request {\n return {\n url: `/mocks/insights/interactive-metadata.json`,\n key: `demo:interactive:metadata`,\n normalize: false\n };\n },\n\n interactiveResults(): Flight.Request {\n return {\n url: `/mocks/insights/interactive-results.json`,\n key: `demo:interactive:results`,\n normalize: false\n };\n },\n\n videoViews(): Flight.Request {\n return {\n url: `/mocks/insights/video-views.json`,\n key: `demo:video:views`,\n normalize: false\n };\n },\n\n users(): Flight.Request {\n return {\n url: `/mocks/insights/users.json`,\n key: `demo:users`,\n normalize: false\n };\n },\n\n individualHeatmap(): Flight.Request {\n return {\n url: `/mocks/insights/individual-heatmap.json`,\n key: `demo:individual:heatmap`,\n normalize: false\n };\n },\n\n aggregateHeatmap(): Flight.Request {\n return {\n url: `/mocks/insights/aggregate-heatmap.json`,\n key: `demo:aggregate:heatmap`,\n normalize: false\n };\n }\n};","import { useEffect } from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { handleHttpError, HttpErrorMap, IgnoreHttpErrorMap } from 'libs/shared/errors/handlers/HttpErrorHandlers';\n\nfunction generateCacheKey(flightObjs: Array<Flight.Response<any>>): string {\n return flightObjs.map(obj => obj.statusCode).join(':');\n}\n\n// TODO: Change this to just `useHandleHttpError` and only accept a status code.\nexport function useHandleObjectError(\n _flightObjs: Flight.Response<any> | Array<Flight.Response<any>>,\n customErrors?: HttpErrorMap,\n ignoreErrors?: IgnoreHttpErrorMap\n): void {\n const flightObjs = Array.isArray(_flightObjs) ? _flightObjs : [_flightObjs];\n\n useEffect(() => {\n flightObjs.forEach(obj => {\n handleHttpError(obj.statusCode, customErrors, ignoreErrors);\n });\n }, [ generateCacheKey(flightObjs), customErrors, ignoreErrors ]);\n}","import { AnalyticsRequestFilter } from 'libs/shared/interfaces';\n\nexport function getAnalyticsRequestKey(baseKey: string, filter: AnalyticsRequestFilter, sharerId?: string): string {\n let key = `${baseKey}:${filter.start}:${filter.end}`;\n\n const userIdKey = Array.isArray(filter.userId) ? filter.userId.sort().join(':') : filter.userId;\n const groupIdKey = Array.isArray(filter.groupId) ? filter.groupId.sort().join(':') : filter.groupId;\n\n if (userIdKey)\n key += `:${userIdKey}`;\n\n if (groupIdKey)\n key += `:${groupIdKey}`;\n\n if (sharerId)\n key += `:${sharerId}`;\n\n return key;\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\n\nimport { useAnonSessions } from 'libs/shared/apps/analytics/hooks/UseAnonSessions';\nimport { useMarkAnswers } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { anonymiseUserName, getUserOrAnonSession } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { StudentResponseList } from 'libs/shared/apps/student-response-list/StudentResponseList';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { InsightsDemoRequests } from 'libs/shared/flight-requests/InsightsDemoRequests';\nimport { useCannotConsumeError } from 'libs/shared/hooks/useCannotConsumeError';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { useLockContentWidth } from 'libs/shared/hooks/useLockContentWidth';\nimport { Config, Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { PopupViewProps } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.interactiveStudentResults';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InteractiveStudentResultsViewProps extends PopupViewProps {\n userId: string;\n interactiveId: string;\n interactionId?: string;\n reportsStyling?: boolean;\n sessionId?: string;\n shareId?: string;\n}\n\nexport function InteractiveStudentResultsDemoView(props: InteractiveStudentResultsViewProps): JSX.Element {\n const [anonymiseUsers] = useViewModel<boolean>(SharedViewModelKeys.ANONYMISE_USERS);\n\n useLockContentWidth();\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(\n InsightsDemoRequests.interactiveMetadata()\n );\n const interactive = Flight.useBasicFetch<Interactive>(InsightsDemoRequests.interactive());\n\n const results = Flight.useBasicFetch<InteractiveResultSet>(InsightsDemoRequests.interactiveResults());\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const anonSessions = useAnonSessions(props.shareId);\n\n useHandleObjectError([ interactiveMetadata, results ]);\n useCannotConsumeError(interactiveMetadata);\n\n const { markedAnswers, addMarkedAnswers, submitMarkedAnswers } = useMarkAnswers(\n interactive.data?.id,\n interactiveMetadata.data?.id,\n props.closePopup\n );\n\n const studentResults = results.data?.students.find(s => {\n if (props.userId)\n return s.user?.id?.toString() === props.userId?.toString();\n\n if (props.sessionId)\n return s.sessionId?.toString() === props.sessionId?.toString();\n\n return false;\n });\n\n const popupTitle = studentResults\n ? getPhrase('heading', { studentName: anonymiseUserName(getUserOrAnonSession(studentResults, anonSessions), anonymiseUsers) })\n : '';\n const dataLoaded = !!interactive.data && !!results.data && !!config.data;\n\n return (\n <Popup\n title={popupTitle}\n showLoadingSpinner={!dataLoaded}\n closePopup={props.closePopup}\n size='lg'\n >\n {dataLoaded &&\n <StudentResponseList\n interactive={interactive.data}\n studentResults={studentResults}\n markedAnswers={markedAnswers}\n addMarkedAnswers={addMarkedAnswers}\n submitMarkedAnswers={submitMarkedAnswers}\n imageCdnUrl={config.data.imageCdnUrl}\n selectedInteractionId={props.interactionId}\n onClickClose={props.closePopup}\n anonymiseUsers={anonymiseUsers}\n reportsStyling={props.reportsStyling}\n isDemo\n />\n }\n </Popup>\n );\n}"],"names":["DEFAULT_POLLING_INTERVAL","usePolling","callback","pollingInterval","pollingTrigger","setPollingTrigger","timeoutRef","t","current","window","setTimeout","clearTimeout","useAnonSessions","shareId","fetch","anonSessionsRequest","anonSessionsResponse","data","length","reduce","prev","sessionId","getPhrase","anonymiseUserName","user","shouldAnonymise","id","sessionName","seed","Math","floor","Date","getMinutes","dictionaries","separator","style","getAnonSession","anonSessions","fallback","getUserOrAnonSession","result","LanguageService","StudentResponseListFooter","props","numMarkedAnswers","Object","keys","markedAnswers","className","showSubmitButtonSpinner","onClick","onClickClose","interactionsToMark","isDemo","Tooltip","title","spanHack","spanHackClassName","disabled","SpinnerButton","variant","onClickSubmit","showSpinner","StudentResponseListHeader","summary","unanswered","awaitingMarking","round","percentCorrect","StudentResponseList","ref","scrolled","setScrolled","setShowSpinner","selectedInteractionRef","requestAnimationFrame","scrollIntoView","behavior","block","interactive","studentResults","interactions","questionsToMark","filter","i","InteractiveCorrectnessHelper","InteractionCorrectness","getInteractionsToMark","submitMarkedAnswers","map","interaction","idx","isSelected","toString","selectedInteractionId","markingRequired","some","q","anonymisedUserName","anonymiseUsers","key","InteractionLabel","iconClassName","reportsStyling","InteractionResponse","markedStatus","markInteraction","addMarkedAnswers","imageCdnUrl","showFeedback","responseComponentClass","InteractionResponseItem","ScoreThresholdDefaults","HIGH","MODERATE","ScoreThresholdInsights","defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","internalServerError","handleHttpError","info","customErrorMap","ignoreMap","statusCode","status","errorMap","InsightsDemoRequests","url","normalize","interactiveMetadata","interactiveResults","videoViews","users","individualHeatmap","aggregateHeatmap","generateCacheKey","flightObjs","obj","join","useHandleObjectError","_flightObjs","customErrors","ignoreErrors","Array","isArray","useEffect","forEach","getAnalyticsRequestKey","baseKey","sharerId","start","end","userIdKey","userId","sort","groupIdKey","groupId","InteractiveStudentResultsDemoView","results","config","closePopup","students","find","s","popupTitle","studentName","dataLoaded","showLoadingSpinner","size","interactionId"],"sourceRoot":""}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[549],{70376:(e,t,a)=>{a.d(t,{W:()=>s});var n=a(32735),r=a(91967);function i(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,n=Array(t);a<t;a++)n[a]=e[a];return n}var o=5e3;function s(e){var t,a,s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:o,l=(t=n.useState(!1),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,o,s=[],l=!0,c=!1;try{if(i=(a=a.call(e)).next,0===t){if(Object(a)!==a)return;l=!1}else for(;!(l=(n=i.call(a)).done)&&(s.push(n.value),s.length!==t);l=!0);}catch(e){c=!0,r=e}finally{try{if(!l&&null!=a.return&&(o=a.return(),Object(o)!==o))return}finally{if(c)throw r}}return s}}(t,a)||function(e,t){if(e){if("string"==typeof e)return i(e,t);var a={}.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)?i(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.")}()),c=l[0],u=l[1],d=n.useRef(null),m=function(){u((function(e){return!e})),d.current=window.setTimeout(m,s)};return n.useEffect((function(){d.current=window.setTimeout(m,s)}),[]),n.useEffect((function(){r.q.isFunction(e)&&e()}),[c]),function(){return window.clearTimeout(d.current)}}},5255:(e,t,a)=>{a.d(t,{Y:()=>s});var n=a(70376),r=a(20354),i=a(30439);function o(e){return o="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},o(e)}function s(e){var t,a=r.a.useGetFetch(),s=e&&i.o.getAnonSessions(e),l=r.a.useBasicFetch(s);return(0,n.W)((function(){return a(s)}),5e3),(null===(t=l.data)||void 0===t?void 0:t.length)?l.data.reduce((function(e,t){return Object.assign(Object.assign({},e),(a={},n=t.sessionId,r=t,(n=function(e){var t=function(e){if("object"!=o(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var a=t.call(e,"string");if("object"!=o(a))return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==o(t)?t:t+""}(n))in a?Object.defineProperty(a,n,{value:r,enumerable:!0,configurable:!0,writable:!0}):a[n]=r,a));var a,n,r}),{}):{}}},94644:(e,t,a)=>{a.d(t,{r:()=>u});var n=a(50242),r=a(81886),i=a(67058),o=a(14553),s=a(49267),l=a(49075),c={notFound:i.d,forbidden:{rating:o.q,yearLevel:o.q,region:s.a,privacy:o.q},badRequest:l._,internalServerError:l._};function u(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 i;i="number"==typeof e?e:e.status;var o=Object.assign(Object.assign({},c),t);i&&r.Q.Ry.isStatusCodeError(i)&&(i!==n.o.InternalServer?i!==n.o.NotFound?i!==n.o.Forbidden?a.badRequest||r.Q.Ry.throw(new o.badRequest):a.forbidden||r.Q.Ry.throw(new o.forbidden.privacy):a.notFound||r.Q.Ry.throw(new o.notFound):a.internalServerError||r.Q.Ry.throw(new l._))}}},17913:(e,t,a)=>{a.d(t,{u:()=>o});var n=a(97395),r=a(110),i=a(62875),o={individualEngagement:function(e,t,a,r){var o=Object.assign({objectId:e},t);return a&&(o.sharerId=a),r&&(o.includeAnonViews=!0),{url:n._.urlBuilder("{gateway}/v1/analytics/heat-map",o),key:(0,i.H)("engagement:".concat(e,":").concat(r),t,a),formatData:function(e){var t;return Object.assign(Object.assign({},e),{data:null===(t=e.data)||void 0===t?void 0:t.map((function(e){var t;return Object.assign(Object.assign({},e),{heatMap:null!==(t=e.heatMap)&&void 0!==t?t:[]})}))})},normalize:!1}},aggregateEngagement:function(e,t,a,r){var o=Object.assign({objectId:e},t);return a&&(o.sharerId=a),r&&(o.includeAnonViews=!0),{url:n._.urlBuilder("{gateway}/v1/analytics/heat-map/aggregations",o),key:(0,i.H)("aggregate:engagement:".concat(e,":").concat(r),t,a),formatData:function(e){var t;return Object.assign(Object.assign({},e),{heatMap:null!==(t=e.heatMap)&&void 0!==t?t:[]})},normalize:!1}},views:function(e,t,a,o){var s=Object.assign(Object.assign({},e),{timeOffset:r.O.getTimezoneOffset()});return t&&(s.objectId=t),a&&(s.sharerId=a),o&&(s.includeAnonViews=!0),{url:n._.urlBuilder("{gateway}/v1/analytics/video-views",s),key:(0,i.H)("video:views:".concat(t,":").concat(o),e,a),normalize:!1}}}},39902:(e,t,a)=>{a.d(t,{F:()=>v,f:()=>m});var n=a(32735),r=a(20354),i=a(75896);function o(e){return function(e){if(Array.isArray(e))return l(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||s(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function s(e,t){if(e){if("string"==typeof e)return l(e,t);var a={}.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)?l(e,t):void 0}}function l(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,n=Array(t);a<t;a++)n[a]=e[a];return n}function c(e){return c="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},c(e)}function u(e,t,a){return(t=function(e){var t=function(e){if("object"!=c(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var a=t.call(e,"string");if("object"!=c(a))return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==c(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}var d=50;function m(e,t){var a=i.m.chunk(e,d).map((function(e){return t(i.m.uniq(e))})),n=r.a.useBasicFetchAll(a),o=i.m.flatten(n.data),s=n.data.length?o.reduce((function(e,t){return Object.assign(Object.assign({},e),u({},t.id,t))}),{}):null;return{itemsArr:o,items:s,isFetching:n.isFetching}}function v(e,t,a){var l,m,v,f,g=a||function(e){return"object"===c(e)?e.id:e},h=n.useRef(new Set),p=(v=n.useState([]),f=2,function(e){if(Array.isArray(e))return e}(v)||function(e,t){var a=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var n,r,i,o,s=[],l=!0,c=!1;try{if(i=(a=a.call(e)).next,0===t){if(Object(a)!==a)return;l=!1}else for(;!(l=(n=i.call(a)).done)&&(s.push(n.value),s.length!==t);l=!0);}catch(e){c=!0,r=e}finally{try{if(!l&&null!=a.return&&(o=a.return(),Object(o)!==o))return}finally{if(c)throw r}}return s}}(v,f)||s(v,f)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),y=p[0],b=p[1];n.useEffect((function(){if(null==e?void 0:e.length){var a=[];e.forEach((function(e){var t=g(e);h.current.has(t)||(a.push(e),h.current.add(t))})),a.length&&b((function(e){return[].concat(o(e),o(i.m.chunk(a,d).map(t)))}))}}),[null==e?void 0:e.length]);var E=r.a.useBasicFetchAll(y),w=i.m.flatten(E.data),I=E.data.length?w.reduce((function(e,t){return Object.assign(Object.assign({},e),u({},g(t),t))}),{}):null;return{hasFirstRequestCompleted:!!(null===(m=null===(l=E.responses)||void 0===l?void 0:l[0])||void 0===m?void 0:m.hasCompleted),itemsArr:w,items:I,isFetching:E.isFetching}}},91286:(e,t,a)=>{a.d(t,{v:()=>o});var n=a(32735),r=a(94644);function i(e){return e.map((function(e){return e.statusCode})).join(":")}function o(e,t,a){var o=Array.isArray(e)?e:[e];(0,n.useEffect)((function(){o.forEach((function(e){(0,r.r)(e.statusCode,t,a)}))}),[i(o),t,a])}},50782:(e,t,a)=>{a.d(t,{R:()=>I});var n=a(32735),r=a(82602),i=a(20354),o=a(74901),s=a(40003),l=a(30439),c=a(65853),u=a(64249),d=a(91693),m=a(83345),v=a(39151),f=a(1666),g=a(31949),h=a(17913),p=a(37802),y=a(35223),b=a(86099),E=a(24758),w="insights.shareInfo";function I(e){var t,a,I,A,S,j=i.a.useBasicFetch(v.L.config()),O=(0,p.r)(null).publicInteractiveAttempts,N=Object.assign(Object.assign({},(0,s.wO)((0,s.Hb)(),e.dateRangeAppLinkParams)),(0,o.K)(e.audienceAppLinkParams)),k=i.a.useBasicFetch(g.N.currentUser()),F=i.a.useBasicFetch(e.video&&l.o.getShareLinkByObjectId(e.video.id)),C=i.a.useBasicFetch(e.video&&l.o.getSentDirectShareByObjectId(e.video.id)),U=i.a.useBasicFetch((null===(t=k.data)||void 0===t?void 0:t.customerId)&&u.I.getDirectShareRecipientsRequest(k.data.customerId,C.data)),L=i.a.useBasicFetch(k.data&&e.video&&h.u.views(N,e.video.id,k.data.id,O)),R=i.a.useBasicFetch(e.video&&l.o.getPrivacy(e.video.id)),B=i.a.useBasicFetch((null===(a=k.data)||void 0===a?void 0:a.isAuthenticated)&&f.h.yearGroups(k.data.customerId)),T=F.hasCompleted&&!F.data&&C.hasCompleted&&!C.data,P=F.hasCompleted&&F.data||C.hasCompleted&&C.data&&(!F.data||R.data)&&(!F.data||B.data)&&U.data&&L.data,x=F.data&&R.data&&B.data&&c.R.getIconAndText({entity:e.video,entityTypeId:e.video.typeId,hasStudentExp:!1,isPasswordProtected:F.data.isPasswordProtected,linkExpireDate:F.data.linkExpireDate,privacy:R.data,status:F.data.status,yearGroups:B.data}),V=n.useMemo((function(){var e;return null===(e=L.data)||void 0===e?void 0:e.data.reduce((function(e,t){return t.count+e}),0)}),[L.data]),M=(null===(I=C.data)||void 0===I?void 0:I.dateCreated)||(null===(A=F.data)||void 0===A?void 0:A.dateCreated);return n.createElement("div",{className:"mb-4"},P&&n.createElement(n.Fragment,null,n.createElement("h2",{className:"h4"},n.createElement(m.x,{namespace:w,phrase:"shareInfo"})),n.createElement("div",{className:"d-flex border p-3 rounded-3 align-items-center justify-content-between"},n.createElement("div",{className:"d-flex align-items-center gap-2"},n.createElement(E.A,{shareRecipients:U.data,imageCdnUrl:null===(S=j.data)||void 0===S?void 0:S.imageCdnUrl,hasShareLink:!!F.data,maxAvatars:4,shareLinkText:null==x?void 0:x.text}),"·",n.createElement("p",{className:"mb-0"},(0,r.WU)(M)),!!V&&n.createElement(n.Fragment,null,"·",n.createElement("p",{className:"mb-0"},n.createElement(m.x,{namespace:w,phrase:"views",options:{smartCount:V}})))),n.createElement(d.h,{appLink:(0,b.YK)(e.video),svgName:y.vn.Share,className:"btn btn-outline-dark"},n.createElement(m.x,{namespace:w,phrase:"share"})))),!T&&!P&&n.createElement(n.Fragment,null,n.createElement("div",{className:"h4 partial-loading-background w-25"}," "),n.createElement("div",{className:"p-3 rounded partial-loading-background"},n.createElement("p",{className:"mb-1"}," "))))}},96049:(e,t,a)=>{a.r(t),a.d(t,{VideoInsightsOverviewView:()=>X});var n=a(32735),r=a(23481),i=a(2948),o=a(20354),s=a(75896),l=a(51870),c=a(50916),u=a(84621),d=a(98551),m=a(35223),v=r.T.encloseNamespace("shared.insightStudentsNotWatched");function f(e){var t,a=(null===(t=e.students)||void 0===t?void 0:t.filter((function(t){var a;return!(null===(a=e.watchedIds)||void 0===a?void 0:a.includes(t.id))})))||[];return n.createElement(u.L,{title:v("title"),svgName:m.vn.Puzzle,svgClassName:"bg-light-teal text-teal"},n.createElement(d.y,{students:a,imageCdnUrl:e.imageCdnUrl,imageUrl:e.imageUrl,description:v("studentsDisplay"),anonymiseUsers:e.anonymiseUsers}))}var g=r.T.encloseNamespace("shared.insightStudentsWatched");function h(e){return n.createElement(u.L,{title:g("title"),svgName:m.vn.Flag,svgClassName:"bg-light-indigo text-indigo",count:e.students.length},n.createElement(d.y,{students:e.students,imageCdnUrl:e.imageCdnUrl,imageUrl:e.imageUrl,description:g("studentsDisplay"),appLink:e.heatmapAppLink,appLinkText:g("viewAll"),anonymiseUsers:e.anonymiseUsers}))}var p=a(5255),y=a(26025),b=a(26136),E=a(74901),w=a(40003),I=a(30439),A=a(83345),S=a(38143),j=a(4594),O=a(16714),N=a(39151),k=a(31949),F=a(17913),C=a(39902),U=a(91286),L=a(93322),R=a(22902),B=a(79612),T=a(37802),P=a(31908),x=a(99742),V=a(88630),M=a(53936),_=a(53214),q=a(10447),D=a(50782);const H={partialInsights:"qm6HY"};function W(){return n.createElement("div",null,n.createElement("h2",{className:"h4 w-25 partial-loading-background"}," "),n.createElement("div",{className:"row g-3 mb-5"},n.createElement("div",{className:"col-12"},n.createElement("div",{className:"".concat(H.partialInsights," rounded partial-loading-background")}))),n.createElement("h2",{className:"h4 w-25 partial-loading-background"}," "),n.createElement("div",{className:"row g-3 mb-5"},n.createElement("div",{className:"col-6"},n.createElement("div",{className:"".concat(H.partialInsights," rounded partial-loading-background")})),n.createElement("div",{className:"col-6"},n.createElement("div",{className:"".concat(H.partialInsights," rounded partial-loading-background")}))))}var z=a(14070),G=a(97291);function Q(e){return function(e){if(Array.isArray(e))return $(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||Y(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Y(e,t){if(e){if("string"==typeof e)return $(e,t);var a={}.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)?$(e,t):void 0}}function $(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,n=Array(t);a<t;a++)n[a]=e[a];return n}var K="insights.videoInsightsOverview",J=r.T.encloseNamespace(K);function X(e){var t,a,r,u,d,m,v,g,H=(v=(0,i.D)(S.g.ANONYMISE_USERS),g=1,function(e){if(Array.isArray(e))return e}(v)||function(e,t){var a=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var n,r,i,o,s=[],l=!0,c=!1;try{if(i=(a=a.call(e)).next,0===t){if(Object(a)!==a)return;l=!1}else for(;!(l=(n=i.call(a)).done)&&(s.push(n.value),s.length!==t);l=!0);}catch(e){c=!0,r=e}finally{try{if(!l&&null!=a.return&&(o=a.return(),Object(o)!==o))return}finally{if(c)throw r}}return s}}(v,g)||Y(v,g)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[0];(0,L.F)();var $=(0,T.r)(null),X=$.hasClassrooms,Z=$.hasShareFlowV2,ee=(0,R.T)().hasPermissions,te=(0,T.r)(null).publicInteractiveAttempts,ae=o.a.useBasicFetch(k.N.currentUser()),ne=o.a.useBasicFetch(N.L.config()),re=P.M.getVideoRequest(e.videoId,e.typeId),ie=o.a.useBasicFetch(re),oe=y.B.getAudienceAppLinkParams(),se=y.B.getDateRangeAppLinkParams(),le=Object.assign(Object.assign({},(0,w.wO)((0,w.Hb)(),se)),(0,E.K)(oe));(0,B.M)({title:ie.data?J("pageTitle",{video:null===(t=ie.data)||void 0===t?void 0:t.name}):null}),(0,U.v)(ie);var ce=o.a.useBasicFetch(ae.data&&F.u.aggregateEngagement(e.videoId,le,ae.data.id,te)),ue=1===(null===(a=oe.classrooms)||void 0===a?void 0:a.length)&&!(null===(r=oe.classroomGroups)||void 0===r?void 0:r.length),de=o.a.useBasicFetch(ue&&V.F.getClassroomStudents(s.m.first(oe.classrooms))),me=(0,C.f)((null===(u=ce.data)||void 0===u?void 0:u.userIds)||[],(function(e){return I.o.getRecipientsById(e,ae.data.customerId)})),ve=o.a.useBasicFetch(ae.data&&F.u.views(le,e.videoId,ae.data.id,te)),fe=(0,p.Y)(e.shareId),ge=!!e.shareId;function he(){var e,t,a,n,r;if(!(null===(e=ce.data)||void 0===e?void 0:e.userIds)&&!(null===(t=ce.data)||void 0===t?void 0:t.sessionIds))return[];var i=null!==(a=me.itemsArr)&&void 0!==a?a:[],o=(null===(r=null===(n=ce.data)||void 0===n?void 0:n.sessionIds)||void 0===r?void 0:r.map((function(e){return(0,b.jP)(e,fe)})))||[];return[].concat(Q(i),Q(o))}var pe=ae.data&&ne.data&&ie.data&&ce.data&&(!ue||de.data),ye=Object.assign(Object.assign(Object.assign({},oe),se),{shareId:e.shareId}),be=function(e,t,a){return{heatmapAppLink:{application:G.O.INSIGHTS,action:t===j.E.Clip?z.e.Insights.CLIP_HEATMAP:z.e.Insights.VIDEO_HEATMAP,args:[e],params:a}}}(e.videoId,e.typeId,ye);return n.createElement("div",{className:"px-3"},n.createElement(M.j,{video:ie.data,dateRangeAppLinkParams:se,tabs:function(){var e,t,a;return(null===(e=ie.data)||void 0===e?void 0:e.typeId)===j.E.Clip?(0,q.$o)(null===(t=ie.data)||void 0===t?void 0:t.id,"insights",ye):(0,q.$6)(null===(a=ie.data)||void 0===a?void 0:a.id,"insights",ye)}(),hasAnalytics:ee(O.C.ViewCustomerAnalytics),analyticsWebUrl:null===(d=ne.data)||void 0===d?void 0:d.analyticsWebUrl,hasShareFlowV2:Z,shareId:e.shareId}),n.createElement(D.R,{audienceAppLinkParams:oe,dateRangeAppLinkParams:se,video:ie.data}),!pe&&n.createElement(W,null),pe&&n.createElement(_.u,{video:ie.data,hasShared:ge,hasShareFlowV2:Z,shareId:e.shareId},n.createElement("section",{className:"mb-5"},n.createElement("h2",{className:"h4"},n.createElement(A.x,{namespace:K,phrase:"studentViewing"}),n.createElement("span",null,": ",he().length,de.data?"/".concat(de.data.data.length):"")),n.createElement("div",{className:"row g-3"},ue&&n.createElement("div",{className:"col-12 col-md"},n.createElement(f,{students:de.data.data,watchedIds:ce.data.userIds,imageCdnUrl:ne.data.imageCdnUrl,heatmapAppLink:be.heatmapAppLink,imageUrl:x.W.Insights.AVATAR,anonymiseUsers:H})),n.createElement("div",{className:"col-12 col-md"},n.createElement(h,{students:he(),imageCdnUrl:ne.data.imageCdnUrl,heatmapAppLink:be.heatmapAppLink,imageUrl:x.W.Insights.AVATAR,anonymiseUsers:H})))),n.createElement("section",{className:"mb-5"},n.createElement("h2",{className:"h4"},n.createElement(A.x,{namespace:K,phrase:X?"classEngagement":"engagement"})),n.createElement("div",{className:"row g-3"},n.createElement("div",{className:"col-12 col-md-6"},n.createElement(l.i,{osCount:null===(m=ve.data)||void 0===m?void 0:m.osCount})),n.createElement("div",{className:"col-12 col-md-6"},n.createElement(c.b,{engagement:ce.data,heatmapAppLink:be.heatmapAppLink}))))))}}}]);
|
|
2
|
+
//# sourceMappingURL=549-2d591052e3-lite.chunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scripts/549-2d591052e3-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/common/src/react/hooks/UsePolling.ts","file:///app/packages/libs/shared/src/apps/analytics/hooks/UseAnonSessions.ts","file:///app/packages/libs/shared/src/errors/handlers/HttpErrorHandlers.ts","file:///app/packages/libs/shared/src/flight-requests/VideoViewRequests.ts","file:///app/packages/libs/shared/src/hooks/UseBatchFetch.ts","file:///app/packages/libs/shared/src/hooks/UseHandleObjectError.ts","file:///app/packages/projects/lite/src/apps/my-shares/views/share-info/ShareInfoView.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/students-not-watched/InsightStudentsNotWatched.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/students-watched/InsightStudentsWatched.tsx","file:///app/packages/projects/lite/src/apps/my-shares/views/video/overview/partial-loading/partial-video-insights-overview.scss","file:///app/packages/projects/lite/src/apps/my-shares/views/video/overview/partial-loading/PartialVideoInsightsOverview.tsx","file:///app/packages/projects/lite/src/apps/my-shares/views/video/overview/VideoInsightsOverviewView.tsx","file:///app/packages/projects/lite/src/apps/my-shares/views/video/overview/VideoInsightsOverviewUtils.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nconst DEFAULT_POLLING_INTERVAL = 5000; // 5 seconds.\n\n/**\n * Hook to fire a callback at a set interval.\n * @param callback \n * @param pollingInterval \n * \n * Returns a function to clear the timeout.\n */\nexport function usePolling(callback: () => void, pollingInterval: number = DEFAULT_POLLING_INTERVAL): () => void {\n const [ pollingTrigger, setPollingTrigger ] = React.useState(false);\n\n const timeoutRef = React.useRef<number>(null);\n\n const poll = () => {\n setPollingTrigger(t => !t);\n\n timeoutRef.current = window.setTimeout(poll, pollingInterval);\n };\n\n React.useEffect(() => {\n timeoutRef.current = window.setTimeout(poll, pollingInterval);\n }, []);\n\n React.useEffect(() => {\n if (FunctionHelper.isFunction(callback))\n callback();\n }, [pollingTrigger]);\n\n return () => window.clearTimeout(timeoutRef.current);\n}","import { usePolling } from 'libs/common/react/hooks/UsePolling';\nimport { Flight } from 'libs/common/react/index';\n\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\n\nexport interface AnonSession {\n sessionId: string;\n sessionName: string;\n}\n\nexport interface AnonSessions extends Record<string, AnonSession> {}\n\nexport function useAnonSessions(shareId: string): AnonSessions {\n const fetch = Flight.useGetFetch();\n const anonSessionsRequest = shareId && ShareRequests.getAnonSessions(shareId);\n const anonSessionsResponse = Flight.useBasicFetch<AnonSession[]>(anonSessionsRequest);\n\n usePolling(() => fetch(anonSessionsRequest), 5000);\n\n if (!anonSessionsResponse.data?.length)\n return {};\n\n return anonSessionsResponse.data.reduce((prev, current) => ({ ...prev, [current.sessionId]: current }), {});\n}","import { BaseError } from 'libs/common/backbone/core/BaseError';\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Core } from 'libs/common/core';\n\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { PrivateResourceError } from 'libs/shared/errors/general/private-resource/PrivateResourceError';\nimport { RegionLockedResourceError } from 'libs/shared/errors/general/region-locked-resource/RegionLockedResourceError';\nimport { UnspecifiedError } from 'libs/shared/errors/general/unspecified-error/UnspecifiedError';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nexport interface HttpErrorMap {\n notFound?: new () => BaseError;\n forbidden?: {\n rating?: new (description: string) => BaseError;\n yearLevel?: new (description: string) => BaseError;\n region?: new () => BaseError;\n privacy?: new (video?: VideoTypes) => BaseError;\n };\n badRequest?: new () => BaseError;\n internalServerError?: new () => BaseError;\n}\n\nexport type IgnoreHttpErrorMap = {\n [key in keyof HttpErrorMap]: boolean;\n};\n\nconst defaultErrors: HttpErrorMap = {\n notFound: NotFoundError,\n forbidden: {\n rating: PrivateResourceError,\n yearLevel: PrivateResourceError,\n region: RegionLockedResourceError,\n privacy: PrivateResourceError\n },\n badRequest: UnspecifiedError,\n internalServerError: UnspecifiedError\n};\n\nexport function handleHttpError(\n info: HttpStatus | Xhr,\n customErrorMap: HttpErrorMap = {},\n /**\n * Prevent certain errors in the errorMap from being thrown\n * so that you may implement your own handler\n */\n ignoreMap: IgnoreHttpErrorMap = {}\n): void {\n if (!info)\n return;\n\n let statusCode: HttpStatus;\n\n if (typeof(info) === 'number') {\n statusCode = info;\n } else {\n statusCode = info.status;\n }\n\n const errorMap = {\n ...defaultErrors,\n ...customErrorMap\n };\n\n if (!statusCode)\n return;\n\n if (!Core.ErrorHelper.isStatusCodeError(statusCode))\n return;\n\n if (statusCode === HttpStatus.InternalServer) {\n if (!ignoreMap.internalServerError)\n Core.ErrorHelper.throw(new UnspecifiedError());\n return;\n }\n\n if (statusCode === HttpStatus.NotFound) {\n if (!ignoreMap.notFound)\n Core.ErrorHelper.throw(new errorMap.notFound());\n return;\n }\n\n if (statusCode === HttpStatus.Forbidden) {\n /**\n * TODO: Work out how to go about handling all forbidden errors, such as region locking, year levels,\n * ratings, and privacy.\n */\n if (!ignoreMap.forbidden)\n Core.ErrorHelper.throw(new errorMap.forbidden.privacy());\n return;\n }\n\n if (!ignoreMap.badRequest)\n Core.ErrorHelper.throw(new errorMap.badRequest());\n}\n\nexport function handleXhrError(xhr: Xhr, customErrorMap?: HttpErrorMap): void {\n handleHttpError(xhr.status, customErrorMap);\n}","import { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { AnalyticsRequestFilter, Engagement } from 'libs/shared/interfaces';\nimport { getAnalyticsRequestKey } from 'libs/shared/utils/AnalyticsRequestUtils';\n\nexport const VideoViewRequests = {\n individualEngagement(\n objectId: string,\n filter: AnalyticsRequestFilter,\n sharerId?: string,\n includeAnonViews?: boolean\n ): Flight.Request {\n const queryParams: HashObject = {\n objectId,\n ...filter\n };\n\n if (sharerId)\n queryParams.sharerId = sharerId;\n\n if (includeAnonViews)\n queryParams.includeAnonViews = true;\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/analytics/heat-map', queryParams),\n key: getAnalyticsRequestKey(`engagement:${objectId}:${includeAnonViews}`, filter, sharerId),\n formatData: (data: any) => {\n return {\n ...data,\n data: data.data?.map((d: any) => ({\n ...d,\n heatMap: d.heatMap ?? []\n }))\n };\n },\n normalize: false\n };\n },\n \n aggregateEngagement(\n objectId: string,\n filter: AnalyticsRequestFilter,\n sharerId?: string,\n includeAnonViews?: boolean\n ): Flight.Request {\n const queryParams: HashObject = {\n objectId,\n ...filter\n };\n\n if (sharerId)\n queryParams.sharerId = sharerId;\n \n if (includeAnonViews)\n queryParams.includeAnonViews = true;\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/analytics/heat-map/aggregations', queryParams),\n key: getAnalyticsRequestKey(`aggregate:engagement:${objectId}:${includeAnonViews}`, filter, sharerId),\n formatData: (data: Engagement) => {\n return {\n ...data,\n heatMap: data.heatMap ?? []\n };\n },\n normalize: false\n };\n },\n \n views(\n filter: AnalyticsRequestFilter,\n objectId?: string,\n sharerId?: string,\n includeAnonViews?: boolean\n ): Flight.Request {\n const queryParams: HashObject = {\n ...filter,\n timeOffset: DateHelper.getTimezoneOffset()\n };\n\n if (objectId)\n queryParams.objectId = objectId;\n\n if (sharerId)\n queryParams.sharerId = sharerId;\n \n if (includeAnonViews)\n queryParams.includeAnonViews = true;\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/analytics/video-views', queryParams),\n key: getAnalyticsRequestKey(`video:views:${objectId}:${includeAnonViews}`, filter, sharerId),\n normalize: false\n };\n }\n};","import React from 'react';\n\nimport { Flight } from 'libs/common/flight';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { BaseObject } from 'libs/shared/interfaces';\n\nconst CHUNK_SIZE = 50;\n\nexport interface UseBatchFetchResult<T extends BaseObject> {\n itemsArr: T[];\n items: { [key: string]: T} | null;\n isFetching: boolean;\n}\n\n/**\n * Used to fetch multiple items by id with Flight. Will fetch 25 items at a time firing off multiple\n * requests if there are more than 25 items.\n * This will return items as null until we have all our items. Items will be returned as an object with\n * their ids as they key for easy mapping\n * \n * @param itemIds \n * @param getRequest \n */\nexport function useBatchFetch<T extends BaseObject>(\n itemIds: string[],\n getRequest: (ids: string[]) => Flight.Request\n): UseBatchFetchResult<T> {\n const chunks = ArrayHelper.chunk<string>(itemIds, CHUNK_SIZE);\n\n const requests = chunks.map(chunk => getRequest(ArrayHelper.uniq(chunk)));\n\n const responses = Flight.useBasicFetchAll<T[]>(requests);\n\n const itemsArr = ArrayHelper.flatten(responses.data);\n const items = responses.data.length\n ? itemsArr.reduce((acc, item) => ({ ...acc, [item.id]: item }), {})\n : null;\n\n return {\n itemsArr,\n items,\n isFetching: responses.isFetching\n };\n}\n\n/**\n * When you need the useBatchFetch() behavior, but your list of objects to hydrate\n * will grow, such as on a scrolling page. useGrowingBatchFetch() will use local state\n * to determine what we've already built a request for and what items are new\n * as to not re-fetch items - Sha\n */\nexport function useGrowingBatchFetch<T>(\n objs: T[],\n getRequest: (items: T[]) => Flight.Request,\n _getKey?: (obj: T) => string\n) {\n const getKey = _getKey || ((obj: any) => {\n if (typeof obj === 'object')\n return obj.id;\n\n return obj;\n });\n\n const fetchedItems = React.useRef<Set<string>>(new Set<string>());\n\n const [ requests, setRequests ] = React.useState<Flight.Request[]>([]);\n\n React.useEffect(() => {\n if (!objs?.length)\n return;\n\n const unfetchedItems: T[] = [];\n \n objs.forEach(obj => {\n const key = getKey(obj);\n\n if (fetchedItems.current.has(key))\n return;\n\n unfetchedItems.push(obj);\n fetchedItems.current.add(key);\n });\n \n if (!unfetchedItems.length)\n return;\n\n setRequests(r => ([ ...r, ...ArrayHelper.chunk<T>(unfetchedItems, CHUNK_SIZE).map(getRequest) ]));\n }, [objs?.length]);\n\n const responses = Flight.useBasicFetchAll<T[]>(requests);\n\n const itemsArr = ArrayHelper.flatten(responses.data);\n const items = responses.data.length\n ? itemsArr.reduce((acc, item) => ({ ...acc, [getKey(item)]: item }), {})\n : null;\n\n return {\n hasFirstRequestCompleted: !!responses.responses?.[0]?.hasCompleted,\n itemsArr,\n items,\n isFetching: responses.isFetching\n };\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';\nimport { format as formatDate } from 'timeago.js';\n\nimport { Flight } from 'libs/common/react/index';\n\nimport { AudienceQueryParams } from 'libs/shared/apps/analytics/interfaces/AudienceQueryParams';\nimport { BaseAnalyticsEventResponse } from 'libs/shared/apps/analytics/interfaces/BaseAnalyticsEvent';\nimport { DateRangeQueryParams } from 'libs/shared/apps/analytics/interfaces/DateRangeQueryParams';\nimport { getAudienceParams } from 'libs/shared/apps/analytics/utils/AudienceUtils';\nimport { getInsightsDateRangePresets, getStartEndParams } from 'libs/shared/apps/analytics/utils/DateRangeUtils';\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { SharePrivacyResponse } from 'libs/shared/apps/share/interfaces/responses/SharePrivacyResponse';\nimport { ShareLinkHelper } from 'libs/shared/apps/share/utils/ShareLinkHelper';\nimport { SharableRecipient, ShareViewHelper } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoViewRequests } from 'libs/shared/flight-requests/VideoViewRequests';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Config, CurrentUser, DirectShare, ShareLink, VideoTypes, YearGroup } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { getShareAppLink } from 'shared/utils/ObjectAppLinkHelper';\n\nimport { SharedToPill } from 'apps/my-shares/components/shared-to-pill/SharedToPill';\n\nconst namespace = 'insights.shareInfo';\n\ninterface ShareInfoViewProps {\n video: VideoTypes;\n audienceAppLinkParams: AudienceQueryParams;\n dateRangeAppLinkParams: DateRangeQueryParams;\n}\n\n// eslint-disable-next-line rulesdir/require-view-title\nexport function ShareInfoView(props: ShareInfoViewProps) {\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const { publicInteractiveAttempts } = useSettings(null);\n\n const requestFilter = {\n ...getStartEndParams(getInsightsDateRangePresets(), props.dateRangeAppLinkParams),\n ...getAudienceParams(props.audienceAppLinkParams)\n };\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const shareLink = Flight.useBasicFetch<ShareLink>(props.video &&\n ShareRequests.getShareLinkByObjectId(props.video.id));\n const sentDirectShare = Flight.useBasicFetch<DirectShare>(props.video &&\n ShareRequests.getSentDirectShareByObjectId(props.video.id));\n const recipients = Flight.useBasicFetch<SharableRecipient[]>(currentUser.data?.customerId &&\n ShareViewHelper.getDirectShareRecipientsRequest(currentUser.data.customerId, sentDirectShare.data));\n const videoViews = Flight.useBasicFetch<BaseAnalyticsEventResponse>(currentUser.data && props.video &&\n VideoViewRequests.views(requestFilter, props.video.id, currentUser.data.id, publicInteractiveAttempts));\n const privacy = Flight.useBasicFetch<SharePrivacyResponse>(props.video && ShareRequests.getPrivacy(props.video.id));\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n const notShared =\n (shareLink.hasCompleted && !shareLink.data) &&\n (sentDirectShare.hasCompleted && !sentDirectShare.data);\n\n const hasShareData =\n (shareLink.hasCompleted && shareLink.data) ||\n (sentDirectShare.hasCompleted && sentDirectShare.data) &&\n (!shareLink.data || privacy.data) &&\n (!shareLink.data || yearGroups.data) &&\n recipients.data &&\n videoViews.data;\n\n const shareLinkText = shareLink.data && privacy.data && yearGroups.data &&\n ShareLinkHelper.getIconAndText({\n entity: props.video,\n entityTypeId: props.video.typeId,\n hasStudentExp: false,\n isPasswordProtected: shareLink.data.isPasswordProtected,\n linkExpireDate: shareLink.data.linkExpireDate,\n privacy: privacy.data,\n status: shareLink.data.status,\n yearGroups: yearGroups.data\n });\n\n const viewCount = React.useMemo(() => {\n return videoViews.data?.data.reduce((acc, view) => view.count + acc, 0);\n }, [videoViews.data]);\n const dateShared = sentDirectShare.data?.dateCreated || shareLink.data?.dateCreated;\n\n return (\n <div className='mb-4'>\n {hasShareData &&\n <>\n <h2 className='h4'><Text namespace={namespace} phrase='shareInfo' /></h2>\n\n <div className='d-flex border p-3 rounded-3 align-items-center justify-content-between'>\n <div className='d-flex align-items-center gap-2'>\n <SharedToPill\n shareRecipients={recipients.data}\n imageCdnUrl={config.data?.imageCdnUrl}\n hasShareLink={!!shareLink.data}\n maxAvatars={4}\n shareLinkText={shareLinkText?.text}\n />\n ·\n <p className='mb-0'>{formatDate(dateShared)}</p>\n {!!viewCount && (\n <>\n ·\n <p className='mb-0'><Text namespace={namespace} phrase='views' options={{ smartCount: viewCount }} /></p>\n </>\n )}\n </div>\n <IconButton\n appLink={getShareAppLink(props.video)}\n svgName={cvSvgLibrary.Share}\n className='btn btn-outline-dark'\n >\n <Text namespace={namespace} phrase='share' />\n </IconButton>\n </div>\n </>\n }\n\n {!notShared && !hasShareData &&\n <>\n <div className='h4 partial-loading-background w-25'> </div>\n <div className='p-3 rounded partial-loading-background'>\n <p className='mb-1'> </p>\n </div>\n </>\n }\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightStudentList } from 'libs/shared/apps/analytics/components/insight-student-list/InsightStudentList';\nimport { User } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.insightStudentsNotWatched';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightStudentsNotWatchedProps {\n students: User[];\n imageCdnUrl: string;\n imageUrl: string;\n heatmapAppLink: Core.AppLink;\n watchedIds: string[];\n anonymiseUsers: boolean;\n}\n\nexport function InsightStudentsNotWatched(props: InsightStudentsNotWatchedProps) {\n const studentsNotWatched = props.students?.filter(student => !props.watchedIds?.includes(student.id)) || [];\n\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.Puzzle}\n svgClassName='bg-light-teal text-teal'\n >\n <InsightStudentList\n students={studentsNotWatched}\n imageCdnUrl={props.imageCdnUrl}\n imageUrl={props.imageUrl}\n description={getPhrase('studentsDisplay')}\n anonymiseUsers={props.anonymiseUsers}\n />\n </InsightCard>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightStudentList } from 'libs/shared/apps/analytics/components/insight-student-list/InsightStudentList';\nimport { UserOrAnonSession } from 'libs/shared/apps/analytics/interfaces/UserOrAnonSession';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.insightStudentsWatched';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightWatchedProps {\n students: UserOrAnonSession[];\n imageCdnUrl: string;\n heatmapAppLink: Core.AppLink;\n imageUrl: string;\n anonymiseUsers: boolean;\n}\n\nexport function InsightStudentsWatched(props: InsightWatchedProps) {\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.Flag}\n svgClassName='bg-light-indigo text-indigo'\n count={props.students.length}\n >\n <InsightStudentList\n students={props.students}\n imageCdnUrl={props.imageCdnUrl}\n imageUrl={props.imageUrl}\n description={getPhrase('studentsDisplay')}\n appLink={props.heatmapAppLink}\n appLinkText={getPhrase('viewAll')}\n anonymiseUsers={props.anonymiseUsers}\n />\n </InsightCard>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"partialInsights\":\"qm6HY\"};","import React from 'react';\n\nimport styles from './partial-video-insights-overview.scss';\n\nexport function PartialVideoInsightsOverview() {\n return (\n <div>\n <h2 className='h4 w-25 partial-loading-background'> </h2>\n <div className='row g-3 mb-5'>\n <div className='col-12'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n </div>\n\n <h2 className='h4 w-25 partial-loading-background'> </h2>\n <div className='row g-3 mb-5'>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { InsightDevices } from 'libs/shared/apps/analytics/components/insights/devices/InsightDevices';\nimport { InsightHeatmap } from 'libs/shared/apps/analytics/components/insights/heatmap/InsightHeatmap';\nimport { InsightStudentsNotWatched } from 'libs/shared/apps/analytics/components/insights/students-not-watched/InsightStudentsNotWatched';\nimport { InsightStudentsWatched } from 'libs/shared/apps/analytics/components/insights/students-watched/InsightStudentsWatched';\nimport { useAnonSessions } from 'libs/shared/apps/analytics/hooks/UseAnonSessions';\nimport { BaseAnalyticsEventResponse } from 'libs/shared/apps/analytics/interfaces/BaseAnalyticsEvent';\nimport { UserOrAnonSession } from 'libs/shared/apps/analytics/interfaces/UserOrAnonSession';\nimport { AnalyticsFilterHelper } from 'libs/shared/apps/analytics/utils/AnalyticsFilterUtils';\nimport { getAnonSession } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { getAudienceParams } from 'libs/shared/apps/analytics/utils/AudienceUtils';\nimport { getInsightsDateRangePresets, getStartEndParams } from 'libs/shared/apps/analytics/utils/DateRangeUtils';\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoViewRequests } from 'libs/shared/flight-requests/VideoViewRequests';\nimport { useBatchFetch } from 'libs/shared/hooks/UseBatchFetch';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { useLockContentWidth } from 'libs/shared/hooks/useLockContentWidth';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { BasePaginatedCollection, Config, CurrentUser, Engagement, User, VideoTypes } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\nimport { InsightsHeader } from 'apps/my-shares/components/insights-header/InsightsHeader';\nimport { InsightsShareMask } from 'apps/my-shares/components/insights-mask/InsightsShareMask';\nimport { getInsightsClipTabs, getInsightsVideoTabs } from 'apps/my-shares/utils/InsightsAppLinkUtils';\nimport { ShareInfoView } from 'apps/my-shares/views/share-info/ShareInfoView';\nimport { PartialVideoInsightsOverview } from 'apps/my-shares/views/video/overview/partial-loading/PartialVideoInsightsOverview';\nimport { getVideoInsightsAppLinks } from 'apps/my-shares/views/video/overview/VideoInsightsOverviewUtils';\n\nconst namespace = 'insights.videoInsightsOverview';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface VideoInsightsViewProps {\n videoId: string;\n typeId: MasterType;\n shareId?: string;\n}\n\nexport function VideoInsightsOverviewView(props: VideoInsightsViewProps) {\n const [anonymiseUsers] = useViewModel<boolean>(SharedViewModelKeys.ANONYMISE_USERS);\n\n useLockContentWidth();\n\n const { hasClassrooms, hasShareFlowV2 } = useSettings(null);\n\n const { hasPermissions } = usePermissions();\n\n const { publicInteractiveAttempts } = useSettings(null);\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const videoRequest = VideoHelper.getVideoRequest(props.videoId, props.typeId);\n const video = Flight.useBasicFetch<VideoTypes>(videoRequest);\n\n const audienceAppLinkParams = AnalyticsFilterHelper.getAudienceAppLinkParams();\n const dateRangeAppLinkParams = AnalyticsFilterHelper.getDateRangeAppLinkParams();\n const requestFilter = {\n ...getStartEndParams(getInsightsDateRangePresets(), dateRangeAppLinkParams),\n ...getAudienceParams(audienceAppLinkParams)\n };\n\n useSetPageMetadata({ title: video.data ? getPhrase('pageTitle', { video: video.data?.name }) : null });\n useHandleObjectError(video);\n\n const aggregateEngagement = Flight.useBasicFetch<Engagement>(\n currentUser.data &&\n VideoViewRequests.aggregateEngagement(\n props.videoId,\n requestFilter,\n currentUser.data.id,\n publicInteractiveAttempts\n )\n );\n\n const classroomFilterOnly =\n audienceAppLinkParams.classrooms?.length === 1 && !audienceAppLinkParams.classroomGroups?.length;\n const classroomStudents = Flight.useBasicFetch<BasePaginatedCollection<User>>(classroomFilterOnly &&\n ClassroomRequests.getClassroomStudents(ArrayHelper.first(audienceAppLinkParams.classrooms)));\n\n const shareRecipients = useBatchFetch<User>(\n aggregateEngagement.data?.userIds || [],\n (ids: string[]) => ShareRequests.getRecipientsById(ids, currentUser.data.customerId)\n );\n\n const videoViews = Flight.useBasicFetch<BaseAnalyticsEventResponse>(currentUser.data &&\n VideoViewRequests.views(requestFilter, props.videoId, currentUser.data.id, publicInteractiveAttempts));\n\n const anonSessions = useAnonSessions(props.shareId);\n\n const hasShared = !!props.shareId;\n\n function getStudentsList(): UserOrAnonSession[] {\n if (!aggregateEngagement.data?.userIds && !aggregateEngagement.data?.sessionIds)\n return [];\n\n const students = shareRecipients.itemsArr ?? [];\n\n const sessions = aggregateEngagement.data?.sessionIds\n ?.map(sessionId => getAnonSession(sessionId, anonSessions)) || [];\n\n return [ ...students, ...sessions ];\n }\n\n const hasDataLoaded =\n currentUser.data &&\n config.data &&\n video.data &&\n aggregateEngagement.data &&\n (!classroomFilterOnly || classroomStudents.data);\n\n const params = {\n ...audienceAppLinkParams,\n ...dateRangeAppLinkParams,\n shareId: props.shareId\n };\n\n const videoInsightsAppLinks = getVideoInsightsAppLinks(props.videoId, props.typeId, params);\n\n function getInsightsOverviewTabs() {\n if (video.data?.typeId === MasterType.Clip) {\n return getInsightsClipTabs(video.data?.id, 'insights', params);\n }\n\n return getInsightsVideoTabs(video.data?.id, 'insights', params);\n }\n\n return (\n <div className='px-3'>\n <InsightsHeader\n video={video.data}\n dateRangeAppLinkParams={dateRangeAppLinkParams}\n tabs={getInsightsOverviewTabs()}\n hasAnalytics={hasPermissions(PermissionName.ViewCustomerAnalytics)}\n analyticsWebUrl={config.data?.analyticsWebUrl}\n hasShareFlowV2={hasShareFlowV2}\n shareId={props.shareId}\n />\n\n <ShareInfoView\n audienceAppLinkParams={audienceAppLinkParams}\n dateRangeAppLinkParams={dateRangeAppLinkParams}\n video={video.data}\n />\n\n {!hasDataLoaded && <PartialVideoInsightsOverview />}\n\n {hasDataLoaded &&\n <InsightsShareMask\n video={video.data}\n hasShared={hasShared}\n hasShareFlowV2={hasShareFlowV2}\n shareId={props.shareId}\n >\n <section className='mb-5'>\n <h2 className='h4'>\n <Text namespace={namespace} phrase='studentViewing' />\n <span>: {getStudentsList().length}{classroomStudents.data ? `/${classroomStudents.data.data.length}` : ''}</span>\n </h2>\n <div className='row g-3'>\n {classroomFilterOnly && (\n <div className='col-12 col-md'>\n <InsightStudentsNotWatched\n students={classroomStudents.data.data}\n watchedIds={aggregateEngagement.data.userIds}\n imageCdnUrl={config.data.imageCdnUrl}\n heatmapAppLink={videoInsightsAppLinks.heatmapAppLink}\n imageUrl={ImageUrls.Insights.AVATAR}\n anonymiseUsers={anonymiseUsers}\n />\n </div>\n )}\n <div className='col-12 col-md'>\n <InsightStudentsWatched\n students={getStudentsList()}\n imageCdnUrl={config.data.imageCdnUrl}\n heatmapAppLink={videoInsightsAppLinks.heatmapAppLink}\n imageUrl={ImageUrls.Insights.AVATAR}\n anonymiseUsers={anonymiseUsers}\n />\n </div>\n </div>\n </section>\n <section className='mb-5'>\n <h2 className='h4'>\n <Text\n namespace={namespace}\n phrase={hasClassrooms ? 'classEngagement' : 'engagement'}\n />\n </h2>\n <div className='row g-3'>\n <div className='col-12 col-md-6'>\n <InsightDevices\n osCount={videoViews.data?.osCount}\n />\n </div>\n <div className='col-12 col-md-6'>\n <InsightHeatmap\n engagement={aggregateEngagement.data}\n heatmapAppLink={videoInsightsAppLinks.heatmapAppLink}\n />\n </div>\n </div>\n </section>\n </InsightsShareMask>\n }\n </div>\n );\n}","import { HashObject } from 'libs/common/react/interfaces';\n\nimport { MasterType } from 'libs/shared/enums/MasterType';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nexport function getVideoInsightsAppLinks(id: string, typeId: MasterType, params?: HashObject) {\n return {\n heatmapAppLink: {\n application: AppChannels.INSIGHTS,\n action: typeId === MasterType.Clip ? Actions.Insights.CLIP_HEATMAP : Actions.Insights.VIDEO_HEATMAP,\n args: [id],\n params\n }\n };\n}"],"names":["DEFAULT_POLLING_INTERVAL","usePolling","callback","pollingInterval","pollingTrigger","setPollingTrigger","timeoutRef","t","current","window","setTimeout","clearTimeout","useAnonSessions","shareId","fetch","anonSessionsRequest","anonSessionsResponse","data","length","reduce","prev","sessionId","defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","internalServerError","handleHttpError","info","customErrorMap","ignoreMap","statusCode","status","errorMap","VideoViewRequests","individualEngagement","objectId","filter","sharerId","includeAnonViews","queryParams","url","key","formatData","map","d","heatMap","normalize","aggregateEngagement","views","timeOffset","CHUNK_SIZE","useBatchFetch","itemIds","getRequest","requests","chunk","responses","itemsArr","items","acc","item","id","isFetching","useGrowingBatchFetch","objs","_getKey","getKey","obj","fetchedItems","Set","setRequests","unfetchedItems","forEach","has","push","add","r","hasFirstRequestCompleted","hasCompleted","generateCacheKey","flightObjs","join","useHandleObjectError","_flightObjs","customErrors","ignoreErrors","Array","isArray","useEffect","namespace","ShareInfoView","props","config","publicInteractiveAttempts","requestFilter","dateRangeAppLinkParams","audienceAppLinkParams","currentUser","shareLink","video","sentDirectShare","recipients","customerId","videoViews","yearGroups","isAuthenticated","notShared","hasShareData","shareLinkText","entity","entityTypeId","typeId","hasStudentExp","isPasswordProtected","linkExpireDate","viewCount","view","count","dateShared","dateCreated","className","phrase","shareRecipients","imageCdnUrl","hasShareLink","maxAvatars","text","options","smartCount","appLink","svgName","getPhrase","LanguageService","InsightStudentsNotWatched","studentsNotWatched","students","student","watchedIds","includes","InsightCard","title","svgClassName","InsightStudentList","imageUrl","description","anonymiseUsers","InsightStudentsWatched","heatmapAppLink","appLinkText","PartialVideoInsightsOverview","VideoInsightsOverviewView","SharedViewModelKeys","useLockContentWidth","useSettings","hasClassrooms","hasShareFlowV2","hasPermissions","usePermissions","UserRequests","ConfigRequests","videoRequest","VideoHelper","videoId","useSetPageMetadata","name","classroomFilterOnly","classrooms","classroomGroups","classroomStudents","ClassroomRequests","ArrayHelper","userIds","ids","ShareRequests","anonSessions","hasShared","getStudentsList","sessionIds","sessions","hasDataLoaded","params","videoInsightsAppLinks","application","action","MasterType","args","getVideoInsightsAppLinks","InsightsHeader","tabs","getInsightsOverviewTabs","hasAnalytics","PermissionName","analyticsWebUrl","InsightsShareMask","Text","ImageUrls","InsightDevices","osCount","InsightHeatmap","engagement"],"sourceRoot":""}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[5721],{70376:(e,t,a)=>{a.d(t,{W:()=>o});var n=a(32735),r=a(91967);function i(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,n=Array(t);a<t;a++)n[a]=e[a];return n}var s=5e3;function o(e){var t,a,o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:s,c=(t=n.useState(!1),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,s,o=[],c=!0,d=!1;try{if(i=(a=a.call(e)).next,0===t){if(Object(a)!==a)return;c=!1}else for(;!(c=(n=i.call(a)).done)&&(o.push(n.value),o.length!==t);c=!0);}catch(e){d=!0,r=e}finally{try{if(!c&&null!=a.return&&(s=a.return(),Object(s)!==s))return}finally{if(d)throw r}}return o}}(t,a)||function(e,t){if(e){if("string"==typeof e)return i(e,t);var a={}.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)?i(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.")}()),d=c[0],u=c[1],l=n.useRef(null),v=function(){u((function(e){return!e})),l.current=window.setTimeout(v,o)};return n.useEffect((function(){l.current=window.setTimeout(v,o)}),[]),n.useEffect((function(){r.q.isFunction(e)&&e()}),[d]),function(){return window.clearTimeout(l.current)}}},71553:(e,t,a)=>{a.d(t,{I:()=>s});var n=a(99940),r=a(62875);function i(e,t){return{currentUserId:e.id,currentCustomerId:e.customerId,dateRange:{start:t.start,end:t.end},userIds:t.userId,classroomsAndGroups:t.groupId}}var s={interactiveResultSet:function(e,t,a,s,o,c,d,u){return{url:o?"/api/domain/v3/analytics/interactives/".concat(e,"/metadata/").concat(t):"/api/domain/v2/analytics/interactives/".concat(e,"/metadata/").concat(t),key:(0,r.H)("interactive:result:set:".concat(e,":").concat(t),s),data:i(a,s),type:n.k.POST,normalize:!1,success:c,error:d,always:u}},mark:function(e,t,a,r,i,s,o){return{url:"/api/domain/v1/analytics/answers/".concat(a),key:"mark:answer:".concat(a,":").concat(r.resultId),type:n.k.PUT,data:r,normalize:!1,invalidationKeys:"interactive:result:set:".concat(e,":").concat(t),success:i,error:s,always:o}},pendingReviews:function(e){return{url:"/api/domain/v1/analytics/interactives/pending-reviews/summary",key:"interactives:pending:reviews",type:n.k.POST,data:e}},interactiveResultsReport:function(e){return{url:"{gateway}/v2/analytics/interactives/report",key:"interactive:results:report",data:e,type:n.k.POST,normalize:!1}}}},5255:(e,t,a)=>{a.d(t,{Y:()=>o});var n=a(70376),r=a(20354),i=a(30439);function s(e){return s="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},s(e)}function o(e){var t,a=r.a.useGetFetch(),o=e&&i.o.getAnonSessions(e),c=r.a.useBasicFetch(o);return(0,n.W)((function(){return a(o)}),5e3),(null===(t=c.data)||void 0===t?void 0:t.length)?c.data.reduce((function(e,t){return Object.assign(Object.assign({},e),(a={},n=t.sessionId,r=t,(n=function(e){var t=function(e){if("object"!=s(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var a=t.call(e,"string");if("object"!=s(a))return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==s(t)?t:t+""}(n))in a?Object.defineProperty(a,n,{value:r,enumerable:!0,configurable:!0,writable:!0}):a[n]=r,a));var a,n,r}),{}):{}}},41196:(e,t,a)=>{a.d(t,{W:()=>o});var n=a(20354),r=a(71553),i=a(20768),s=a(31949);function o(e,t,a){var o,c=n.a.useBasicFetch(s.N.currentUser()),d=n.a.useBasicFetch(!!e&&i.b.interactiveMetadata(e)),u=n.a.useBasicFetch(!!(null===(o=d.data)||void 0===o?void 0:o.interactiveId)&&i.b.interactive(d.data.interactiveId)),l=!!c.data&&!!u.data&&!!t;return n.a.useBasicFetch(l&&r.I.interactiveResultSet(d.data.interactiveId,d.data.id,c.data,t,a))}},94644:(e,t,a)=>{a.d(t,{r:()=>u});var n=a(50242),r=a(81886),i=a(67058),s=a(14553),o=a(49267),c=a(49075),d={notFound:i.d,forbidden:{rating:s.q,yearLevel:s.q,region:o.a,privacy:s.q},badRequest:c._,internalServerError:c._};function u(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 i;i="number"==typeof e?e:e.status;var s=Object.assign(Object.assign({},d),t);i&&r.Q.Ry.isStatusCodeError(i)&&(i!==n.o.InternalServer?i!==n.o.NotFound?i!==n.o.Forbidden?a.badRequest||r.Q.Ry.throw(new s.badRequest):a.forbidden||r.Q.Ry.throw(new s.forbidden.privacy):a.notFound||r.Q.Ry.throw(new s.notFound):a.internalServerError||r.Q.Ry.throw(new c._))}}},17913:(e,t,a)=>{a.d(t,{u:()=>s});var n=a(97395),r=a(110),i=a(62875),s={individualEngagement:function(e,t,a,r){var s=Object.assign({objectId:e},t);return a&&(s.sharerId=a),r&&(s.includeAnonViews=!0),{url:n._.urlBuilder("{gateway}/v1/analytics/heat-map",s),key:(0,i.H)("engagement:".concat(e,":").concat(r),t,a),formatData:function(e){var t;return Object.assign(Object.assign({},e),{data:null===(t=e.data)||void 0===t?void 0:t.map((function(e){var t;return Object.assign(Object.assign({},e),{heatMap:null!==(t=e.heatMap)&&void 0!==t?t:[]})}))})},normalize:!1}},aggregateEngagement:function(e,t,a,r){var s=Object.assign({objectId:e},t);return a&&(s.sharerId=a),r&&(s.includeAnonViews=!0),{url:n._.urlBuilder("{gateway}/v1/analytics/heat-map/aggregations",s),key:(0,i.H)("aggregate:engagement:".concat(e,":").concat(r),t,a),formatData:function(e){var t;return Object.assign(Object.assign({},e),{heatMap:null!==(t=e.heatMap)&&void 0!==t?t:[]})},normalize:!1}},views:function(e,t,a,s){var o=Object.assign(Object.assign({},e),{timeOffset:r.O.getTimezoneOffset()});return t&&(o.objectId=t),a&&(o.sharerId=a),s&&(o.includeAnonViews=!0),{url:n._.urlBuilder("{gateway}/v1/analytics/video-views",o),key:(0,i.H)("video:views:".concat(t,":").concat(s),e,a),normalize:!1}}}},91286:(e,t,a)=>{a.d(t,{v:()=>s});var n=a(32735),r=a(94644);function i(e){return e.map((function(e){return e.statusCode})).join(":")}function s(e,t,a){var s=Array.isArray(e)?e:[e];(0,n.useEffect)((function(){s.forEach((function(e){(0,r.r)(e.statusCode,t,a)}))}),[i(s),t,a])}},82344:(e,t,a)=>{a.r(t),a.d(t,{InteractiveInsightsOverviewView:()=>C});var n=a(32735),r=a(23481),i=a(2948),s=a(20354),o=a(75896),c=a(5255),d=a(41196),u=a(26025),l=a(74901),v=a(40003),m=a(38143),p=a(16714),g=a(39151),f=a(20768),h=a(31949),y=a(17913),b=a(91286),I=a(93322),w=a(22902),S=a(79612),E=a(37802),O=a(88630),A=a(53936),j=a(54948),k=a(10447),F=a(14070),T=a(97291),R=a(50782);function B(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,n=Array(t);a<t;a++)n[a]=e[a];return n}var N=r.T.encloseNamespace("insights.interactiveInsightsOverviewView");function C(e){var t,a,r,C,P,L,U,x,_,M=(x=(0,i.D)(m.g.ANONYMISE_USERS),_=1,function(e){if(Array.isArray(e))return e}(x)||function(e,t){var a=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var n,r,i,s,o=[],c=!0,d=!1;try{if(i=(a=a.call(e)).next,0===t){if(Object(a)!==a)return;c=!1}else for(;!(c=(n=i.call(a)).done)&&(o.push(n.value),o.length!==t);c=!0);}catch(e){d=!0,r=e}finally{try{if(!c&&null!=a.return&&(s=a.return(),Object(s)!==s))return}finally{if(d)throw r}}return o}}(x,_)||function(e,t){if(e){if("string"==typeof e)return B(e,t);var a={}.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)?B(e,t):void 0}}(x,_)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[0];(0,I.F)();var V=(0,E.r)(null).hasShareFlowV2,D=(0,w.T)().hasPermissions,H=(0,E.r)(null).publicInteractiveAttempts,q=s.a.useBasicFetch(h.N.currentUser()),G=s.a.useBasicFetch(g.L.config()),z=s.a.useBasicFetch(f.b.interactiveMetadata(e.interactiveId)),W=s.a.useBasicFetch((null===(t=z.data)||void 0===t?void 0:t.interactiveId)&&f.b.interactive(z.data.interactiveId)),Q=u.B.getAudienceAppLinkParams(),K=u.B.getDateRangeAppLinkParams(),Y=Object.assign(Object.assign({},(0,v.wO)((0,v.Hb)(),K)),(0,l.K)(Q)),$=(0,d.W)(e.interactiveId,Y,!0),J=1===(null===(a=Q.classrooms)||void 0===a?void 0:a.length)&&!(null===(r=Q.classroomGroups)||void 0===r?void 0:r.length),X=s.a.useBasicFetch(J&&O.F.getClassroomStudents(o.m.first(Q.classrooms))),Z=s.a.useBasicFetch($.data&&y.u.aggregateEngagement(e.interactiveId,Y,q.data.id,H)),ee=s.a.useBasicFetch(q.data&&$.data&&y.u.views(Y,e.interactiveId,q.data.id,H)),te=(0,c.Y)(e.shareId),ae=!!e.shareId;(0,S.M)({title:z.data?N("pageTitle",{video:null===(C=z.data)||void 0===C?void 0:C.name}):null}),(0,b.v)([W,z,$]);var ne=q.data&&G.data&&z.data&&W.data&&$.data&&(!J||X.data)&&Z.data&&!!ee.data,re=Object.assign(Object.assign(Object.assign({},Q),K),{shareId:e.shareId}),ie=function(e,t){return{resultsAppLink:{application:T.O.INSIGHTS,action:F.e.Insights.INTERACTIVE_STUDENTS,args:[e],params:t},questionsAppLink:{application:T.O.INSIGHTS,action:F.e.Insights.INTERACTIVE_QUESTIONS,args:[e],params:t},heatmapAppLink:{application:T.O.INSIGHTS,action:F.e.Insights.INTERACTIVE_HEATMAP,args:[e],params:t}}}(null===(P=z.data)||void 0===P?void 0:P.id,re);return n.createElement("div",{className:"px-3"},n.createElement(A.j,{video:z.data,dateRangeAppLinkParams:K,tabs:(0,k.kj)(null===(L=z.data)||void 0===L?void 0:L.id,"insights",re),hasAnalytics:D(p.C.ViewCustomerAnalytics),analyticsWebUrl:null===(U=G.data)||void 0===U?void 0:U.analyticsWebUrl,hasShareFlowV2:V,shareId:e.shareId}),n.createElement(R.R,{audienceAppLinkParams:Q,dateRangeAppLinkParams:K,video:z.data}),n.createElement(j.m,{aggregateEngagement:Z.data,interactive:W.data,interactiveMetadata:z.data,interactiveInsightsAppLinks:ie,classroomStudents:X.data,results:$.data,videoViews:ee.data,config:G.data,classroomFilterOnly:J,anonymiseUsers:M,params:re,hasDataLoaded:ne,hasShared:ae,shareId:e.shareId,anonSessions:te}))}},50782:(e,t,a)=>{a.d(t,{R:()=>S});var n=a(32735),r=a(82602),i=a(20354),s=a(74901),o=a(40003),c=a(30439),d=a(65853),u=a(64249),l=a(91693),v=a(83345),m=a(39151),p=a(1666),g=a(31949),f=a(17913),h=a(37802),y=a(35223),b=a(86099),I=a(24758),w="insights.shareInfo";function S(e){var t,a,S,E,O,A=i.a.useBasicFetch(m.L.config()),j=(0,h.r)(null).publicInteractiveAttempts,k=Object.assign(Object.assign({},(0,o.wO)((0,o.Hb)(),e.dateRangeAppLinkParams)),(0,s.K)(e.audienceAppLinkParams)),F=i.a.useBasicFetch(g.N.currentUser()),T=i.a.useBasicFetch(e.video&&c.o.getShareLinkByObjectId(e.video.id)),R=i.a.useBasicFetch(e.video&&c.o.getSentDirectShareByObjectId(e.video.id)),B=i.a.useBasicFetch((null===(t=F.data)||void 0===t?void 0:t.customerId)&&u.I.getDirectShareRecipientsRequest(F.data.customerId,R.data)),N=i.a.useBasicFetch(F.data&&e.video&&f.u.views(k,e.video.id,F.data.id,j)),C=i.a.useBasicFetch(e.video&&c.o.getPrivacy(e.video.id)),P=i.a.useBasicFetch((null===(a=F.data)||void 0===a?void 0:a.isAuthenticated)&&p.h.yearGroups(F.data.customerId)),L=T.hasCompleted&&!T.data&&R.hasCompleted&&!R.data,U=T.hasCompleted&&T.data||R.hasCompleted&&R.data&&(!T.data||C.data)&&(!T.data||P.data)&&B.data&&N.data,x=T.data&&C.data&&P.data&&d.R.getIconAndText({entity:e.video,entityTypeId:e.video.typeId,hasStudentExp:!1,isPasswordProtected:T.data.isPasswordProtected,linkExpireDate:T.data.linkExpireDate,privacy:C.data,status:T.data.status,yearGroups:P.data}),_=n.useMemo((function(){var e;return null===(e=N.data)||void 0===e?void 0:e.data.reduce((function(e,t){return t.count+e}),0)}),[N.data]),M=(null===(S=R.data)||void 0===S?void 0:S.dateCreated)||(null===(E=T.data)||void 0===E?void 0:E.dateCreated);return n.createElement("div",{className:"mb-4"},U&&n.createElement(n.Fragment,null,n.createElement("h2",{className:"h4"},n.createElement(v.x,{namespace:w,phrase:"shareInfo"})),n.createElement("div",{className:"d-flex border p-3 rounded-3 align-items-center justify-content-between"},n.createElement("div",{className:"d-flex align-items-center gap-2"},n.createElement(I.A,{shareRecipients:B.data,imageCdnUrl:null===(O=A.data)||void 0===O?void 0:O.imageCdnUrl,hasShareLink:!!T.data,maxAvatars:4,shareLinkText:null==x?void 0:x.text}),"·",n.createElement("p",{className:"mb-0"},(0,r.WU)(M)),!!_&&n.createElement(n.Fragment,null,"·",n.createElement("p",{className:"mb-0"},n.createElement(v.x,{namespace:w,phrase:"views",options:{smartCount:_}})))),n.createElement(l.h,{appLink:(0,b.YK)(e.video),svgName:y.vn.Share,className:"btn btn-outline-dark"},n.createElement(v.x,{namespace:w,phrase:"share"})))),!L&&!U&&n.createElement(n.Fragment,null,n.createElement("div",{className:"h4 partial-loading-background w-25"}," "),n.createElement("div",{className:"p-3 rounded partial-loading-background"},n.createElement("p",{className:"mb-1"}," "))))}}}]);
|
|
2
|
+
//# sourceMappingURL=5721-2141ed4fb6-lite.chunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scripts/5721-2141ed4fb6-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/common/src/react/hooks/UsePolling.ts","file:///app/packages/libs/shared/src/apps/analytics/flight-requests/InteractiveResultsRequests.ts","file:///app/packages/libs/shared/src/apps/analytics/hooks/UseAnonSessions.ts","file:///app/packages/libs/shared/src/apps/analytics/hooks/UseFetchInteractiveResults.ts","file:///app/packages/libs/shared/src/errors/handlers/HttpErrorHandlers.ts","file:///app/packages/libs/shared/src/flight-requests/VideoViewRequests.ts","file:///app/packages/libs/shared/src/hooks/UseHandleObjectError.ts","file:///app/packages/projects/lite/src/apps/my-shares/views/interactive/overview/InteractiveInsightsOverviewView.tsx","file:///app/packages/projects/lite/src/apps/my-shares/views/interactive/overview/InteractiveInsightsOverviewUtils.ts","file:///app/packages/projects/lite/src/apps/my-shares/views/share-info/ShareInfoView.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nconst DEFAULT_POLLING_INTERVAL = 5000; // 5 seconds.\n\n/**\n * Hook to fire a callback at a set interval.\n * @param callback \n * @param pollingInterval \n * \n * Returns a function to clear the timeout.\n */\nexport function usePolling(callback: () => void, pollingInterval: number = DEFAULT_POLLING_INTERVAL): () => void {\n const [ pollingTrigger, setPollingTrigger ] = React.useState(false);\n\n const timeoutRef = React.useRef<number>(null);\n\n const poll = () => {\n setPollingTrigger(t => !t);\n\n timeoutRef.current = window.setTimeout(poll, pollingInterval);\n };\n\n React.useEffect(() => {\n timeoutRef.current = window.setTimeout(poll, pollingInterval);\n }, []);\n\n React.useEffect(() => {\n if (FunctionHelper.isFunction(callback))\n callback();\n }, [pollingTrigger]);\n\n return () => window.clearTimeout(timeoutRef.current);\n}","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Flight } from 'libs/common/react/index';\n\nimport { MarkInteractiveAnswer } from 'libs/shared/apps/analytics/interfaces/MarkInteractiveAnswer';\nimport { InteractiveResultsReport } from 'libs/shared/apps/analytics/interfaces/requests/InteractiveResultsReport';\nimport { InteractivesPendingReviewsRequest } from 'libs/shared/apps/analytics/interfaces/requests/InteractivesPendingReviewsRequest';\nimport { AnalyticsRequestFilter, CurrentUser, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { getAnalyticsRequestKey } from 'libs/shared/utils/AnalyticsRequestUtils';\n\ninterface InteractiveResultFilters {\n currentUserId: string;\n currentCustomerId: string;\n dateRange?: { start: string, end: string }\n userIds?: string | string[];\n classroomsAndGroups?: string | string[];\n}\n\nfunction getInteractiveResultFilters(\n currentUser: CurrentUser,\n filter: AnalyticsRequestFilter\n): InteractiveResultFilters {\n return {\n currentUserId: currentUser.id,\n currentCustomerId: currentUser.customerId,\n dateRange: { start: filter.start, end: filter.end },\n userIds: filter.userId,\n classroomsAndGroups: filter.groupId\n };\n}\n\nexport const InteractiveResultsRequests = {\n /** \n * This endpoint returns data with a lot of duplicated ids,\n * e.g. student answers to the same question will have the same id.\n * Because of that, we don't normalize.\n */\n interactiveResultSet(\n interactiveId: string,\n interactiveMetadataId: string,\n currentUser: CurrentUser,\n filter: AnalyticsRequestFilter,\n includePublicResults: boolean,\n success?: (data: InteractiveResultSet) => void,\n error?: (data: any) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: includePublicResults ?\n `/api/domain/v3/analytics/interactives/${interactiveId}/metadata/${interactiveMetadataId}` :\n `/api/domain/v2/analytics/interactives/${interactiveId}/metadata/${interactiveMetadataId}`,\n key: getAnalyticsRequestKey(`interactive:result:set:${interactiveId}:${interactiveMetadataId}`, filter),\n data: getInteractiveResultFilters(currentUser, filter),\n type: HttpVerbs.POST,\n normalize: false,\n success,\n error,\n always\n };\n },\n \n /**\n * As the response from `interactiveResultSet` isn't normalised, we need to invalidate the cache\n * to update the results data.\n */\n mark(\n interactiveId: string,\n interactiveMetadataId: string,\n answerId: string,\n data: MarkInteractiveAnswer,\n success?: () => void,\n error?: (data: any) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: `/api/domain/v1/analytics/answers/${answerId}`,\n key: `mark:answer:${answerId}:${data.resultId}`,\n type: HttpVerbs.PUT,\n data,\n normalize: false,\n invalidationKeys: `interactive:result:set:${interactiveId}:${interactiveMetadataId}`,\n success,\n error,\n always\n };\n },\n\n pendingReviews(data: InteractivesPendingReviewsRequest): Flight.Request {\n return {\n url: `/api/domain/v1/analytics/interactives/pending-reviews/summary`,\n key: `interactives:pending:reviews`,\n type: HttpVerbs.POST,\n data\n };\n },\n\n interactiveResultsReport(data: InteractiveResultsReport): Flight.Request {\n return {\n url: '{gateway}/v2/analytics/interactives/report',\n key: 'interactive:results:report',\n data,\n type: HttpVerbs.POST,\n normalize: false\n };\n }\n};","import { usePolling } from 'libs/common/react/hooks/UsePolling';\nimport { Flight } from 'libs/common/react/index';\n\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\n\nexport interface AnonSession {\n sessionId: string;\n sessionName: string;\n}\n\nexport interface AnonSessions extends Record<string, AnonSession> {}\n\nexport function useAnonSessions(shareId: string): AnonSessions {\n const fetch = Flight.useGetFetch();\n const anonSessionsRequest = shareId && ShareRequests.getAnonSessions(shareId);\n const anonSessionsResponse = Flight.useBasicFetch<AnonSession[]>(anonSessionsRequest);\n\n usePolling(() => fetch(anonSessionsRequest), 5000);\n\n if (!anonSessionsResponse.data?.length)\n return {};\n\n return anonSessionsResponse.data.reduce((prev, current) => ({ ...prev, [current.sessionId]: current }), {});\n}","import { Flight } from 'libs/common/flight';\n\nimport { InteractiveResultsRequests } from 'libs/shared/apps/analytics/flight-requests/InteractiveResultsRequests';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { AnalyticsRequestFilter, CurrentUser, Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\n\nexport function useFetchInteractiveResults(\n interactiveMetadataId: string,\n requestFilter: AnalyticsRequestFilter,\n includePublicResults?: boolean\n): Flight.Response<InteractiveResultSet> {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(!!interactiveMetadataId &&\n InteractiveRequests.interactiveMetadata(interactiveMetadataId));\n\n const interactive = Flight.useBasicFetch<Interactive>(!!interactiveMetadata.data?.interactiveId &&\n InteractiveRequests.interactive(interactiveMetadata.data.interactiveId));\n\n const shouldFetchResults = !!currentUser.data && !!interactive.data && (!!requestFilter);\n\n return Flight.useBasicFetch<InteractiveResultSet>(shouldFetchResults &&\n InteractiveResultsRequests.interactiveResultSet(\n interactiveMetadata.data.interactiveId,\n interactiveMetadata.data.id,\n currentUser.data,\n requestFilter,\n includePublicResults\n ));\n}","import { BaseError } from 'libs/common/backbone/core/BaseError';\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Core } from 'libs/common/core';\n\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { PrivateResourceError } from 'libs/shared/errors/general/private-resource/PrivateResourceError';\nimport { RegionLockedResourceError } from 'libs/shared/errors/general/region-locked-resource/RegionLockedResourceError';\nimport { UnspecifiedError } from 'libs/shared/errors/general/unspecified-error/UnspecifiedError';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nexport interface HttpErrorMap {\n notFound?: new () => BaseError;\n forbidden?: {\n rating?: new (description: string) => BaseError;\n yearLevel?: new (description: string) => BaseError;\n region?: new () => BaseError;\n privacy?: new (video?: VideoTypes) => BaseError;\n };\n badRequest?: new () => BaseError;\n internalServerError?: new () => BaseError;\n}\n\nexport type IgnoreHttpErrorMap = {\n [key in keyof HttpErrorMap]: boolean;\n};\n\nconst defaultErrors: HttpErrorMap = {\n notFound: NotFoundError,\n forbidden: {\n rating: PrivateResourceError,\n yearLevel: PrivateResourceError,\n region: RegionLockedResourceError,\n privacy: PrivateResourceError\n },\n badRequest: UnspecifiedError,\n internalServerError: UnspecifiedError\n};\n\nexport function handleHttpError(\n info: HttpStatus | Xhr,\n customErrorMap: HttpErrorMap = {},\n /**\n * Prevent certain errors in the errorMap from being thrown\n * so that you may implement your own handler\n */\n ignoreMap: IgnoreHttpErrorMap = {}\n): void {\n if (!info)\n return;\n\n let statusCode: HttpStatus;\n\n if (typeof(info) === 'number') {\n statusCode = info;\n } else {\n statusCode = info.status;\n }\n\n const errorMap = {\n ...defaultErrors,\n ...customErrorMap\n };\n\n if (!statusCode)\n return;\n\n if (!Core.ErrorHelper.isStatusCodeError(statusCode))\n return;\n\n if (statusCode === HttpStatus.InternalServer) {\n if (!ignoreMap.internalServerError)\n Core.ErrorHelper.throw(new UnspecifiedError());\n return;\n }\n\n if (statusCode === HttpStatus.NotFound) {\n if (!ignoreMap.notFound)\n Core.ErrorHelper.throw(new errorMap.notFound());\n return;\n }\n\n if (statusCode === HttpStatus.Forbidden) {\n /**\n * TODO: Work out how to go about handling all forbidden errors, such as region locking, year levels,\n * ratings, and privacy.\n */\n if (!ignoreMap.forbidden)\n Core.ErrorHelper.throw(new errorMap.forbidden.privacy());\n return;\n }\n\n if (!ignoreMap.badRequest)\n Core.ErrorHelper.throw(new errorMap.badRequest());\n}\n\nexport function handleXhrError(xhr: Xhr, customErrorMap?: HttpErrorMap): void {\n handleHttpError(xhr.status, customErrorMap);\n}","import { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { AnalyticsRequestFilter, Engagement } from 'libs/shared/interfaces';\nimport { getAnalyticsRequestKey } from 'libs/shared/utils/AnalyticsRequestUtils';\n\nexport const VideoViewRequests = {\n individualEngagement(\n objectId: string,\n filter: AnalyticsRequestFilter,\n sharerId?: string,\n includeAnonViews?: boolean\n ): Flight.Request {\n const queryParams: HashObject = {\n objectId,\n ...filter\n };\n\n if (sharerId)\n queryParams.sharerId = sharerId;\n\n if (includeAnonViews)\n queryParams.includeAnonViews = true;\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/analytics/heat-map', queryParams),\n key: getAnalyticsRequestKey(`engagement:${objectId}:${includeAnonViews}`, filter, sharerId),\n formatData: (data: any) => {\n return {\n ...data,\n data: data.data?.map((d: any) => ({\n ...d,\n heatMap: d.heatMap ?? []\n }))\n };\n },\n normalize: false\n };\n },\n \n aggregateEngagement(\n objectId: string,\n filter: AnalyticsRequestFilter,\n sharerId?: string,\n includeAnonViews?: boolean\n ): Flight.Request {\n const queryParams: HashObject = {\n objectId,\n ...filter\n };\n\n if (sharerId)\n queryParams.sharerId = sharerId;\n \n if (includeAnonViews)\n queryParams.includeAnonViews = true;\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/analytics/heat-map/aggregations', queryParams),\n key: getAnalyticsRequestKey(`aggregate:engagement:${objectId}:${includeAnonViews}`, filter, sharerId),\n formatData: (data: Engagement) => {\n return {\n ...data,\n heatMap: data.heatMap ?? []\n };\n },\n normalize: false\n };\n },\n \n views(\n filter: AnalyticsRequestFilter,\n objectId?: string,\n sharerId?: string,\n includeAnonViews?: boolean\n ): Flight.Request {\n const queryParams: HashObject = {\n ...filter,\n timeOffset: DateHelper.getTimezoneOffset()\n };\n\n if (objectId)\n queryParams.objectId = objectId;\n\n if (sharerId)\n queryParams.sharerId = sharerId;\n \n if (includeAnonViews)\n queryParams.includeAnonViews = true;\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/analytics/video-views', queryParams),\n key: getAnalyticsRequestKey(`video:views:${objectId}:${includeAnonViews}`, filter, sharerId),\n normalize: false\n };\n }\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 { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { useAnonSessions } from 'libs/shared/apps/analytics/hooks/UseAnonSessions';\nimport { useFetchInteractiveResults } from 'libs/shared/apps/analytics/hooks/UseFetchInteractiveResults';\nimport { BaseAnalyticsEventResponse } from 'libs/shared/apps/analytics/interfaces/BaseAnalyticsEvent';\nimport { AnalyticsFilterHelper } from 'libs/shared/apps/analytics/utils/AnalyticsFilterUtils';\nimport { getAudienceParams } from 'libs/shared/apps/analytics/utils/AudienceUtils';\nimport { getInsightsDateRangePresets, getStartEndParams } from 'libs/shared/apps/analytics/utils/DateRangeUtils';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoViewRequests } from 'libs/shared/flight-requests/VideoViewRequests';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { useLockContentWidth } from 'libs/shared/hooks/useLockContentWidth';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { BasePaginatedCollection, Config, CurrentUser, Engagement, Interactive, InteractiveMetadata, User } from 'libs/shared/interfaces';\n\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\nimport { InsightsHeader } from 'apps/my-shares/components/insights-header/InsightsHeader';\nimport { InteractiveInsightsOverview } from 'apps/my-shares/components/interactive-insights-overview/InteractiveInsightsOverview';\nimport { getInsightsInteractiveTabs } from 'apps/my-shares/utils/InsightsAppLinkUtils';\nimport { getInteractiveInsightsAppLinks } from 'apps/my-shares/views/interactive/overview/InteractiveInsightsOverviewUtils';\nimport { ShareInfoView } from 'apps/my-shares/views/share-info/ShareInfoView';\n\nconst namespace = 'insights.interactiveInsightsOverviewView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InteractiveInsightsViewProps {\n interactiveId: string;\n shareId?: string;\n}\n\nexport function InteractiveInsightsOverviewView(props: InteractiveInsightsViewProps) {\n const [anonymiseUsers] = useViewModel<boolean>(SharedViewModelKeys.ANONYMISE_USERS);\n\n useLockContentWidth();\n\n const { hasShareFlowV2 } = useSettings(null);\n\n const { hasPermissions } = usePermissions();\n\n const { publicInteractiveAttempts } = useSettings(null);\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(\n InteractiveRequests.interactiveMetadata(props.interactiveId)\n );\n\n const interactive = Flight.useBasicFetch<Interactive>(interactiveMetadata.data?.interactiveId &&\n InteractiveRequests.interactive(interactiveMetadata.data.interactiveId));\n\n const audienceAppLinkParams = AnalyticsFilterHelper.getAudienceAppLinkParams();\n const dateRangeAppLinkParams = AnalyticsFilterHelper.getDateRangeAppLinkParams();\n const requestFilter = {\n ...getStartEndParams(getInsightsDateRangePresets(), dateRangeAppLinkParams),\n ...getAudienceParams(audienceAppLinkParams)\n };\n\n const results = useFetchInteractiveResults(props.interactiveId, requestFilter, true);\n\n const classroomFilterOnly =\n audienceAppLinkParams.classrooms?.length === 1 && !audienceAppLinkParams.classroomGroups?.length;\n const classroomStudents = Flight.useBasicFetch<BasePaginatedCollection<User>>(classroomFilterOnly &&\n ClassroomRequests.getClassroomStudents(ArrayHelper.first(audienceAppLinkParams.classrooms)));\n\n const aggregateEngagement = Flight.useBasicFetch<Engagement>(\n results.data && VideoViewRequests.aggregateEngagement(\n props.interactiveId,\n requestFilter,\n currentUser.data.id,\n publicInteractiveAttempts\n )\n );\n\n const videoViews = Flight.useBasicFetch<BaseAnalyticsEventResponse>(\n currentUser.data &&\n results.data &&\n VideoViewRequests.views(requestFilter, props.interactiveId, currentUser.data.id, publicInteractiveAttempts)\n );\n\n const anonSessions = useAnonSessions(props.shareId);\n\n const hasShared = !!props.shareId;\n\n useSetPageMetadata({ title: interactiveMetadata.data ? getPhrase('pageTitle', { video: interactiveMetadata.data?.name }) : null });\n\n useHandleObjectError([ interactive, interactiveMetadata, results ]);\n\n const hasDataLoaded =\n currentUser.data &&\n config.data &&\n interactiveMetadata.data &&\n interactive.data &&\n results.data &&\n (!classroomFilterOnly || classroomStudents.data) &&\n aggregateEngagement.data &&\n !!videoViews.data;\n\n const params = {\n ...audienceAppLinkParams,\n ...dateRangeAppLinkParams,\n shareId: props.shareId\n };\n\n const interactiveInsightsAppLinks = getInteractiveInsightsAppLinks(\n interactiveMetadata.data?.id,\n params\n );\n\n return (\n <div className='px-3'>\n <InsightsHeader\n video={interactiveMetadata.data}\n dateRangeAppLinkParams={dateRangeAppLinkParams}\n tabs={getInsightsInteractiveTabs(interactiveMetadata.data?.id, 'insights', params)}\n hasAnalytics={hasPermissions(PermissionName.ViewCustomerAnalytics)}\n analyticsWebUrl={config.data?.analyticsWebUrl}\n hasShareFlowV2={hasShareFlowV2}\n shareId={props.shareId}\n />\n\n <ShareInfoView\n audienceAppLinkParams={audienceAppLinkParams}\n dateRangeAppLinkParams={dateRangeAppLinkParams}\n video={interactiveMetadata.data}\n />\n\n <InteractiveInsightsOverview\n aggregateEngagement={aggregateEngagement.data}\n interactive={interactive.data}\n interactiveMetadata={interactiveMetadata.data}\n interactiveInsightsAppLinks={interactiveInsightsAppLinks}\n classroomStudents={classroomStudents.data}\n results={results.data}\n videoViews={videoViews.data}\n config={config.data}\n classroomFilterOnly={classroomFilterOnly}\n anonymiseUsers={anonymiseUsers}\n params={params}\n hasDataLoaded={hasDataLoaded}\n hasShared={hasShared}\n shareId={props.shareId}\n anonSessions={anonSessions}\n />\n </div>\n );\n}","import { HashObject } from 'libs/common/react/interfaces';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nexport function getInteractiveInsightsAppLinks(id: string, params?: HashObject) {\n return {\n resultsAppLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.INTERACTIVE_STUDENTS,\n args: [id],\n params\n },\n questionsAppLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.INTERACTIVE_QUESTIONS,\n args: [id],\n params\n },\n heatmapAppLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.INTERACTIVE_HEATMAP,\n args: [id],\n params\n }\n };\n}","import React from 'react';\nimport { format as formatDate } from 'timeago.js';\n\nimport { Flight } from 'libs/common/react/index';\n\nimport { AudienceQueryParams } from 'libs/shared/apps/analytics/interfaces/AudienceQueryParams';\nimport { BaseAnalyticsEventResponse } from 'libs/shared/apps/analytics/interfaces/BaseAnalyticsEvent';\nimport { DateRangeQueryParams } from 'libs/shared/apps/analytics/interfaces/DateRangeQueryParams';\nimport { getAudienceParams } from 'libs/shared/apps/analytics/utils/AudienceUtils';\nimport { getInsightsDateRangePresets, getStartEndParams } from 'libs/shared/apps/analytics/utils/DateRangeUtils';\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { SharePrivacyResponse } from 'libs/shared/apps/share/interfaces/responses/SharePrivacyResponse';\nimport { ShareLinkHelper } from 'libs/shared/apps/share/utils/ShareLinkHelper';\nimport { SharableRecipient, ShareViewHelper } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoViewRequests } from 'libs/shared/flight-requests/VideoViewRequests';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Config, CurrentUser, DirectShare, ShareLink, VideoTypes, YearGroup } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { getShareAppLink } from 'shared/utils/ObjectAppLinkHelper';\n\nimport { SharedToPill } from 'apps/my-shares/components/shared-to-pill/SharedToPill';\n\nconst namespace = 'insights.shareInfo';\n\ninterface ShareInfoViewProps {\n video: VideoTypes;\n audienceAppLinkParams: AudienceQueryParams;\n dateRangeAppLinkParams: DateRangeQueryParams;\n}\n\n// eslint-disable-next-line rulesdir/require-view-title\nexport function ShareInfoView(props: ShareInfoViewProps) {\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const { publicInteractiveAttempts } = useSettings(null);\n\n const requestFilter = {\n ...getStartEndParams(getInsightsDateRangePresets(), props.dateRangeAppLinkParams),\n ...getAudienceParams(props.audienceAppLinkParams)\n };\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const shareLink = Flight.useBasicFetch<ShareLink>(props.video &&\n ShareRequests.getShareLinkByObjectId(props.video.id));\n const sentDirectShare = Flight.useBasicFetch<DirectShare>(props.video &&\n ShareRequests.getSentDirectShareByObjectId(props.video.id));\n const recipients = Flight.useBasicFetch<SharableRecipient[]>(currentUser.data?.customerId &&\n ShareViewHelper.getDirectShareRecipientsRequest(currentUser.data.customerId, sentDirectShare.data));\n const videoViews = Flight.useBasicFetch<BaseAnalyticsEventResponse>(currentUser.data && props.video &&\n VideoViewRequests.views(requestFilter, props.video.id, currentUser.data.id, publicInteractiveAttempts));\n const privacy = Flight.useBasicFetch<SharePrivacyResponse>(props.video && ShareRequests.getPrivacy(props.video.id));\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n const notShared =\n (shareLink.hasCompleted && !shareLink.data) &&\n (sentDirectShare.hasCompleted && !sentDirectShare.data);\n\n const hasShareData =\n (shareLink.hasCompleted && shareLink.data) ||\n (sentDirectShare.hasCompleted && sentDirectShare.data) &&\n (!shareLink.data || privacy.data) &&\n (!shareLink.data || yearGroups.data) &&\n recipients.data &&\n videoViews.data;\n\n const shareLinkText = shareLink.data && privacy.data && yearGroups.data &&\n ShareLinkHelper.getIconAndText({\n entity: props.video,\n entityTypeId: props.video.typeId,\n hasStudentExp: false,\n isPasswordProtected: shareLink.data.isPasswordProtected,\n linkExpireDate: shareLink.data.linkExpireDate,\n privacy: privacy.data,\n status: shareLink.data.status,\n yearGroups: yearGroups.data\n });\n\n const viewCount = React.useMemo(() => {\n return videoViews.data?.data.reduce((acc, view) => view.count + acc, 0);\n }, [videoViews.data]);\n const dateShared = sentDirectShare.data?.dateCreated || shareLink.data?.dateCreated;\n\n return (\n <div className='mb-4'>\n {hasShareData &&\n <>\n <h2 className='h4'><Text namespace={namespace} phrase='shareInfo' /></h2>\n\n <div className='d-flex border p-3 rounded-3 align-items-center justify-content-between'>\n <div className='d-flex align-items-center gap-2'>\n <SharedToPill\n shareRecipients={recipients.data}\n imageCdnUrl={config.data?.imageCdnUrl}\n hasShareLink={!!shareLink.data}\n maxAvatars={4}\n shareLinkText={shareLinkText?.text}\n />\n ·\n <p className='mb-0'>{formatDate(dateShared)}</p>\n {!!viewCount && (\n <>\n ·\n <p className='mb-0'><Text namespace={namespace} phrase='views' options={{ smartCount: viewCount }} /></p>\n </>\n )}\n </div>\n <IconButton\n appLink={getShareAppLink(props.video)}\n svgName={cvSvgLibrary.Share}\n className='btn btn-outline-dark'\n >\n <Text namespace={namespace} phrase='share' />\n </IconButton>\n </div>\n </>\n }\n\n {!notShared && !hasShareData &&\n <>\n <div className='h4 partial-loading-background w-25'> </div>\n <div className='p-3 rounded partial-loading-background'>\n <p className='mb-1'> </p>\n </div>\n </>\n }\n </div>\n );\n}"],"names":["DEFAULT_POLLING_INTERVAL","usePolling","callback","pollingInterval","pollingTrigger","setPollingTrigger","timeoutRef","t","current","window","setTimeout","clearTimeout","getInteractiveResultFilters","currentUser","filter","currentUserId","id","currentCustomerId","customerId","dateRange","start","end","userIds","userId","classroomsAndGroups","groupId","InteractiveResultsRequests","interactiveResultSet","interactiveId","interactiveMetadataId","includePublicResults","success","error","always","url","key","data","type","normalize","mark","answerId","resultId","invalidationKeys","pendingReviews","interactiveResultsReport","useAnonSessions","shareId","fetch","anonSessionsRequest","anonSessionsResponse","length","reduce","prev","sessionId","useFetchInteractiveResults","requestFilter","interactiveMetadata","interactive","shouldFetchResults","I","defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","internalServerError","handleHttpError","info","customErrorMap","ignoreMap","statusCode","status","errorMap","VideoViewRequests","individualEngagement","objectId","sharerId","includeAnonViews","queryParams","formatData","map","d","heatMap","aggregateEngagement","views","timeOffset","generateCacheKey","flightObjs","obj","join","useHandleObjectError","_flightObjs","customErrors","ignoreErrors","Array","isArray","useEffect","forEach","getPhrase","LanguageService","InteractiveInsightsOverviewView","props","anonymiseUsers","SharedViewModelKeys","useLockContentWidth","hasShareFlowV2","useSettings","hasPermissions","usePermissions","publicInteractiveAttempts","UserRequests","config","ConfigRequests","InteractiveRequests","audienceAppLinkParams","dateRangeAppLinkParams","results","classroomFilterOnly","classrooms","classroomGroups","classroomStudents","ClassroomRequests","ArrayHelper","videoViews","anonSessions","hasShared","useSetPageMetadata","title","video","name","hasDataLoaded","params","interactiveInsightsAppLinks","resultsAppLink","application","action","args","questionsAppLink","heatmapAppLink","getInteractiveInsightsAppLinks","className","InsightsHeader","tabs","hasAnalytics","PermissionName","analyticsWebUrl","ShareInfoView","InteractiveInsightsOverview","namespace","shareLink","sentDirectShare","recipients","yearGroups","isAuthenticated","notShared","hasCompleted","hasShareData","shareLinkText","entity","entityTypeId","typeId","hasStudentExp","isPasswordProtected","linkExpireDate","viewCount","acc","view","count","dateShared","dateCreated","phrase","shareRecipients","imageCdnUrl","hasShareLink","maxAvatars","text","options","smartCount","appLink","svgName"],"sourceRoot":""}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[5797],{70376:(t,e,r)=>{r.d(e,{W:()=>u});var n=r(32735),a=r(91967);function i(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}var o=5e3;function u(t){var e,r,u=arguments.length>1&&void 0!==arguments[1]?arguments[1]:o,c=(e=n.useState(!1),r=2,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var n,a,i,o,u=[],c=!0,s=!1;try{if(i=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=i.call(r)).done)&&(u.push(n.value),u.length!==e);c=!0);}catch(t){s=!0,a=t}finally{try{if(!c&&null!=r.return&&(o=r.return(),Object(o)!==o))return}finally{if(s)throw a}}return u}}(e,r)||function(t,e){if(t){if("string"==typeof t)return i(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?i(t,e):void 0}}(e,r)||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.")}()),s=c[0],l=c[1],d=n.useRef(null),f=function(){l((function(t){return!t})),d.current=window.setTimeout(f,u)};return n.useEffect((function(){d.current=window.setTimeout(f,u)}),[]),n.useEffect((function(){a.q.isFunction(t)&&t()}),[s]),function(){return window.clearTimeout(d.current)}}},5255:(t,e,r)=>{r.d(e,{Y:()=>u});var n=r(70376),a=r(20354),i=r(30439);function o(t){return o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},o(t)}function u(t){var e,r=a.a.useGetFetch(),u=t&&i.o.getAnonSessions(t),c=a.a.useBasicFetch(u);return(0,n.W)((function(){return r(u)}),5e3),(null===(e=c.data)||void 0===e?void 0:e.length)?c.data.reduce((function(t,e){return Object.assign(Object.assign({},t),(r={},n=e.sessionId,a=e,(n=function(t){var e=function(t){if("object"!=o(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var r=e.call(t,"string");if("object"!=o(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==o(e)?e:e+""}(n))in r?Object.defineProperty(r,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):r[n]=a,r));var r,n,a}),{}):{}}},41196:(t,e,r)=>{r.d(e,{W:()=>u});var n=r(20354),a=r(71553),i=r(20768),o=r(31949);function u(t,e,r){var u,c=n.a.useBasicFetch(o.N.currentUser()),s=n.a.useBasicFetch(!!t&&i.b.interactiveMetadata(t)),l=n.a.useBasicFetch(!!(null===(u=s.data)||void 0===u?void 0:u.interactiveId)&&i.b.interactive(s.data.interactiveId)),d=!!c.data&&!!l.data&&!!e;return n.a.useBasicFetch(d&&a.I.interactiveResultSet(s.data.interactiveId,s.data.id,c.data,e,r))}},94644:(t,e,r)=>{r.d(e,{r:()=>l});var n=r(50242),a=r(81886),i=r(67058),o=r(14553),u=r(49267),c=r(49075),s={notFound:i.d,forbidden:{rating:o.q,yearLevel:o.q,region:u.a,privacy:o.q},badRequest:c._,internalServerError:c._};function l(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(t){var i;i="number"==typeof t?t:t.status;var o=Object.assign(Object.assign({},s),e);i&&a.Q.Ry.isStatusCodeError(i)&&(i!==n.o.InternalServer?i!==n.o.NotFound?i!==n.o.Forbidden?r.badRequest||a.Q.Ry.throw(new o.badRequest):r.forbidden||a.Q.Ry.throw(new o.forbidden.privacy):r.notFound||a.Q.Ry.throw(new o.notFound):r.internalServerError||a.Q.Ry.throw(new c._))}}},91286:(t,e,r)=>{r.d(e,{v:()=>o});var n=r(32735),a=r(94644);function i(t){return t.map((function(t){return t.statusCode})).join(":")}function o(t,e,r){var o=Array.isArray(t)?t:[t];(0,n.useEffect)((function(){o.forEach((function(t){(0,a.r)(t.statusCode,e,r)}))}),[i(o),e,r])}},24191:(t,e,r)=>{r.r(e),r.d(e,{InteractiveInsightsQuestionsView:()=>O});var n=r(32735),a=r(23481),i=r(2948),o=r(20354),u=r(5255),c=r(41196),s=r(26025),l=r(74901),d=r(40003),f=r(38143),v=r(16714),y=r(39151),b=r(20768),h=r(91286),m=r(93322),g=r(22902),p=r(79612),w=r(37802),S=r(53936),I=r(68536),j=r(10447);function A(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}var F=a.T.encloseNamespace("shared.interactiveInsightsQuestionsView");function O(t){var e,r,a,O,E,R=(O=(0,i.D)(f.g.ANONYMISE_USERS),E=1,function(t){if(Array.isArray(t))return t}(O)||function(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var n,a,i,o,u=[],c=!0,s=!1;try{if(i=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=i.call(r)).done)&&(u.push(n.value),u.length!==e);c=!0);}catch(t){s=!0,a=t}finally{try{if(!c&&null!=r.return&&(o=r.return(),Object(o)!==o))return}finally{if(s)throw a}}return u}}(O,E)||function(t,e){if(t){if("string"==typeof t)return A(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?A(t,e):void 0}}(O,E)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[0];(0,m.F)();var B=(0,w.r)(null).hasShareFlowV2,k=(0,g.T)().hasPermissions,C=o.a.useBasicFetch(y.L.config()),T=o.a.useBasicFetch(b.b.interactiveMetadata(t.interactiveId)),q=o.a.useBasicFetch((null===(e=T.data)||void 0===e?void 0:e.interactiveId)&&b.b.interactive(T.data.interactiveId)),_=(0,u.Y)(t.shareId),M=s.B.getAudienceAppLinkParams(),P=s.B.getDateRangeAppLinkParams(),Q=(0,c.W)(t.interactiveId,Object.assign(Object.assign({},(0,d.wO)((0,d.Hb)(),P)),(0,l.K)(M)),!0);(0,p.M)({title:T.data?F("pageTitle",{video:null===(r=T.data)||void 0===r?void 0:r.name}):null}),(0,h.v)([q,T,Q]);var U=q.data&&T.data&&!!Q.data,L=Object.assign(Object.assign(Object.assign({},M),P),{shareId:t.shareId});return n.createElement("div",{className:"px-3"},n.createElement(S.j,{dateRangeAppLinkParams:P,tabs:(0,j.kj)(t.interactiveId,"questions",L),video:T.data,hasAnalytics:k(v.C.ViewCustomerAnalytics),analyticsWebUrl:null===(a=C.data)||void 0===a?void 0:a.analyticsWebUrl,hasShareFlowV2:B,shareId:t.shareId}),n.createElement(I.x,{interactive:q.data,interactiveMetadata:T.data,interactionId:t.interactionId,config:C.data,sortBy:t.sortBy,isFetching:Q.isFetching||q.isFetching,anonymiseUsers:R,results:Q.data,hasDataLoaded:U,anonSessions:_}))}}}]);
|
|
2
|
+
//# sourceMappingURL=5797-f84ce545b9-lite.chunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scripts/5797-f84ce545b9-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/common/src/react/hooks/UsePolling.ts","file:///app/packages/libs/shared/src/apps/analytics/hooks/UseAnonSessions.ts","file:///app/packages/libs/shared/src/apps/analytics/hooks/UseFetchInteractiveResults.ts","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/apps/my-shares/views/interactive/questions/InteractiveInsightsQuestionsView.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nconst DEFAULT_POLLING_INTERVAL = 5000; // 5 seconds.\n\n/**\n * Hook to fire a callback at a set interval.\n * @param callback \n * @param pollingInterval \n * \n * Returns a function to clear the timeout.\n */\nexport function usePolling(callback: () => void, pollingInterval: number = DEFAULT_POLLING_INTERVAL): () => void {\n const [ pollingTrigger, setPollingTrigger ] = React.useState(false);\n\n const timeoutRef = React.useRef<number>(null);\n\n const poll = () => {\n setPollingTrigger(t => !t);\n\n timeoutRef.current = window.setTimeout(poll, pollingInterval);\n };\n\n React.useEffect(() => {\n timeoutRef.current = window.setTimeout(poll, pollingInterval);\n }, []);\n\n React.useEffect(() => {\n if (FunctionHelper.isFunction(callback))\n callback();\n }, [pollingTrigger]);\n\n return () => window.clearTimeout(timeoutRef.current);\n}","import { usePolling } from 'libs/common/react/hooks/UsePolling';\nimport { Flight } from 'libs/common/react/index';\n\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\n\nexport interface AnonSession {\n sessionId: string;\n sessionName: string;\n}\n\nexport interface AnonSessions extends Record<string, AnonSession> {}\n\nexport function useAnonSessions(shareId: string): AnonSessions {\n const fetch = Flight.useGetFetch();\n const anonSessionsRequest = shareId && ShareRequests.getAnonSessions(shareId);\n const anonSessionsResponse = Flight.useBasicFetch<AnonSession[]>(anonSessionsRequest);\n\n usePolling(() => fetch(anonSessionsRequest), 5000);\n\n if (!anonSessionsResponse.data?.length)\n return {};\n\n return anonSessionsResponse.data.reduce((prev, current) => ({ ...prev, [current.sessionId]: current }), {});\n}","import { Flight } from 'libs/common/flight';\n\nimport { InteractiveResultsRequests } from 'libs/shared/apps/analytics/flight-requests/InteractiveResultsRequests';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { AnalyticsRequestFilter, CurrentUser, Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\n\nexport function useFetchInteractiveResults(\n interactiveMetadataId: string,\n requestFilter: AnalyticsRequestFilter,\n includePublicResults?: boolean\n): Flight.Response<InteractiveResultSet> {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(!!interactiveMetadataId &&\n InteractiveRequests.interactiveMetadata(interactiveMetadataId));\n\n const interactive = Flight.useBasicFetch<Interactive>(!!interactiveMetadata.data?.interactiveId &&\n InteractiveRequests.interactive(interactiveMetadata.data.interactiveId));\n\n const shouldFetchResults = !!currentUser.data && !!interactive.data && (!!requestFilter);\n\n return Flight.useBasicFetch<InteractiveResultSet>(shouldFetchResults &&\n InteractiveResultsRequests.interactiveResultSet(\n interactiveMetadata.data.interactiveId,\n interactiveMetadata.data.id,\n currentUser.data,\n requestFilter,\n includePublicResults\n ));\n}","import { BaseError } from 'libs/common/backbone/core/BaseError';\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Core } from 'libs/common/core';\n\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { PrivateResourceError } from 'libs/shared/errors/general/private-resource/PrivateResourceError';\nimport { RegionLockedResourceError } from 'libs/shared/errors/general/region-locked-resource/RegionLockedResourceError';\nimport { UnspecifiedError } from 'libs/shared/errors/general/unspecified-error/UnspecifiedError';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nexport interface HttpErrorMap {\n notFound?: new () => BaseError;\n forbidden?: {\n rating?: new (description: string) => BaseError;\n yearLevel?: new (description: string) => BaseError;\n region?: new () => BaseError;\n privacy?: new (video?: VideoTypes) => BaseError;\n };\n badRequest?: new () => BaseError;\n internalServerError?: new () => BaseError;\n}\n\nexport type IgnoreHttpErrorMap = {\n [key in keyof HttpErrorMap]: boolean;\n};\n\nconst defaultErrors: HttpErrorMap = {\n notFound: NotFoundError,\n forbidden: {\n rating: PrivateResourceError,\n yearLevel: PrivateResourceError,\n region: RegionLockedResourceError,\n privacy: PrivateResourceError\n },\n badRequest: UnspecifiedError,\n internalServerError: UnspecifiedError\n};\n\nexport function handleHttpError(\n info: HttpStatus | Xhr,\n customErrorMap: HttpErrorMap = {},\n /**\n * Prevent certain errors in the errorMap from being thrown\n * so that you may implement your own handler\n */\n ignoreMap: IgnoreHttpErrorMap = {}\n): void {\n if (!info)\n return;\n\n let statusCode: HttpStatus;\n\n if (typeof(info) === 'number') {\n statusCode = info;\n } else {\n statusCode = info.status;\n }\n\n const errorMap = {\n ...defaultErrors,\n ...customErrorMap\n };\n\n if (!statusCode)\n return;\n\n if (!Core.ErrorHelper.isStatusCodeError(statusCode))\n return;\n\n if (statusCode === HttpStatus.InternalServer) {\n if (!ignoreMap.internalServerError)\n Core.ErrorHelper.throw(new UnspecifiedError());\n return;\n }\n\n if (statusCode === HttpStatus.NotFound) {\n if (!ignoreMap.notFound)\n Core.ErrorHelper.throw(new errorMap.notFound());\n return;\n }\n\n if (statusCode === HttpStatus.Forbidden) {\n /**\n * TODO: Work out how to go about handling all forbidden errors, such as region locking, year levels,\n * ratings, and privacy.\n */\n if (!ignoreMap.forbidden)\n Core.ErrorHelper.throw(new errorMap.forbidden.privacy());\n return;\n }\n\n if (!ignoreMap.badRequest)\n Core.ErrorHelper.throw(new errorMap.badRequest());\n}\n\nexport function handleXhrError(xhr: Xhr, customErrorMap?: HttpErrorMap): void {\n handleHttpError(xhr.status, customErrorMap);\n}","import { useEffect } from 'react';\n\nimport { 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 { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\n\nimport { useAnonSessions } from 'libs/shared/apps/analytics/hooks/UseAnonSessions';\nimport { useFetchInteractiveResults } from 'libs/shared/apps/analytics/hooks/UseFetchInteractiveResults';\nimport { AnalyticsFilterHelper } from 'libs/shared/apps/analytics/utils/AnalyticsFilterUtils';\nimport { getAudienceParams } from 'libs/shared/apps/analytics/utils/AudienceUtils';\nimport { getInsightsDateRangePresets, getStartEndParams } from 'libs/shared/apps/analytics/utils/DateRangeUtils';\nimport { SortStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { useLockContentWidth } from 'libs/shared/hooks/useLockContentWidth';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Config, Interactive, InteractiveMetadata } from 'libs/shared/interfaces';\n\nimport { InsightsHeader } from 'apps/my-shares/components/insights-header/InsightsHeader';\nimport { InteractiveInsightsQuestions } from 'apps/my-shares/components/interactive-insights-questions/InteractiveInsightsQuestions';\nimport { getInsightsInteractiveTabs } from 'apps/my-shares/utils/InsightsAppLinkUtils';\n\nconst namespace = 'shared.interactiveInsightsQuestionsView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\n\ninterface InteractiveInsightsQuestionsViewProps {\n interactiveId: string;\n interactionId: string;\n sortBy: SortStudentsBy;\n shareId?: string;\n}\n\nexport function InteractiveInsightsQuestionsView(props: InteractiveInsightsQuestionsViewProps) {\n const [anonymiseUsers] = useViewModel<boolean>(SharedViewModelKeys.ANONYMISE_USERS);\n\n useLockContentWidth();\n\n const { hasShareFlowV2 } = useSettings(null);\n\n const { hasPermissions } = usePermissions();\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(\n InteractiveRequests.interactiveMetadata(props.interactiveId)\n );\n\n const interactive = Flight.useBasicFetch<Interactive>(interactiveMetadata.data?.interactiveId &&\n InteractiveRequests.interactive(interactiveMetadata.data.interactiveId));\n\n const anonSessions = useAnonSessions(props.shareId);\n\n const audienceAppLinkParams = AnalyticsFilterHelper.getAudienceAppLinkParams();\n const dateRangeAppLinkParams = AnalyticsFilterHelper.getDateRangeAppLinkParams();\n\n const results = useFetchInteractiveResults(props.interactiveId, {\n ...getStartEndParams(getInsightsDateRangePresets(), dateRangeAppLinkParams),\n ...getAudienceParams(audienceAppLinkParams)\n }, true);\n\n\n useSetPageMetadata({ title: interactiveMetadata.data ? getPhrase('pageTitle', { video: interactiveMetadata.data?.name }) : null });\n useHandleObjectError([ interactive, interactiveMetadata, results ]);\n\n const hasDataLoaded = interactive.data && interactiveMetadata.data && !!results.data;\n\n const params = {\n ...audienceAppLinkParams,\n ...dateRangeAppLinkParams,\n shareId: props.shareId\n };\n\n return (\n <div className='px-3'>\n <InsightsHeader\n dateRangeAppLinkParams={dateRangeAppLinkParams}\n tabs={getInsightsInteractiveTabs(props.interactiveId, 'questions', params)}\n video={interactiveMetadata.data}\n hasAnalytics={hasPermissions(PermissionName.ViewCustomerAnalytics)}\n analyticsWebUrl={config.data?.analyticsWebUrl}\n hasShareFlowV2={hasShareFlowV2}\n shareId={props.shareId}\n />\n\n <InteractiveInsightsQuestions\n interactive={interactive.data}\n interactiveMetadata={interactiveMetadata.data}\n interactionId={props.interactionId}\n config={config.data}\n sortBy={props.sortBy}\n isFetching={results.isFetching || interactive.isFetching}\n anonymiseUsers={anonymiseUsers}\n results={results.data}\n hasDataLoaded={hasDataLoaded}\n anonSessions={anonSessions}\n />\n </div>\n );\n}"],"names":["DEFAULT_POLLING_INTERVAL","usePolling","callback","pollingInterval","pollingTrigger","setPollingTrigger","timeoutRef","t","current","window","setTimeout","clearTimeout","useAnonSessions","shareId","fetch","anonSessionsRequest","anonSessionsResponse","data","length","reduce","prev","sessionId","useFetchInteractiveResults","interactiveMetadataId","requestFilter","includePublicResults","currentUser","interactiveMetadata","interactive","interactiveId","shouldFetchResults","I","id","defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","internalServerError","handleHttpError","info","customErrorMap","ignoreMap","statusCode","status","errorMap","generateCacheKey","flightObjs","map","obj","join","useHandleObjectError","_flightObjs","customErrors","ignoreErrors","Array","isArray","useEffect","forEach","getPhrase","InteractiveInsightsQuestionsView","props","anonymiseUsers","hasShareFlowV2","hasPermissions","config","anonSessions","audienceAppLinkParams","dateRangeAppLinkParams","results","title","video","name","hasDataLoaded","params","className","tabs","hasAnalytics","analyticsWebUrl","interactionId","sortBy","isFetching"],"sourceRoot":""}
|