@clickview/lite 0.73.1 → 0.74.0-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundles.json +2 -2
- package/dist/css/{7122-lite-a094f8fe17.chunk.css → 7122-lite-e0652641e4.chunk.css} +1 -1
- package/dist/css/{4499-lite-c43d17524f.chunk.css → 7150-lite-60d455ba66.chunk.css} +1 -1
- package/dist/css/{lite-app-10d57977f3.css → lite-app-98b3200025.css} +1 -1
- package/dist/languages/en.json +1 -1
- package/dist/scripts/{1362-061cd588c0-lite.chunk.js → 1362-56810ef4c8-lite.chunk.js} +3 -3
- package/dist/scripts/1362-56810ef4c8-lite.chunk.js.map +1 -0
- package/dist/scripts/{1367-12750422b0-lite.chunk.js → 1367-e0481edee3-lite.chunk.js} +2 -2
- package/dist/scripts/1367-e0481edee3-lite.chunk.js.map +1 -0
- package/dist/scripts/{1735-c0f3f1238a-lite.chunk.js → 1735-e4cdbc46ed-lite.chunk.js} +3 -3
- package/dist/scripts/1735-e4cdbc46ed-lite.chunk.js.map +1 -0
- package/dist/scripts/{324-6d6ee95d5d-lite.chunk.js → 324-e7a99b7d52-lite.chunk.js} +2 -2
- package/dist/scripts/{324-6d6ee95d5d-lite.chunk.js.map → 324-e7a99b7d52-lite.chunk.js.map} +1 -1
- package/dist/scripts/{3252-22fac3da15-lite.chunk.js → 3252-50b5c19f19-lite.chunk.js} +1 -1
- package/dist/scripts/{3252-22fac3da15-lite.chunk.js.map → 3252-50b5c19f19-lite.chunk.js.map} +1 -1
- package/dist/scripts/3677-4904f30c6a-lite.chunk.js +2 -0
- package/dist/scripts/3677-4904f30c6a-lite.chunk.js.map +1 -0
- package/dist/scripts/{3781-7a9ddc7736-lite.chunk.js → 3781-e092f92668-lite.chunk.js} +2 -2
- package/dist/scripts/{3781-7a9ddc7736-lite.chunk.js.map → 3781-e092f92668-lite.chunk.js.map} +1 -1
- package/dist/scripts/{3823-e38a508a3c-lite.chunk.js → 3823-0dc1972eb2-lite.chunk.js} +2 -2
- package/dist/scripts/3823-0dc1972eb2-lite.chunk.js.map +1 -0
- package/dist/scripts/3915-abd9a65a08-lite.chunk.js +2 -0
- package/dist/scripts/3915-abd9a65a08-lite.chunk.js.map +1 -0
- package/dist/scripts/{3978-09fb1f250e-lite.chunk.js → 3978-a551dd2648-lite.chunk.js} +2 -2
- package/dist/scripts/3978-a551dd2648-lite.chunk.js.map +1 -0
- package/dist/scripts/{4013-d31272b42a-lite.chunk.js → 4013-6f68d7031e-lite.chunk.js} +1 -1
- package/dist/scripts/{4013-d31272b42a-lite.chunk.js.map → 4013-6f68d7031e-lite.chunk.js.map} +1 -1
- package/dist/scripts/{4014-4225ce1eb6-lite.chunk.js → 4014-3eccce2f89-lite.chunk.js} +3 -3
- package/dist/scripts/4014-3eccce2f89-lite.chunk.js.map +1 -0
- package/dist/scripts/{4050-cf35c4ec45-lite.chunk.js → 4050-ffe5b6ae6d-lite.chunk.js} +2 -2
- package/dist/scripts/{4050-cf35c4ec45-lite.chunk.js.map → 4050-ffe5b6ae6d-lite.chunk.js.map} +1 -1
- package/dist/scripts/{4061-525ef00f69-lite.chunk.js → 4061-100002abf6-lite.chunk.js} +2 -2
- package/dist/scripts/4061-100002abf6-lite.chunk.js.map +1 -0
- package/dist/scripts/4191-9a08c4b205-lite.chunk.js +2 -0
- package/dist/scripts/4191-9a08c4b205-lite.chunk.js.map +1 -0
- package/dist/scripts/{4358-b21c24f96a-lite.chunk.js → 4358-a1bbca8249-lite.chunk.js} +1 -1
- package/dist/scripts/{4358-b21c24f96a-lite.chunk.js.map → 4358-a1bbca8249-lite.chunk.js.map} +1 -1
- package/dist/scripts/{4400-8c36fb4ab5-lite.chunk.js → 4400-755a158a52-lite.chunk.js} +2 -2
- package/dist/scripts/4400-755a158a52-lite.chunk.js.map +1 -0
- package/dist/scripts/4806-13c9302b2c-lite.chunk.js +2 -0
- package/dist/scripts/4806-13c9302b2c-lite.chunk.js.map +1 -0
- package/dist/scripts/{5135-864055ab0b-lite.chunk.js → 5135-166ec46620-lite.chunk.js} +2 -2
- package/dist/scripts/5135-166ec46620-lite.chunk.js.map +1 -0
- package/dist/scripts/{5143-286c66de2b-lite.chunk.js → 5143-d6c4a357ea-lite.chunk.js} +2 -2
- package/dist/scripts/5143-d6c4a357ea-lite.chunk.js.map +1 -0
- package/dist/scripts/{5743-a764171a6d-lite.chunk.js → 5743-14700e4f76-lite.chunk.js} +2 -2
- package/dist/scripts/5743-14700e4f76-lite.chunk.js.map +1 -0
- package/dist/scripts/{6030-5db8cc1bc4-lite.chunk.js → 6030-c2e07df714-lite.chunk.js} +2 -2
- package/dist/scripts/6030-c2e07df714-lite.chunk.js.map +1 -0
- package/dist/scripts/{618-4334f9451b-lite.chunk.js → 618-996d8b560b-lite.chunk.js} +2 -2
- package/dist/scripts/618-996d8b560b-lite.chunk.js.map +1 -0
- package/dist/scripts/{6207-f444184025-lite.chunk.js → 6207-be843186e0-lite.chunk.js} +1 -1
- package/dist/scripts/{6207-f444184025-lite.chunk.js.map → 6207-be843186e0-lite.chunk.js.map} +1 -1
- package/dist/scripts/{6413-c4333e80d4-lite.chunk.js → 6413-caaae6a383-lite.chunk.js} +3 -3
- package/dist/scripts/{6413-c4333e80d4-lite.chunk.js.map → 6413-caaae6a383-lite.chunk.js.map} +1 -1
- package/dist/scripts/{6646-24a34f7d99-lite.chunk.js → 6646-c5775f6553-lite.chunk.js} +3 -3
- package/dist/scripts/6646-c5775f6553-lite.chunk.js.map +1 -0
- package/dist/scripts/{6909-8a45942b63-lite.chunk.js → 6909-6805b6a0d9-lite.chunk.js} +2 -2
- package/dist/scripts/6909-6805b6a0d9-lite.chunk.js.map +1 -0
- package/dist/scripts/7064-b3bafc599f-lite.chunk.js +2 -0
- package/dist/scripts/7064-b3bafc599f-lite.chunk.js.map +1 -0
- package/dist/scripts/7122-dbf374af58-lite.chunk.js +2 -0
- package/dist/scripts/7122-dbf374af58-lite.chunk.js.map +1 -0
- package/dist/scripts/7150-93a205975c-lite.chunk.js +2 -0
- package/dist/scripts/7150-93a205975c-lite.chunk.js.map +1 -0
- package/dist/scripts/{7234-85d4acaa33-lite.chunk.js → 7234-bcddfe2112-lite.chunk.js} +2 -2
- package/dist/scripts/7234-bcddfe2112-lite.chunk.js.map +1 -0
- package/dist/scripts/{7383-690bc234f1-lite.chunk.js → 7383-02d4956304-lite.chunk.js} +2 -2
- package/dist/scripts/7383-02d4956304-lite.chunk.js.map +1 -0
- package/dist/scripts/{7873-2e64f4eb37-lite.chunk.js → 7873-0ce0523a28-lite.chunk.js} +2 -2
- package/dist/scripts/{7873-2e64f4eb37-lite.chunk.js.map → 7873-0ce0523a28-lite.chunk.js.map} +1 -1
- package/dist/scripts/{8248-050265ed2d-lite.chunk.js → 8248-41dad9bf71-lite.chunk.js} +3 -3
- package/dist/scripts/8248-41dad9bf71-lite.chunk.js.map +1 -0
- package/dist/scripts/8385-6ef08fa319-lite.chunk.js +2 -0
- package/dist/scripts/8385-6ef08fa319-lite.chunk.js.map +1 -0
- package/dist/scripts/{8451-1cb649a3f3-lite.chunk.js → 8451-0103210a8f-lite.chunk.js} +2 -2
- package/dist/scripts/8451-0103210a8f-lite.chunk.js.map +1 -0
- package/dist/scripts/8630-80f676dcda-lite.chunk.js +2 -0
- package/dist/scripts/8630-80f676dcda-lite.chunk.js.map +1 -0
- package/dist/scripts/8891-5118c47b59-lite.chunk.js +2 -0
- package/dist/scripts/8891-5118c47b59-lite.chunk.js.map +1 -0
- package/dist/scripts/8982-b9e53e43ec-lite.chunk.js +2 -0
- package/dist/scripts/8982-b9e53e43ec-lite.chunk.js.map +1 -0
- package/dist/scripts/{9186-daf77d7174-lite.chunk.js → 9186-c1d2615458-lite.chunk.js} +2 -2
- package/dist/scripts/9186-c1d2615458-lite.chunk.js.map +1 -0
- package/dist/scripts/{9241-dbac9cb9f9-lite.chunk.js → 9241-2386134dd3-lite.chunk.js} +2 -2
- package/dist/scripts/9241-2386134dd3-lite.chunk.js.map +1 -0
- package/dist/scripts/{9345-30ccf524c5-lite.chunk.js → 9345-0a7f58bb53-lite.chunk.js} +3 -3
- package/dist/scripts/9345-0a7f58bb53-lite.chunk.js.map +1 -0
- package/dist/scripts/9352-d4b2dc16a8-lite.chunk.js +2 -0
- package/dist/scripts/9352-d4b2dc16a8-lite.chunk.js.map +1 -0
- package/dist/scripts/{9503-275c13891d-lite.chunk.js → 9503-715c46ecc1-lite.chunk.js} +2 -2
- package/dist/scripts/9503-715c46ecc1-lite.chunk.js.map +1 -0
- package/dist/scripts/9630-ca2a850260-lite.chunk.js +2 -0
- package/dist/scripts/9630-ca2a850260-lite.chunk.js.map +1 -0
- package/dist/scripts/{9767-d69fdc31b0-lite.chunk.js → 9767-1b583ceb6c-lite.chunk.js} +2 -2
- package/dist/scripts/9767-1b583ceb6c-lite.chunk.js.map +1 -0
- package/dist/scripts/9894-7c119a8fe3-lite.chunk.js +2 -0
- package/dist/scripts/9894-7c119a8fe3-lite.chunk.js.map +1 -0
- package/dist/scripts/bundle-5b65703152.min.js +3 -0
- package/dist/scripts/{bundle-0075afb6af.min.js.map → bundle-5b65703152.min.js.map} +1 -1
- package/package.json +1 -1
- package/dist/scripts/1362-061cd588c0-lite.chunk.js.map +0 -1
- package/dist/scripts/1367-12750422b0-lite.chunk.js.map +0 -1
- package/dist/scripts/1735-c0f3f1238a-lite.chunk.js.map +0 -1
- package/dist/scripts/3677-20958f59d3-lite.chunk.js +0 -2
- package/dist/scripts/3677-20958f59d3-lite.chunk.js.map +0 -1
- package/dist/scripts/3823-e38a508a3c-lite.chunk.js.map +0 -1
- package/dist/scripts/3915-a1f15d687a-lite.chunk.js +0 -2
- package/dist/scripts/3915-a1f15d687a-lite.chunk.js.map +0 -1
- package/dist/scripts/3978-09fb1f250e-lite.chunk.js.map +0 -1
- package/dist/scripts/4014-4225ce1eb6-lite.chunk.js.map +0 -1
- package/dist/scripts/4061-525ef00f69-lite.chunk.js.map +0 -1
- package/dist/scripts/4191-7612e1713c-lite.chunk.js +0 -2
- package/dist/scripts/4191-7612e1713c-lite.chunk.js.map +0 -1
- package/dist/scripts/4400-8c36fb4ab5-lite.chunk.js.map +0 -1
- package/dist/scripts/4499-1365934bf2-lite.chunk.js +0 -2
- package/dist/scripts/4499-1365934bf2-lite.chunk.js.map +0 -1
- package/dist/scripts/4806-384760d9c9-lite.chunk.js +0 -2
- package/dist/scripts/4806-384760d9c9-lite.chunk.js.map +0 -1
- package/dist/scripts/5135-864055ab0b-lite.chunk.js.map +0 -1
- package/dist/scripts/5143-286c66de2b-lite.chunk.js.map +0 -1
- package/dist/scripts/5743-a764171a6d-lite.chunk.js.map +0 -1
- package/dist/scripts/6030-5db8cc1bc4-lite.chunk.js.map +0 -1
- package/dist/scripts/618-4334f9451b-lite.chunk.js.map +0 -1
- package/dist/scripts/6646-24a34f7d99-lite.chunk.js.map +0 -1
- package/dist/scripts/6909-8a45942b63-lite.chunk.js.map +0 -1
- package/dist/scripts/7064-3ccf1b82d1-lite.chunk.js +0 -2
- package/dist/scripts/7064-3ccf1b82d1-lite.chunk.js.map +0 -1
- package/dist/scripts/7122-352fdd3516-lite.chunk.js +0 -2
- package/dist/scripts/7122-352fdd3516-lite.chunk.js.map +0 -1
- package/dist/scripts/7234-85d4acaa33-lite.chunk.js.map +0 -1
- package/dist/scripts/7383-690bc234f1-lite.chunk.js.map +0 -1
- package/dist/scripts/8248-050265ed2d-lite.chunk.js.map +0 -1
- package/dist/scripts/8385-083e882d77-lite.chunk.js +0 -2
- package/dist/scripts/8385-083e882d77-lite.chunk.js.map +0 -1
- package/dist/scripts/8451-1cb649a3f3-lite.chunk.js.map +0 -1
- package/dist/scripts/8630-0945271ea2-lite.chunk.js +0 -2
- package/dist/scripts/8630-0945271ea2-lite.chunk.js.map +0 -1
- package/dist/scripts/8891-393bb5bdaf-lite.chunk.js +0 -2
- package/dist/scripts/8891-393bb5bdaf-lite.chunk.js.map +0 -1
- package/dist/scripts/8982-8c21fab48a-lite.chunk.js +0 -2
- package/dist/scripts/8982-8c21fab48a-lite.chunk.js.map +0 -1
- package/dist/scripts/9186-daf77d7174-lite.chunk.js.map +0 -1
- package/dist/scripts/9241-dbac9cb9f9-lite.chunk.js.map +0 -1
- package/dist/scripts/9345-30ccf524c5-lite.chunk.js.map +0 -1
- package/dist/scripts/9352-04db4c533d-lite.chunk.js +0 -2
- package/dist/scripts/9352-04db4c533d-lite.chunk.js.map +0 -1
- package/dist/scripts/9503-275c13891d-lite.chunk.js.map +0 -1
- package/dist/scripts/9630-285237c980-lite.chunk.js +0 -2
- package/dist/scripts/9630-285237c980-lite.chunk.js.map +0 -1
- package/dist/scripts/9767-d69fdc31b0-lite.chunk.js.map +0 -1
- package/dist/scripts/9894-10943e41f7-lite.chunk.js +0 -2
- package/dist/scripts/9894-10943e41f7-lite.chunk.js.map +0 -1
- package/dist/scripts/bundle-0075afb6af.min.js +0 -3
- /package/dist/scripts/{1362-061cd588c0-lite.chunk.js.LICENSE.txt → 1362-56810ef4c8-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{1735-c0f3f1238a-lite.chunk.js.LICENSE.txt → 1735-e4cdbc46ed-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{4014-4225ce1eb6-lite.chunk.js.LICENSE.txt → 4014-3eccce2f89-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{4050-cf35c4ec45-lite.chunk.js.LICENSE.txt → 4050-ffe5b6ae6d-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{6413-c4333e80d4-lite.chunk.js.LICENSE.txt → 6413-caaae6a383-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{6646-24a34f7d99-lite.chunk.js.LICENSE.txt → 6646-c5775f6553-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{8248-050265ed2d-lite.chunk.js.LICENSE.txt → 8248-41dad9bf71-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{9345-30ccf524c5-lite.chunk.js.LICENSE.txt → 9345-0a7f58bb53-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{bundle-0075afb6af.min.js.LICENSE.txt → bundle-5b65703152.min.js.LICENSE.txt} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/324-6d6ee95d5d-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/components/typeform-wrapper/TypeformWrapper.tsx","file:///app/packages/projects/lite/src/shared/enums/FeedbackStatus.ts","file:///app/packages/projects/lite/src/shared/flight-requests/UpgradeRequests.ts","file:///app/packages/projects/lite/src/shared/views/lite-upgrade-feedback/components/ErrorForm.tsx","file:///app/packages/projects/lite/src/shared/views/lite-upgrade-feedback/components/FeedbackOptions.tsx","file:///app/packages/projects/lite/src/shared/views/lite-upgrade-feedback/utils/getFeedbackOptions.ts","file:///app/packages/projects/lite/src/shared/views/lite-upgrade-feedback/lite-upgrade-feedback.scss","file:///app/packages/projects/lite/src/shared/views/lite-upgrade-feedback/LiteUpgradeFeedbackView.tsx"],"sourcesContent":["import React from 'react';\nimport { Spinner } from 'react-bootstrap';\nimport { Widget } from '@typeform/embed-react';\n\nimport { EnvironmentVariables } from 'libs/common/backbone/services/EnvironmentVariables';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nconst LOAD_TIMEOUT = 6000; // 6 seconds\n\ninterface TypeformWrapperProps {\n formId: string;\n hiddenFields?: HashObject;\n onSubmit?: () => void;\n onReady?: () => void;\n onLoadTmeout?: () => void;\n height?: string;\n}\n\nexport const TypeformWrapper = React.memo(function(props: TypeformWrapperProps): React.ReactElement {\n const timeoutId = React.useRef<number>(null);\n const [ loaded, setLoaded ] = React.useState(false);\n\n React.useEffect(() => {\n setLoaded(false);\n\n /**\n * We give the typeform a certain amount of time to load. If that time expired\n * we make the assumption that typeform didn't load (Most likely because of a school firewall)\n * and we fall back to using our own, very simple form\n */\n timeoutId.current = window.setTimeout(() => {\n props.onLoadTmeout();\n }, LOAD_TIMEOUT);\n }, [props.formId]);\n\n function onReady(): void {\n if (timeoutId.current)\n window.clearTimeout(timeoutId.current);\n\n setLoaded(true);\n props.onReady && props.onReady();\n }\n\n return (\n <>\n <div className={loaded ? '' : 'd-none'}>\n <Widget\n id={props.formId}\n style={{\n height: props.height\n }}\n hideHeaders={true}\n hideFooter={false}\n opacity={0}\n hidden={props.hiddenFields}\n enableSandbox={EnvironmentVariables.isDevelopment}\n onSubmit={props.onSubmit}\n onReady={onReady}\n />\n </div>\n {!loaded &&\n <div className={`d-flex justify-content-center align-items-center`} style={{ height: props.height }}>\n <Spinner as='div' animation='border' role='status' />\n </div>\n }\n </>\n );\n}, () => true);\n/**\n * We don't want this component to re-render when a parent component is re-rendered\n * as it resets the form state. The props should never change\n */","export enum FeedbackStatus {\n Skipped = 'skipped',\n Submitted = 'submitted'\n}","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Flight } from 'libs/common/flight';\n\ninterface UpgradeFeedback {\n userId: string;\n customerId: string;\n instanceRegion: string;\n crmId: string;\n type: string;\n text: string;\n}\n\nexport const UpgradeRequests = {\n errorFeedback(\n data: UpgradeFeedback,\n success?: () => void,\n error?: () => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: '/api/upgrade/feedback',\n key: 'upgrade:error:feedback',\n type: HttpVerbs.POST,\n data,\n success,\n error,\n always\n };\n }\n};","import React from 'react';\n\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\ninterface ErrorFormProps {\n question: string;\n onSubmit: (text: string) => void;\n submitText: string;\n}\n\nexport function ErrorForm(props: ErrorFormProps): React.ReactElement {\n const [ errorFormText, setErrorFormText ] = React.useState('');\n\n function onChangeErrorForm(e: React.ChangeEvent<HTMLTextAreaElement>): void {\n setErrorFormText(e.target.value);\n }\n\n return (\n <>\n <div className='form-group'>\n <label htmlFor='feedback'>{props.question}</label>\n <textarea className='form-control' id='feedback' value={errorFormText} onChange={onChangeErrorForm}></textarea>\n </div>\n <PopupButtons>\n <PopupButtons.Submit text={props.submitText} variant='dark' onClick={() => props.onSubmit(errorFormText)} />\n </PopupButtons>\n </>\n );\n}","import React from 'react';\n\nimport { FeedbackOption } from 'shared/views/lite-upgrade-feedback/interfaces/FeedbackOption';\n\ninterface FeedbackOptionsProps {\n options: FeedbackOption[];\n onClick: (option: FeedbackOption) => void;\n optionClassName: string;\n imageClassName: string;\n promptText: string;\n}\n\nexport function FeedbackOptions(props: FeedbackOptionsProps): React.ReactElement {\n return (\n <div className='row mb-2'>\n <p className='mx-2'>{props.promptText}</p>\n {props.options.map((o, i) => {\n return (\n <div key={i} className='col-lg-4 col-6 pb-2'>\n <div className={`w-100 cursor-pointer text-center border rounded py-3 ${props.optionClassName}`} onClick={() => props.onClick(o)}>\n <div className={`${props.imageClassName} w-100 mb-3`} style={{ backgroundImage: `url(\"${o.imageUrl}\")` }} />\n <span className='fw-bolder'>{o.displayText}</span>\n </div>\n </div>\n );\n })}\n </div>\n );\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { FeedbackOption } from 'shared/views/lite-upgrade-feedback/interfaces/FeedbackOption';\n\nconst namespace = 'shared.liteUpgradeFeedback';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst DEFAULT_HEIGHT = '500px';\n\nexport function getFeedbackOptions(): FeedbackOption[] {\n return [\n {\n name: 'missing-features',\n displayText: getPhrase('missingFeatures'),\n imageUrl: ImageUrls.Upgrade.MISSING_FEATURES,\n formId: 'WEanoLcI',\n fallbackQuestion: getPhrase('missingFeaturesFallback'),\n height: DEFAULT_HEIGHT\n },\n {\n name: 'bug',\n displayText: getPhrase('bug'),\n imageUrl: ImageUrls.Upgrade.BUG,\n formId: 'i4PCcQyO',\n fallbackQuestion: getPhrase('bugFallback'),\n height: '650px'\n },\n {\n name: 'process',\n displayText: getPhrase('process'),\n imageUrl: ImageUrls.Upgrade.PROCESS,\n formId: 'tblnlrIN',\n fallbackQuestion: getPhrase('processFallback'),\n height: DEFAULT_HEIGHT\n },\n {\n name: 'old-look',\n displayText: getPhrase('oldLook'),\n imageUrl: ImageUrls.Upgrade.OLD_LOOK,\n formId: 'Zf1iXAGw',\n fallbackQuestion: getPhrase('oldLookFallback'),\n height: '570px'\n },\n {\n name: 'wrong-time',\n displayText: getPhrase('wrongTime'),\n imageUrl: ImageUrls.Upgrade.WRONG_TIME,\n formId: 'q9Qmi8qX',\n fallbackQuestion: getPhrase('wrongTimeFallback'),\n height: '630px'\n },\n {\n name: 'other',\n displayText: getPhrase('other'),\n imageUrl: ImageUrls.Upgrade.OTHER,\n formId: 'HDHV6YhU',\n fallbackQuestion: getPhrase('otherFallback'),\n height: DEFAULT_HEIGHT\n }\n ];\n}","// extracted by mini-css-extract-plugin\nexport default {\"image\":\"lRdl8\",\"option\":\"hSaJ1\",\"formHeight\":\"P2hDj\",\"errorFeedbackSuccess\":\"koNOV\"};","import React from 'react';\nimport { Spinner } from 'react-bootstrap';\nimport { useDispatch } from 'react-redux';\n\nimport { LocationUtils } from 'libs/common/backbone/core';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, UpgradeBannerDescriptors, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\nimport { UrlHelper } from 'libs/analytics/utils/UrlHelper';\n\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { TypeformWrapper } from 'libs/shared/components/typeform-wrapper/TypeformWrapper';\nimport { SettingKind } from 'libs/shared/enums/SettingKind';\nimport { SettingName } from 'libs/shared/enums/SettingName';\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 { useLiteUpgrade } from 'libs/shared/hooks/UseLiteUpgrade';\nimport { UpgradeType } from 'libs/shared/hooks/UseLiteUpgrade';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Config, CurrentUser, Customer, PopupViewProps } from 'libs/shared/interfaces';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { FeedbackStatus } from 'shared/enums/FeedbackStatus';\nimport { UpgradeRequests } from 'shared/flight-requests/UpgradeRequests';\nimport { ErrorForm } from 'shared/views/lite-upgrade-feedback/components/ErrorForm';\nimport { FeedbackOptions } from 'shared/views/lite-upgrade-feedback/components/FeedbackOptions';\nimport { FeedbackOption } from 'shared/views/lite-upgrade-feedback/interfaces/FeedbackOption';\nimport { getFeedbackOptions } from 'shared/views/lite-upgrade-feedback/utils/getFeedbackOptions';\n\nimport styles from './lite-upgrade-feedback.scss';\n\nconst namespace = 'shared.liteUpgradeFeedback';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface LiteUpgradeFeedbackViewProps extends PopupViewProps {\n goToOnline: boolean;\n}\n\ntype Steps = 'options' | 'form' | 'error-form' | 'error-form-success' | 'redirecting';\n\nexport function LiteUpgradeFeedbackView(props: LiteUpgradeFeedbackViewProps): React.ReactElement {\n const dispatch = useDispatch();\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const customer = Flight.useBasicFetch<Customer>(currentUser.data &&\n CustomerRequests.customer(currentUser.data.customerId));\n\n const liteUpgrade = useLiteUpgrade();\n const { updateSetting } = useSettings(LocationContext.LiteUpgradeFeedbackPopup);\n\n const [ step, setStep ] = React.useState<Steps>('options');\n const [ option, setOption ] = React.useState<FeedbackOption>();\n\n const [ button, setButton ] = React.useState<'back' | 'close' | 'none'>('none');\n\n const options = React.useMemo(() => getFeedbackOptions(), []);\n\n React.useEffect(() => {\n if (!props.goToOnline)\n return;\n\n setButton('back');\n }, [props.goToOnline]);\n\n function onClickOption(selectedOption: FeedbackOption): void {\n setOption(selectedOption);\n setStep('form');\n setButton('none');\n }\n\n function redirectToOnline(skippedFeedback: boolean): void {\n const onlineUrl = UrlHelper.safeUrlConcat(config.data.onlineUrl, '/enable-online?loginPrompt=false');\n\n // If the user skipped giving feedback, show a spinner and redirect\n if (skippedFeedback) {\n setStep('redirecting');\n window.setTimeout(() => LocationUtils.PageLoad(onlineUrl), 500);\n return;\n }\n\n /**\n * If the user did not skip giving feedback, we allow the typeform\n * \"thank you\" UI to display for a moment then redirect\n */\n window.setTimeout(() => LocationUtils.PageLoad(onlineUrl), 1500);\n }\n\n function updateFeedbackStatus(status: FeedbackStatus): void {\n if (liteUpgrade.feedbackStatus === FeedbackStatus.Submitted) {\n onWorkflowFinished(status === FeedbackStatus.Skipped);\n return;\n }\n\n const newSetting = {\n name: SettingName.LiteUpgradeFeedback,\n kind: SettingKind.Temporary,\n value: status\n };\n\n updateSetting(\n currentUser.data.id,\n newSetting,\n null,\n null,\n () => onWorkflowFinished(status === FeedbackStatus.Skipped)\n );\n }\n\n function onWorkflowFinished(skippedFeedback: boolean): void {\n if (!props.goToOnline) {\n AnalyticsHelper.logUserAction({\n upgradeType: liteUpgrade.upgradeType\n }, {\n actionType: UserAction.Click,\n location: LocationContext.LiteUpgradeBanner,\n entity: EntityType.User,\n descriptor: UpgradeBannerDescriptors.Feedback,\n workflowPhase: WorkflowPhase.Complete\n });\n setButton('close');\n\n return;\n }\n\n AnalyticsHelper.logUserAction({\n upgradeType: liteUpgrade.upgradeType,\n skippedFeedback\n }, {\n actionType: UserAction.Click,\n location: LocationContext.LiteUpgradeBanner,\n entity: EntityType.User,\n descriptor: UpgradeBannerDescriptors.GoToOnline,\n workflowPhase: WorkflowPhase.Complete\n });\n\n if (liteUpgrade.upgradeType === UpgradeType.Lite) {\n const newSetting = {\n name: SettingName.LiteUpgradeTypeUser,\n kind: SettingKind.Temporary,\n value: UpgradeType.Launch\n };\n \n updateSetting(\n currentUser.data.id,\n newSetting,\n null,\n null,\n () => redirectToOnline(skippedFeedback)\n );\n return;\n }\n\n redirectToOnline(skippedFeedback);\n }\n\n /**\n * Normally the data is saved by typeform, however if \n * we're using our backup form, we need to save the data ourselves\n */\n function onErrorFormSubmit(text: string): void {\n const data = {\n userId: currentUser.data.id,\n customerId: currentUser.data.customerId,\n instanceRegion: currentUser.data.instanceRegion,\n crmId: customer.data.crmId,\n type: option.name,\n text\n };\n\n Flight.fetch(\n dispatch,\n UpgradeRequests.errorFeedback(\n data,\n null,\n null,\n () => {\n setStep('error-form-success');\n updateFeedbackStatus(text ? FeedbackStatus.Submitted : FeedbackStatus.Skipped);\n }\n )\n );\n }\n\n if (!liteUpgrade.isLoading && !liteUpgrade.isUpgrading) {\n props.closePopup();\n return <></>;\n }\n\n const isLoaded = (\n !!currentUser.data &&\n !!customer.data &&\n !!config.data &&\n !liteUpgrade.isLoading\n );\n\n if (!isLoaded) {\n return <Popup title={getPhrase('title')} closePopup={props.closePopup} size='lg' showLoadingSpinner></Popup>;\n }\n\n return (\n <Popup title={getPhrase('title')} closePopup={props.closePopup} size='lg' >\n {/* Shows first */}\n {step === 'options' &&\n <FeedbackOptions\n options={options}\n onClick={onClickOption}\n optionClassName={styles.option}\n imageClassName={styles.image}\n promptText={getPhrase('optionHeading')}\n />\n }\n\n {/* Shows after an option is selected */}\n {step === 'form' &&\n <TypeformWrapper\n formId={option.formId}\n hiddenFields={{\n userId: currentUser.data.id,\n customerId: currentUser.data.customerId,\n instanceRegion: currentUser.data.instanceRegion,\n crmId: customer.data.crmId,\n reason: option.name\n }}\n height={option.height}\n onSubmit={() => updateFeedbackStatus(FeedbackStatus.Submitted)}\n onReady={() => setStep('form')}\n onLoadTmeout={() => setStep('error-form')}\n />\n }\n\n {/* Only shows if the typeform fails to load */}\n {step === 'error-form' &&\n <ErrorForm\n question={option.fallbackQuestion}\n onSubmit={onErrorFormSubmit}\n submitText={props.goToOnline ? getPhrase('takeMeBack') : getPhrase('submit')}\n />\n }\n\n {step === 'error-form-success' &&\n <div className='text-center'>\n <img className={`px-5 img-fluid ${styles.errorFeedbackSuccess}`} src={ImageUrls.SUCCESS} />\n <p><Text namespace={namespace} phrase='thankYou' /></p>\n </div>}\n\n {/* Shows when redirecting to online */}\n {step === 'redirecting' &&\n <div className={`d-flex justify-content-center align-items-center ${styles.formHeight}`}>\n <Spinner as='div' animation='border' role='status' />\n </div>\n }\n\n {button !== 'none' && (\n <PopupButtons>\n {button === 'back' && (\n <PopupButtons.Cancel text={getPhrase('takeMeBack')} onClick={() => updateFeedbackStatus(FeedbackStatus.Skipped)} />\n )}\n\n {button === 'close' && (\n <PopupButtons.Cancel variant='dark' text={getPhrase('close')} onClick={props.closePopup} />\n )}\n </PopupButtons>\n )}\n </Popup>\n );\n}"],"names":["FeedbackStatus","TypeformWrapper","props","timeoutId","loaded","setLoaded","current","window","setTimeout","onLoadTmeout","formId","className","Widget","id","style","height","hideHeaders","hideFooter","opacity","hidden","hiddenFields","enableSandbox","EnvironmentVariables","onSubmit","onReady","clearTimeout","Spinner","as","animation","role","UpgradeRequests","errorFeedback","data","success","error","always","url","key","type","HttpVerbs","ErrorForm","errorFormText","setErrorFormText","htmlFor","question","value","onChange","e","target","PopupButtons","text","submitText","variant","onClick","FeedbackOptions","promptText","options","map","o","i","optionClassName","imageClassName","backgroundImage","imageUrl","displayText","getPhrase","LanguageService","DEFAULT_HEIGHT","LiteUpgradeFeedbackView","dispatch","config","ConfigRequests","currentUser","UserRequests","customer","CustomerRequests","customerId","liteUpgrade","updateSetting","useSettings","step","setStep","option","setOption","button","setButton","name","ImageUrls","fallbackQuestion","redirectToOnline","skippedFeedback","onlineUrl","UrlHelper","updateFeedbackStatus","status","feedbackStatus","Submitted","newSetting","SettingName","kind","SettingKind","onWorkflowFinished","Skipped","goToOnline","AnalyticsHelper","upgradeType","actionType","location","entity","descriptor","workflowPhase","isLoading","isUpgrading","Popup","title","closePopup","size","selectedOption","userId","instanceRegion","crmId","reason","src","Text","namespace","phrase","showLoadingSpinner"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"scripts/324-e7a99b7d52-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/components/typeform-wrapper/TypeformWrapper.tsx","file:///app/packages/projects/lite/src/shared/enums/FeedbackStatus.ts","file:///app/packages/projects/lite/src/shared/flight-requests/UpgradeRequests.ts","file:///app/packages/projects/lite/src/shared/views/lite-upgrade-feedback/components/ErrorForm.tsx","file:///app/packages/projects/lite/src/shared/views/lite-upgrade-feedback/components/FeedbackOptions.tsx","file:///app/packages/projects/lite/src/shared/views/lite-upgrade-feedback/utils/getFeedbackOptions.ts","file:///app/packages/projects/lite/src/shared/views/lite-upgrade-feedback/lite-upgrade-feedback.scss","file:///app/packages/projects/lite/src/shared/views/lite-upgrade-feedback/LiteUpgradeFeedbackView.tsx"],"sourcesContent":["import React from 'react';\nimport { Spinner } from 'react-bootstrap';\nimport { Widget } from '@typeform/embed-react';\n\nimport { EnvironmentVariables } from 'libs/common/backbone/services/EnvironmentVariables';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nconst LOAD_TIMEOUT = 6000; // 6 seconds\n\ninterface TypeformWrapperProps {\n formId: string;\n hiddenFields?: HashObject;\n onSubmit?: () => void;\n onReady?: () => void;\n onLoadTmeout?: () => void;\n height?: string;\n}\n\nexport const TypeformWrapper = React.memo(function(props: TypeformWrapperProps): React.ReactElement {\n const timeoutId = React.useRef<number>(null);\n const [ loaded, setLoaded ] = React.useState(false);\n\n React.useEffect(() => {\n setLoaded(false);\n\n /**\n * We give the typeform a certain amount of time to load. If that time expired\n * we make the assumption that typeform didn't load (Most likely because of a school firewall)\n * and we fall back to using our own, very simple form\n */\n timeoutId.current = window.setTimeout(() => {\n props.onLoadTmeout();\n }, LOAD_TIMEOUT);\n }, [props.formId]);\n\n function onReady(): void {\n if (timeoutId.current)\n window.clearTimeout(timeoutId.current);\n\n setLoaded(true);\n props.onReady && props.onReady();\n }\n\n return (\n <>\n <div className={loaded ? '' : 'd-none'}>\n <Widget\n id={props.formId}\n style={{\n height: props.height\n }}\n hideHeaders={true}\n hideFooter={false}\n opacity={0}\n hidden={props.hiddenFields}\n enableSandbox={EnvironmentVariables.isDevelopment}\n onSubmit={props.onSubmit}\n onReady={onReady}\n />\n </div>\n {!loaded &&\n <div className={`d-flex justify-content-center align-items-center`} style={{ height: props.height }}>\n <Spinner as='div' animation='border' role='status' />\n </div>\n }\n </>\n );\n}, () => true);\n/**\n * We don't want this component to re-render when a parent component is re-rendered\n * as it resets the form state. The props should never change\n */","export enum FeedbackStatus {\n Skipped = 'skipped',\n Submitted = 'submitted'\n}","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Flight } from 'libs/common/flight';\n\ninterface UpgradeFeedback {\n userId: string;\n customerId: string;\n instanceRegion: string;\n crmId: string;\n type: string;\n text: string;\n}\n\nexport const UpgradeRequests = {\n errorFeedback(\n data: UpgradeFeedback,\n success?: () => void,\n error?: () => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: '/api/upgrade/feedback',\n key: 'upgrade:error:feedback',\n type: HttpVerbs.POST,\n data,\n success,\n error,\n always\n };\n }\n};","import React from 'react';\n\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\ninterface ErrorFormProps {\n question: string;\n onSubmit: (text: string) => void;\n submitText: string;\n}\n\nexport function ErrorForm(props: ErrorFormProps): React.ReactElement {\n const [ errorFormText, setErrorFormText ] = React.useState('');\n\n function onChangeErrorForm(e: React.ChangeEvent<HTMLTextAreaElement>): void {\n setErrorFormText(e.target.value);\n }\n\n return (\n <>\n <div className='form-group'>\n <label htmlFor='feedback'>{props.question}</label>\n <textarea className='form-control' id='feedback' value={errorFormText} onChange={onChangeErrorForm}></textarea>\n </div>\n <PopupButtons>\n <PopupButtons.Submit text={props.submitText} variant='dark' onClick={() => props.onSubmit(errorFormText)} />\n </PopupButtons>\n </>\n );\n}","import React from 'react';\n\nimport { FeedbackOption } from 'shared/views/lite-upgrade-feedback/interfaces/FeedbackOption';\n\ninterface FeedbackOptionsProps {\n options: FeedbackOption[];\n onClick: (option: FeedbackOption) => void;\n optionClassName: string;\n imageClassName: string;\n promptText: string;\n}\n\nexport function FeedbackOptions(props: FeedbackOptionsProps): React.ReactElement {\n return (\n <div className='row mb-2'>\n <p className='mx-2'>{props.promptText}</p>\n {props.options.map((o, i) => {\n return (\n <div key={i} className='col-lg-4 col-6 pb-2'>\n <div className={`w-100 cursor-pointer text-center border rounded py-3 ${props.optionClassName}`} onClick={() => props.onClick(o)}>\n <div className={`${props.imageClassName} w-100 mb-3`} style={{ backgroundImage: `url(\"${o.imageUrl}\")` }} />\n <span className='fw-bolder'>{o.displayText}</span>\n </div>\n </div>\n );\n })}\n </div>\n );\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { FeedbackOption } from 'shared/views/lite-upgrade-feedback/interfaces/FeedbackOption';\n\nconst namespace = 'shared.liteUpgradeFeedback';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst DEFAULT_HEIGHT = '500px';\n\nexport function getFeedbackOptions(): FeedbackOption[] {\n return [\n {\n name: 'missing-features',\n displayText: getPhrase('missingFeatures'),\n imageUrl: ImageUrls.Upgrade.MISSING_FEATURES,\n formId: 'WEanoLcI',\n fallbackQuestion: getPhrase('missingFeaturesFallback'),\n height: DEFAULT_HEIGHT\n },\n {\n name: 'bug',\n displayText: getPhrase('bug'),\n imageUrl: ImageUrls.Upgrade.BUG,\n formId: 'i4PCcQyO',\n fallbackQuestion: getPhrase('bugFallback'),\n height: '650px'\n },\n {\n name: 'process',\n displayText: getPhrase('process'),\n imageUrl: ImageUrls.Upgrade.PROCESS,\n formId: 'tblnlrIN',\n fallbackQuestion: getPhrase('processFallback'),\n height: DEFAULT_HEIGHT\n },\n {\n name: 'old-look',\n displayText: getPhrase('oldLook'),\n imageUrl: ImageUrls.Upgrade.OLD_LOOK,\n formId: 'Zf1iXAGw',\n fallbackQuestion: getPhrase('oldLookFallback'),\n height: '570px'\n },\n {\n name: 'wrong-time',\n displayText: getPhrase('wrongTime'),\n imageUrl: ImageUrls.Upgrade.WRONG_TIME,\n formId: 'q9Qmi8qX',\n fallbackQuestion: getPhrase('wrongTimeFallback'),\n height: '630px'\n },\n {\n name: 'other',\n displayText: getPhrase('other'),\n imageUrl: ImageUrls.Upgrade.OTHER,\n formId: 'HDHV6YhU',\n fallbackQuestion: getPhrase('otherFallback'),\n height: DEFAULT_HEIGHT\n }\n ];\n}","// extracted by mini-css-extract-plugin\nexport default {\"image\":\"lRdl8\",\"option\":\"hSaJ1\",\"formHeight\":\"P2hDj\",\"errorFeedbackSuccess\":\"koNOV\"};","import React from 'react';\nimport { Spinner } from 'react-bootstrap';\nimport { useDispatch } from 'react-redux';\n\nimport { LocationUtils } from 'libs/common/backbone/core';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, UpgradeBannerDescriptors, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\nimport { UrlHelper } from 'libs/analytics/utils/UrlHelper';\n\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { TypeformWrapper } from 'libs/shared/components/typeform-wrapper/TypeformWrapper';\nimport { SettingKind } from 'libs/shared/enums/SettingKind';\nimport { SettingName } from 'libs/shared/enums/SettingName';\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 { useLiteUpgrade } from 'libs/shared/hooks/UseLiteUpgrade';\nimport { UpgradeType } from 'libs/shared/hooks/UseLiteUpgrade';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Config, CurrentUser, Customer, PopupViewProps } from 'libs/shared/interfaces';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { FeedbackStatus } from 'shared/enums/FeedbackStatus';\nimport { UpgradeRequests } from 'shared/flight-requests/UpgradeRequests';\nimport { ErrorForm } from 'shared/views/lite-upgrade-feedback/components/ErrorForm';\nimport { FeedbackOptions } from 'shared/views/lite-upgrade-feedback/components/FeedbackOptions';\nimport { FeedbackOption } from 'shared/views/lite-upgrade-feedback/interfaces/FeedbackOption';\nimport { getFeedbackOptions } from 'shared/views/lite-upgrade-feedback/utils/getFeedbackOptions';\n\nimport styles from './lite-upgrade-feedback.scss';\n\nconst namespace = 'shared.liteUpgradeFeedback';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface LiteUpgradeFeedbackViewProps extends PopupViewProps {\n goToOnline: boolean;\n}\n\ntype Steps = 'options' | 'form' | 'error-form' | 'error-form-success' | 'redirecting';\n\nexport function LiteUpgradeFeedbackView(props: LiteUpgradeFeedbackViewProps): React.ReactElement {\n const dispatch = useDispatch();\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const customer = Flight.useBasicFetch<Customer>(currentUser.data &&\n CustomerRequests.customer(currentUser.data.customerId));\n\n const liteUpgrade = useLiteUpgrade();\n const { updateSetting } = useSettings(LocationContext.LiteUpgradeFeedbackPopup);\n\n const [ step, setStep ] = React.useState<Steps>('options');\n const [ option, setOption ] = React.useState<FeedbackOption>();\n\n const [ button, setButton ] = React.useState<'back' | 'close' | 'none'>('none');\n\n const options = React.useMemo(() => getFeedbackOptions(), []);\n\n React.useEffect(() => {\n if (!props.goToOnline)\n return;\n\n setButton('back');\n }, [props.goToOnline]);\n\n function onClickOption(selectedOption: FeedbackOption): void {\n setOption(selectedOption);\n setStep('form');\n setButton('none');\n }\n\n function redirectToOnline(skippedFeedback: boolean): void {\n const onlineUrl = UrlHelper.safeUrlConcat(config.data.onlineUrl, '/enable-online?loginPrompt=false');\n\n // If the user skipped giving feedback, show a spinner and redirect\n if (skippedFeedback) {\n setStep('redirecting');\n window.setTimeout(() => LocationUtils.PageLoad(onlineUrl), 500);\n return;\n }\n\n /**\n * If the user did not skip giving feedback, we allow the typeform\n * \"thank you\" UI to display for a moment then redirect\n */\n window.setTimeout(() => LocationUtils.PageLoad(onlineUrl), 1500);\n }\n\n function updateFeedbackStatus(status: FeedbackStatus): void {\n if (liteUpgrade.feedbackStatus === FeedbackStatus.Submitted) {\n onWorkflowFinished(status === FeedbackStatus.Skipped);\n return;\n }\n\n const newSetting = {\n name: SettingName.LiteUpgradeFeedback,\n kind: SettingKind.FeatureFlag,\n value: status\n };\n\n updateSetting(\n currentUser.data.id,\n newSetting,\n null,\n null,\n () => onWorkflowFinished(status === FeedbackStatus.Skipped)\n );\n }\n\n function onWorkflowFinished(skippedFeedback: boolean): void {\n if (!props.goToOnline) {\n AnalyticsHelper.logUserAction({\n upgradeType: liteUpgrade.upgradeType\n }, {\n actionType: UserAction.Click,\n location: LocationContext.LiteUpgradeBanner,\n entity: EntityType.User,\n descriptor: UpgradeBannerDescriptors.Feedback,\n workflowPhase: WorkflowPhase.Complete\n });\n setButton('close');\n\n return;\n }\n\n AnalyticsHelper.logUserAction({\n upgradeType: liteUpgrade.upgradeType,\n skippedFeedback\n }, {\n actionType: UserAction.Click,\n location: LocationContext.LiteUpgradeBanner,\n entity: EntityType.User,\n descriptor: UpgradeBannerDescriptors.GoToOnline,\n workflowPhase: WorkflowPhase.Complete\n });\n\n if (liteUpgrade.upgradeType === UpgradeType.Lite) {\n const newSetting = {\n name: SettingName.LiteUpgradeTypeUser,\n kind: SettingKind.FeatureFlag,\n value: UpgradeType.Launch\n };\n \n updateSetting(\n currentUser.data.id,\n newSetting,\n null,\n null,\n () => redirectToOnline(skippedFeedback)\n );\n return;\n }\n\n redirectToOnline(skippedFeedback);\n }\n\n /**\n * Normally the data is saved by typeform, however if \n * we're using our backup form, we need to save the data ourselves\n */\n function onErrorFormSubmit(text: string): void {\n const data = {\n userId: currentUser.data.id,\n customerId: currentUser.data.customerId,\n instanceRegion: currentUser.data.instanceRegion,\n crmId: customer.data.crmId,\n type: option.name,\n text\n };\n\n Flight.fetch(\n dispatch,\n UpgradeRequests.errorFeedback(\n data,\n null,\n null,\n () => {\n setStep('error-form-success');\n updateFeedbackStatus(text ? FeedbackStatus.Submitted : FeedbackStatus.Skipped);\n }\n )\n );\n }\n\n if (!liteUpgrade.isLoading && !liteUpgrade.isUpgrading) {\n props.closePopup();\n return <></>;\n }\n\n const isLoaded = (\n !!currentUser.data &&\n !!customer.data &&\n !!config.data &&\n !liteUpgrade.isLoading\n );\n\n if (!isLoaded) {\n return <Popup title={getPhrase('title')} closePopup={props.closePopup} size='lg' showLoadingSpinner></Popup>;\n }\n\n return (\n <Popup title={getPhrase('title')} closePopup={props.closePopup} size='lg' >\n {/* Shows first */}\n {step === 'options' &&\n <FeedbackOptions\n options={options}\n onClick={onClickOption}\n optionClassName={styles.option}\n imageClassName={styles.image}\n promptText={getPhrase('optionHeading')}\n />\n }\n\n {/* Shows after an option is selected */}\n {step === 'form' &&\n <TypeformWrapper\n formId={option.formId}\n hiddenFields={{\n userId: currentUser.data.id,\n customerId: currentUser.data.customerId,\n instanceRegion: currentUser.data.instanceRegion,\n crmId: customer.data.crmId,\n reason: option.name\n }}\n height={option.height}\n onSubmit={() => updateFeedbackStatus(FeedbackStatus.Submitted)}\n onReady={() => setStep('form')}\n onLoadTmeout={() => setStep('error-form')}\n />\n }\n\n {/* Only shows if the typeform fails to load */}\n {step === 'error-form' &&\n <ErrorForm\n question={option.fallbackQuestion}\n onSubmit={onErrorFormSubmit}\n submitText={props.goToOnline ? getPhrase('takeMeBack') : getPhrase('submit')}\n />\n }\n\n {step === 'error-form-success' &&\n <div className='text-center'>\n <img className={`px-5 img-fluid ${styles.errorFeedbackSuccess}`} src={ImageUrls.SUCCESS} />\n <p><Text namespace={namespace} phrase='thankYou' /></p>\n </div>}\n\n {/* Shows when redirecting to online */}\n {step === 'redirecting' &&\n <div className={`d-flex justify-content-center align-items-center ${styles.formHeight}`}>\n <Spinner as='div' animation='border' role='status' />\n </div>\n }\n\n {button !== 'none' && (\n <PopupButtons>\n {button === 'back' && (\n <PopupButtons.Cancel text={getPhrase('takeMeBack')} onClick={() => updateFeedbackStatus(FeedbackStatus.Skipped)} />\n )}\n\n {button === 'close' && (\n <PopupButtons.Cancel variant='dark' text={getPhrase('close')} onClick={props.closePopup} />\n )}\n </PopupButtons>\n )}\n </Popup>\n );\n}"],"names":["FeedbackStatus","TypeformWrapper","props","timeoutId","loaded","setLoaded","current","window","setTimeout","onLoadTmeout","formId","className","Widget","id","style","height","hideHeaders","hideFooter","opacity","hidden","hiddenFields","enableSandbox","EnvironmentVariables","onSubmit","onReady","clearTimeout","Spinner","as","animation","role","UpgradeRequests","errorFeedback","data","success","error","always","url","key","type","HttpVerbs","ErrorForm","errorFormText","setErrorFormText","htmlFor","question","value","onChange","e","target","PopupButtons","text","submitText","variant","onClick","FeedbackOptions","promptText","options","map","o","i","optionClassName","imageClassName","backgroundImage","imageUrl","displayText","getPhrase","LanguageService","DEFAULT_HEIGHT","LiteUpgradeFeedbackView","dispatch","config","ConfigRequests","currentUser","UserRequests","customer","CustomerRequests","customerId","liteUpgrade","updateSetting","useSettings","step","setStep","option","setOption","button","setButton","name","ImageUrls","fallbackQuestion","redirectToOnline","skippedFeedback","onlineUrl","UrlHelper","updateFeedbackStatus","status","feedbackStatus","Submitted","newSetting","SettingName","kind","SettingKind","onWorkflowFinished","Skipped","goToOnline","AnalyticsHelper","upgradeType","actionType","location","entity","descriptor","workflowPhase","isLoading","isUpgrading","Popup","title","closePopup","size","selectedOption","userId","instanceRegion","crmId","reason","src","Text","namespace","phrase","showLoadingSpinner"],"sourceRoot":""}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[3252],{26136:(e,t,n)=>{n.d(t,{B:()=>a});var r=n(76198),i=n(64818);function a(e,t){return e?t?(0,r._8)((n="profileId"in e?e.profileId:e.id,a=+"".concat(n).concat(Math.floor((new Date).getMinutes()/5)),{dictionaries:[r.O9,r.yd],separator:" ",length:2,style:"capital",seed:a})):"profileId"in e?e.name:i.l.getFullName(e):"";var n,a}},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),l=n(86572),u=n(28972),c=n(83140),d=n(80845),m=n(23481),v=n(2102),f=n(36532),b=m.T.encloseNamespace("interactives.studentResponseList");function g(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},b("close")),!!e.interactionsToMark.length&&r.createElement(r.Fragment,null,e.isDemo?r.createElement(f.u,{id:"submitAnswers",title:b("demoOnly"),spanHack:!0,spanHackClassName:"d-inline-flex"},r.createElement("button",{className:"btn btn-outline-dark pointer-events-none",disabled:!t},b("submitAnswers"))):r.createElement(v.m,{variant:"outline-dark",onClick:e.onClickSubmit,disabled:!t,showSpinner:e.showSubmitButtonSpinner},b("submitAnswers")))))}var p=m.T.encloseNamespace("interactives.studentResponseList");function k(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"},p("unanswered")),e.summary.unanswered),r.createElement("div",{className:"bg-light rounded p-2 me-2"},r.createElement("strong",{className:"me-2"},p("score")),e.summary.awaitingMarking?r.createElement("em",null,p("pending")):"".concat(Math.round(100*e.summary.percentCorrect),"%"))),!!e.interactionsToMark.length&&r.createElement(r.Fragment,null,e.isDemo?r.createElement(f.u,{id:"submitAnswers",title:p("demoOnly"),spanHack:!0},r.createElement("button",{className:"btn btn-outline-dark pointer-events-none",disabled:!t},p("submitAnswers"))):r.createElement(v.m,{variant:"outline-dark",onClick:e.onClickSubmit,disabled:!t,showSpinner:e.showSubmitButtonSpinner},p("submitAnswers"))))}const y={awaitingMarking:"MvGb5"};function h(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=[],l=!0,u=!1;try{if(a=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(r=a.call(n)).done)&&(o.push(r.value),o.length!==t);l=!0);}catch(e){u=!0,i=e}finally{try{if(!l&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(u)throw i}}return o}}(e,t)||function(e,t){if(e){if("string"==typeof e)return w(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)?w(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 w(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,v,f=h(r.useState(!1),2),b=f[0],p=f[1],w=(t=r.useRef(null),n=h(r.useState(!1),2),m=n[0],v=n[1],r.useEffect((function(){t.current&&!m&&(v(!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))===u.w.AwaitingMarking}))}(A,e.studentResults);function C(){p(!0),e.submitMarkedAnswers()}return r.createElement(r.Fragment,null,r.createElement(k,{summary:S,interactionsToMark:E,markedAnswers:e.markedAnswers,onClickSubmit:C,showSubmitButtonSpinner:b,isDemo:e.isDemo}),r.createElement("ul",{className:"list-unstyled"},A.map((function(t,n){var u,c=t.id.toString()===(null===(u=e.selectedInteractionId)||void 0===u?void 0:u.toString()),d=E.some((function(e){return e.id===t.id})),m=(0,a.B)(e.studentResults.user||e.studentResults.publicUser,e.anonymiseUsers),v="p-2 mb-3 rounded";return c&&(v+=" border-2 border-info shadow"),v+=d?" ".concat(y.awaitingMarking):" border",r.createElement("li",{key:n,className:v,ref:c?w:null},r.createElement("div",{className:"d-flex mb-2"},r.createElement(l.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(g,{interactionsToMark:E,markedAnswers:e.markedAnswers,onClickSubmit:C,onClickClose:e.onClickClose,showSubmitButtonSpinner:b,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),l=n(49075),u={notFound:a.d,forbidden:{rating:s.q,yearLevel:s.q,region:o.a,privacy:s.q},badRequest:l._,internalServerError:l._};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({},u),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 l._))}}},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])}},29818:(e,t,n)=>{n.r(t),n.d(t,{InteractiveStudentResultsDemoView:()=>y});var r=n(32735),i=n(23481),a=n(20354),s=n(2948),o=n(9193),l=n(26136),u=n(3218),c=n(9111),d=n(38143),m=n(39151),v=n(54405),f=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 k=i.T.encloseNamespace("shared.interactiveStudentResults");function y(e){var t,n,i,y,h,w=(y=(0,s.D)(d.g.ANONYMISE_USERS),h=1,function(e){if(Array.isArray(e))return e}(y)||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=[],l=!0,u=!1;try{if(a=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(r=a.call(n)).done)&&(o.push(r.value),o.length!==t);l=!0);}catch(e){u=!0,i=e}finally{try{if(!l&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(u)throw i}}return o}}(y,h)||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}}(y,h)||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 S=a.a.useBasicFetch(v.X.interactiveMetadata()),A=a.a.useBasicFetch(v.X.interactive()),E=a.a.useBasicFetch(v.X.interactiveResults()),C=a.a.useBasicFetch(m.L.config());(0,b.v)([S,E]),(0,f.b)(S);var R=(0,o.D)(null===(t=A.data)||void 0===t?void 0:t.id,null===(n=S.data)||void 0===n?void 0:n.id,e.closePopup),I=R.markedAnswers,M=R.addMarkedAnswers,N=R.submitMarkedAnswers,j=null===(i=E.data)||void 0===i?void 0:i.students.find((function(t){var n,r,i,a,s,o;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.profileId&&(null===(s=null===(a=t.publicUser)||void 0===a?void 0:a.profileId)||void 0===s?void 0:s.toString())===(null===(o=e.profileId)||void 0===o?void 0:o.toString())})),F=j?k("heading",{studentName:(0,l.B)(j.user||j.publicUser,w)}):"",O=!!A.data&&!!E.data&&!!C.data;return r.createElement(c.G,{title:F,showLoadingSpinner:!O,closePopup:e.closePopup,size:"lg"},O&&r.createElement(u.R,{interactive:A.data,studentResults:j,markedAnswers:I,addMarkedAnswers:M,submitMarkedAnswers:N,imageCdnUrl:C.data.imageCdnUrl,selectedInteractionId:e.interactionId,onClickClose:e.closePopup,anonymiseUsers:w,reportsStyling:e.reportsStyling,isDemo:!0}))}}}]);
|
|
2
|
-
//# sourceMappingURL=3252-
|
|
2
|
+
//# sourceMappingURL=3252-50b5c19f19-lite.chunk.js.map
|
package/dist/scripts/{3252-22fac3da15-lite.chunk.js.map → 3252-50b5c19f19-lite.chunk.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/3252-22fac3da15-lite.chunk.js","mappings":"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","sources":["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/projects/lite/src/apps/insights/views/demo/interactive-student-results/InteractiveStudentResultsDemoView.tsx"],"sourcesContent":["import { animals, colors, Config as UniqueNamesConfig, uniqueNamesGenerator } from 'unique-names-generator';\n\nimport { User } from 'libs/shared/interfaces';\nimport { PublicInteractiveUser } from 'libs/shared/interfaces/models/interactive-results/PublicInteractiveUser';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\n\nfunction getUniqueNamesConfig(id: string): UniqueNamesConfig {\n /**\n * Generate a seed that is unique to each user but changes every 5 minutes.\n * \n * We use a seed so that if the same user's name is anonymised multiple times\n * in quick succession (e.g. multiple renders), the same name will be returned each time.\n * \n * We change the seed every 5 minutes so that students don't always have the same name.\n */\n const seed = +`${id}${Math.floor((new Date()).getMinutes() / 5)}`;\n\n return {\n dictionaries: [ colors, animals ],\n separator: ' ',\n length: 2,\n style: 'capital',\n seed\n };\n}\n\nexport function anonymiseUserName(user: User | PublicInteractiveUser, shouldAnonymise: boolean): string {\n if (!user)\n return '';\n\n if (!shouldAnonymise)\n return 'profileId' in user ? user.name : UserHelper.getFullName(user);\n\n return uniqueNamesGenerator(getUniqueNamesConfig('profileId' in user ? user.profileId : user.id));\n}\n","import 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 { MarkedAnswerHash } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { anonymiseUserName } 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}\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 props.studentResults.user || props.studentResults.publicUser,\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 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 { useMarkAnswers } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { anonymiseUserName } 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 profileId?: 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 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.profileId)\n return s.publicUser?.profileId?.toString() === props.profileId?.toString();\n\n return false;\n });\n\n const popupTitle = studentResults\n ? getPhrase('heading', { studentName: anonymiseUserName(studentResults.user || studentResults.publicUser, 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":["anonymiseUserName","user","shouldAnonymise","id","profileId","seed","Math","floor","Date","getMinutes","dictionaries","separator","length","style","name","getPhrase","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","current","requestAnimationFrame","scrollIntoView","behavior","block","interactive","studentResults","interactions","questionsToMark","filter","i","InteractiveCorrectnessHelper","InteractionCorrectness","getInteractionsToMark","submitMarkedAnswers","map","interaction","idx","isSelected","toString","selectedInteractionId","markingRequired","some","q","anonymisedUserName","publicUser","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","InteractiveStudentResultsDemoView","results","config","data","closePopup","students","find","s","userId","popupTitle","studentName","dataLoaded","showLoadingSpinner","size","interactionId"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"scripts/3252-50b5c19f19-lite.chunk.js","mappings":"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","sources":["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/projects/lite/src/apps/insights/views/demo/interactive-student-results/InteractiveStudentResultsDemoView.tsx"],"sourcesContent":["import { animals, colors, Config as UniqueNamesConfig, uniqueNamesGenerator } from 'unique-names-generator';\n\nimport { User } from 'libs/shared/interfaces';\nimport { PublicInteractiveUser } from 'libs/shared/interfaces/models/interactive-results/PublicInteractiveUser';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\n\nfunction getUniqueNamesConfig(id: string): UniqueNamesConfig {\n /**\n * Generate a seed that is unique to each user but changes every 5 minutes.\n * \n * We use a seed so that if the same user's name is anonymised multiple times\n * in quick succession (e.g. multiple renders), the same name will be returned each time.\n * \n * We change the seed every 5 minutes so that students don't always have the same name.\n */\n const seed = +`${id}${Math.floor((new Date()).getMinutes() / 5)}`;\n\n return {\n dictionaries: [ colors, animals ],\n separator: ' ',\n length: 2,\n style: 'capital',\n seed\n };\n}\n\nexport function anonymiseUserName(user: User | PublicInteractiveUser, shouldAnonymise: boolean): string {\n if (!user)\n return '';\n\n if (!shouldAnonymise)\n return 'profileId' in user ? user.name : UserHelper.getFullName(user);\n\n return uniqueNamesGenerator(getUniqueNamesConfig('profileId' in user ? user.profileId : user.id));\n}\n","import 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 { MarkedAnswerHash } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { anonymiseUserName } 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}\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 props.studentResults.user || props.studentResults.publicUser,\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 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 { useMarkAnswers } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { anonymiseUserName } 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 profileId?: 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 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.profileId)\n return s.publicUser?.profileId?.toString() === props.profileId?.toString();\n\n return false;\n });\n\n const popupTitle = studentResults\n ? getPhrase('heading', { studentName: anonymiseUserName(studentResults.user || studentResults.publicUser, 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":["anonymiseUserName","user","shouldAnonymise","id","profileId","seed","Math","floor","Date","getMinutes","dictionaries","separator","length","style","name","getPhrase","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","current","requestAnimationFrame","scrollIntoView","behavior","block","interactive","studentResults","interactions","questionsToMark","filter","i","InteractiveCorrectnessHelper","InteractionCorrectness","getInteractionsToMark","submitMarkedAnswers","map","interaction","idx","isSelected","toString","selectedInteractionId","markingRequired","some","q","anonymisedUserName","publicUser","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","InteractiveStudentResultsDemoView","results","config","data","closePopup","students","find","s","userId","popupTitle","studentName","dataLoaded","showLoadingSpinner","size","interactionId"],"sourceRoot":""}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[3677],{39902:(e,t,n)=>{n.d(t,{F:()=>m,f:()=>p});var r=n(32735),i=n(20354),a=n(75896);function o(e){return function(e){if(Array.isArray(e))return s(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||c(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 c(e,t){if(e){if("string"==typeof e)return s(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(e,t):void 0}}function s(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function l(e){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},l(e)}function u(e,t,n){return(t=function(e){var t=function(e){if("object"!=l(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=l(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==l(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var d=50;function p(e,t){var n=a.m.chunk(e,d).map((function(e){return t(a.m.uniq(e))})),r=i.a.useBasicFetchAll(n),o=a.m.flatten(r.data),c=r.data.length?o.reduce((function(e,t){return Object.assign(Object.assign({},e),u({},t.id,t))}),{}):null;return{itemsArr:o,items:c,isFetching:r.isFetching}}function m(e,t,n){var s,p,m,f,v=n||function(e){return"object"===l(e)?e.id:e},h=r.useRef(new Set),y=(m=r.useState([]),f=2,function(e){if(Array.isArray(e))return e}(m)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,i,a,o,c=[],s=!0,l=!1;try{if(a=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(r=a.call(n)).done)&&(c.push(r.value),c.length!==t);s=!0);}catch(e){l=!0,i=e}finally{try{if(!s&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(l)throw i}}return c}}(m,f)||c(m,f)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),g=y[0],b=y[1];r.useEffect((function(){if(null==e?void 0:e.length){var n=[];e.forEach((function(e){var t=v(e);h.current.has(t)||(n.push(e),h.current.add(t))})),n.length&&b((function(e){return[].concat(o(e),o(a.m.chunk(n,d).map(t)))}))}}),[null==e?void 0:e.length]);var A=i.a.useBasicFetchAll(g),I=a.m.flatten(A.data),P=A.data.length?I.reduce((function(e,t){return Object.assign(Object.assign({},e),u({},v(t),t))}),{}):null;return{hasFirstRequestCompleted:!!(null===(p=null===(s=A.responses)||void 0===s?void 0:s[0])||void 0===p?void 0:p.hasCompleted),itemsArr:I,items:P,isFetching:A.isFetching}}},63719:(e,t,n)=>{n.d(t,{h:()=>c});var r=n(32735),i=n(77316);function a(e,t){if(e){if("string"==typeof e)return o(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)?o(e,t):void 0}}function o(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 c(e){var t,n,c=(t=r.useMemo((function(){return i.p.getBuilder()}),[]),n=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,i,a,o,c=[],s=!0,l=!1;try{if(a=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(r=a.call(n)).done)&&(c.push(r.value),c.length!==t);s=!0);}catch(e){l=!0,i=e}finally{try{if(!s&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(l)throw i}}return c}}(t,n)||a(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.")}()),s=c[0],l=(0,c[1])(s);return l&&e?[].concat(function(e){return function(e){if(Array.isArray(e))return o(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||a(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.")}()}(l),[Object.assign(Object.assign({},e),{active:!0})]):l}},58321:(e,t,n)=>{n.d(t,{U:()=>f});var r=n(20354),i=n(16714),a=n(39151),o=n(1666),c=n(31949),s=n(22902),l=n(37802),u=n(22490),d=n(82431),p=n(46390),m=n(27638);function f(e){var t,n,f,v=e||{},h=v.locationContext,y=v.mtv,g=v.flightNamespace,b=v.sharedPlaylist,A=(0,p.G)(),I=A.isPlugin,P=A.params,E=(0,m.u)(h,g),V=E.setFavourite,C=E.canFavourite,S=(0,l.r)(null),w=S.hasTopicDirectories,T=S.isLoadingSettings,O=(0,s.T)(),x=O.hasPermissions,L=O.isLoaded,M=x(i.C.StudentExperience),R=r.a.useBasicFetch(a.L.config()),j=r.a.useBasicFetch(c.N.currentUser()),k=r.a.useBasicFetch((null===(t=j.data)||void 0===t?void 0:t.isAuthenticated)&&o.h.yearGroups(j.data.customerId));return{hasCommonVideoPropsCompleted:!T&&L&&R.hasCompleted&&j.hasCompleted&&(!(null===(n=j.data)||void 0===n?void 0:n.isAuthenticated)||k.hasCompleted),commonVideoProps:{subTextType:"series",getSubTextAppLink:function(e){var t;return"series"in e?b&&!(null===(t=j.data)||void 0===t?void 0:t.isAuthenticated)?null:d.j.getSeriesAppLink(e.series,{mtv:y}):null},isPlugin:I,isPluginPopup:!!(null==P?void 0:P.popup),canFavourite:C,setFavourite:V,imageCdnUrl:null===(f=R.data)||void 0===f?void 0:f.imageCdnUrl,yearGroups:k.data,getClassroomGuideAppLink:u.W.getClassroomGuideAppLink,getInteractiveGuidanceAppLink:u.W.getInteractiveGuidanceAppLink,getResourceGuidanceAppLink:u.W.getResourceGuidanceAppLink,showNewVideoIndicator:w,companyLogoFallbackUrl:null,hasStudentExperience:M}}}},44110:(e,t,n)=>{n.d(t,{i:()=>o});var r=n(20354),i=n(89454),a=n(86698),o=function(){var e=(0,a.y)({redirectOnError:!0}),t=e.activePresentation,n=e.getFallbackPresentation,o=t||n();return r.a.useBasicFetch(!!o&&i.O.presentationAudiences(o.id))}},35014:(e,t,n)=>{n.d(t,{I:()=>p});var r=n(20354),i=n(55171),a=n(16714),o=n(12754),c=n(31949),s=n(22902),l=n(15311),u=n(37802),d=n(11387);function p(e){var t=(0,s.T)(),n=t.hasPermissions,p=t.hasLocalPermissions,m=(0,l.r)().hasProduct,f=r.a.useBasicFetch(c.N.currentUser()),v=(0,u.r)(null).hasPlayPageTranscript,h=m(o.x.Primary);return{canViewGlance:n(a.C.ViewVideoGlance),canViewResources:!0,canViewInteractives:h&&n(a.C.ViewVideoInteractives),canViewClips:h&&n(a.C.ViewVideoClips),canViewCurriculumLinks:n(a.C.ViewCurriculums),canUseActions:p(a.E.UseVideoActions),canViewPublicLayout:!p(a.E.WatchVideos)&&d.C.hasRegionPrefix(),canViewResourceItems:p(a.E.ViewVideoResourceItems),canNavigate:h,canViewTranscript:function(e){var t;return(null===(t=f.data)||void 0===t?void 0:t.isAuthenticated)?v:!!e&&i.e.PublicTranscriptVideoIds.includes(e)}(e)}}},97816:(e,t,n)=>{n.d(t,{V:()=>o});var r=n(1575),i=n(39902),a=n(31908);function o(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=function(e){return e?Array.isArray(e)?e.filter((function(e){return!!e&&(a.M.isVideo(e)||a.M.isClip(e))})):"data"in e?e.data.filter((function(e){return!!e&&(a.M.isVideo(e)||a.M.isClip(e))})):[]:[]}(e).map((function(e){return e.id}));(0,i.F)(n,(function(e){return r.R.videoMixinAssocs(e,t.flightNamespace)}))}},80053:(e,t,n)=>{n.d(t,{N:()=>J});var r=n(32735),i=n(2948),a=n(28400),o=n(49935),c=n(93850),s=n(61499),l=n(38165),u=n(89456),d=n(71063),p=n(80128),m=n(35429),f=n(4594),v=n(16714),h=n(12754),y=n(22902),g=n(65332),b=n(9907),A=n(59598),I=n(31908),P=n(26492),E=n(22103),V=n(84459),C=n(87851),S=n(11256),w=n(47938),T=n(4171),O=n(78166),x=n(99742),L=n(14070),M=n(97291),R=n(86702),j=n(22490),k=n(29978),N=n(15731),U=n(75861),F=n(28389),G=n(31887),q=n(83345),_=n(75100),D=n(51365),W=n(10671),B=n(10741),H="shared.playClip";function K(e){var t=(0,y.T)().hasPermissions,n=(0,W._)({location:W.i.VideoItem});return r.createElement("section",{className:"play-page-section",id:A.K.ClippedFrom,ref:function(t){var n;t&&(null===(n=e.headingRef)||void 0===n?void 0:n.current)&&e.headingRef.current.set(A.K.ClippedFrom,t)}},r.createElement("h2",{className:"h4 mb-0"},r.createElement(q.x,{namespace:H,phrase:"clippedFrom"})),r.createElement(D.M.Provider,{value:n},r.createElement(_.E4,{videos:[e.originalVideo],getVideoAppLink:function(t,n){var r;return j.W.getAppLink(t,Object.assign(Object.assign({},n),{context:e.queryParams.context,contextId:e.queryParams.contextId,playNext:e.queryParams.playNext,shareId:e.shareId,moviesAndTv:e.queryParams.mtv,includeContext:null===(r=e.currentUser)||void 0===r?void 0:r.isAuthenticated}))},hasPermissions:t,presentationAudiences:e.audiences,getPreviewQuestionsAppLink:function(e){return B.j.getPreviewQuestionsAppLink(e)},commonVideoProps:e.commonVideoProps})))}const Q={main:"ULvZW",expandedToc:"W3k9M",theatreMode:"KOUGv",theatreModeContent:"fWNAc",theatreModePlayPageContainer:"RJ5nP",theatreModeLeftContent:"dllgG"};function Y(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 $=function(e,t,n){return function(r){return n?{application:M.O.VIDEOS,action:L.e.Videos.PREVIEW_PDF,args:[r.id],params:{videoId:e,shareId:t}}:{application:M.O.SIGN_UP,action:L.e.SignUp.SIGN_UP}}};function J(e){var t,n,q,_,D,W,B,H,J,Z,z=(0,m.g)(),X=(0,y.T)().hasPermissions,ee=I.M.getCanBeConsumed(e.clip).canConsume,te=e.hasTheatreMode&&"theatre"===z.mode,ne=(0,F.V)(e.hasTheatreMode,te),re=(0,N.Q)(e.tableOfContentsId,e.hasTheatreMode,te),ie=re.tableOfContentsActiveId,ae=re.setTableOfContentsActiveId,oe=re.controlledId,ce=re.setControlledId,se=re.tableOfContentsExpanded,le=re.onToggleTableOfContents,ue=(0,s.Wp)(e.clip)&&e.featureAccess.canViewGlance,de=(0,U.i)(ue),pe=de.headingRef,me=de.headingElements,fe=me.map((function(t){var n;return{id:t.id,name:G.d.getSectionHeading(t.id,{clips:e.clips,interactives:e.interactives,resources:null===(n=e.clip.resources)||void 0===n?void 0:n.data,isPlayClipPage:!0})}}));(0,g.D)({setActiveId:ae,headingElements:me,controlledId:oe,setControlledId:ce}),(0,b.P)(me,oe);var ve=I.M.isVideoTypeArchived(e.clip),he=X(v.C.StudentExperience),ye=r.useRef(!1);function ge(){var e,t,n,r;ye.current=!(null===(t=null===(e=null==z?void 0:z.playerRef)||void 0===e?void 0:e.current)||void 0===t?void 0:t.isPaused()),null===(r=null===(n=null==z?void 0:z.playerRef)||void 0===n?void 0:n.current)||void 0===r||r.pause()}function be(){var e,t;ye.current&&(null===(t=null===(e=null==z?void 0:z.playerRef)||void 0===e?void 0:e.current)||void 0===t||t.play())}function Ae(){var t,n;return!(!e.originalVideo||!(null===(t=e.clip._canBeConsumed)||void 0===t?void 0:t.value)||!(null===(n=e.currentUser)||void 0===n?void 0:n.isAuthenticated)||!e.hasProduct(h.x.Primary)||he)}var Ie,Pe,Ee="picture-in-picture"===z.mode||e.featureAccess.canViewPublicLayout,Ve=null!==(n=null===(t=e.clips)||void 0===t?void 0:t.filter((function(t){return t.id.toString()!==e.clip.id.toString()})))&&void 0!==n?n:[],Ce={hasTheatreMode:e.hasTheatreMode,shouldShowSideTableOfContents:e.shouldShowSideTableOfContents,tableOfContentsExpanded:se,theatreMode:te},Se=(0,k.l)(Ce),we=(0,k.D)(Ce),Te=(Ie=(0,i.D)(R.y.PLAY_PAGE_CONTAINER_CLASS_NAME),Pe=2,function(e){if(Array.isArray(e))return e}(Ie)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,i,a,o,c=[],s=!0,l=!1;try{if(a=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(r=a.call(n)).done)&&(c.push(r.value),c.length!==t);s=!0);}catch(e){l=!0,i=e}finally{try{if(!s&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(l)throw i}}return c}}(Ie,Pe)||function(e,t){if(e){if("string"==typeof e)return Y(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)?Y(e,t):void 0}}(Ie,Pe)||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.")}())[1];return r.useEffect((function(){Te(te?Q.theatreModePlayPageContainer:"")}),[te]),r.useEffect((function(){return function(){return Te("")}}),[]),r.createElement("div",{className:"px-4 play-page-sections-container ".concat(e.shouldShowSideTableOfContents?"row g-0":"")},r.createElement("main",{className:"".concat(Q.main," ").concat(Se)},!!(null===(q=e.breadcrumbs)||void 0===q?void 0:q.length)&&r.createElement("div",{className:"mb-2"},r.createElement(o.Oo,{breadcrumbs:e.breadcrumbs})),r.createElement(w.W,{restrictions:e.clip._restrictions,yearGroups:e.commonVideoProps.yearGroups,objectId:e.clip.id,objectTypeId:f.E.Clip,canManageVideoAccess:e.canManageVideoAccess}),ve&&r.createElement(P.T,{typeId:e.clip.typeId,hasStudentExperience:he}),r.createElement("section",{id:A.K.Video,className:"mb-2 ".concat(d.M.GLOBAL_PLAYER_SELECTOR),ref:function(e){e&&(null==pe?void 0:pe.current)&&pe.current.set(A.K.Video,e)}},ee&&r.createElement(p.r,{key:e.clip.id,objectId:e.clip.id,objectTypeId:e.clip.typeId,shareId:e.shareId,context:null===(_=e.queryParams)||void 0===_?void 0:_.context,contextId:null===(D=e.queryParams)||void 0===D?void 0:D.contextId,moviesAndTv:null===(W=e.queryParams)||void 0===W?void 0:W.mtv,playNext:null===(B=e.queryParams)||void 0===B?void 0:B.playNext,startTime:null!==(J=null===(H=e.queryParams)||void 0===H?void 0:H.t)&&void 0!==J?J:null===(Z=e.queryParams)||void 0===Z?void 0:Z.startTime,mode:z.mode||"default",location:"play-page"}),r.createElement("div",{className:Ee?"":"d-none"},r.createElement(T.S,{video:e.clip,type:"pip"}))),r.createElement("div",{className:we},r.createElement("div",{className:ne?"".concat(Q.theatreModeLeftContent):"w-100"},r.createElement(S.v,{media:e.clip,yearGroups:e.commonVideoProps.yearGroups,audiences:e.audiences,originalVideoAppLink:Ae()?{application:M.O.VIDEOS,action:L.e.Videos.PLAY_VIDEO,args:[e.originalVideo.id,a.m.slugify(e.originalVideo.name)]}:null,featureAccess:e.featureAccess,shareId:e.shareId,showTitlePadlock:!e.commonVideoProps.hasStudentExperience}),ue?r.createElement(l.j,{video:e.clip,pointsOfInterest:e.pointsOfInterest,setStartTime:function(e){var t;return null===(t=z.playerRef.current)||void 0===t?void 0:t.currentTime(e)},getTagAppLink:function(e){return{application:M.O.SEARCH,action:L.e.Search.HOME,params:{tagOrClassification:e.name}}},suppressInteractivity:e.featureAccess.canViewPublicLayout,canViewGlance:ue}):r.createElement(c.a,{video:e.clip,currentUser:e.currentUser,onLaunchImmersiveReader:ge,onExitImmersiveReader:be,getTagAppLink:function(e){return{application:M.O.SEARCH,action:L.e.Search.HOME,params:{tagOrClassification:e.name}}},headingRef:pe,suppressInteractivity:e.featureAccess.canViewPublicLayout}),r.createElement(u.M,{video:e.clip,canViewResources:e.featureAccess.canViewResourceItems,imageCdnUrl:e.commonVideoProps.imageCdnUrl,getAppLink:$(e.clip.id,e.shareId,e.featureAccess.canViewResourceItems),analyticsData:{clipId:e.clip.id,clipName:e.clip.name},resourceThumbnailFallbackUrl:x.W.Fallbacks.RESOURCE_THUMBNAIL,headingRef:pe}),r.createElement(V.J,{video:e.clip,interactives:e.interactives,analyticsData:{clipId:e.clip.id,clipName:e.clip.name},canViewInteractives:e.featureAccess.canViewInteractives,headingRef:pe,commonVideoProps:e.commonVideoProps}),r.createElement(E.O,{clips:Ve||[],video:e.clip,canViewClips:e.featureAccess.canViewClips,audiences:e.audiences,headingRef:pe,analyticsData:{clipId:e.clip.id,clipName:e.clip.name},commonVideoProps:e.commonVideoProps}),ue&&r.createElement(c.a,{video:e.clip,currentUser:e.currentUser,onLaunchImmersiveReader:ge,onExitImmersiveReader:be,getTagAppLink:function(e){return{application:M.O.SEARCH,action:L.e.Search.HOME,params:{tagOrClassification:e.name}}},headingRef:pe,suppressInteractivity:e.featureAccess.canViewPublicLayout,showHeading:!0}),!!Ae()&&r.createElement(K,{originalVideo:e.originalVideo,shareId:e.shareId,queryParams:e.queryParams,audiences:e.audiences,headingRef:pe,currentUser:e.currentUser,commonVideoProps:e.commonVideoProps}),r.createElement(O.Z,{currentVideo:e.clip,relatedVideos:e.relatedVideos,currentUser:e.currentUser,audiences:e.audiences,getVideoAppLink:function(t,n){var r;return j.W.getAppLink(t,Object.assign(Object.assign({},n),{context:e.queryParams.context,contextId:e.queryParams.contextId,playNext:e.queryParams.playNext,shareId:e.shareId,moviesAndTv:e.queryParams.mtv,includeContext:null===(r=e.currentUser)||void 0===r?void 0:r.isAuthenticated}))},moviesAndTv:e.queryParams.mtv,commonVideoProps:e.commonVideoProps})),te&&r.createElement(C.h,{isExpanded:se,setIsExpanded:le,toggleTheatreMode:null,items:fe,activeId:ie,setControlledId:ce,analyticsData:{videoId:e.clip.id,videoName:e.clip.name},showInSide:e.shouldShowSideTableOfContents,isTheatreMode:!0,hasTranscription:e.hasTheatreMode}))),!te&&r.createElement(C.h,{isExpanded:se,setIsExpanded:le,toggleTheatreMode:e.hasTheatreMode?function(e){var t,n,r;null===(r=null===(n=null===(t=z.playerRef)||void 0===t?void 0:t.current)||void 0===n?void 0:n.toggleTheatreMode)||void 0===r||r.call(n,e)}:null,items:fe,activeId:ie,setControlledId:ce,analyticsData:{videoId:e.clip.id,videoName:e.clip.name},showInSide:e.shouldShowSideTableOfContents,isTheatreMode:!1,hasTranscription:e.hasTheatreMode}))}}}]);
|
|
2
|
+
//# sourceMappingURL=3677-4904f30c6a-lite.chunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scripts/3677-4904f30c6a-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/hooks/UseBatchFetch.ts","file:///app/packages/libs/shared/src/hooks/useBreadcrumbs.ts","file:///app/packages/projects/lite/src/shared/hooks/useCommonVideoProps.ts","file:///app/packages/projects/lite/src/shared/hooks/usePresentationAudiences.ts","file:///app/packages/projects/lite/src/shared/hooks/useVideoFeatureAccess.ts","file:///app/packages/projects/lite/src/shared/hooks/useVideoMixin.ts","file:///app/packages/projects/lite/src/shared/views/play-clip/components/clipped-from/ClippedFrom.tsx","file:///app/packages/projects/lite/src/shared/views/play-clip/components/play-clip/play-clip.scss","file:///app/packages/projects/lite/src/shared/views/play-clip/components/play-clip/PlayClip.tsx"],"sourcesContent":["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 React from 'react';\n\nimport { Breadcrumb } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { BreadcrumbService } from 'libs/shared/services/BreadcrumbService';\n\nexport function useBreadcrumbs(current: Breadcrumb): Breadcrumb[] {\n const [ match, useBuilder ] = React.useMemo(() => BreadcrumbService.getBuilder(), []);\n\n const breadcrumbs = useBuilder(match);\n\n if (!breadcrumbs || !current)\n return breadcrumbs;\n\n return [ ...breadcrumbs, { ...current, active: true }];\n}\n\n","import { Core } from 'libs/common/backbone/index';\nimport { Flight } from 'libs/common/react/index';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\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 { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Config, CurrentUser, VideoTypes, YearGroup } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\n\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nimport { SeriesAppLinkHelper } from 'apps/series/SeriesAppLinkHelper';\n\nimport { usePluginHelper } from './use-plugin-helper/usePluginHelper';\nimport { useLiteFavourites } from './useLiteFavourites';\n\ninterface UseCommonVideoPropsResult {\n hasCommonVideoPropsCompleted: boolean;\n commonVideoProps: CommonVideoProps;\n}\n\ninterface UseCommonVideoPropsOptions {\n locationContext: LocationContext,\n mtv?: boolean;\n flightNamespace?: string;\n sharedPlaylist?: boolean;\n}\n\nexport function useCommonVideoProps(options: UseCommonVideoPropsOptions): UseCommonVideoPropsResult {\n const { locationContext, mtv, flightNamespace, sharedPlaylist } = options || {};\n\n const { isPlugin, params } = usePluginHelper();\n const { setFavourite, canFavourite } = useLiteFavourites(locationContext, flightNamespace);\n const { hasTopicDirectories, isLoadingSettings } = useSettings(null);\n const { hasPermissions, isLoaded: hasLoadedPermissions } = usePermissions();\n const hasStudentExperience = hasPermissions(PermissionName.StudentExperience);\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n function getSubTextAppLink(video: VideoTypes): Core.AppLink {\n if (!('series' in video))\n return null;\n\n /**\n * We do not allow navigating to series on shared playlists when the user is not signed in\n * because most series are customer created and will be empty for public users\n * \n * We do not have to do this for shared series, because all the series links are self referencing\n * - Sha\n */\n if (sharedPlaylist && !currentUser.data?.isAuthenticated)\n return null;\n \n return SeriesAppLinkHelper.getSeriesAppLink(video.series, { mtv });\n }\n\n const hasCommonVideoPropsCompleted = (\n !isLoadingSettings &&\n hasLoadedPermissions &&\n config.hasCompleted &&\n currentUser.hasCompleted &&\n (!currentUser.data?.isAuthenticated || yearGroups.hasCompleted)\n );\n\n return {\n hasCommonVideoPropsCompleted,\n commonVideoProps: {\n subTextType: 'series',\n getSubTextAppLink,\n isPlugin,\n isPluginPopup: !!params?.popup,\n canFavourite,\n setFavourite,\n imageCdnUrl: config.data?.imageCdnUrl,\n yearGroups: yearGroups.data,\n getClassroomGuideAppLink: VideoAppLinkHelper.getClassroomGuideAppLink,\n getInteractiveGuidanceAppLink: VideoAppLinkHelper.getInteractiveGuidanceAppLink,\n getResourceGuidanceAppLink: VideoAppLinkHelper.getResourceGuidanceAppLink,\n showNewVideoIndicator: hasTopicDirectories,\n companyLogoFallbackUrl: null,\n hasStudentExperience\n }\n };\n}","import { Flight } from 'libs/common/react/index';\n\nimport { AudienceRequests } from 'libs/shared/flight-requests/AudienceRequests';\nimport { PresentationAudience } from 'libs/shared/interfaces';\n\nimport { usePresentation } from 'shared/hooks/usePresentation';\n\nexport const usePresentationAudiences = () => {\n const { activePresentation, getFallbackPresentation } = usePresentation({ redirectOnError: true });\n\n const presentation = activePresentation || getFallbackPresentation();\n\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(\n !!presentation &&\n AudienceRequests.presentationAudiences(presentation.id)\n );\n\n return audiences;\n};","import { Flight } from 'libs/common/react/index';\n\nimport { HardCoded } from 'libs/shared/constants/HardCoded';\nimport { LocalPermissionName, PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useProducts } from 'libs/shared/hooks/UseProducts';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { CurrentUser } from 'libs/shared/interfaces';\n\nimport { LiteRouteHelper } from 'shared/utils/LiteRouteHelper';\n\nexport interface VideoFeaturesHash {\n canViewGlance: boolean;\n canViewResources: boolean;\n canViewInteractives: boolean;\n canViewClips: boolean;\n canUseActions: boolean;\n canViewPublicLayout: boolean;\n canNavigate: boolean;\n canViewCurriculumLinks: boolean;\n canViewResourceItems: boolean;\n canViewTranscript: boolean;\n}\n\nexport function useVideoFeatureAccess(videoId?: string) {\n const { hasPermissions, hasLocalPermissions } = usePermissions();\n const { hasProduct } = useProducts();\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const { hasPlayPageTranscript } = useSettings(null);\n\n const hasNP = hasProduct(ProductId.Primary);\n\n function showPublicLayout(): boolean {\n /**\n * Authenticated users should never see the placeholder\n */\n if (hasLocalPermissions(LocalPermissionName.WatchVideos))\n return false;\n\n /**\n * Accessing a play page unathenticated will have different contextual behabviours:\n * - For a share page, the user should see the video and never the placeholder\n * - For a public browsing page (ie. using a route-prefix) they should see the placeholder\n */\n return LiteRouteHelper.hasRegionPrefix();\n }\n\n function shouldShowTranscript(videoId: string): boolean {\n if (currentUser.data?.isAuthenticated)\n return hasPlayPageTranscript;\n\n if (!videoId)\n return false;\n\n return HardCoded.PublicTranscriptVideoIds.includes(videoId);\n }\n\n return {\n canViewGlance: hasPermissions(PermissionName.ViewVideoGlance),\n canViewResources: true,\n canViewInteractives: hasNP && hasPermissions(PermissionName.ViewVideoInteractives),\n canViewClips: hasNP && hasPermissions(PermissionName.ViewVideoClips),\n canViewCurriculumLinks: hasPermissions(PermissionName.ViewCurriculums),\n canUseActions: hasLocalPermissions(LocalPermissionName.UseVideoActions),\n canViewPublicLayout: showPublicLayout(),\n canViewResourceItems: hasLocalPermissions(LocalPermissionName.ViewVideoResourceItems),\n canNavigate: hasNP,\n canViewTranscript: shouldShowTranscript(videoId)\n };\n}","import { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { useGrowingBatchFetch } from 'libs/shared/hooks/UseBatchFetch';\nimport { Clip, ClipCollection, Video, VideoCollection } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\ntype Types = Video[] | VideoCollection | Clip[] | ClipCollection;\n\nfunction getValidObjects(objects: Types): (Video | Clip)[] {\n if (!objects)\n return [];\n\n if (Array.isArray(objects))\n return objects.filter(o => !!o && (VideoHelper.isVideo(o) || VideoHelper.isClip(o)));\n\n if ('data' in objects)\n return objects.data.filter(o => !!o && (VideoHelper.isVideo(o) || VideoHelper.isClip(o)));\n\n return [];\n}\n\ninterface VideoMixinOptions {\n /**\n * If the videos that are having new data mixed into are sitting on an explicit Flight namespace,\n * providing that namespace here is required\n */\n flightNamespace?: string;\n}\n\nexport function useVideoMixin(objects: Types, options: VideoMixinOptions = {}): void {\n const videoIds = getValidObjects(objects).map(v => v.id);\n\n useGrowingBatchFetch(videoIds, ids => VideoRequests.videoMixinAssocs(ids, options.flightNamespace));\n}","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoList } from 'libs/shared/components/video-list/VideoList';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { CurrentUser, PresentationAudience, VideoTypes } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\nimport { PlayViewQueryParams } from 'libs/shared/interfaces/query-params/PlayViewQueryParams';\n\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\nimport { InteractiveHelpers } from 'shared/utils/InteractiveHelper';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nconst namespace = 'shared.playClip';\n\ninterface ClippedFromProps {\n originalVideo: VideoTypes;\n queryParams: PlayViewQueryParams;\n audiences: PresentationAudience[];\n shareId?: string;\n headingRef: React.MutableRefObject<Map<PlayPageAnchor, HTMLElement>>;\n currentUser: CurrentUser;\n commonVideoProps: CommonVideoProps;\n}\n\nexport function ClippedFrom(props: ClippedFromProps) {\n const { hasPermissions } = usePermissions();\n const videoActions = useVideoActions({ location: VideoActionsLocation.VideoItem });\n\n return (\n <section\n className='play-page-section'\n id={PlayPageAnchor.ClippedFrom}\n ref={el => {\n (el && props.headingRef?.current) && props.headingRef.current.set(PlayPageAnchor.ClippedFrom, el);\n }}\n >\n <h2 className='h4 mb-0'><Text namespace={namespace} phrase='clippedFrom' /></h2>\n <VideoActionsContext.Provider value={videoActions}>\n <VideoList\n videos={[props.originalVideo]}\n getVideoAppLink={(v, opts) => VideoAppLinkHelper.getAppLink(v, {\n ...opts,\n context: props.queryParams.context,\n contextId: props.queryParams.contextId,\n playNext: props.queryParams.playNext,\n shareId: props.shareId,\n moviesAndTv: props.queryParams.mtv,\n includeContext: props.currentUser?.isAuthenticated\n })}\n hasPermissions={hasPermissions}\n presentationAudiences={props.audiences}\n getPreviewQuestionsAppLink={interactive => InteractiveHelpers.getPreviewQuestionsAppLink(interactive)}\n commonVideoProps={props.commonVideoProps}\n />\n </VideoActionsContext.Provider>\n </section>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"main\":\"ULvZW\",\"expandedToc\":\"W3k9M\",\"theatreMode\":\"KOUGv\",\"theatreModeContent\":\"fWNAc\",\"theatreModePlayPageContainer\":\"RJ5nP\",\"theatreModeLeftContent\":\"dllgG\"};","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { Breadcrumb, Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { VideoDetailsWithScrollbarV2 } from 'libs/shared/components/play-page/details/VideoDetailsV2';\nimport { hasGlanceData } from 'libs/shared/components/play-page/glance/VideoAtAGlanceUtilsV2';\nimport { VideoAtAGlanceV2 } from 'libs/shared/components/play-page/glance/VideoAtAGlanceV2';\nimport { PlayPageResources } from 'libs/shared/components/play-page/resources-widget/PlayPageResources';\nimport { SeoConstants } from 'libs/shared/constants/SeoConstants';\nimport { GlobalPlayerConsumer } from 'libs/shared/context/player-context/components/GlobalPlayerConsumer';\nimport { usePlayerContext } from 'libs/shared/context/player-context/PlayerContext';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { HasProductFunc } from 'libs/shared/hooks/UseProducts';\nimport { useTableOfContentsActiveHeading } from 'libs/shared/hooks/useTableOfContentsActiveHeading';\nimport { useTableOfContentsScroll } from 'libs/shared/hooks/useTableOfContentsScroll';\nimport { Clip, CurrentUser, InteractiveMetadata, Link, PointOfInterest, PresentationAudience, Resource, Video } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\nimport { PlayViewQueryParams } from 'libs/shared/interfaces/query-params/PlayViewQueryParams';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { ArchivedBanner } from 'shared/components/play-page/ArchivedBanner';\nimport { PlayPageClips } from 'shared/components/play-page/components/play-page-clips/PlayPageClips';\nimport { PlayPageInteractives } from 'shared/components/play-page/components/play-page-interactives/PlayPageInteractives';\nimport { TableOfContentsContainer } from 'shared/components/play-page/components/table-of-contents/TableOfContents';\nimport { PlayPageTitleAndActions } from 'shared/components/play-page/components/title-and-actions/PlayPageTitleAndActions';\nimport { RestrictionBanner } from 'shared/components/play-page/RestrictionBanner';\nimport { PlayerPlaceholder } from 'shared/components/player-placeholder/PlayerPlaceholder';\nimport { RelatedVideos } from 'shared/components/related-videos/RelatedVideos';\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { ViewModelKeys } from 'shared/constants/LiteViewModels';\nimport { RelatedVideosHash } from 'shared/hooks/useGetRelatedVideos';\nimport { VideoFeaturesHash } from 'shared/hooks/useVideoFeatureAccess';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\nimport { getContentClassName, getMainClassName } from 'shared/views/play/components/play-page/PlayPageUtils';\nimport { usePlayPageTableOfContent } from 'shared/views/play/hooks/usePlayPageTableOfContent';\nimport { useSectionHeadings } from 'shared/views/play/hooks/useSectionHeadings';\nimport { useTheatreStyle } from 'shared/views/play/hooks/useTheatreStyle';\nimport { PlayPageUtils } from 'shared/views/play/PlayPageUtil';\nimport { ClippedFrom } from 'shared/views/play-clip/components/clipped-from/ClippedFrom';\n\nimport styles from './play-clip.scss';\n\nconst getResourceAppLink = (videoId: string, shareId: string, canViewResource: boolean) =>\n (resource: Resource | Link) => {\n if (!canViewResource) {\n return {\n application: AppChannels.SIGN_UP,\n action: Actions.SignUp.SIGN_UP\n };\n }\n\n return {\n application: AppChannels.VIDEOS,\n action: Actions.Videos.PREVIEW_PDF,\n args: [resource.id],\n params: {\n videoId: videoId,\n shareId: shareId\n }\n };\n };\n\n\ninterface PlayClipProps {\n clip: Clip;\n clips: Clip[];\n interactives: InteractiveMetadata[];\n originalVideo: Video;\n currentUser: CurrentUser;\n relatedVideos: RelatedVideosHash;\n queryParams: PlayViewQueryParams;\n hasProduct: HasProductFunc;\n audiences: PresentationAudience[];\n shareId?: string;\n canManageVideoAccess: boolean;\n pointsOfInterest?: PointOfInterest[];\n featureAccess: VideoFeaturesHash;\n tableOfContentsId: string;\n shouldShowSideTableOfContents: boolean;\n hasTopicDirectories: boolean;\n hasTheatreMode: boolean;\n breadcrumbs?: Breadcrumb[];\n commonVideoProps: CommonVideoProps;\n}\n\nexport function PlayClip(props: PlayClipProps): JSX.Element {\n const playerContext = usePlayerContext();\n\n const { hasPermissions } = usePermissions();\n const { canConsume } = VideoHelper.getCanBeConsumed(props.clip);\n \n const theatreMode = props.hasTheatreMode && playerContext.mode === 'theatre';\n const shouldUseTheareModeStyle = useTheatreStyle(props.hasTheatreMode, theatreMode);\n\n function toggleTheatreMode(value: boolean) {\n playerContext.playerRef?.current?.toggleTheatreMode?.(value);\n }\n\n const {\n tableOfContentsActiveId,\n setTableOfContentsActiveId,\n controlledId,\n setControlledId,\n tableOfContentsExpanded,\n onToggleTableOfContents\n } = usePlayPageTableOfContent(props.tableOfContentsId, props.hasTheatreMode, theatreMode);\n\n const hasGlance = hasGlanceData(props.clip) && props.featureAccess.canViewGlance;\n\n const { headingRef, headingElements } = useSectionHeadings(hasGlance);\n const items = headingElements.map(ele => {\n return {\n id: ele.id as PlayPageAnchor,\n name: PlayPageUtils.getSectionHeading(\n ele.id as PlayPageAnchor,\n {\n clips: props.clips,\n interactives: props.interactives,\n resources: props.clip.resources?.data,\n isPlayClipPage: true\n }\n )\n };\n });\n\n useTableOfContentsActiveHeading({\n setActiveId: setTableOfContentsActiveId,\n headingElements,\n controlledId,\n setControlledId\n });\n\n useTableOfContentsScroll(headingElements, controlledId);\n\n const isArchived = VideoHelper.isVideoTypeArchived(props.clip);\n const hasStudentExperience = hasPermissions(PermissionName.StudentExperience);\n /**\n * Need to use a ref because if we use state, onExitImmersiveReader will have a stale\n * reference of the state. This is because the state is changed in onLaunchImmersiveReader\n * which is passed in at the same time as onExitImmersiveReader\n */\n const shouldPlayOnExitImmersiveReader = React.useRef(false);\n\n function onLaunchImmersiveReader(): void {\n shouldPlayOnExitImmersiveReader.current = !playerContext?.playerRef?.current?.isPaused();\n playerContext?.playerRef?.current?.pause();\n }\n\n function onExitImmersiveReader(): void {\n if (!shouldPlayOnExitImmersiveReader.current)\n return;\n\n playerContext?.playerRef?.current?.play();\n }\n\n function canAccessOriginal(): boolean {\n if (!props.originalVideo || !props.clip._canBeConsumed?.value)\n return false;\n\n if (!props.currentUser?.isAuthenticated)\n return false;\n\n if (!props.hasProduct(ProductId.Primary))\n return false;\n\n if (hasStudentExperience)\n return false;\n\n return true;\n }\n\n function getOriginalVideoAppLink(): Core.AppLink {\n if (!canAccessOriginal())\n return null;\n \n return {\n application: AppChannels.VIDEOS,\n action: Actions.Videos.PLAY_VIDEO,\n args: [ props.originalVideo.id, TextHelper.slugify(props.originalVideo.name) ]\n };\n }\n\n const showPlayerPlaceholder = playerContext.mode === 'picture-in-picture' || props.featureAccess.canViewPublicLayout;\n\n const otherClips = props.clips?.filter(c => c.id.toString() !== props.clip.id.toString()) ?? [];\n\n const calcClassNameProps = {\n hasTheatreMode: props.hasTheatreMode,\n shouldShowSideTableOfContents: props.shouldShowSideTableOfContents,\n tableOfContentsExpanded,\n theatreMode\n };\n const mainClassName = getMainClassName(calcClassNameProps);\n const contentClassName = getContentClassName(calcClassNameProps);\n\n const [ , setContainerClassName ] = useViewModel(ViewModelKeys.PLAY_PAGE_CONTAINER_CLASS_NAME);\n \n React.useEffect(() => {\n if (!theatreMode) {\n setContainerClassName('');\n } else {\n setContainerClassName(styles.theatreModePlayPageContainer);\n }\n }, [theatreMode]);\n\n React.useEffect(() => {\n return () => setContainerClassName('');\n }, []);\n\n return (\n <div className={`px-4 play-page-sections-container ${props.shouldShowSideTableOfContents ? 'row g-0' : ''}`}>\n <main className={`${styles.main} ${mainClassName}`}>\n {!!props.breadcrumbs?.length && (\n <div className='mb-2'>\n <Breadcrumbs breadcrumbs={props.breadcrumbs} />\n </div>\n )}\n\n <RestrictionBanner\n restrictions={props.clip._restrictions}\n yearGroups={props.commonVideoProps.yearGroups}\n objectId={props.clip.id}\n objectTypeId={MasterType.Clip}\n canManageVideoAccess={props.canManageVideoAccess}\n />\n\n {isArchived && (\n <ArchivedBanner\n typeId={props.clip.typeId}\n hasStudentExperience={hasStudentExperience}\n />\n )}\n\n <section\n id={PlayPageAnchor.Video}\n className={`mb-2 ${SeoConstants.GLOBAL_PLAYER_SELECTOR}`}\n ref={el => { (el && headingRef?.current) && headingRef.current.set(PlayPageAnchor.Video, el); }}\n >\n {canConsume && (\n <GlobalPlayerConsumer\n key={props.clip.id}\n objectId={props.clip.id}\n objectTypeId={props.clip.typeId}\n shareId={props.shareId}\n context={props.queryParams?.context}\n contextId={props.queryParams?.contextId}\n moviesAndTv={props.queryParams?.mtv}\n playNext={props.queryParams?.playNext}\n startTime={props.queryParams?.t ?? props.queryParams?.startTime}\n mode={playerContext.mode || 'default'}\n location='play-page'\n />\n )}\n\n <div className={showPlayerPlaceholder ? '' : 'd-none'}>\n <PlayerPlaceholder\n video={props.clip}\n type='pip'\n />\n </div>\n </section>\n\n <div className={contentClassName}>\n <div className={shouldUseTheareModeStyle ? `${styles.theatreModeLeftContent}` : 'w-100'}>\n <PlayPageTitleAndActions\n media={props.clip}\n yearGroups={props.commonVideoProps.yearGroups}\n audiences={props.audiences}\n originalVideoAppLink={getOriginalVideoAppLink()}\n featureAccess={props.featureAccess}\n shareId={props.shareId}\n showTitlePadlock={!props.commonVideoProps.hasStudentExperience}\n />\n\n {/* if no glance render video details here */}\n {hasGlance ? (\n <VideoAtAGlanceV2\n video={props.clip}\n pointsOfInterest={props.pointsOfInterest}\n setStartTime={(time: number) => playerContext.playerRef.current?.currentTime(time)}\n getTagAppLink={tag => ({\n application: AppChannels.SEARCH,\n action: Actions.Search.HOME,\n params: { tagOrClassification: tag.name }\n })}\n suppressInteractivity={props.featureAccess.canViewPublicLayout}\n canViewGlance={hasGlance}\n />\n ) : (\n <VideoDetailsWithScrollbarV2\n video={props.clip}\n currentUser={props.currentUser}\n onLaunchImmersiveReader={onLaunchImmersiveReader}\n onExitImmersiveReader={onExitImmersiveReader}\n getTagAppLink={tag => ({\n application: AppChannels.SEARCH,\n action: Actions.Search.HOME,\n params: { tagOrClassification: tag.name }\n })}\n headingRef={headingRef}\n suppressInteractivity={props.featureAccess.canViewPublicLayout}\n />\n )}\n\n <PlayPageResources\n video={props.clip}\n canViewResources={props.featureAccess.canViewResourceItems}\n imageCdnUrl={props.commonVideoProps.imageCdnUrl}\n getAppLink={\n getResourceAppLink(props.clip.id, props.shareId, props.featureAccess.canViewResourceItems)\n }\n analyticsData={{ clipId: props.clip.id, clipName: props.clip.name }}\n resourceThumbnailFallbackUrl={ImageUrls.Fallbacks.RESOURCE_THUMBNAIL}\n headingRef={headingRef}\n />\n\n <PlayPageInteractives\n video={props.clip}\n interactives={props.interactives}\n analyticsData={{ clipId: props.clip.id, clipName: props.clip.name }}\n canViewInteractives={props.featureAccess.canViewInteractives}\n headingRef={headingRef}\n commonVideoProps={props.commonVideoProps}\n />\n\n <PlayPageClips\n clips={otherClips || []}\n video={props.clip}\n canViewClips={props.featureAccess.canViewClips}\n audiences={props.audiences}\n headingRef={headingRef}\n analyticsData={{ clipId: props.clip.id, clipName: props.clip.name }}\n commonVideoProps={props.commonVideoProps}\n />\n\n {/* if has glance, render video details here */}\n {hasGlance && (\n <VideoDetailsWithScrollbarV2\n video={props.clip}\n currentUser={props.currentUser}\n onLaunchImmersiveReader={onLaunchImmersiveReader}\n onExitImmersiveReader={onExitImmersiveReader}\n getTagAppLink={tag => ({\n application: AppChannels.SEARCH,\n action: Actions.Search.HOME,\n params: { tagOrClassification: tag.name }\n })}\n headingRef={headingRef}\n suppressInteractivity={props.featureAccess.canViewPublicLayout}\n showHeading\n />\n )}\n \n {!!canAccessOriginal() && (\n <ClippedFrom\n originalVideo={props.originalVideo}\n shareId={props.shareId}\n queryParams={props.queryParams}\n audiences={props.audiences}\n headingRef={headingRef}\n currentUser={props.currentUser}\n commonVideoProps={props.commonVideoProps}\n />\n )}\n\n <RelatedVideos\n currentVideo={props.clip}\n relatedVideos={props.relatedVideos}\n currentUser={props.currentUser}\n audiences={props.audiences}\n getVideoAppLink={(v, opts) => VideoAppLinkHelper.getAppLink(v, {\n ...opts,\n context: props.queryParams.context,\n contextId: props.queryParams.contextId,\n playNext: props.queryParams.playNext,\n shareId: props.shareId,\n moviesAndTv: props.queryParams.mtv,\n includeContext: props.currentUser?.isAuthenticated\n })}\n moviesAndTv={props.queryParams.mtv}\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n {theatreMode && (\n <TableOfContentsContainer\n isExpanded={tableOfContentsExpanded}\n setIsExpanded={onToggleTableOfContents}\n toggleTheatreMode={ null}\n items={items}\n activeId={tableOfContentsActiveId}\n setControlledId={setControlledId}\n analyticsData={{ videoId: props.clip.id, videoName: props.clip.name }}\n showInSide={props.shouldShowSideTableOfContents}\n isTheatreMode={true}\n hasTranscription={props.hasTheatreMode}\n />\n )}\n </div>\n </main>\n\n {!theatreMode && (\n <TableOfContentsContainer\n isExpanded={tableOfContentsExpanded}\n setIsExpanded={onToggleTableOfContents}\n toggleTheatreMode={props.hasTheatreMode ? toggleTheatreMode : null}\n items={items}\n activeId={tableOfContentsActiveId}\n setControlledId={setControlledId}\n analyticsData={{ videoId: props.clip.id, videoName: props.clip.name }}\n showInSide={props.shouldShowSideTableOfContents}\n isTheatreMode={false}\n hasTranscription={props.hasTheatreMode}\n />\n )}\n </div>\n );\n}\n"],"names":["CHUNK_SIZE","useBatchFetch","itemIds","getRequest","requests","map","chunk","responses","itemsArr","data","items","length","reduce","acc","item","id","isFetching","useGrowingBatchFetch","objs","_getKey","getKey","obj","fetchedItems","Set","setRequests","unfetchedItems","forEach","key","current","has","push","add","r","hasFirstRequestCompleted","hasCompleted","useBreadcrumbs","match","breadcrumbs","useBuilder","active","useCommonVideoProps","options","locationContext","mtv","flightNamespace","sharedPlaylist","isPlugin","params","u","setFavourite","canFavourite","hasTopicDirectories","isLoadingSettings","hasPermissions","hasLoadedPermissions","isLoaded","hasStudentExperience","config","currentUser","yearGroups","isAuthenticated","customerId","hasCommonVideoPropsCompleted","commonVideoProps","subTextType","getSubTextAppLink","video","series","isPluginPopup","popup","imageCdnUrl","getClassroomGuideAppLink","getInteractiveGuidanceAppLink","getResourceGuidanceAppLink","showNewVideoIndicator","companyLogoFallbackUrl","usePresentationAudiences","redirectOnError","activePresentation","getFallbackPresentation","presentation","useVideoFeatureAccess","videoId","hasLocalPermissions","hasProduct","hasPlayPageTranscript","hasNP","canViewGlance","canViewResources","canViewInteractives","canViewClips","canViewCurriculumLinks","canUseActions","canViewPublicLayout","canViewResourceItems","canNavigate","canViewTranscript","shouldShowTranscript","useVideoMixin","objects","videoIds","Array","isArray","filter","o","getValidObjects","v","ids","namespace","ClippedFrom","props","usePermissions","videoActions","useVideoActions","location","className","PlayPageAnchor","ref","el","headingRef","set","Text","phrase","VideoActionsContext","value","VideoList","videos","originalVideo","getVideoAppLink","opts","VideoAppLinkHelper","context","queryParams","contextId","playNext","shareId","moviesAndTv","includeContext","presentationAudiences","audiences","getPreviewQuestionsAppLink","interactive","InteractiveHelper","getResourceAppLink","canViewResource","resource","application","action","args","PlayClip","playerContext","canConsume","VideoHelper","clip","theatreMode","hasTheatreMode","mode","shouldUseTheareModeStyle","useTheatreStyle","usePlayPageTableOfContent","tableOfContentsId","tableOfContentsActiveId","setTableOfContentsActiveId","controlledId","setControlledId","tableOfContentsExpanded","onToggleTableOfContents","hasGlance","featureAccess","useSectionHeadings","headingElements","ele","name","PlayPageUtil","clips","interactives","resources","isPlayClipPage","useTableOfContentsActiveHeading","setActiveId","useTableOfContentsScroll","isArchived","PermissionName","shouldPlayOnExitImmersiveReader","onLaunchImmersiveReader","playerRef","isPaused","pause","onExitImmersiveReader","play","canAccessOriginal","_canBeConsumed","ProductId","showPlayerPlaceholder","otherClips","c","toString","calcClassNameProps","shouldShowSideTableOfContents","mainClassName","contentClassName","setContainerClassName","Breadcrumbs","RestrictionBanner","restrictions","_restrictions","objectId","objectTypeId","MasterType","canManageVideoAccess","ArchivedBanner","typeId","SeoConstants","GlobalPlayerConsumer","startTime","t","PlayerPlaceholder","type","PlayPageTitleAndActions","media","originalVideoAppLink","TextHelper","showTitlePadlock","VideoAtAGlanceV2","pointsOfInterest","setStartTime","time","currentTime","getTagAppLink","tag","tagOrClassification","suppressInteractivity","PlayPageResources","getAppLink","analyticsData","clipId","clipName","resourceThumbnailFallbackUrl","ImageUrls","PlayPageInteractives","PlayPageClips","showHeading","RelatedVideos","currentVideo","relatedVideos","TableOfContents","isExpanded","setIsExpanded","toggleTheatreMode","activeId","videoName","showInSide","isTheatreMode","hasTranscription"],"sourceRoot":""}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[3781],{63781:(e,a,t)=>{t.r(a),t.d(a,{LiteUpgradeOnboardingView:()=>
|
|
2
|
-
//# sourceMappingURL=3781-
|
|
1
|
+
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[3781],{63781:(e,a,t)=>{t.r(a),t.d(a,{LiteUpgradeOnboardingView:()=>F});var r=t(32735),n=t(23481),i=t(81886),c=t(20354),l=t(65858),o=t(30439),s=t(2102),u=t(83345),d=t(60051),p=t(77963),m=t(65728),h=t(39151),f=t(47812),g=t(31949),v=t(1575),b=t(79612),y=t(37802),w=t(13126),S=t(14070),k=t(97291),C=function(e){return e?{videoId:"49331262",shareId:"0DYKrb"}:null},E=t(18901);const O={playerContainer:"aAJnB",fallback:"RQpQJ"};function x(e,a){return function(e){if(Array.isArray(e))return e}(e)||function(e,a){var t=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=t){var r,n,i,c,l=[],o=!0,s=!1;try{if(i=(t=t.call(e)).next,0===a){if(Object(t)!==t)return;o=!1}else for(;!(o=(r=i.call(t)).done)&&(l.push(r.value),l.length!==a);o=!0);}catch(e){s=!0,n=e}finally{try{if(!o&&null!=t.return&&(c=t.return(),Object(c)!==c))return}finally{if(s)throw n}}return l}}(e,a)||function(e,a){if(e){if("string"==typeof e)return A(e,a);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?A(e,a):void 0}}(e,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.")}()}function A(e,a){(null==a||a>e.length)&&(a=e.length);for(var t=0,r=Array(a);t<a;t++)r[t]=e[t];return r}var I=20,N="default.upgradeOnboarding",B=n.T.encloseNamespace(N);function F(){var e=x(r.useState(!1),2),a=e[0],t=e[1],n=x(r.useState(!0),2),A=n[0],F=n[1],L=x(r.useState(!1),2),U=L[0],j=L[1],T=(0,y.r)(l.LZ.LiteUpgradeOnboarding).updateSetting,_=c.a.useBasicFetch(g.N.currentUser()),D=c.a.useBasicFetch(h.L.config()),R=C(D.data),H=c.a.useBasicFetch(R&&v.R.sharedVideo(R.videoId,R.shareId)),K=c.a.useBasicFetch(o.o.getShareObject(R.shareId)),M=c.a.useBasicFetch(f.k.createViewKey(R.shareId,d.f.Share));function Q(){t(!0);var e={name:m.E.HasCompletedUpgradeOnboarding,value:!0,kind:p.g.FeatureFlag};window.setTimeout((function(){T(_.data.id,e,(function(){w.e.enableNav(),w.e.enableSearch(),i.Q.C$.trigger({application:k.O.DASHBOARD,action:S.e.Dashboard.HOME})}))}),1e3)}(0,b.M)({title:B("pageTitle")});var V=H.data&&_.hasCompleted&&D.hasCompleted&&K.hasCompleted&&M.hasCompleted;return r.createElement("div",{className:"w-100 text-center pt-4 pb-3 px-5"},r.createElement("h1",null,r.createElement(u.x,{namespace:N,phrase:"heading"})),r.createElement("p",{className:"h4 fw-normal"},r.createElement(u.x,{namespace:N,phrase:"message"})),r.createElement("div",{className:O.playerContainer},A&&r.createElement("div",{className:"".concat(O.fallback," w-100 bg-light")}),V&&r.createElement(E._,{config:D.data,video:H.data,currentUser:_.data,shareLink:K.data,viewKey:M.data,onReady:function(e){F(!1);var a=function(){e.currentTime()>e.duration()-I&&j(!0)};e.on("timeupdate",a),e.one("dispose",(function(){e.off("timeupdate",a)}))},autoplay:!0,allowCreateClip:!1})),U?r.createElement(s.m,{variant:"dark",showSpinner:a,onClick:Q,className:"px-3"},r.createElement(u.x,{namespace:N,phrase:"getStarted"})):r.createElement(s.m,{variant:"link",showSpinner:a,onClick:Q,className:"px-3"},r.createElement(u.x,{namespace:N,phrase:"watchLater"})))}}}]);
|
|
2
|
+
//# sourceMappingURL=3781-e092f92668-lite.chunk.js.map
|
package/dist/scripts/{3781-7a9ddc7736-lite.chunk.js.map → 3781-e092f92668-lite.chunk.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/3781-
|
|
1
|
+
{"version":3,"file":"scripts/3781-e092f92668-lite.chunk.js","mappings":"iYAEaA,EAAkB,SAACC,GAC9B,OAAKA,EAGE,CACLC,QAAS,WACTC,QAAS,UAJF,IAMX,E,WCTA,SAAgB,gBAAkB,QAAQ,SAAW,S,ggCCgCrD,IAAMC,EAAgB,GAEhBC,EAAY,4BACZC,EAAYC,EAAA,mBAAiCF,GAE7C,SAAUG,IACd,IAAyE,IAArB,YAAe,GAAM,GAAjEC,EAAiB,KAAEC,EAAoB,KACe,IAApB,YAAe,GAAK,GAAtDC,EAAY,KAAEC,EAAe,KACY,IAArB,YAAe,GAAM,GAAzCC,EAAK,KAAEC,EAAQ,KAEfC,GAAkB,EAAAC,EAAA,GAAY,4BAA9BD,cAEFE,EAAc,kBAAkCC,EAAA,iBAChDjB,EAAS,kBAA6BkB,EAAA,YAEtCC,EAAepB,EAAgBC,EAAOoB,MAEtCC,EAAQ,kBAA4BF,GACxCG,EAAA,cAA0BH,EAAalB,QAASkB,EAAajB,UAEzDqB,EAAY,kBAAuCC,EAAA,iBAA6BL,EAAajB,UAC7FuB,EAAU,kBACdC,EAAA,gBAA6BP,EAAajB,QAASyB,EAAA,UAKrD,SAASC,IACPnB,GAAqB,GAErB,IAAMoB,EAAa,CACjBC,KAAMC,EAAA,gCACNC,OAAO,EACPC,KAAMC,EAAA,eAIRC,OAAOC,YAAW,WAChBtB,EACEE,EAAYI,KAAKiB,GACjBR,GACA,WACES,EAAA,cACAA,EAAA,iBACA,eAA2B,CACzBC,YAAa,cACbC,OAAQ,oBAEZ,GAEJ,GAAG,IACL,EA1BA,EAAAC,EAAA,GAAmB,CAAEC,MAAOrC,EAAU,eA8CtC,IAAMsC,EACJtB,EAAMD,MACNJ,EAAY2B,cACZ3C,EAAO2C,cACPpB,EAAUoB,cACVlB,EAAQkB,aAGV,OACE,uBAAKC,UAAU,oCACb,0BACE,gBAACC,EAAA,EAAI,CAACzC,UAAWA,EAAW0C,OAAO,aAErC,qBAAGF,UAAU,gBAAe,gBAACC,EAAA,EAAI,CAACzC,UAAWA,EAAW0C,OAAO,aAE/D,uBAAKF,UAAW,mBACblC,GAAgB,uBAAKkC,UAAS,UAAK,WAAe,qBAClDD,GACC,gBAACI,EAAA,EAAc,CACb/C,OAAQA,EAAOoB,KACfC,MAAOA,EAAMD,KACbJ,YAAaA,EAAYI,KACzBG,UAAWA,EAAUH,KACrBK,QAASA,EAAQL,KACjB4B,QA1CV,SAAiBC,GACftC,GAAgB,GAEhB,IAAMuC,EAAe,WACfD,EAAOE,cAA2BF,EAAOG,WAAajD,GACxDU,GAAS,EAEb,EAKAoC,EAAOI,GAAG,aAAcH,GACxBD,EAAOK,IAAI,WAAW,WACpBL,EAAOM,IAAI,aAAcL,EAC3B,GACF,EA2BUM,UAAQ,EACRC,iBAAiB,KAKtB7C,EACG,gBAAC8C,EAAA,EAAa,CACdC,QAAQ,OACRC,YAAapD,EACbqD,QAASjC,EACTgB,UAAU,QAEV,gBAACC,EAAA,EAAI,CAACzC,UAAWA,EAAW0C,OAAO,gBAEnC,gBAACY,EAAA,EAAa,CACdC,QAAQ,OACRC,YAAapD,EACbqD,QAASjC,EACTgB,UAAU,QAEV,gBAACC,EAAA,EAAI,CAACzC,UAAWA,EAAW0C,OAAO,gBAK7C,C","sources":["file:///app/packages/projects/lite/src/shared/utils/getUpgradeVideo.ts","file:///app/packages/projects/lite/src/apps/default/views/upgrade-onboarding/upgrade-onboarding.scss","file:///app/packages/projects/lite/src/apps/default/views/upgrade-onboarding/LiteUpgradeOnboardingView.tsx"],"sourcesContent":["import { Config } from 'libs/shared/interfaces';\n\nexport const getUpgradeVideo = (config: Config) => {\n if (!config)\n return null;\n \n return {\n videoId: '49331262',\n shareId: '0DYKrb'\n };\n};","// extracted by mini-css-extract-plugin\nexport default {\"playerContainer\":\"aAJnB\",\"fallback\":\"RQpQJ\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { SpinnerButton } from 'libs/shared/components/spinner-button/SpinnerButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { MediaIdType } from 'libs/shared/enums/MediaIdType';\nimport { SettingKind } from 'libs/shared/enums/SettingKind';\nimport { SettingName } from 'libs/shared/enums/SettingName';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { PlayerRequests } from 'libs/shared/flight-requests/PlayerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Config, CurrentUser, PlayerViewKey, UnionShareObject, Video } from 'libs/shared/interfaces';\nimport { LayoutHelper } from 'libs/shared/utils/LayoutHelper';\n\nimport { Player } from 'projects/player/players/player';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { getUpgradeVideo } from 'shared/utils/getUpgradeVideo';\nimport { LitePlayerView } from 'shared/views/lite-player/LitePlayerView';\n\nimport styles from './upgrade-onboarding.scss';\n\n// How long before the end of the video \"Watch later\" changes to \"Get started\"\nconst END_THRESHOLD = 20;\n\nconst namespace = 'default.upgradeOnboarding';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function LiteUpgradeOnboardingView(): JSX.Element {\n const [ showButtonSpinner, setShowButtonSpinner ] = React.useState(false);\n const [ showFallback, setShowFallback ] = React.useState(true);\n const [ ended, setEnded ] = React.useState(false);\n\n const { updateSetting } = useSettings(LocationContext.LiteUpgradeOnboarding);\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const upgradeVideo = getUpgradeVideo(config.data);\n\n const video = Flight.useBasicFetch<Video>(upgradeVideo &&\n VideoRequests.sharedVideo(upgradeVideo.videoId, upgradeVideo.shareId));\n\n const shareLink = Flight.useBasicFetch<UnionShareObject>(ShareRequests.getShareObject(upgradeVideo.shareId));\n const viewKey = Flight.useBasicFetch<PlayerViewKey>(\n PlayerRequests.createViewKey(upgradeVideo.shareId, MediaIdType.Share)\n );\n\n useSetPageMetadata({ title: getPhrase('pageTitle') });\n\n function onClickGetStarted(): void {\n setShowButtonSpinner(true);\n\n const newSetting = {\n name: SettingName.HasCompletedUpgradeOnboarding,\n value: true,\n kind: SettingKind.FeatureFlag\n };\n\n // Fake timeout\n window.setTimeout(() => {\n updateSetting(\n currentUser.data.id,\n newSetting,\n () => {\n LayoutHelper.enableNav();\n LayoutHelper.enableSearch();\n Core.AppLinkHelper.trigger({\n application: AppChannels.DASHBOARD,\n action: Actions.Dashboard.HOME\n });\n }\n );\n }, 1000);\n }\n\n function onReady(player: Player): void {\n setShowFallback(false);\n\n const onTimeUpdate = () => {\n if (player.currentTime() as number > (player.duration() - END_THRESHOLD)) {\n setEnded(true);\n }\n };\n\n /**\n * Change the button to \"Get started\" slightly before the end of the video\n */\n player.on('timeupdate', onTimeUpdate);\n player.one('dispose', () => {\n player.off('timeupdate', onTimeUpdate);\n });\n }\n\n const hasCompleted = (\n video.data &&\n currentUser.hasCompleted &&\n config.hasCompleted &&\n shareLink.hasCompleted &&\n viewKey.hasCompleted\n );\n\n return (\n <div className='w-100 text-center pt-4 pb-3 px-5'>\n <h1>\n <Text namespace={namespace} phrase='heading' />\n </h1>\n <p className='h4 fw-normal'><Text namespace={namespace} phrase='message' /></p>\n\n <div className={styles.playerContainer}>\n {showFallback && <div className={`${styles.fallback} w-100 bg-light`} />}\n {hasCompleted && (\n <LitePlayerView\n config={config.data}\n video={video.data}\n currentUser={currentUser.data}\n shareLink={shareLink.data}\n viewKey={viewKey.data}\n onReady={onReady}\n autoplay\n allowCreateClip={false}\n />\n )}\n </div>\n\n {ended\n ? <SpinnerButton\n variant='dark'\n showSpinner={showButtonSpinner}\n onClick={onClickGetStarted}\n className='px-3'\n >\n <Text namespace={namespace} phrase='getStarted' />\n </SpinnerButton>\n : <SpinnerButton\n variant='link'\n showSpinner={showButtonSpinner}\n onClick={onClickGetStarted}\n className='px-3'\n >\n <Text namespace={namespace} phrase='watchLater' />\n </SpinnerButton>\n }\n </div>\n );\n}"],"names":["getUpgradeVideo","config","videoId","shareId","END_THRESHOLD","namespace","getPhrase","LanguageService","LiteUpgradeOnboardingView","showButtonSpinner","setShowButtonSpinner","showFallback","setShowFallback","ended","setEnded","updateSetting","useSettings","currentUser","UserRequests","ConfigRequests","upgradeVideo","data","video","VideoRequests","shareLink","ShareRequests","viewKey","PlayerRequests","MediaIdType","onClickGetStarted","newSetting","name","SettingName","value","kind","SettingKind","window","setTimeout","id","LayoutHelper","application","action","useSetPageMetadata","title","hasCompleted","className","Text","phrase","LitePlayerView","onReady","player","onTimeUpdate","currentTime","duration","on","one","off","autoplay","allowCreateClip","SpinnerButton","variant","showSpinner","onClick"],"sourceRoot":""}
|