@clickview/lite 0.70.1-dev.5 → 0.70.1-dev.6

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.
Files changed (136) hide show
  1. package/dist/bundles.json +1 -1
  2. package/dist/css/{9583-lite-9eda71423d.chunk.css → 3878-lite-877e596a24.chunk.css} +3 -0
  3. package/dist/css/{5797-lite-1dfd2c337d.chunk.css → 5099-lite-7d7c063e62.chunk.css} +3 -0
  4. package/dist/css/{8191-lite-ee877f2ecd.chunk.css → 6984-lite-53c3fa4d18.chunk.css} +3 -0
  5. package/dist/css/{8723-lite-676baa8218.chunk.css → 7103-lite-ee0c975440.chunk.css} +3 -0
  6. package/dist/css/{7783-lite-1dfd2c337d.chunk.css → 7394-lite-7d7c063e62.chunk.css} +3 -0
  7. package/dist/css/7502-lite-9b2ed5bd56.chunk.css +4 -0
  8. package/dist/css/{5721-lite-9eda71423d.chunk.css → 7548-lite-877e596a24.chunk.css} +3 -0
  9. package/dist/css/{549-lite-b49bde8e4d.chunk.css → 7657-lite-ad909396f3.chunk.css} +3 -1
  10. package/dist/css/{6783-lite-e85973335b.chunk.css → 829-lite-27b58d07b3.chunk.css} +3 -0
  11. package/dist/css/{5635-lite-ee877f2ecd.chunk.css → 9673-lite-53c3fa4d18.chunk.css} +3 -0
  12. package/dist/scripts/1107-0fb4769540-lite.chunk.js +2 -0
  13. package/dist/scripts/1107-0fb4769540-lite.chunk.js.map +1 -0
  14. package/dist/scripts/1437-658ad1fe2b-lite.chunk.js +2 -0
  15. package/dist/scripts/1437-658ad1fe2b-lite.chunk.js.map +1 -0
  16. package/dist/scripts/1710-ef798f1e0d-lite.chunk.js +2 -0
  17. package/dist/scripts/1710-ef798f1e0d-lite.chunk.js.map +1 -0
  18. package/dist/scripts/2024-4fec8f175b-lite.chunk.js +2 -0
  19. package/dist/scripts/2024-4fec8f175b-lite.chunk.js.map +1 -0
  20. package/dist/scripts/2435-a846651e83-lite.chunk.js +2 -0
  21. package/dist/scripts/2435-a846651e83-lite.chunk.js.map +1 -0
  22. package/dist/scripts/2809-84ce060e14-lite.chunk.js +2 -0
  23. package/dist/scripts/2809-84ce060e14-lite.chunk.js.map +1 -0
  24. package/dist/scripts/3878-45fd0861cc-lite.chunk.js +2 -0
  25. package/dist/scripts/3878-45fd0861cc-lite.chunk.js.map +1 -0
  26. package/dist/scripts/4096-c834372efb-lite.chunk.js +2 -0
  27. package/dist/scripts/4096-c834372efb-lite.chunk.js.map +1 -0
  28. package/dist/scripts/4456-ada4977b41-lite.chunk.js +2 -0
  29. package/dist/scripts/4456-ada4977b41-lite.chunk.js.map +1 -0
  30. package/dist/scripts/4806-a05a2a3012-lite.chunk.js +2 -0
  31. package/dist/scripts/4806-a05a2a3012-lite.chunk.js.map +1 -0
  32. package/dist/scripts/5099-297f8cd028-lite.chunk.js +2 -0
  33. package/dist/scripts/5099-297f8cd028-lite.chunk.js.map +1 -0
  34. package/dist/scripts/5829-903613bbf0-lite.chunk.js +3 -0
  35. package/dist/scripts/5829-903613bbf0-lite.chunk.js.map +1 -0
  36. package/dist/scripts/5925-937fec8a93-lite.chunk.js +2 -0
  37. package/dist/scripts/5925-937fec8a93-lite.chunk.js.map +1 -0
  38. package/dist/scripts/6459-ac139cb154-lite.chunk.js +2 -0
  39. package/dist/scripts/6459-ac139cb154-lite.chunk.js.map +1 -0
  40. package/dist/scripts/6629-4edaed39c8-lite.chunk.js +3 -0
  41. package/dist/scripts/6629-4edaed39c8-lite.chunk.js.map +1 -0
  42. package/dist/scripts/6984-9d8b378bcc-lite.chunk.js +2 -0
  43. package/dist/scripts/6984-9d8b378bcc-lite.chunk.js.map +1 -0
  44. package/dist/scripts/7103-ef79582538-lite.chunk.js +2 -0
  45. package/dist/scripts/7103-ef79582538-lite.chunk.js.map +1 -0
  46. package/dist/scripts/7394-5448807e14-lite.chunk.js +2 -0
  47. package/dist/scripts/7394-5448807e14-lite.chunk.js.map +1 -0
  48. package/dist/scripts/7502-78b085caad-lite.chunk.js +2 -0
  49. package/dist/scripts/7502-78b085caad-lite.chunk.js.map +1 -0
  50. package/dist/scripts/7548-5eb0d3b7a0-lite.chunk.js +2 -0
  51. package/dist/scripts/7548-5eb0d3b7a0-lite.chunk.js.map +1 -0
  52. package/dist/scripts/7593-cc4e09c847-lite.chunk.js +2 -0
  53. package/dist/scripts/7593-cc4e09c847-lite.chunk.js.map +1 -0
  54. package/dist/scripts/7657-e302fda4f2-lite.chunk.js +2 -0
  55. package/dist/scripts/7657-e302fda4f2-lite.chunk.js.map +1 -0
  56. package/dist/scripts/8057-431c6be34c-lite.chunk.js +2 -0
  57. package/dist/scripts/8057-431c6be34c-lite.chunk.js.map +1 -0
  58. package/dist/scripts/8224-b9b5d3b1a5-lite.chunk.js +2 -0
  59. package/dist/scripts/8224-b9b5d3b1a5-lite.chunk.js.map +1 -0
  60. package/dist/scripts/829-aff9937989-lite.chunk.js +3 -0
  61. package/dist/scripts/829-aff9937989-lite.chunk.js.map +1 -0
  62. package/dist/scripts/{9250-ec244ab17a-lite.chunk.js → 8723-708f2373d6-lite.chunk.js} +3 -3
  63. package/dist/scripts/{9250-ec244ab17a-lite.chunk.js.map → 8723-708f2373d6-lite.chunk.js.map} +1 -1
  64. package/dist/scripts/8960-c159492ba3-lite.chunk.js +2 -0
  65. package/dist/scripts/8960-c159492ba3-lite.chunk.js.map +1 -0
  66. package/dist/scripts/9673-8a2740611a-lite.chunk.js +2 -0
  67. package/dist/scripts/9673-8a2740611a-lite.chunk.js.map +1 -0
  68. package/dist/scripts/9882-f1a9cc55ec-lite.chunk.js +2 -0
  69. package/dist/scripts/9882-f1a9cc55ec-lite.chunk.js.map +1 -0
  70. package/dist/scripts/{bundle-d2cf17c78d.min.js → bundle-5a89651ec2.min.js} +3 -3
  71. package/dist/scripts/{bundle-d2cf17c78d.min.js.map → bundle-5a89651ec2.min.js.map} +1 -1
  72. package/package.json +1 -1
  73. package/dist/css/7428-lite-e2d7497beb.chunk.css +0 -8
  74. package/dist/scripts/1565-ba78a2a25c-lite.chunk.js +0 -2
  75. package/dist/scripts/1565-ba78a2a25c-lite.chunk.js.map +0 -1
  76. package/dist/scripts/2024-abf6cf1842-lite.chunk.js +0 -2
  77. package/dist/scripts/2024-abf6cf1842-lite.chunk.js.map +0 -1
  78. package/dist/scripts/2072-50b656cb3b-lite.chunk.js +0 -2
  79. package/dist/scripts/2072-50b656cb3b-lite.chunk.js.map +0 -1
  80. package/dist/scripts/2574-02faf4a2d2-lite.chunk.js +0 -2
  81. package/dist/scripts/2574-02faf4a2d2-lite.chunk.js.map +0 -1
  82. package/dist/scripts/396-2ffc09cc70-lite.chunk.js +0 -2
  83. package/dist/scripts/396-2ffc09cc70-lite.chunk.js.map +0 -1
  84. package/dist/scripts/4377-001a8ee263-lite.chunk.js +0 -2
  85. package/dist/scripts/4377-001a8ee263-lite.chunk.js.map +0 -1
  86. package/dist/scripts/4806-c2dce3650d-lite.chunk.js +0 -2
  87. package/dist/scripts/4806-c2dce3650d-lite.chunk.js.map +0 -1
  88. package/dist/scripts/4948-30af9a446d-lite.chunk.js +0 -2
  89. package/dist/scripts/4948-30af9a446d-lite.chunk.js.map +0 -1
  90. package/dist/scripts/549-2d591052e3-lite.chunk.js +0 -2
  91. package/dist/scripts/549-2d591052e3-lite.chunk.js.map +0 -1
  92. package/dist/scripts/5635-6e2559f04d-lite.chunk.js +0 -2
  93. package/dist/scripts/5635-6e2559f04d-lite.chunk.js.map +0 -1
  94. package/dist/scripts/5679-80c1d8434e-lite.chunk.js +0 -2
  95. package/dist/scripts/5679-80c1d8434e-lite.chunk.js.map +0 -1
  96. package/dist/scripts/5721-2141ed4fb6-lite.chunk.js +0 -2
  97. package/dist/scripts/5721-2141ed4fb6-lite.chunk.js.map +0 -1
  98. package/dist/scripts/5797-f84ce545b9-lite.chunk.js +0 -2
  99. package/dist/scripts/5797-f84ce545b9-lite.chunk.js.map +0 -1
  100. package/dist/scripts/581-fe733617bd-lite.chunk.js +0 -2
  101. package/dist/scripts/581-fe733617bd-lite.chunk.js.map +0 -1
  102. package/dist/scripts/5829-689f5be5d1-lite.chunk.js +0 -3
  103. package/dist/scripts/5829-689f5be5d1-lite.chunk.js.map +0 -1
  104. package/dist/scripts/6046-5652117548-lite.chunk.js +0 -2
  105. package/dist/scripts/6046-5652117548-lite.chunk.js.map +0 -1
  106. package/dist/scripts/6629-910e316a83-lite.chunk.js +0 -3
  107. package/dist/scripts/6629-910e316a83-lite.chunk.js.map +0 -1
  108. package/dist/scripts/6783-7efd15103a-lite.chunk.js +0 -3
  109. package/dist/scripts/6783-7efd15103a-lite.chunk.js.map +0 -1
  110. package/dist/scripts/7064-f5e8bc71bc-lite.chunk.js +0 -2
  111. package/dist/scripts/7064-f5e8bc71bc-lite.chunk.js.map +0 -1
  112. package/dist/scripts/7428-546d62999f-lite.chunk.js +0 -2
  113. package/dist/scripts/7428-546d62999f-lite.chunk.js.map +0 -1
  114. package/dist/scripts/7482-9016f79093-lite.chunk.js +0 -2
  115. package/dist/scripts/7482-9016f79093-lite.chunk.js.map +0 -1
  116. package/dist/scripts/7757-9b72774917-lite.chunk.js +0 -2
  117. package/dist/scripts/7757-9b72774917-lite.chunk.js.map +0 -1
  118. package/dist/scripts/7783-18da4064c0-lite.chunk.js +0 -2
  119. package/dist/scripts/7783-18da4064c0-lite.chunk.js.map +0 -1
  120. package/dist/scripts/8191-ff27deee6c-lite.chunk.js +0 -2
  121. package/dist/scripts/8191-ff27deee6c-lite.chunk.js.map +0 -1
  122. package/dist/scripts/8672-094d54cbbd-lite.chunk.js +0 -2
  123. package/dist/scripts/8672-094d54cbbd-lite.chunk.js.map +0 -1
  124. package/dist/scripts/8723-c3aaa1643a-lite.chunk.js +0 -2
  125. package/dist/scripts/8723-c3aaa1643a-lite.chunk.js.map +0 -1
  126. package/dist/scripts/9583-3b2623e754-lite.chunk.js +0 -2
  127. package/dist/scripts/9583-3b2623e754-lite.chunk.js.map +0 -1
  128. /package/dist/css/{4377-lite-856c02f000.chunk.css → 1107-lite-856c02f000.chunk.css} +0 -0
  129. /package/dist/css/{581-lite-a1cdc302ab.chunk.css → 1437-lite-a1cdc302ab.chunk.css} +0 -0
  130. /package/dist/css/{7757-lite-856c02f000.chunk.css → 4456-lite-856c02f000.chunk.css} +0 -0
  131. /package/dist/css/{9250-lite-37216d4207.chunk.css → 8723-lite-37216d4207.chunk.css} +0 -0
  132. /package/dist/scripts/{5829-689f5be5d1-lite.chunk.js.LICENSE.txt → 5829-903613bbf0-lite.chunk.js.LICENSE.txt} +0 -0
  133. /package/dist/scripts/{6629-910e316a83-lite.chunk.js.LICENSE.txt → 6629-4edaed39c8-lite.chunk.js.LICENSE.txt} +0 -0
  134. /package/dist/scripts/{6783-7efd15103a-lite.chunk.js.LICENSE.txt → 829-aff9937989-lite.chunk.js.LICENSE.txt} +0 -0
  135. /package/dist/scripts/{9250-ec244ab17a-lite.chunk.js.LICENSE.txt → 8723-708f2373d6-lite.chunk.js.LICENSE.txt} +0 -0
  136. /package/dist/scripts/{bundle-d2cf17c78d.min.js.LICENSE.txt → bundle-5a89651ec2.min.js.LICENSE.txt} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"scripts/9250-ec244ab17a-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/components/forms/form-feedback/FormFeedback.tsx","file:///app/packages/libs/shared/src/components/launchpad/v2/launchpad-v2.scss","file:///app/packages/libs/shared/src/components/launchpad/v2/LaunchpadV2.tsx","file:///app/packages/projects/lite/src/apps/launchpad/views/select-anon-user/components/emoji-avi.scss","file:///app/packages/projects/lite/src/apps/launchpad/views/select-anon-user/components/EmojiAvi.tsx","file:///app/packages/projects/lite/src/apps/launchpad/views/select-anon-user/select-anon-user.scss","file:///app/packages/projects/lite/src/apps/launchpad/views/select-anon-user/SelectAnonUserView.tsx","file:///app/packages/projects/lite/src/apps/share/hooks/useFetchSharedResource.ts","file:///app/packages/projects/lite/src/shared/components/launchpad/launchpad.scss","file:///app/packages/projects/lite/src/shared/components/launchpad/Launchpad.tsx"],"sourcesContent":["import React from 'react';\n\ninterface FormFeedbackProps extends React.PropsWithChildren {\n name: string;\n className?: string;\n}\n\nexport function FormFeedback(props: FormFeedbackProps) {\n return (\n <span id={`${props.name}Error`} className={`${props.className} invalid-feedback d-block`} role='status'>{props.children}</span>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"left\":\"s6wnJ\",\"leftWithImage\":\"UFQ2T\",\"bgCover\":\"Tp9_3\",\"bgFull\":\"AlF2T\",\"right\":\"eoZzJ\",\"rightContent\":\"RVyLM\",\"narrowContent\":\"INvJ0\",\"logo\":\"YHNgA\",\"buttonContainer\":\"ZW85Q\",\"blur\":\"Mtlg9\",\"imageContainer\":\"NxEjh\",\"imagePosition\":\"NN9cV\",\"image\":\"PkJ8J\",\"thumbnail\":\"y0V3Z\",\"tallposter\":\"Wrg5x\",\"cover\":\"x3h8F\",\"contentBody\":\"aLd5V\",\"contentBodyBase\":\"uQ2rm\"};","import React from 'react';\n\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { ClickViewLogo } from 'libs/shared/components/svgs/clickview-logo/ClickViewLogo';\nimport { MasterType } from 'libs/shared/enums/MasterType';\n\nimport styles from './launchpad-v2.scss';\n\nfunction mapObjectTypeToImageClass(objectType: MasterType): string {\n switch (objectType) {\n case MasterType.Video:\n case MasterType.Interactive:\n case MasterType.Clip:\n return styles.thumbnail;\n\n case MasterType.Subject:\n case MasterType.Playlist:\n return styles.cover;\n\n case MasterType.Series:\n return styles.tallposter;\n\n default:\n return '';\n }\n}\n\ninterface LaunchpadV2Props {\n}\n\nexport function LaunchpadV2(props: React.PropsWithChildren<LaunchpadV2Props>): JSX.Element {\n return (\n <div className='d-flex'>\n {props.children}\n </div>\n );\n}\n\ninterface LeftPanelProps {\n className?: string;\n}\n\n\nfunction LeftPanel(props: React.PropsWithChildren<LeftPanelProps>): JSX.Element {\n return (\n <div className={`${styles.left} ${props.className ? props.className : ''}`}>\n {props.children}\n </div>\n );\n}\n\ninterface LeftImageProps {\n objectType?: MasterType;\n title?: string;\n imageUrl?: string;\n fallbackImages: LaunchImage[];\n}\n\ninterface LaunchImage {\n bgUrl: string;\n}\n\nfunction LeftImage(props: LeftImageProps): JSX.Element {\n const [ showImage, setShowImage ] = React.useState(false);\n const [ image, setImage ] = React.useState<string>('');\n\n React.useEffect(() => {\n if (!props.imageUrl) {\n const image = props.fallbackImages[Math.floor(Math.random() * props.fallbackImages.length)];\n setImage(image.bgUrl);\n return;\n }\n\n const img = new Image();\n img.onload = () => setShowImage(true);\n img.src = props.imageUrl;\n return () => img.onload = null;\n }, [props.imageUrl]);\n\n return (\n <div\n className={`${styles.left} ${styles.leftWithImage} ${styles.bgCover} bg-light`}\n style={{ backgroundImage: image ? `url('${image}')` : '' }}\n >\n {showImage &&\n <>\n <div className={styles.blur} style={{ backgroundImage: `url('${props.imageUrl}')` }} />\n <div className={`${styles.imageContainer} ${mapObjectTypeToImageClass(props.objectType)}`}>\n <div className={styles.imagePosition}>\n <img className={styles.image} src={props.imageUrl} alt={props.title} />\n </div>\n </div>\n </>\n }\n </div>\n );\n}\n\ntype ImageSizeType = 'cover' | 'full';\n\ninterface LeftImageWithBackgroundProps {\n imageUrl: string;\n imageSize?: ImageSizeType;\n backgroundColor?: string;\n title?: string;\n}\n\nconst imageSizeMap: {[key in ImageSizeType]: string} = {\n cover: styles.bgCover,\n full: styles.bgFull\n};\n\nfunction LeftImageWithBackground(props: LeftImageWithBackgroundProps): JSX.Element {\n const bgStyles: React.CSSProperties = {\n backgroundImage: props.imageUrl ? `url(\"${props.imageUrl}\")` : ''\n };\n\n if (props.backgroundColor)\n bgStyles.backgroundColor = props.backgroundColor;\n \n return (\n <div\n className={`${styles.left} ${styles.leftWithImage} ${imageSizeMap[props.imageSize || 'cover']} d-flex align-items-center`}\n style={bgStyles}\n title={props.title}\n />\n );\n}\n\ninterface RightPanelProps {\n className?: string;\n}\n\nexport function RightPanel(props: React.PropsWithChildren<RightPanelProps>): JSX.Element {\n return (\n <div className={`${styles.right} ${props.className ? props.className : ''}`}>\n {props.children}\n </div>\n );\n}\n\ninterface HeaderProps {\n bannerComponent?: JSX.Element;\n logoComponent?: () => JSX.Element;\n className?: {\n logoContainer?: string;\n }\n}\n\n\nfunction Header(props: React.PropsWithChildren<HeaderProps>): JSX.Element {\n const LogoComponent = props?.logoComponent || ClickViewLogo;\n \n return (\n <div className='position-relative'>\n {!!props.bannerComponent &&\n props.bannerComponent\n }\n <div className={classNames(styles.logo, 'position-absolute', props.className?.logoContainer)}>\n <LogoComponent />\n </div>\n {props.children}\n </div>\n );\n}\n\ninterface ContentProps {\n className?: string;\n}\n\nfunction Content(props: React.PropsWithChildren<ContentProps>): JSX.Element {\n return (\n <div className={classNames(styles.rightContent, 'd-flex flex-column justify-content-center h-100', props?.className)}>\n {props.children}\n </div>\n );\n}\n\ninterface ContentBodyProps {\n className?: string;\n width?: 'base' | 'full';\n}\n\nconst widthClassNameMap: {[key in ContentBodyProps['width']]: string} = {\n base: styles.contentBodyBase,\n full: ''\n};\n\nfunction ContentBody(props: React.PropsWithChildren<ContentBodyProps>): JSX.Element {\n const widthClassName = widthClassNameMap[props.width || 'base'];\n return (\n <div className={classNames(styles.contentBody, widthClassName, 'm-auto p-3', props.className)}>\n {props.children}\n </div>\n );\n}\n\ninterface NarrowContentProps {\n className?: string;\n}\n\nLaunchpadV2.NarrowContent = NarrowContent;\nfunction NarrowContent(props: React.PropsWithChildren<NarrowContentProps>): JSX.Element {\n return (\n <div className={`${styles.narrowContent} mx-auto w-100 ${props.className ? props.className : ''}`}>\n {props.children}\n </div>\n );\n}\n\ninterface ButtonsProps {\n className?: string;\n}\n\nfunction Buttons(props: React.PropsWithChildren<ButtonsProps>): JSX.Element {\n return (\n <div className={classNames('position-fixed bg-white d-flex align-items-center', styles.buttonContainer, props?.className)}>\n {props.children}\n </div>\n );\n}\n\n/**\n * Intended ussage below:\n * \n * <LaunchpadV2>\n * <LaunchpadV2.Left>\n * // Your LHS content here\n * </LaunchpadV2.Left>\n * <LaunchpadV2.Right>\n * <LaunchpadV2.Header />\n * <LaunchpadV2.Content>\n * // Can omit this if it needs to be full width\n * <LaunchpadV2.ContentBody width=\"...\">\n * // Your main content here\n * </LaunchpadV2.ContentBody>\n * </LaunchpadV2.Content>\n * \n * // Omit this and put your buttons in content\n * // if you want your buttons immediately under your content rather \n * // than at the bottom of the screen\n * <LaunchpadV2.Buttons />\n * \n * </LaunchpadV2.Right>\n * </LaunchpadV2>\n * \n * - Sha\n */\n\nLaunchpadV2.Left = LeftPanel;\nLaunchpadV2.LeftImage = LeftImage;\nLaunchpadV2.LeftImageWithBackground = LeftImageWithBackground;\nLaunchpadV2.Right = RightPanel;\nLaunchpadV2.Header = Header;\nLaunchpadV2.Content = Content;\nLaunchpadV2.ContentBody = ContentBody;\nLaunchpadV2.Buttons = Buttons;\n","// extracted by mini-css-extract-plugin\nexport default {\"aviBackground\":\"oHeDN\",\"aviContainer\":\"J3O78\",\"aviIcon\":\"vNvft\"};","import React from 'react';\n\nimport { AnonymisedUser } from 'libs/shared/apps/share/interfaces/AnonymisedUser';\n\nimport styles from './emoji-avi.scss';\n\nconst AVIS = [\n '🐵', '🐒', '🦍', '🦧', '🐶', '🐕', '🦮', '🐕‍🦺', '🐩', '🐺',\n '🦊', '🦝', '🐱', '🐈', '🐈‍⬛', '🦁', '🐯', '🐅', '🐆', '🐴',\n '🐎', '🦄', '🦓', '🦌', '🐮', '🐂', '🐃', '🐄', '🐷', '🐖',\n '🐗', '🐽', '🐏', '🐑', '🐐', '🦙', '🦒', '🐘', '🦣', '🦏',\n '🦛', '🦘', '🦥', '🦦', '🦨', '🦡', '🐇', '🐁', '🐀', '🦔',\n '🐿️', '🦇', '🐉', '🦎', '🐍', '🐢', '🐊', '🦖', '🦕', '🐙',\n '🦑', '🦐', '🦞', '🦀', '🦪', '🐡', '🐠', '🐟', '🐬', '🐳',\n '🐋', '🦈', '🦭', '🐾'\n];\n\nconst BACKGROUNDS = [\n 'bg-orange',\n 'bg-indigo',\n 'bg-teal',\n 'bg-cyan',\n 'bg-purple',\n 'bg-pink',\n 'bg-red',\n 'bg-yellow',\n 'bg-green',\n 'bg-blue'\n];\n\nfunction getRandom(name: string, collection: string[]): string {\n let charCode = 0;\n\n for (let i = 0; i < name?.length ?? 0; i++) {\n charCode += name.charCodeAt(i);\n }\n \n return collection[charCode % collection.length];\n}\n\ninterface EmojiAviProps {\n recipient: AnonymisedUser;\n}\n\nexport function EmojiAvi(props: EmojiAviProps): JSX.Element {\n return (\n <span className={`h1 d-block mb-0 position-relative ${styles.aviContainer}`}>\n <span\n className={`\n ${getRandom(props.recipient.publicName, BACKGROUNDS)}\n rounded-circle\n position-absolute\n top-0\n start-0\n bottom-0\n end-0\n ${styles.aviBackground}\n `}\n ></span>\n <span\n className={`\n ${styles.aviIcon}\n position-absolute\n top-50\n start-50\n `}\n >\n {getRandom(props.recipient.publicName, AVIS)}\n </span>\n </span>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"confirmationContainer\":\"TIEUw\"};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { Flight } from 'libs/common/react/index';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { SessionHelper } from 'libs/analytics/utils/SessionHelper';\n\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { AnonymisedUser } from 'libs/shared/apps/share/interfaces/AnonymisedUser';\nimport { SharableEntity, ShareViewHelper } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { FormFeedback } from 'libs/shared/components/forms/form-feedback/FormFeedback';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { LaunchpadV2 } from 'libs/shared/components/launchpad/v2/LaunchpadV2';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ImageSize, ImageType } from 'libs/shared/enums/Images';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { LAUNCHPAD_FALLBACK_IMAGES } from 'shared/components/launchpad/Launchpad';\n\nimport { EmbedPlaceHolderHelper } from 'apps/embed/utils/EmbedPlaceholderHelper';\nimport { ShareLinkFilterHelpers } from 'apps/share/filters/share-link-filter/ShareLinkFilterHelpers';\nimport { useFetchSharedResource } from 'apps/share/hooks/useFetchSharedResource';\n\nimport { EmojiAvi } from './components/EmojiAvi';\n\nimport styles from './select-anon-user.scss';\n\nconst namespace = 'launchpad.selectAnonUser';\n\ntype Step = 'enter-name' | 'select-user' | 'confirm';\n\ninterface SelectAnonUserViewProps {\n shareId: string;\n appLink: Core.AppLink;\n}\n\n// eslint-disable-next-line rulesdir/require-view-title\nexport function SelectAnonUserView(props: SelectAnonUserViewProps): JSX.Element {\n const fetchAsync = Flight.useGetFetchAsync();\n\n const [ name, setName ] = React.useState(ShareLinkFilterHelpers.getAnonUser(props.shareId) || '');\n const [ isReturning, setIsReturning ] = React.useState(!!ShareLinkFilterHelpers.getAnonUser(props.shareId));\n const [ error, setError ] = React.useState('');\n const [ step, setStep ] = React.useState<Step>('enter-name');\n const [ backStep, setBackStep ] = React.useState<Step>(null);\n const [ selectedUser, setSelectedUser ] = React.useState<AnonymisedUser>(null);\n \n const sharedResource = useFetchSharedResource<SharableEntity>(props.shareId);\n const shareRecipients = Flight.useBasicFetch<AnonymisedUser[]>(ShareRequests.getShareRecipients(props.shareId));\n\n function onSetName(e: React.ChangeEvent<HTMLInputElement>): void {\n setName(e.target.value);\n setError('');\n }\n\n React.useLayoutEffect(() => {\n EmbedPlaceHolderHelper.remove();\n }, []);\n \n React.useEffect(() => {\n if (!shareRecipients.hasCompleted)\n return;\n\n if (ShareLinkFilterHelpers.getAnonUser(props.shareId)) {\n setStep('confirm');\n setBackStep(shareRecipients.data?.length ? 'select-user' : 'enter-name');\n return;\n }\n\n if (shareRecipients.data?.length)\n setStep('select-user');\n }, [shareRecipients.hasCompleted]);\n\n async function onClickGoToQuiz(): Promise<void> {\n ShareLinkFilterHelpers.setAnonUser(props.shareId, selectedUser?.publicName || name.trim());\n try {\n const request = ShareRequests.createAnonSession(\n props.shareId,\n SessionHelper.getClientSessionData().id,\n selectedUser?.publicName || name.trim()\n );\n await fetchAsync(request);\n } finally {\n const href = Core.AppLinkHelper.getHref(props.appLink);\n Core.LocationUtils.PageLoad(href);\n }\n }\n\n function onSubmit(e: React.FormEvent): void {\n e.preventDefault();\n\n if (!name?.trim()) {\n setError('Please provide a name');\n return;\n }\n\n if (!backStep)\n setBackStep('enter-name');\n setStep('confirm');\n }\n\n function onContinueAvi(): void {\n if (!selectedUser) return;\n\n setBackStep('select-user');\n setStep('confirm');\n }\n\n function onClickRecipient(recipient: AnonymisedUser): void {\n setSelectedUser(recipient);\n }\n\n function onClickNotMyName(): void {\n setName('');\n setStep(backStep);\n setIsReturning(false);\n SessionHelper.resetClientSession();\n }\n\n const hasCompleted = (\n sharedResource &&\n shareRecipients.hasCompleted\n );\n\n if (!hasCompleted)\n return <></>;\n\n const leftImageUrl = ImageHelper.createUrl(ShareViewHelper.getImageUrl(sharedResource), { size: ImageSize.Large });\n\n return (\n <LaunchpadV2>\n <LaunchpadV2.LeftImage\n title={sharedResource.name}\n imageUrl={leftImageUrl}\n objectType={sharedResource.typeId}\n fallbackImages={LAUNCHPAD_FALLBACK_IMAGES}\n />\n <LaunchpadV2.Right>\n <LaunchpadV2.Header />\n <LaunchpadV2.Content>\n <div className='mb-auto text-center'>\n {VideoHelper.isInteractive(sharedResource) && (\n <div className='mb-3 d-lg-none d-block w-75 mx-auto'>\n <BaseImage\n data={VideoHelper.getThumbnail(sharedResource)}\n imageType={ImageType.Thumbnails}\n className='rounded-3 overflow-hidden'\n />\n </div>\n )}\n \n <h1 className='h2'>\n {sharedResource.name}\n </h1>\n </div>\n\n {step === 'enter-name' && (\n <>\n <LaunchpadV2.NarrowContent className='mb-auto'>\n <form onSubmit={onSubmit}>\n <div className='form-group'>\n <label className='h2' htmlFor='name'>Enter your name</label>\n <input\n className={`form-control form-control-lg ${error ? 'is-invalid' : ''}`}\n type='text'\n aria-label='Enter your name...'\n placeholder='Enter your name...'\n autoFocus\n value={name}\n onChange={onSetName}\n autoComplete='off'\n autoCorrect='off'\n autoCapitalize='none'\n spellCheck='false'\n name={'name'}\n id='name'\n />\n {!!error && <FormFeedback name='name'>{error}</FormFeedback>}\n </div>\n </form>\n </LaunchpadV2.NarrowContent>\n <LaunchpadV2.Buttons>\n {!!shareRecipients.data?.length &&\n <button\n className='btn btn-link btn-lg'\n onClick={() => setStep('select-user')}\n >\n <Text namespace={namespace} phrase='back' />\n </button>\n }\n <div className='d-flex justify-content-end w-100'>\n <button\n className='btn btn-lg btn-dark'\n onClick={onSubmit}\n >\n <Text namespace={namespace} phrase='continue' />\n </button>\n </div>\n </LaunchpadV2.Buttons>\n </>\n )}\n\n {step === 'select-user' && (\n <>\n <LaunchpadV2.NarrowContent className='mb-auto'>\n <h2><Text namespace={namespace} phrase='selectName' /></h2>\n <ul className='list-unstyled row'>\n {ArrayHelper.sortBy(shareRecipients.data, a => a.publicName).map((recipient, index) => {\n return (\n <li key={index} className='col-3 p-2'>\n <DivButton\n className={`text-center rounded border py-2 ${selectedUser?.id === recipient.id ? 'border-info bg-light-blue' : ''}`}\n onClick={() => onClickRecipient(recipient)}\n >\n <div className='px-3'>\n <EmojiAvi recipient={recipient} />\n </div>\n \n <p className='mb-0 mt-2 fw-semibold text-truncate'>{recipient.publicName}</p>\n </DivButton>\n </li>\n );\n })}\n </ul>\n </LaunchpadV2.NarrowContent>\n <LaunchpadV2.Buttons>\n <div className='d-flex justify-content-between w-100'>\n <button\n className='btn btn-lg btn-link'\n onClick={() => {\n setSelectedUser(null);\n setStep('enter-name');\n setBackStep('select-user');\n }}\n >\n <Text namespace={namespace} phrase='cantFindName' />\n </button>\n <button\n className='btn btn-lg btn-dark'\n onClick={onContinueAvi}\n disabled={!selectedUser}\n >\n <Text namespace={namespace} phrase='continue' />\n </button>\n </div>\n </LaunchpadV2.Buttons>\n </>\n )}\n\n {step === 'confirm' && (\n <LaunchpadV2.NarrowContent className='mb-auto text-center'>\n {selectedUser &&\n <div className={`${styles.confirmationContainer} mx-auto`}>\n <EmojiAvi recipient={selectedUser} />\n </div>\n }\n <p className='h2'>\n <Text\n namespace={namespace}\n phrase={isReturning ? 'welcome' : 'hi'}\n options={{ name: selectedUser?.publicName || name }}\n />\n </p>\n \n <p className='h2 mb-4'><Text namespace={namespace} phrase='ready' /></p>\n <button\n className='btn btn-lg btn-dark w-100 mb-3'\n onClick={onClickGoToQuiz}\n >\n <Text namespace={namespace} phrase='start' />\n </button>\n <button\n className='btn btn-lg btn-link w-100'\n onClick={onClickNotMyName}\n >\n <Text namespace={namespace} phrase='notMyName' />\n </button>\n </LaunchpadV2.NarrowContent>\n )}\n </LaunchpadV2.Content>\n </LaunchpadV2.Right>\n </LaunchpadV2>\n );\n}\n\n","import { Flight } from 'libs/common/flight';\n\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ClassificationRequests } from 'libs/shared/flight-requests/ClassificationRequests';\nimport { ClipRequests } from 'libs/shared/flight-requests/ClipRequests';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { PlaylistRequests } from 'libs/shared/flight-requests/PlaylistRequests';\nimport { SeriesRequests } from 'libs/shared/flight-requests/SeriesRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { CurrentUser, ShareLink } from 'libs/shared/interfaces';\n\nexport function useFetchSharedResource<T>(shareId: string): T {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const shareLink = Flight.useBasicFetch<ShareLink>(ShareRequests.getShareObject(shareId));\n\n function getResourceRequest(): Flight.Request {\n if (!shareLink.data || !currentUser.data)\n return null;\n\n switch (shareLink.data.objectTypeId) {\n case MasterType.Video:\n return VideoRequests.publicVideo(shareLink.data.objectId, shareId);\n case MasterType.Clip:\n return ClipRequests.publicClip(shareLink.data.objectId, shareId);\n case MasterType.Interactive:\n return InteractiveRequests.publicInteractiveMetadata(shareLink.data.objectId, shareId);\n case MasterType.Playlist:\n return PlaylistRequests.getSharedPlaylist(shareLink.data.objectId, shareId);\n case MasterType.Subject:\n return ClassificationRequests.classification(shareLink.data.objectId, currentUser.data.id);\n case MasterType.Series:\n return SeriesRequests.sharedSeries(shareLink.data.objectId, shareId);\n }\n }\n\n const resourceRequest = getResourceRequest();\n const resource = Flight.useBasicFetch<T>(resourceRequest);\n\n return resource.data;\n}","// extracted by mini-css-extract-plugin\nexport default {\"left\":\"vIypY\",\"leftTextImage\":\"YViNj\",\"right\":\"MkD4u\",\"blur\":\"X6mCh\",\"imageContainer\":\"bc7kz\",\"imagePosition\":\"JOhEj\",\"image\":\"Ef2QR\",\"thumbnail\":\"Gdurb\",\"tallposter\":\"fjVNK\",\"cover\":\"o3j31\",\"linksContainer\":\"AT9Dk\"};","import React from 'react';\n\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nimport styles from './launchpad.scss';\n\nexport const LAUNCHPAD_FALLBACK_IMAGES = [\n { bgUrl: ImageUrls.LaunchPad.BG_1 },\n { bgUrl: ImageUrls.LaunchPad.BG_2 },\n { bgUrl: ImageUrls.LaunchPad.BG_3 },\n { bgUrl: ImageUrls.LaunchPad.BG_4 },\n { bgUrl: ImageUrls.LaunchPad.BG_5 }\n];\n\nexport const LAUNCHPAD_PRODUCT_FALLBACK_IMAGES = [\n { bgUrl: ImageUrls.LaunchPad.PRODUCT.BG_1 },\n { bgUrl: ImageUrls.LaunchPad.PRODUCT.BG_2 },\n { bgUrl: ImageUrls.LaunchPad.PRODUCT.BG_3 },\n { bgUrl: ImageUrls.LaunchPad.PRODUCT.BG_4 },\n { bgUrl: ImageUrls.LaunchPad.PRODUCT.BG_5 },\n { bgUrl: ImageUrls.LaunchPad.PRODUCT.BG_6 },\n { bgUrl: ImageUrls.LaunchPad.PRODUCT.BG_7 },\n { bgUrl: ImageUrls.LaunchPad.PRODUCT.BG_8 },\n { bgUrl: ImageUrls.LaunchPad.PRODUCT.BG_9 }\n];\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst XMAS_URLS: LaunchImage[] = [\n { bgUrl: '/images/launchpad/xmas/2024-promo1-bg.png' },\n { bgUrl: '/images/launchpad/xmas/2024-promo2-bg.png' },\n { bgUrl: '/images/launchpad/xmas/2024-promo3-bg.png' },\n { bgUrl: '/images/launchpad/xmas/2024-promo4-bg.png' },\n { bgUrl: '/images/launchpad/xmas/2024-promo5-bg.png' }\n];\n\nfunction mapObjectTypeToImageClass(objectType: MasterType): string {\n switch (objectType) {\n case MasterType.Video:\n case MasterType.Interactive:\n case MasterType.Clip:\n return styles.thumbnail;\n\n case MasterType.Subject:\n case MasterType.Playlist:\n return styles.cover;\n\n case MasterType.Series:\n return styles.tallposter;\n\n default:\n return '';\n }\n}\n\ninterface LaunchpadLink {\n url: string;\n text: string;\n onClick?: () => void;\n hide?: boolean;\n}\n\ninterface LaunchpadProps {\n objectType?: MasterType;\n title?: string;\n imageUrl?: string;\n links?: LaunchpadLink[];\n leftComponent?: () => JSX.Element;\n}\n\ninterface LaunchImage {\n bgUrl: string;\n}\n\nfunction getRandomImage(urlLists: LaunchImage[]): LaunchImage {\n return urlLists[Math.floor(Math.random() * urlLists.length)];\n}\n\nexport function Launchpad(props: React.PropsWithChildren<LaunchpadProps>): JSX.Element {\n const [ showImage, setShowImage ] = React.useState(false);\n const [ image, setImage ] = React.useState<string>('');\n\n const imageUrl = ImageHelper.createUrl(props.imageUrl, { size: ImageSize.Large });\n const IMAGE_URLS = LAUNCHPAD_PRODUCT_FALLBACK_IMAGES;\n\n React.useEffect(() => {\n if (imageUrl || !IMAGE_URLS || IMAGE_URLS.length === 0)\n return;\n\n const image = getRandomImage(IMAGE_URLS);\n\n if (image.bgUrl) {\n setImage(image.bgUrl);\n }\n }, []);\n\n React.useEffect(() => {\n if (!imageUrl)\n return;\n\n const img = new Image();\n img.onload = () => setShowImage(true);\n img.src = imageUrl;\n return () => img.onload = null;\n }, []);\n\n return (\n <div className='d-flex'>\n { props.leftComponent ?\n props.leftComponent()\n :\n <div\n className={`${styles.left} ${image ? 'bg-blue d-flex align-items-center' : 'bg-light'}`}\n >\n {image ?\n <img className='img-fluid' src={image} draggable={false} /> :\n (showImage &&\n <>\n <div className={styles.blur} style={{ backgroundImage: `url('${imageUrl}')` }} />\n <div className={`${styles.imageContainer} ${mapObjectTypeToImageClass(props.objectType)}`}>\n <div className={styles.imagePosition}>\n <img className={styles.image} src={imageUrl} alt={props.title} />\n </div>\n </div>\n </>\n )\n }\n </div>\n }\n <div className={`${styles.right} bg-white d-flex flex-column`}>\n <div className={`position-absolute d-flex align-items-center ${styles.linksContainer}`}>\n {props.links?.map((link, key) => {\n if (link.hide)\n return <React.Fragment key={key}></React.Fragment>;\n\n return (\n <a key={key} href={link.url} className='info-link fw-semibold' onClick={link.onClick}>\n {link.text}\n </a>\n );\n })}\n </div>\n\n {props.children}\n </div>\n </div>\n );\n}"],"names":["FormFeedback","props","id","name","className","role","children","mapObjectTypeToImageClass","objectType","MasterType","LaunchpadV2","imageSizeMap","cover","full","widthClassNameMap","base","NarrowContent","Left","LeftImage","showImage","setShowImage","image","setImage","imageUrl","img","Image","onload","src","fallbackImages","Math","floor","random","length","bgUrl","style","backgroundImage","alt","title","LeftImageWithBackground","bgStyles","backgroundColor","imageSize","Right","Header","LogoComponent","logoComponent","ClickViewLogo","bannerComponent","logoContainer","Content","ContentBody","widthClassName","width","Buttons","AVIS","BACKGROUNDS","getRandom","collection","charCode","i","charCodeAt","EmojiAvi","recipient","publicName","namespace","SelectAnonUserView","fetchAsync","ShareLinkFilterHelpers","shareId","setName","isReturning","setIsReturning","error","setError","step","setStep","backStep","setBackStep","selectedUser","setSelectedUser","sharedResource","useFetchSharedResource","shareRecipients","ShareRequests","onSubmit","e","preventDefault","trim","hasCompleted","data","leftImageUrl","ImageHelper","ShareViewHelper","size","typeId","VideoHelper","BaseImage","imageType","htmlFor","type","placeholder","autoFocus","value","onChange","target","autoComplete","autoCorrect","autoCapitalize","spellCheck","onClick","Text","phrase","ArrayHelper","a","map","index","key","DivButton","onClickRecipient","disabled","options","request","SessionHelper","href","appLink","currentUser","shareLink","resourceRequest","objectTypeId","objectId","getResourceRequest","LAUNCHPAD_FALLBACK_IMAGES","ImageUrls","LAUNCHPAD_PRODUCT_FALLBACK_IMAGES","Launchpad","IMAGE_URLS","urlLists","leftComponent","draggable","links","link","hide","url","text"],"sourceRoot":""}
1
+ {"version":3,"file":"scripts/8723-708f2373d6-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/components/forms/form-feedback/FormFeedback.tsx","file:///app/packages/libs/shared/src/components/launchpad/v2/launchpad-v2.scss","file:///app/packages/libs/shared/src/components/launchpad/v2/LaunchpadV2.tsx","file:///app/packages/projects/lite/src/apps/launchpad/views/select-anon-user/components/emoji-avi.scss","file:///app/packages/projects/lite/src/apps/launchpad/views/select-anon-user/components/EmojiAvi.tsx","file:///app/packages/projects/lite/src/apps/launchpad/views/select-anon-user/select-anon-user.scss","file:///app/packages/projects/lite/src/apps/launchpad/views/select-anon-user/SelectAnonUserView.tsx","file:///app/packages/projects/lite/src/apps/share/hooks/useFetchSharedResource.ts","file:///app/packages/projects/lite/src/shared/components/launchpad/launchpad.scss","file:///app/packages/projects/lite/src/shared/components/launchpad/Launchpad.tsx"],"sourcesContent":["import React from 'react';\n\ninterface FormFeedbackProps extends React.PropsWithChildren {\n name: string;\n className?: string;\n}\n\nexport function FormFeedback(props: FormFeedbackProps) {\n return (\n <span id={`${props.name}Error`} className={`${props.className} invalid-feedback d-block`} role='status'>{props.children}</span>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"left\":\"s6wnJ\",\"leftWithImage\":\"UFQ2T\",\"bgCover\":\"Tp9_3\",\"bgFull\":\"AlF2T\",\"right\":\"eoZzJ\",\"rightContent\":\"RVyLM\",\"narrowContent\":\"INvJ0\",\"logo\":\"YHNgA\",\"buttonContainer\":\"ZW85Q\",\"blur\":\"Mtlg9\",\"imageContainer\":\"NxEjh\",\"imagePosition\":\"NN9cV\",\"image\":\"PkJ8J\",\"thumbnail\":\"y0V3Z\",\"tallposter\":\"Wrg5x\",\"cover\":\"x3h8F\",\"contentBody\":\"aLd5V\",\"contentBodyBase\":\"uQ2rm\"};","import React from 'react';\n\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { ClickViewLogo } from 'libs/shared/components/svgs/clickview-logo/ClickViewLogo';\nimport { MasterType } from 'libs/shared/enums/MasterType';\n\nimport styles from './launchpad-v2.scss';\n\nfunction mapObjectTypeToImageClass(objectType: MasterType): string {\n switch (objectType) {\n case MasterType.Video:\n case MasterType.Interactive:\n case MasterType.Clip:\n return styles.thumbnail;\n\n case MasterType.Subject:\n case MasterType.Playlist:\n return styles.cover;\n\n case MasterType.Series:\n return styles.tallposter;\n\n default:\n return '';\n }\n}\n\ninterface LaunchpadV2Props {\n}\n\nexport function LaunchpadV2(props: React.PropsWithChildren<LaunchpadV2Props>): JSX.Element {\n return (\n <div className='d-flex'>\n {props.children}\n </div>\n );\n}\n\ninterface LeftPanelProps {\n className?: string;\n}\n\n\nfunction LeftPanel(props: React.PropsWithChildren<LeftPanelProps>): JSX.Element {\n return (\n <div className={`${styles.left} ${props.className ? props.className : ''}`}>\n {props.children}\n </div>\n );\n}\n\ninterface LeftImageProps {\n objectType?: MasterType;\n title?: string;\n imageUrl?: string;\n fallbackImages: LaunchImage[];\n}\n\ninterface LaunchImage {\n bgUrl: string;\n}\n\nfunction LeftImage(props: LeftImageProps): JSX.Element {\n const [ showImage, setShowImage ] = React.useState(false);\n const [ image, setImage ] = React.useState<string>('');\n\n React.useEffect(() => {\n if (!props.imageUrl) {\n const image = props.fallbackImages[Math.floor(Math.random() * props.fallbackImages.length)];\n setImage(image.bgUrl);\n return;\n }\n\n const img = new Image();\n img.onload = () => setShowImage(true);\n img.src = props.imageUrl;\n return () => img.onload = null;\n }, [props.imageUrl]);\n\n return (\n <div\n className={`${styles.left} ${styles.leftWithImage} ${styles.bgCover} bg-light`}\n style={{ backgroundImage: image ? `url('${image}')` : '' }}\n >\n {showImage &&\n <>\n <div className={styles.blur} style={{ backgroundImage: `url('${props.imageUrl}')` }} />\n <div className={`${styles.imageContainer} ${mapObjectTypeToImageClass(props.objectType)}`}>\n <div className={styles.imagePosition}>\n <img className={styles.image} src={props.imageUrl} alt={props.title} />\n </div>\n </div>\n </>\n }\n </div>\n );\n}\n\ntype ImageSizeType = 'cover' | 'full';\n\ninterface LeftImageWithBackgroundProps {\n imageUrl: string;\n imageSize?: ImageSizeType;\n backgroundColor?: string;\n title?: string;\n}\n\nconst imageSizeMap: {[key in ImageSizeType]: string} = {\n cover: styles.bgCover,\n full: styles.bgFull\n};\n\nfunction LeftImageWithBackground(props: LeftImageWithBackgroundProps): JSX.Element {\n const bgStyles: React.CSSProperties = {\n backgroundImage: props.imageUrl ? `url(\"${props.imageUrl}\")` : ''\n };\n\n if (props.backgroundColor)\n bgStyles.backgroundColor = props.backgroundColor;\n \n return (\n <div\n className={`${styles.left} ${styles.leftWithImage} ${imageSizeMap[props.imageSize || 'cover']} d-flex align-items-center`}\n style={bgStyles}\n title={props.title}\n />\n );\n}\n\ninterface RightPanelProps {\n className?: string;\n}\n\nexport function RightPanel(props: React.PropsWithChildren<RightPanelProps>): JSX.Element {\n return (\n <div className={`${styles.right} ${props.className ? props.className : ''}`}>\n {props.children}\n </div>\n );\n}\n\ninterface HeaderProps {\n bannerComponent?: JSX.Element;\n logoComponent?: () => JSX.Element;\n className?: {\n logoContainer?: string;\n }\n}\n\n\nfunction Header(props: React.PropsWithChildren<HeaderProps>): JSX.Element {\n const LogoComponent = props?.logoComponent || ClickViewLogo;\n \n return (\n <div className='position-relative'>\n {!!props.bannerComponent &&\n props.bannerComponent\n }\n <div className={classNames(styles.logo, 'position-absolute', props.className?.logoContainer)}>\n <LogoComponent />\n </div>\n {props.children}\n </div>\n );\n}\n\ninterface ContentProps {\n className?: string;\n}\n\nfunction Content(props: React.PropsWithChildren<ContentProps>): JSX.Element {\n return (\n <div className={classNames(styles.rightContent, 'd-flex flex-column justify-content-center h-100', props?.className)}>\n {props.children}\n </div>\n );\n}\n\ninterface ContentBodyProps {\n className?: string;\n width?: 'base' | 'full';\n}\n\nconst widthClassNameMap: {[key in ContentBodyProps['width']]: string} = {\n base: styles.contentBodyBase,\n full: ''\n};\n\nfunction ContentBody(props: React.PropsWithChildren<ContentBodyProps>): JSX.Element {\n const widthClassName = widthClassNameMap[props.width || 'base'];\n return (\n <div className={classNames(styles.contentBody, widthClassName, 'm-auto p-3', props.className)}>\n {props.children}\n </div>\n );\n}\n\ninterface NarrowContentProps {\n className?: string;\n}\n\nLaunchpadV2.NarrowContent = NarrowContent;\nfunction NarrowContent(props: React.PropsWithChildren<NarrowContentProps>): JSX.Element {\n return (\n <div className={`${styles.narrowContent} mx-auto w-100 ${props.className ? props.className : ''}`}>\n {props.children}\n </div>\n );\n}\n\ninterface ButtonsProps {\n className?: string;\n}\n\nfunction Buttons(props: React.PropsWithChildren<ButtonsProps>): JSX.Element {\n return (\n <div className={classNames('position-fixed bg-white d-flex align-items-center', styles.buttonContainer, props?.className)}>\n {props.children}\n </div>\n );\n}\n\n/**\n * Intended ussage below:\n * \n * <LaunchpadV2>\n * <LaunchpadV2.Left>\n * // Your LHS content here\n * </LaunchpadV2.Left>\n * <LaunchpadV2.Right>\n * <LaunchpadV2.Header />\n * <LaunchpadV2.Content>\n * // Can omit this if it needs to be full width\n * <LaunchpadV2.ContentBody width=\"...\">\n * // Your main content here\n * </LaunchpadV2.ContentBody>\n * </LaunchpadV2.Content>\n * \n * // Omit this and put your buttons in content\n * // if you want your buttons immediately under your content rather \n * // than at the bottom of the screen\n * <LaunchpadV2.Buttons />\n * \n * </LaunchpadV2.Right>\n * </LaunchpadV2>\n * \n * - Sha\n */\n\nLaunchpadV2.Left = LeftPanel;\nLaunchpadV2.LeftImage = LeftImage;\nLaunchpadV2.LeftImageWithBackground = LeftImageWithBackground;\nLaunchpadV2.Right = RightPanel;\nLaunchpadV2.Header = Header;\nLaunchpadV2.Content = Content;\nLaunchpadV2.ContentBody = ContentBody;\nLaunchpadV2.Buttons = Buttons;\n","// extracted by mini-css-extract-plugin\nexport default {\"aviBackground\":\"oHeDN\",\"aviContainer\":\"J3O78\",\"aviIcon\":\"vNvft\"};","import React from 'react';\n\nimport { AnonymisedUser } from 'libs/shared/apps/share/interfaces/AnonymisedUser';\n\nimport styles from './emoji-avi.scss';\n\nconst AVIS = [\n '🐵', '🐒', '🦍', '🦧', '🐶', '🐕', '🦮', '🐕‍🦺', '🐩', '🐺',\n '🦊', '🦝', '🐱', '🐈', '🐈‍⬛', '🦁', '🐯', '🐅', '🐆', '🐴',\n '🐎', '🦄', '🦓', '🦌', '🐮', '🐂', '🐃', '🐄', '🐷', '🐖',\n '🐗', '🐽', '🐏', '🐑', '🐐', '🦙', '🦒', '🐘', '🦣', '🦏',\n '🦛', '🦘', '🦥', '🦦', '🦨', '🦡', '🐇', '🐁', '🐀', '🦔',\n '🐿️', '🦇', '🐉', '🦎', '🐍', '🐢', '🐊', '🦖', '🦕', '🐙',\n '🦑', '🦐', '🦞', '🦀', '🦪', '🐡', '🐠', '🐟', '🐬', '🐳',\n '🐋', '🦈', '🦭', '🐾'\n];\n\nconst BACKGROUNDS = [\n 'bg-orange',\n 'bg-indigo',\n 'bg-teal',\n 'bg-cyan',\n 'bg-purple',\n 'bg-pink',\n 'bg-red',\n 'bg-yellow',\n 'bg-green',\n 'bg-blue'\n];\n\nfunction getRandom(name: string, collection: string[]): string {\n let charCode = 0;\n\n for (let i = 0; i < name?.length ?? 0; i++) {\n charCode += name.charCodeAt(i);\n }\n \n return collection[charCode % collection.length];\n}\n\ninterface EmojiAviProps {\n recipient: AnonymisedUser;\n}\n\nexport function EmojiAvi(props: EmojiAviProps): JSX.Element {\n return (\n <span className={`h1 d-block mb-0 position-relative ${styles.aviContainer}`}>\n <span\n className={`\n ${getRandom(props.recipient.publicName, BACKGROUNDS)}\n rounded-circle\n position-absolute\n top-0\n start-0\n bottom-0\n end-0\n ${styles.aviBackground}\n `}\n ></span>\n <span\n className={`\n ${styles.aviIcon}\n position-absolute\n top-50\n start-50\n `}\n >\n {getRandom(props.recipient.publicName, AVIS)}\n </span>\n </span>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"confirmationContainer\":\"TIEUw\"};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { Flight } from 'libs/common/react/index';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { SessionHelper } from 'libs/analytics/utils/SessionHelper';\n\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { AnonymisedUser } from 'libs/shared/apps/share/interfaces/AnonymisedUser';\nimport { SharableEntity, ShareViewHelper } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { FormFeedback } from 'libs/shared/components/forms/form-feedback/FormFeedback';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { LaunchpadV2 } from 'libs/shared/components/launchpad/v2/LaunchpadV2';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ImageSize, ImageType } from 'libs/shared/enums/Images';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { LAUNCHPAD_FALLBACK_IMAGES } from 'shared/components/launchpad/Launchpad';\n\nimport { EmbedPlaceHolderHelper } from 'apps/embed/utils/EmbedPlaceholderHelper';\nimport { ShareLinkFilterHelpers } from 'apps/share/filters/share-link-filter/ShareLinkFilterHelpers';\nimport { useFetchSharedResource } from 'apps/share/hooks/useFetchSharedResource';\n\nimport { EmojiAvi } from './components/EmojiAvi';\n\nimport styles from './select-anon-user.scss';\n\nconst namespace = 'launchpad.selectAnonUser';\n\ntype Step = 'enter-name' | 'select-user' | 'confirm';\n\ninterface SelectAnonUserViewProps {\n shareId: string;\n appLink: Core.AppLink;\n}\n\n// eslint-disable-next-line rulesdir/require-view-title\nexport function SelectAnonUserView(props: SelectAnonUserViewProps): JSX.Element {\n const fetchAsync = Flight.useGetFetchAsync();\n\n const [ name, setName ] = React.useState(ShareLinkFilterHelpers.getAnonUser(props.shareId) || '');\n const [ isReturning, setIsReturning ] = React.useState(!!ShareLinkFilterHelpers.getAnonUser(props.shareId));\n const [ error, setError ] = React.useState('');\n const [ step, setStep ] = React.useState<Step>('enter-name');\n const [ backStep, setBackStep ] = React.useState<Step>(null);\n const [ selectedUser, setSelectedUser ] = React.useState<AnonymisedUser>(null);\n \n const sharedResource = useFetchSharedResource<SharableEntity>(props.shareId);\n const shareRecipients = Flight.useBasicFetch<AnonymisedUser[]>(ShareRequests.getShareRecipients(props.shareId));\n\n function onSetName(e: React.ChangeEvent<HTMLInputElement>): void {\n setName(e.target.value);\n setError('');\n }\n\n React.useLayoutEffect(() => {\n EmbedPlaceHolderHelper.remove();\n }, []);\n \n React.useEffect(() => {\n if (!shareRecipients.hasCompleted)\n return;\n\n if (ShareLinkFilterHelpers.getAnonUser(props.shareId)) {\n setStep('confirm');\n setBackStep(shareRecipients.data?.length ? 'select-user' : 'enter-name');\n return;\n }\n\n if (shareRecipients.data?.length)\n setStep('select-user');\n }, [shareRecipients.hasCompleted]);\n\n async function onClickGoToQuiz(): Promise<void> {\n ShareLinkFilterHelpers.setAnonUser(props.shareId, selectedUser?.publicName || name.trim());\n try {\n const request = ShareRequests.createAnonSession(\n props.shareId,\n SessionHelper.getClientSessionData().id,\n selectedUser?.publicName || name.trim()\n );\n await fetchAsync(request);\n } finally {\n const href = Core.AppLinkHelper.getHref(props.appLink);\n Core.LocationUtils.PageLoad(href);\n }\n }\n\n function onSubmit(e: React.FormEvent): void {\n e.preventDefault();\n\n if (!name?.trim()) {\n setError('Please provide a name');\n return;\n }\n\n if (!backStep)\n setBackStep('enter-name');\n setStep('confirm');\n }\n\n function onContinueAvi(): void {\n if (!selectedUser) return;\n\n setBackStep('select-user');\n setStep('confirm');\n }\n\n function onClickRecipient(recipient: AnonymisedUser): void {\n setSelectedUser(recipient);\n }\n\n function onClickNotMyName(): void {\n setName('');\n setStep(backStep);\n setIsReturning(false);\n SessionHelper.resetClientSession();\n }\n\n const hasCompleted = (\n sharedResource &&\n shareRecipients.hasCompleted\n );\n\n if (!hasCompleted)\n return <></>;\n\n const leftImageUrl = ImageHelper.createUrl(ShareViewHelper.getImageUrl(sharedResource), { size: ImageSize.Large });\n\n return (\n <LaunchpadV2>\n <LaunchpadV2.LeftImage\n title={sharedResource.name}\n imageUrl={leftImageUrl}\n objectType={sharedResource.typeId}\n fallbackImages={LAUNCHPAD_FALLBACK_IMAGES}\n />\n <LaunchpadV2.Right>\n <LaunchpadV2.Header />\n <LaunchpadV2.Content>\n <div className='mb-auto text-center'>\n {VideoHelper.isInteractive(sharedResource) && (\n <div className='mb-3 d-lg-none d-block w-75 mx-auto'>\n <BaseImage\n data={VideoHelper.getThumbnail(sharedResource)}\n imageType={ImageType.Thumbnails}\n className='rounded-3 overflow-hidden'\n />\n </div>\n )}\n \n <h1 className='h2'>\n {sharedResource.name}\n </h1>\n </div>\n\n {step === 'enter-name' && (\n <>\n <LaunchpadV2.NarrowContent className='mb-auto'>\n <form onSubmit={onSubmit}>\n <div className='form-group'>\n <label className='h2' htmlFor='name'>Enter your name</label>\n <input\n className={`form-control form-control-lg ${error ? 'is-invalid' : ''}`}\n type='text'\n aria-label='Enter your name...'\n placeholder='Enter your name...'\n autoFocus\n value={name}\n onChange={onSetName}\n autoComplete='off'\n autoCorrect='off'\n autoCapitalize='none'\n spellCheck='false'\n name={'name'}\n id='name'\n />\n {!!error && <FormFeedback name='name'>{error}</FormFeedback>}\n </div>\n </form>\n </LaunchpadV2.NarrowContent>\n <LaunchpadV2.Buttons>\n {!!shareRecipients.data?.length &&\n <button\n className='btn btn-link btn-lg'\n onClick={() => setStep('select-user')}\n >\n <Text namespace={namespace} phrase='back' />\n </button>\n }\n <div className='d-flex justify-content-end w-100'>\n <button\n className='btn btn-lg btn-dark'\n onClick={onSubmit}\n >\n <Text namespace={namespace} phrase='continue' />\n </button>\n </div>\n </LaunchpadV2.Buttons>\n </>\n )}\n\n {step === 'select-user' && (\n <>\n <LaunchpadV2.NarrowContent className='mb-auto'>\n <h2><Text namespace={namespace} phrase='selectName' /></h2>\n <ul className='list-unstyled row'>\n {ArrayHelper.sortBy(shareRecipients.data, a => a.publicName).map((recipient, index) => {\n return (\n <li key={index} className='col-3 p-2'>\n <DivButton\n className={`text-center rounded border py-2 ${selectedUser?.id === recipient.id ? 'border-info bg-light-blue' : ''}`}\n onClick={() => onClickRecipient(recipient)}\n >\n <div className='px-3'>\n <EmojiAvi recipient={recipient} />\n </div>\n \n <p className='mb-0 mt-2 fw-semibold text-truncate'>{recipient.publicName}</p>\n </DivButton>\n </li>\n );\n })}\n </ul>\n </LaunchpadV2.NarrowContent>\n <LaunchpadV2.Buttons>\n <div className='d-flex justify-content-between w-100'>\n <button\n className='btn btn-lg btn-link'\n onClick={() => {\n setSelectedUser(null);\n setStep('enter-name');\n setBackStep('select-user');\n }}\n >\n <Text namespace={namespace} phrase='cantFindName' />\n </button>\n <button\n className='btn btn-lg btn-dark'\n onClick={onContinueAvi}\n disabled={!selectedUser}\n >\n <Text namespace={namespace} phrase='continue' />\n </button>\n </div>\n </LaunchpadV2.Buttons>\n </>\n )}\n\n {step === 'confirm' && (\n <LaunchpadV2.NarrowContent className='mb-auto text-center'>\n {selectedUser &&\n <div className={`${styles.confirmationContainer} mx-auto`}>\n <EmojiAvi recipient={selectedUser} />\n </div>\n }\n <p className='h2'>\n <Text\n namespace={namespace}\n phrase={isReturning ? 'welcome' : 'hi'}\n options={{ name: selectedUser?.publicName || name }}\n />\n </p>\n \n <p className='h2 mb-4'><Text namespace={namespace} phrase='ready' /></p>\n <button\n className='btn btn-lg btn-dark w-100 mb-3'\n onClick={onClickGoToQuiz}\n >\n <Text namespace={namespace} phrase='start' />\n </button>\n <button\n className='btn btn-lg btn-link w-100'\n onClick={onClickNotMyName}\n >\n <Text namespace={namespace} phrase='notMyName' />\n </button>\n </LaunchpadV2.NarrowContent>\n )}\n </LaunchpadV2.Content>\n </LaunchpadV2.Right>\n </LaunchpadV2>\n );\n}\n\n","import { Flight } from 'libs/common/flight';\n\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ClassificationRequests } from 'libs/shared/flight-requests/ClassificationRequests';\nimport { ClipRequests } from 'libs/shared/flight-requests/ClipRequests';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { PlaylistRequests } from 'libs/shared/flight-requests/PlaylistRequests';\nimport { SeriesRequests } from 'libs/shared/flight-requests/SeriesRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { CurrentUser, ShareLink } from 'libs/shared/interfaces';\n\nexport function useFetchSharedResource<T>(shareId: string): T {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const shareLink = Flight.useBasicFetch<ShareLink>(ShareRequests.getShareObject(shareId));\n\n function getResourceRequest(): Flight.Request {\n if (!shareLink.data || !currentUser.data)\n return null;\n\n switch (shareLink.data.objectTypeId) {\n case MasterType.Video:\n return VideoRequests.publicVideo(shareLink.data.objectId, shareId);\n case MasterType.Clip:\n return ClipRequests.publicClip(shareLink.data.objectId, shareId);\n case MasterType.Interactive:\n return InteractiveRequests.publicInteractiveMetadata(shareLink.data.objectId, shareId);\n case MasterType.Playlist:\n return PlaylistRequests.getSharedPlaylist(shareLink.data.objectId, shareId);\n case MasterType.Subject:\n return ClassificationRequests.classification(shareLink.data.objectId, currentUser.data.id);\n case MasterType.Series:\n return SeriesRequests.sharedSeries(shareLink.data.objectId, shareId);\n }\n }\n\n const resourceRequest = getResourceRequest();\n const resource = Flight.useBasicFetch<T>(resourceRequest);\n\n return resource.data;\n}","// extracted by mini-css-extract-plugin\nexport default {\"left\":\"vIypY\",\"leftTextImage\":\"YViNj\",\"right\":\"MkD4u\",\"blur\":\"X6mCh\",\"imageContainer\":\"bc7kz\",\"imagePosition\":\"JOhEj\",\"image\":\"Ef2QR\",\"thumbnail\":\"Gdurb\",\"tallposter\":\"fjVNK\",\"cover\":\"o3j31\",\"linksContainer\":\"AT9Dk\"};","import React from 'react';\n\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nimport styles from './launchpad.scss';\n\nexport const LAUNCHPAD_FALLBACK_IMAGES = [\n { bgUrl: ImageUrls.LaunchPad.BG_1 },\n { bgUrl: ImageUrls.LaunchPad.BG_2 },\n { bgUrl: ImageUrls.LaunchPad.BG_3 },\n { bgUrl: ImageUrls.LaunchPad.BG_4 },\n { bgUrl: ImageUrls.LaunchPad.BG_5 }\n];\n\nexport const LAUNCHPAD_PRODUCT_FALLBACK_IMAGES = [\n { bgUrl: ImageUrls.LaunchPad.PRODUCT.BG_1 },\n { bgUrl: ImageUrls.LaunchPad.PRODUCT.BG_2 },\n { bgUrl: ImageUrls.LaunchPad.PRODUCT.BG_3 },\n { bgUrl: ImageUrls.LaunchPad.PRODUCT.BG_4 },\n { bgUrl: ImageUrls.LaunchPad.PRODUCT.BG_5 },\n { bgUrl: ImageUrls.LaunchPad.PRODUCT.BG_6 },\n { bgUrl: ImageUrls.LaunchPad.PRODUCT.BG_7 },\n { bgUrl: ImageUrls.LaunchPad.PRODUCT.BG_8 },\n { bgUrl: ImageUrls.LaunchPad.PRODUCT.BG_9 }\n];\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst XMAS_URLS: LaunchImage[] = [\n { bgUrl: '/images/launchpad/xmas/2024-promo1-bg.png' },\n { bgUrl: '/images/launchpad/xmas/2024-promo2-bg.png' },\n { bgUrl: '/images/launchpad/xmas/2024-promo3-bg.png' },\n { bgUrl: '/images/launchpad/xmas/2024-promo4-bg.png' },\n { bgUrl: '/images/launchpad/xmas/2024-promo5-bg.png' }\n];\n\nfunction mapObjectTypeToImageClass(objectType: MasterType): string {\n switch (objectType) {\n case MasterType.Video:\n case MasterType.Interactive:\n case MasterType.Clip:\n return styles.thumbnail;\n\n case MasterType.Subject:\n case MasterType.Playlist:\n return styles.cover;\n\n case MasterType.Series:\n return styles.tallposter;\n\n default:\n return '';\n }\n}\n\ninterface LaunchpadLink {\n url: string;\n text: string;\n onClick?: () => void;\n hide?: boolean;\n}\n\ninterface LaunchpadProps {\n objectType?: MasterType;\n title?: string;\n imageUrl?: string;\n links?: LaunchpadLink[];\n leftComponent?: () => JSX.Element;\n}\n\ninterface LaunchImage {\n bgUrl: string;\n}\n\nfunction getRandomImage(urlLists: LaunchImage[]): LaunchImage {\n return urlLists[Math.floor(Math.random() * urlLists.length)];\n}\n\nexport function Launchpad(props: React.PropsWithChildren<LaunchpadProps>): JSX.Element {\n const [ showImage, setShowImage ] = React.useState(false);\n const [ image, setImage ] = React.useState<string>('');\n\n const imageUrl = ImageHelper.createUrl(props.imageUrl, { size: ImageSize.Large });\n const IMAGE_URLS = LAUNCHPAD_PRODUCT_FALLBACK_IMAGES;\n\n React.useEffect(() => {\n if (imageUrl || !IMAGE_URLS || IMAGE_URLS.length === 0)\n return;\n\n const image = getRandomImage(IMAGE_URLS);\n\n if (image.bgUrl) {\n setImage(image.bgUrl);\n }\n }, []);\n\n React.useEffect(() => {\n if (!imageUrl)\n return;\n\n const img = new Image();\n img.onload = () => setShowImage(true);\n img.src = imageUrl;\n return () => img.onload = null;\n }, []);\n\n return (\n <div className='d-flex'>\n { props.leftComponent ?\n props.leftComponent()\n :\n <div\n className={`${styles.left} ${image ? 'bg-blue d-flex align-items-center' : 'bg-light'}`}\n >\n {image ?\n <img className='img-fluid' src={image} draggable={false} /> :\n (showImage &&\n <>\n <div className={styles.blur} style={{ backgroundImage: `url('${imageUrl}')` }} />\n <div className={`${styles.imageContainer} ${mapObjectTypeToImageClass(props.objectType)}`}>\n <div className={styles.imagePosition}>\n <img className={styles.image} src={imageUrl} alt={props.title} />\n </div>\n </div>\n </>\n )\n }\n </div>\n }\n <div className={`${styles.right} bg-white d-flex flex-column`}>\n <div className={`position-absolute d-flex align-items-center ${styles.linksContainer}`}>\n {props.links?.map((link, key) => {\n if (link.hide)\n return <React.Fragment key={key}></React.Fragment>;\n\n return (\n <a key={key} href={link.url} className='info-link fw-semibold' onClick={link.onClick}>\n {link.text}\n </a>\n );\n })}\n </div>\n\n {props.children}\n </div>\n </div>\n );\n}"],"names":["FormFeedback","props","id","name","className","role","children","mapObjectTypeToImageClass","objectType","MasterType","LaunchpadV2","imageSizeMap","cover","full","widthClassNameMap","base","NarrowContent","Left","LeftImage","showImage","setShowImage","image","setImage","imageUrl","img","Image","onload","src","fallbackImages","Math","floor","random","length","bgUrl","style","backgroundImage","alt","title","LeftImageWithBackground","bgStyles","backgroundColor","imageSize","Right","Header","LogoComponent","logoComponent","ClickViewLogo","bannerComponent","logoContainer","Content","ContentBody","widthClassName","width","Buttons","AVIS","BACKGROUNDS","getRandom","collection","charCode","i","charCodeAt","EmojiAvi","recipient","publicName","namespace","SelectAnonUserView","fetchAsync","ShareLinkFilterHelpers","shareId","setName","isReturning","setIsReturning","error","setError","step","setStep","backStep","setBackStep","selectedUser","setSelectedUser","sharedResource","useFetchSharedResource","shareRecipients","ShareRequests","onSubmit","e","preventDefault","trim","hasCompleted","data","leftImageUrl","ImageHelper","ShareViewHelper","size","typeId","VideoHelper","BaseImage","imageType","htmlFor","type","placeholder","autoFocus","value","onChange","target","autoComplete","autoCorrect","autoCapitalize","spellCheck","onClick","Text","phrase","ArrayHelper","a","map","index","key","DivButton","onClickRecipient","disabled","options","request","SessionHelper","href","appLink","currentUser","shareLink","resourceRequest","objectTypeId","objectId","getResourceRequest","LAUNCHPAD_FALLBACK_IMAGES","ImageUrls","LAUNCHPAD_PRODUCT_FALLBACK_IMAGES","Launchpad","IMAGE_URLS","urlLists","leftComponent","draggable","links","link","hide","url","text"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[8960],{70376:(e,t,n)=>{n.d(t,{W:()=>o});var r=n(32735),a=n(91967);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}var i=5e3;function o(e){var t,n,o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:i,l=(t=r.useState(!1),n=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,s,i,o=[],l=!0,u=!1;try{if(s=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(r=s.call(n)).done)&&(o.push(r.value),o.length!==t);l=!0);}catch(e){u=!0,a=e}finally{try{if(!l&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(u)throw a}}return o}}(t,n)||function(e,t){if(e){if("string"==typeof e)return s(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(e,t):void 0}}(t,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),u=l[0],c=l[1],m=r.useRef(null),d=function(){c((function(e){return!e})),m.current=window.setTimeout(d,o)};return r.useEffect((function(){m.current=window.setTimeout(d,o)}),[]),r.useEffect((function(){a.q.isFunction(e)&&e()}),[u]),function(){return window.clearTimeout(m.current)}}},69087:(e,t,n)=>{n.d(t,{d:()=>A});var r=n(32735),a=n(38129),s=n(23481),i=n(75896),o=n(83914),l=n(8246),u=n(35223);function c(e){var t=e.answer;return r.createElement("div",{key:t.id,className:"".concat(function(e){switch(e){case l.N.Correct:return"bg-light-green";case l.N.Incorrect:return"bg-light-red";case l.N.PendingReview:return"bg-light-blue"}}(t.status)," rounded p-2 mb-2")},r.createElement("div",{className:"d-flex align-items-center gap-2"},t.status===l.N.Correct&&r.createElement(o.x,{svgName:u.vn.Check,className:"svg-container flex-shrink-0 text-success"}),t.status===l.N.Incorrect&&r.createElement(o.x,{svgName:u.vn.Close,className:"svg-container flex-shrink-0 text-danger"}),!e.customAnswer&&r.createElement("span",{className:e.textClassName},t.text)),e.children)}var m=s.T.encloseNamespace("shared.interactionResponses");function d(e){return d="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},d(e)}function f(e,t,n){return(t=function(e){var t=function(e){if("object"!=d(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=d(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==d(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var b=function(){return r.createElement(r.Fragment,null)},v=f(f(f(f(f(f(f({},a.Z9.Annotation,b),a.Z9.Image,b),a.Z9.MissingWord,(function(e){return e.answers.length?r.createElement("ul",{className:"list-unstyled"},e.answers.map((function(e){return r.createElement("li",{key:e.id},r.createElement(c,{answer:e,textClassName:"bg-white p-1 border border-gray-300 rounded"}))}))):r.createElement(r.Fragment,null)})),a.Z9.MultipleChoice,(function(e){return e.answers.length?r.createElement("ul",{className:"list-unstyled"},e.answers.map((function(e){return r.createElement("li",{key:e.id},r.createElement(c,{answer:e}))}))):r.createElement(r.Fragment,null)})),a.Z9.TrueOrFalse,(function(e){var t=i.m.first(e.answers);return t?r.createElement(c,{answer:t}):r.createElement(r.Fragment,null)})),a.Z9.ShortAnswer,(function(e){var t=i.m.first(e.answers);return t?r.createElement(c,{answer:t},e.children):r.createElement(r.Fragment,null)})),a.Z9.Illustration,(function(e){var t=i.m.first(e.answers);return t?r.createElement(c,{answer:t,customAnswer:!0},r.createElement("div",{className:"ratio ratio-16x9"},r.createElement("img",{className:"img-fluid bg-white border rounded h-100 w-100",src:t.text,alt:"".concat(m("illustrationAlt"),": ").concat(e.interaction.name)})),e.children):r.createElement(r.Fragment,null)})),y=n(97408),g=n(44526),w=n(56151),p=n(3894),h=n(69737),E=n(83140),S=n(80845),k=n(64818);const N={avatarContainer:"O7oaA"};function A(e){var t,n,a,s,i,o,l=v[e.interaction.typeId];if(!l)return r.createElement(r.Fragment,null);var u=(0,S.j_)(e.studentResults),c=(0,S.f6)(e.interaction.id,u),m=E.A.isInteractionCorrect(e.interaction,u);return r.createElement("div",{className:"position-relative"},r.createElement("div",{className:"rounded ".concat(null!==(t=e.className)&&void 0!==t?t:"")},r.createElement("div",{className:"d-flex"},!!e.showStudentDetails&&r.createElement("div",{className:"me-2"},r.createElement("div",{className:N.avatarContainer},r.createElement(y.q,{imageCdnUrl:e.imageCdnUrl,initials:e.anonymisedUserName?k.l.getInitialsFromFullName(e.anonymisedUserName):k.l.getInitials(null===(n=e.studentResults.user)||void 0===n?void 0:n.name,null===(a=e.studentResults.user)||void 0===a?void 0:a.surname),imageUrl:e.anonymisedUserName?null:null===(i=null===(s=e.studentResults.user)||void 0===s?void 0:s.avatar)||void 0===i?void 0:i.url,showAnonymousUser:!!(null===(o=e.studentResults)||void 0===o?void 0:o.sessionId)}))),r.createElement("div",{className:"flex-grow-1"},!!e.showStudentDetails&&r.createElement(w.U,{studentResults:e.studentResults,correctness:m,anonymisedUserName:e.anonymisedUserName}),r.createElement("div",{className:"d-flex justify-content-between"},r.createElement("div",{className:"flex-grow-1 mb-2 ".concat(e.responseComponentClass?e.responseComponentClass:"")},c?r.createElement(l,{interaction:e.interaction,answers:c.answers,imageCdnUrl:e.imageCdnUrl,user:e.studentResults.user,showFeedback:e.showFeedback,showAvatar:e.showAvatar},r.createElement(p.Z,{studentAttempt:c,correctness:m,markInteraction:e.markInteraction,markedStatus:e.markedStatus})):r.createElement(h.R,null)),!e.showStudentDetails&&r.createElement(g.Y,{correctness:m}))))))}},5255:(e,t,n)=>{n.d(t,{Y:()=>o});var r=n(70376),a=n(20354),s=n(30439);function i(e){return i="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},i(e)}function o(e){var t,n=a.a.useGetFetch(),o=e&&s.o.getAnonSessions(e),l=a.a.useBasicFetch(o);return(0,r.W)((function(){return n(o)}),5e3),(null===(t=l.data)||void 0===t?void 0:t.length)?l.data.reduce((function(e,t){return Object.assign(Object.assign({},e),(n={},r=t.sessionId,a=t,(r=function(e){var t=function(e){if("object"!=i(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=i(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==i(t)?t:t+""}(r))in n?Object.defineProperty(n,r,{value:a,enumerable:!0,configurable:!0,writable:!0}):n[r]=a,n));var n,r,a}),{}):{}}},9193:(e,t,n)=>{n.d(t,{D:()=>f});var r=n(32735),a=n(70680),s=n(23481),i=n(20354),o=n(71553),l=n(39157),u=n(69883);function c(e){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},c(e)}function m(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var d=s.T.encloseNamespace("reportsShared.dataHooks"),f=function(e,t,n){var s,f,b=(s=(0,r.useState)({}),f=2,function(e){if(Array.isArray(e))return e}(s)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,s,i,o=[],l=!0,u=!1;try{if(s=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(r=s.call(n)).done)&&(o.push(r.value),o.length!==t);l=!0);}catch(e){u=!0,a=e}finally{try{if(!l&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(u)throw a}}return o}}(s,f)||function(e,t){if(e){if("string"==typeof e)return m(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?m(e,t):void 0}}(s,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.")}()),v=b[0],y=b[1],g=(0,a.I0)(),w=(0,u.Z)();return{markedAnswers:v,addMarkedAnswers:function(e,t){e.forEach((function(e){y((function(n){return Object.assign(Object.assign({},n),function(e,t,n){return(t=function(e){var t=function(e){if("object"!=c(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=c(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==c(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}({},(0,l.UU)(e),Object.assign(Object.assign({},e),{status:t})))}))}))},submitMarkedAnswers:function(){var r=Object.keys(v).map((function(e){return v[e]}));if(r.length){var a=0,s=0;r.forEach((function(n){var r=n.id,a=n.resultId,s=n.questionId,c=n.status;i.a.fetch(g,o.I.mark(e,t,r,{id:r,resultId:a,questionId:s,status:c},l,null,u))}))}function l(){s++}function u(){var e,t;++a===r.length&&(e="",t=!1,0===s&&(e=d("error",{smartCount:r.length}),t=!0),s<a&&(e=d("success",{smartCount:s})+" ".concat(d("partialError",{smartCount:a-s}))),s===a&&(e=d("success",{smartCount:s})),t?w.error(e):w.success(e),y({}),n&&n())}}}}},3218:(e,t,n)=>{n.d(t,{R:()=>S});var r=n(32735),a=n(69087),s=n(26136),i=n(39157),o=n(69186),l=n(86572),u=n(28972),c=n(83140),m=n(80845),d=n(23481),f=n(2102),b=n(36532),v=d.T.encloseNamespace("interactives.studentResponseList");function y(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},v("close")),!!e.interactionsToMark.length&&r.createElement(r.Fragment,null,e.isDemo?r.createElement(b.u,{id:"submitAnswers",title:v("demoOnly"),spanHack:!0,spanHackClassName:"d-inline-flex"},r.createElement("button",{className:"btn btn-outline-dark pointer-events-none",disabled:!t},v("submitAnswers"))):r.createElement(f.m,{variant:"outline-dark",onClick:e.onClickSubmit,disabled:!t,showSpinner:e.showSubmitButtonSpinner},v("submitAnswers")))))}var g=d.T.encloseNamespace("interactives.studentResponseList");function w(e){var t=Object.keys(e.markedAnswers).length;return r.createElement("div",{className:"d-flex justify-content-between pb-3"},r.createElement("div",{className:"d-flex"},!!e.summary.unanswered&&r.createElement("div",{className:"bg-light rounded p-2 me-2"},r.createElement("strong",{className:"me-2"},g("unanswered")),e.summary.unanswered),r.createElement("div",{className:"bg-light rounded p-2 me-2"},r.createElement("strong",{className:"me-2"},g("score")),e.summary.awaitingMarking?r.createElement("em",null,g("pending")):"".concat(Math.round(100*e.summary.percentCorrect),"%"))),!!e.interactionsToMark.length&&r.createElement(r.Fragment,null,e.isDemo?r.createElement(b.u,{id:"submitAnswers",title:g("demoOnly"),spanHack:!0},r.createElement("button",{className:"btn btn-outline-dark pointer-events-none",disabled:!t},g("submitAnswers"))):r.createElement(f.m,{variant:"outline-dark",onClick:e.onClickSubmit,disabled:!t,showSpinner:e.showSubmitButtonSpinner},g("submitAnswers"))))}const p={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,a,s,i,o=[],l=!0,u=!1;try{if(s=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(r=s.call(n)).done)&&(o.push(r.value),o.length!==t);l=!0);}catch(e){u=!0,a=e}finally{try{if(!l&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(u)throw a}}return o}}(e,t)||function(e,t){if(e){if("string"==typeof e)return E(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)?E(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 E(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,d,f,b=h(r.useState(!1),2),v=b[0],g=b[1],E=(t=r.useRef(null),n=h(r.useState(!1),2),d=n[0],f=n[1],r.useEffect((function(){t.current&&!d&&(f(!0),requestAnimationFrame((function(){return t.current.scrollIntoView({behavior:"smooth",block:"center"})})))}),[t.current,d]),t),S=(0,i.Rt)(e.interactive,e.studentResults),k=(0,m.Q)(e.interactive),N=function(e,t){return e.filter((function(e){return c.A.isInteractionCorrect(e,(0,m.j_)(t))===u.w.AwaitingMarking}))}(k,e.studentResults);function A(){g(!0),e.submitMarkedAnswers()}return r.createElement(r.Fragment,null,r.createElement(w,{summary:S,interactionsToMark:N,markedAnswers:e.markedAnswers,onClickSubmit:A,showSubmitButtonSpinner:v,isDemo:e.isDemo}),r.createElement("ul",{className:"list-unstyled"},k.map((function(t,n){var u,c=t.id.toString()===(null===(u=e.selectedInteractionId)||void 0===u?void 0:u.toString()),m=N.some((function(e){return e.id===t.id})),d=(0,s.B2)((0,s.DV)(e.studentResults,e.anonSessions),e.anonymiseUsers),f="p-2 mb-3 rounded";return c&&(f+=" border-2 border-info shadow"),f+=m?" ".concat(p.awaitingMarking):" border",r.createElement("li",{key:n,className:f,ref:c?E: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,i.HI)(t.id,e.studentResults,e.markedAnswers),markInteraction:e.addMarkedAnswers,imageCdnUrl:e.imageCdnUrl,anonymisedUserName:d,className:"bg-light ps-2",showFeedback:!0,reportsStyling:!0,responseComponentClass:"mx-n2"}):r.createElement(a.d,{interaction:t,studentResults:e.studentResults,markedStatus:(0,i.HI)(t.id,e.studentResults,e.markedAnswers),markInteraction:e.addMarkedAnswers,imageCdnUrl:e.imageCdnUrl,anonymisedUserName:d,showFeedback:!0}))}))),r.createElement(y,{interactionsToMark:N,markedAnswers:e.markedAnswers,onClickSubmit:A,onClickClose:e.onClickClose,showSubmitButtonSpinner:v,isDemo:e.isDemo}))}},94644:(e,t,n)=>{n.d(t,{r:()=>c});var r=n(50242),a=n(81886),s=n(67058),i=n(14553),o=n(49267),l=n(49075),u={notFound:s.d,forbidden:{rating:i.q,yearLevel:i.q,region:o.a,privacy:i.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 s;s="number"==typeof e?e:e.status;var i=Object.assign(Object.assign({},u),t);s&&a.Q.Ry.isStatusCodeError(s)&&(s!==r.o.InternalServer?s!==r.o.NotFound?s!==r.o.Forbidden?n.badRequest||a.Q.Ry.throw(new i.badRequest):n.forbidden||a.Q.Ry.throw(new i.forbidden.privacy):n.notFound||a.Q.Ry.throw(new i.notFound):n.internalServerError||a.Q.Ry.throw(new l._))}}},91286:(e,t,n)=>{n.d(t,{v:()=>i});var r=n(32735),a=n(94644);function s(e){return e.map((function(e){return e.statusCode})).join(":")}function i(e,t,n){var i=Array.isArray(e)?e:[e];(0,r.useEffect)((function(){i.forEach((function(e){(0,a.r)(e.statusCode,t,n)}))}),[s(i),t,n])}},93322:(e,t,n)=>{n.d(t,{F:()=>s});var r=n(32735),a=n(13126);function s(){r.useEffect((function(){return a.e.lockContentWidth(),function(){return a.e.unlockContentWidth()}}),[])}}}]);
2
+ //# sourceMappingURL=8960-c159492ba3-lite.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts/8960-c159492ba3-lite.chunk.js","mappings":"oQAIA,IAAMA,EAA2B,IAS3B,SAAUC,EAAWC,GAAwE,I,IAAlDC,EAAA,uDAA0BH,EACN,G,EAArB,YAAe,G,EAAM,E,o4BAA3DI,EAAc,KAAEC,EAAiB,KAEnCC,EAAa,SAAqB,MAElC,EAAO,WACXD,GAAkB,SAAAE,GAAC,OAAKA,CAAC,IAEzBD,EAAWE,QAAUC,OAAOC,WAAW,EAAMP,EAC/C,EAWA,OATA,aAAgB,WACdG,EAAWE,QAAUC,OAAOC,WAAW,EAAMP,EAC/C,GAAG,IAEH,aAAgB,WACV,eAA0BD,IAC5BA,GACJ,GAAG,CAACE,IAEG,kBAAMK,OAAOE,aAAaL,EAAWE,QAAQ,CACtD,C,mHCrBM,SAAUI,EAAgBC,GAC9B,IAAQC,EAAWD,EAAXC,OAUR,OACE,uBAAKC,IAAKD,EAAOE,GAAIC,UAAS,UAThC,SAAqBC,GACnB,OAAQA,GACN,KAAKC,EAAA,UAAiC,MAAO,iBAC7C,KAAKA,EAAA,YAAmC,MAAO,eAC/C,KAAKA,EAAA,gBAAuC,MAAO,gBAEvD,CAGqCC,CAAYN,EAAOI,QAAO,sBAC3D,uBAAKD,UAAU,mCACZH,EAAOI,SAAWC,EAAA,WAAmC,gBAACE,EAAA,EAAY,CAACC,QAAS,WAAoBL,UAAU,6CAC1GH,EAAOI,SAAWC,EAAA,aAAqC,gBAACE,EAAA,EAAY,CAACC,QAAS,WAAoBL,UAAU,6CAC3GJ,EAAMU,cAAgB,wBAAMN,UAAWJ,EAAMW,eAAgBV,EAAOW,OAEvEZ,EAAMa,SAGb,CC1BA,IACMC,EAAYC,EAAA,mBADA,+B,mnBCWlB,IAAMC,EAAqB,WAAH,OAAS,gCAAK,EAEzBC,EAA2B,iBAGrC,gBAA+BD,GAC/B,WAA0BA,GAC1B,kBCpBG,SAA8BhB,GAClC,OAAKA,EAAMkB,QAAQC,OAGjB,sBAAIf,UAAU,iBACXJ,EAAMkB,QAAQE,KAAI,SAAAnB,GAAM,OACvB,sBAAIC,IAAKD,EAAOE,IACd,gBAACJ,EAAe,CACdE,OAAQA,EACRU,cAAc,gDAEb,KAVuB,gCAcpC,IDMG,qBEtBG,SAAiCX,GACrC,OAAKA,EAAMkB,QAAQC,OAGjB,sBAAIf,UAAU,iBACXJ,EAAMkB,QAAQE,KAAI,SAAAnB,GAAM,OACvB,sBAAIC,IAAKD,EAAOE,IACd,gBAACJ,EAAe,CAACE,OAAQA,IACtB,KAPuB,gCAWpC,IFWG,kBGrBG,SAA8BD,GAClC,IAAMC,EAASoB,EAAA,QAAkBrB,EAAMkB,SAEvC,OAAKjB,EAIH,gBAACF,EAAe,CAACE,OAAQA,IAHlB,gCAKX,IHaG,kBItBG,SAA8BD,GAClC,IAAMC,EAASoB,EAAA,QAAkBrB,EAAMkB,SAEvC,OAAKjB,EAIH,gBAACF,EAAe,CAACE,OAAQA,GACtBD,EAAMa,UAJF,gCAOX,IJYG,mBDnBG,SAA+Bb,GACnC,IAAMC,EAASoB,EAAA,QAAkBrB,EAAMkB,SAEvC,OAAKjB,EAIH,gBAACF,EAAe,CAACE,OAAQA,EAAQS,cAAY,GAC3C,uBAAKN,UAAU,oBACb,uBACEA,UAAU,gDACVkB,IAAKrB,EAAOW,KACZW,IAAG,UAAKT,EAAU,mBAAkB,aAAKd,EAAMwB,YAAYC,SAG9DzB,EAAMa,UAXF,gCAcX,I,uFM5BA,SAAgB,gBAAkB,SC6B5B,SAAUa,EAAwB1B,G,gBAChC2B,EAAwBV,EAA4BjB,EAAMwB,YAAYI,QAE5E,IAAKD,EACH,OAAO,iCAET,IAAME,GAAS,QAAiB7B,EAAM8B,gBAEhCC,GAAiB,QAAkB/B,EAAMwB,YAAYrB,GAAI0B,GAEzDG,EAAcC,EAAA,uBAAkDjC,EAAMwB,YAAaK,GAEzF,OACE,uBAAKzB,UAAU,qBACb,uBAAKA,UAAS,kBAA4B,QAAf,EAAAJ,EAAMI,iBAAS,QAAI,KAC5C,uBAAKA,UAAU,YACVJ,EAAMkC,oBACP,uBAAK9B,UAAU,QACb,uBAAKA,UAAW,mBACd,gBAAC+B,EAAA,EAAM,CACLC,YAAapC,EAAMoC,YACnBC,SAAUrC,EAAMsC,mBACZC,EAAA,0BAAmCvC,EAAMsC,oBACzCC,EAAA,cAAgD,QAAzB,EAAAvC,EAAM8B,eAAeU,YAAI,eAAEf,KAA+B,QAAzB,EAAAzB,EAAM8B,eAAeU,YAAI,eAAEC,SAEvFC,SAAU1C,EAAMsC,mBAAqB,KAAwC,QAAjC,EAAyB,QAAzB,EAAAtC,EAAM8B,eAAeU,YAAI,eAAEG,cAAM,eAAEC,IAC/EC,qBAAyC,QAApB,EAAA7C,EAAM8B,sBAAc,eAAEgB,eAMnD,uBAAK1C,UAAU,iBACVJ,EAAMkC,oBACP,gBAACa,EAAA,EAA+B,CAC9BjB,eAAgB9B,EAAM8B,eACtBE,YAAaA,EACbM,mBAAoBtC,EAAMsC,qBAG9B,uBAAKlC,UAAU,kCACb,uBAAKA,UAAS,2BAAsBJ,EAAMgD,uBAAyBhD,EAAMgD,uBAAyB,KAC/FjB,EACG,gBAACJ,EAAqB,CACtBH,YAAaxB,EAAMwB,YACnBN,QAASa,EAAeb,QACxBkB,YAAapC,EAAMoC,YACnBI,KAAMxC,EAAM8B,eAAeU,KAC3BS,aAAcjD,EAAMiD,aACpBC,WAAYlD,EAAMkD,YAElB,gBAACC,EAAA,EAAY,CACXpB,eAAgBA,EAChBC,YAAaA,EACboB,gBAAiBpD,EAAMoD,gBACvBC,aAAcrD,EAAMqD,gBAGtB,gBAACC,EAAA,EAAU,QAGftD,EAAMkC,oBACN,gBAACqB,EAAA,EAA8B,CAACvB,YAAaA,QAQ7D,C,6SCxFM,SAAUwB,EAAgBC,G,MACxBC,EAAQ,kBACRC,EAAsBF,GAAW,oBAA8BA,GAC/DG,EAAuB,kBAAoCD,GAIjE,OAFA,QAAW,kBAAMD,EAAMC,EAAoB,GAAE,MAEf,QAAzB,EAAAC,EAAqBC,YAAI,eAAE1C,QAGzByC,EAAqBC,KAAKC,QAAO,SAACC,EAAMpE,GAAO,OAAK,+BAAMoE,I,EAAI,G,EAAGpE,EAAQmD,U,EAAYnD,G,+XAAO,GAAK,CAAC,GAFhG,CAAC,CAGZ,C,+bCXA,IAAMmB,EAAY,qBAAiC,2BAQtCkD,EAAiB,SAACC,EAAuBC,EAA+BC,GACnF,I,IAA0E,G,GAA9B,IAAAC,UAA2B,CAAC,G,EAAE,E,o4BAAlEC,EAAa,KAAEC,EAAgB,KAEjCC,GAAW,UACXC,GAAS,SAoEf,MAAO,CACLH,cAAAA,EACAI,iBApEF,SAA0BvD,EAA0Bb,GAClDa,EAAQwD,SAAQ,SAAAC,GACdL,GAAiB,SAAAM,GAAC,OAAI,+BAAMA,G,2YAAC,KAAG,QAAkBD,GAAG,+BAAOA,GAAC,CAAEtE,OAAAA,KAAM,GACvE,GACF,EAiEEwE,oBA/DF,WACE,IAAM3D,EAAU4D,OAAOC,KAAKV,GAAejD,KAAI,SAAAlB,GAAG,OAAImE,EAAcnE,EAAI,IAExE,GAAKgB,EAAQC,OAAb,CAGA,IAAI6D,EAAgB,EAChBC,EAAe,EAwCnB/D,EAAQwD,SAAQ,YAAyC,IAAtCvE,EAAE,EAAFA,GAAI+E,EAAQ,EAARA,SAAUC,EAAU,EAAVA,WAAY9E,EAAM,EAANA,OAC3C,UAAakE,EAAU,EAAAa,EAAA,KACrBnB,EACAC,EACA/D,EACA,CAAEA,GAAAA,EAAI+E,SAAAA,EAAUC,WAAAA,EAAY9E,OAAAA,GAC5BgF,EACA,KACAC,GAEJ,GArDQ,CAKR,SAASD,IACPJ,GACF,CAEA,SAASK,IAOT,IACMC,EACAC,IARJR,IAEsB9D,EAAQC,SAK1BoE,EAAe,GACfC,GAAgB,EAEC,IAAjBP,IACFM,EAAezE,EAAU,QAAS,CAAE2E,WAAYvE,EAAQC,SACxDqE,GAAgB,GAGdP,EAAeD,IACjBO,EAAezE,EAAU,UAAW,CAAE2E,WAAYR,IAAe,WAC1DnE,EAAU,eAAgB,CAAE2E,WAAYT,EAAgBC,MAG7DA,IAAiBD,IACnBO,EAAezE,EAAU,UAAW,CAAE2E,WAAYR,KAGpDO,EACIhB,EAAOkB,MAAMH,GACbf,EAAOmB,QAAQJ,GAEnBjB,EAAiB,CAAC,GAElBH,GAAUA,IA1BZ,CAwCF,EAOF,C,yKCvFMrD,EAAYC,EAAA,mBADA,oCAYZ,SAAU6E,EAA0B5F,GACxC,IAAM6F,EAAmBf,OAAOC,KAAK/E,EAAMqE,eAAelD,OAE1D,OACE,uBAAKf,UAAU,mCACb,4BACIJ,EAAM8F,yBACN,0BAAQ1F,UAAU,eAAe2F,QAAS/F,EAAMgG,cAC7ClF,EAAU,YAGZd,EAAMiG,mBAAmB9E,QAC1B,gCACGnB,EAAMkG,OACL,gBAACC,EAAA,EAAO,CACNhG,GAAG,gBACHiG,MAAOtF,EAAU,YACjBuF,UAAQ,EACRC,kBAAkB,iBAElB,0BACElG,UAAU,2CACVmG,UAAWV,GAEV/E,EAAU,mBAIf,gBAAC0F,EAAA,EAAa,CACZC,QAAQ,eACRV,QAAS/F,EAAM0G,cACfH,UAAWV,EACXc,YAAa3G,EAAM8F,yBAElBhF,EAAU,oBAQ3B,CCrDA,IACM,EAAYC,EAAA,mBADA,oCAYZ,SAAU6F,EAA0B5G,GACxC,IAAM6F,EAAmBf,OAAOC,KAAK/E,EAAMqE,eAAelD,OAE1D,OACE,uBAAKf,UAAU,uCACb,uBAAKA,UAAU,YACVJ,EAAM6G,QAAQC,YACf,uBAAK1G,UAAU,6BACb,0BAAQA,UAAU,QAAQ,EAAU,eACnCJ,EAAM6G,QAAQC,YAGnB,uBAAK1G,UAAU,6BACb,0BAAQA,UAAU,QAAQ,EAAU,UACnCJ,EAAM6G,QAAQE,gBACX,0BAAK,EAAU,YAAgB,UAC5BC,KAAKC,MAAqC,IAA/BjH,EAAM6G,QAAQK,gBAAqB,SAItDlH,EAAMiG,mBAAmB9E,QAC1B,gCACGnB,EAAMkG,OACL,gBAACC,EAAA,EAAO,CAAChG,GAAG,gBAAgBiG,MAAO,EAAU,YAAaC,UAAQ,GAChE,0BACEjG,UAAU,2CACVmG,UAAWV,GAEV,EAAU,mBAIf,gBAACW,EAAA,EAAa,CACZC,QAAQ,eACRV,QAAS/F,EAAM0G,cACfH,UAAWV,EACXc,YAAa3G,EAAM8F,yBAElB,EAAU,mBAOzB,CClEA,SAAgB,gBAAkB,S,ggCC+D5B,SAAUqB,EAAoBnH,GAClC,IA/BMoH,EACiD,EAA/CC,EAAUC,EA8B2C,IAArB,YAAe,GAAM,GAArDX,EAAW,KAAEY,EAAc,KAC7BC,GAhCAJ,EAAM,SAA4B,MACe,IAArB,YAAe,GAAM,GAA/CC,EAAQ,KAAEC,EAAW,KAG7B,aAAgB,WACTF,EAAIzH,UAAW0H,IAGpBC,GAAY,GACZG,uBAAsB,kBAAML,EAAIzH,QAAQ+H,eAAe,CAAEC,SAAU,SAAUC,MAAO,UAAW,IACjG,GAAG,CAAER,EAAIzH,QAAS0H,IAEXD,GAsBDP,GAAU,QAAyB7G,EAAM6H,YAAa7H,EAAM8B,gBAC5DgG,GAAe,OAAgB9H,EAAM6H,aACrCE,EAlDR,SACED,EACAhG,GAEA,OAAOgG,EAAaE,QAAO,SAAAC,GACzB,OAAOhG,EAAA,uBACLgG,GACA,QAAiBnG,MACboG,EAAA,iBACR,GACF,CAwC0BC,CAAsBL,EAAc9H,EAAM8B,gBAElE,SAAS4E,IACPa,GAAe,GACfvH,EAAM6E,qBACR,CAEA,OACE,gCACE,gBAAC+B,EAAyB,CACxBC,QAASA,EACTZ,mBAAoB8B,EACpB1D,cAAerE,EAAMqE,cACrBqC,cAAeA,EACfZ,wBAAyBa,EACzBT,OAAQlG,EAAMkG,SAEhB,sBAAI9F,UAAU,iBACX0H,EAAa1G,KAAI,SAACI,EAAa4G,G,MACxBC,EAAa7G,EAAYrB,GAAGmI,cAA0C,QAA3B,EAAAtI,EAAMuI,6BAAqB,eAAED,YACxEE,EAAkBT,EAAgBU,MAAK,SAAAC,GAAC,OAAIA,EAAEvI,KAAOqB,EAAYrB,EAAE,IACnEmC,GAAqB,SACzB,QAAqBtC,EAAM8B,eAAgB9B,EAAM2I,cACjD3I,EAAM4I,gBAGJxI,EAAY,mBAUhB,OARIiI,IACFjI,GAAa,gCAGbA,GADEoI,EACW,IAAJ,OAAQ,mBAEJ,UAGb,sBAAItI,IAAKkI,EAAKhI,UAAWA,EAAWgH,IAAKiB,EAAab,EAAyB,MAC7E,uBAAKpH,UAAU,eACb,gBAACyI,EAAA,EAAgB,CACfrH,YAAaA,EACbsH,cAAc,mBAGjB9I,EAAM+I,eACL,gBAACC,EAAA,EAAmB,CAClBxH,YAAaA,EACbM,eAAgB9B,EAAM8B,eACtBuB,cAAc,QAAgB7B,EAAYrB,GAAIH,EAAM8B,eAAgB9B,EAAMqE,eAC1EjB,gBAAiBpD,EAAMyE,iBACvBrC,YAAapC,EAAMoC,YACnBE,mBAAoBA,EACpBlC,UAAU,gBACV6C,cAAY,EACZ8F,gBAAc,EACd/F,uBAAuB,UAGzB,gBAACtB,EAAA,EAAuB,CACtBF,YAAaA,EACbM,eAAgB9B,EAAM8B,eACtBuB,cAAc,QAAgB7B,EAAYrB,GAAIH,EAAM8B,eAAgB9B,EAAMqE,eAC1EjB,gBAAiBpD,EAAMyE,iBACvBrC,YAAapC,EAAMoC,YACnBE,mBAAoBA,EACpBW,cAAY,IAKtB,KAEF,gBAAC2C,EAAyB,CACxBK,mBAAoB8B,EACpB1D,cAAerE,EAAMqE,cACrBqC,cAAeA,EACfV,aAAchG,EAAMgG,aACpBF,wBAAyBa,EACzBT,OAAQlG,EAAMkG,SAItB,C,yGC7HM+C,EAA8B,CAClCC,SAAU,IACVC,UAAW,CACTC,OAAQ,IACRC,UAAW,IACXC,OAAQ,IACRC,QAAS,KAEXC,WAAY,IACZC,oBAAqB,KAGjB,SAAUC,EACdC,GAMkC,IALlCC,EAAA,uDAA+B,CAAC,EAKhCC,EAAA,uDAAgC,CAAC,EAEjC,GAAKF,EAAL,CAGA,IAAIG,EAGFA,EADmB,iBAAVH,EACIA,EAEAA,EAAKtJ,OAGpB,IAAM0J,EAAW,OAAH,wBACTd,GACAW,GAGAE,GAGA,yBAAmCA,KAGpCA,IAAe,mBAMfA,IAAe,aAMfA,IAAe,cAUdD,EAAUL,YACb,aAAuB,IAAIO,EAASP,YAN/BK,EAAUV,WACb,aAAuB,IAAIY,EAASZ,UAAUI,SAX3CM,EAAUX,UACb,aAAuB,IAAIa,EAASb,UAPjCW,EAAUJ,qBACb,aAAuB,IAAI,KAvBvB,CA6CV,C,6DCxFA,SAASO,EAAiBC,GACxB,OAAOA,EAAW7I,KAAI,SAAA8I,GAAG,OAAIA,EAAIJ,UAAU,IAAEK,KAAK,IACpD,CAGM,SAAUC,EACdC,EACAC,EACAC,GAEA,IAAMN,EAAaO,MAAMC,QAAQJ,GAAeA,EAAc,CAACA,IAE/D,IAAAK,YAAU,WACRT,EAAWvF,SAAQ,SAAAwF,IACjB,OAAgBA,EAAIJ,WAAYQ,EAAcC,EAChD,GACF,GAAG,CAAEP,EAAiBC,GAAaK,EAAcC,GACnD,C,6DCnBM,SAAUI,IACd,aAAgB,WAEd,OADA,uBACO,kBAAM,wBAAiC,CAChD,GAAG,GACL,C","sources":["file:///app/packages/libs/common/src/react/hooks/UsePolling.ts","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/interaction-response-item/components/AnswerContainer.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/interaction-response-item/components/IllustrationResponse.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/interaction-response-item/ResponseItemComponentLookup.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/interaction-response-item/components/MissingWordResponse.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/interaction-response-item/components/MultipleChoiceResponse.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/interaction-response-item/components/TrueOrFalseResponse.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/interaction-response-item/components/ShortAnswerResponse.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/interaction-response-item/interaction-response-item.scss","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/interaction-response-item/InteractionResponseItem.tsx","file:///app/packages/libs/shared/src/apps/analytics/hooks/UseAnonSessions.ts","file:///app/packages/libs/shared/src/apps/analytics/hooks/UseMarkAnswers.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/errors/handlers/HttpErrorHandlers.ts","file:///app/packages/libs/shared/src/hooks/UseHandleObjectError.ts","file:///app/packages/libs/shared/src/hooks/useLockContentWidth.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nconst DEFAULT_POLLING_INTERVAL = 5000; // 5 seconds.\n\n/**\n * Hook to fire a callback at a set interval.\n * @param callback \n * @param pollingInterval \n * \n * Returns a function to clear the timeout.\n */\nexport function usePolling(callback: () => void, pollingInterval: number = DEFAULT_POLLING_INTERVAL): () => void {\n const [ pollingTrigger, setPollingTrigger ] = React.useState(false);\n\n const timeoutRef = React.useRef<number>(null);\n\n const poll = () => {\n setPollingTrigger(t => !t);\n\n timeoutRef.current = window.setTimeout(poll, pollingInterval);\n };\n\n React.useEffect(() => {\n timeoutRef.current = window.setTimeout(poll, pollingInterval);\n }, []);\n\n React.useEffect(() => {\n if (FunctionHelper.isFunction(callback))\n callback();\n }, [pollingTrigger]);\n\n return () => window.clearTimeout(timeoutRef.current);\n}","import React from 'react';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { StudentAnswer } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\ninterface AnswerContainerProps extends React.PropsWithChildren {\n answer: StudentAnswer;\n textClassName?: string;\n customAnswer?: boolean;\n}\n\nexport function AnswerContainer(props: AnswerContainerProps) {\n const { answer } = props;\n\n function getBgColour(status: InteractiveAnswerStatus) {\n switch (status) {\n case InteractiveAnswerStatus.Correct: return 'bg-light-green';\n case InteractiveAnswerStatus.Incorrect: return 'bg-light-red';\n case InteractiveAnswerStatus.PendingReview: return 'bg-light-blue';\n }\n }\n\n return (\n <div key={answer.id} className={`${getBgColour(answer.status)} rounded p-2 mb-2`}>\n <div className='d-flex align-items-center gap-2'>\n {answer.status === InteractiveAnswerStatus.Correct && <SvgContainer svgName={cvSvgLibrary.Check} className='svg-container flex-shrink-0 text-success' />}\n {answer.status === InteractiveAnswerStatus.Incorrect && <SvgContainer svgName={cvSvgLibrary.Close} className='svg-container flex-shrink-0 text-danger' />}\n {!props.customAnswer && <span className={props.textClassName}>{answer.text}</span>}\n </div>\n {props.children}\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { AnswerContainer } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/components/AnswerContainer';\nimport { ResponseItemComponentProps } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/ResponseItemComponentLookup';\n\nconst namespace = 'shared.interactionResponses';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function IllustrationResponse(props: ResponseItemComponentProps): JSX.Element {\n const answer = ArrayHelper.first(props.answers);\n\n if (!answer)\n return <></>;\n\n return (\n <AnswerContainer answer={answer} customAnswer>\n <div className='ratio ratio-16x9'>\n <img\n className='img-fluid bg-white border rounded h-100 w-100'\n src={answer.text}\n alt={`${getPhrase('illustrationAlt')}: ${props.interaction.name}`}\n />\n </div>\n {props.children}\n </AnswerContainer>\n );\n}","import React from 'react';\n\nimport { Interaction, InteractionTypeId, StudentAnswer, User } from 'libs/shared/interfaces';\n\nimport { IllustrationResponse } from './components/IllustrationResponse';\nimport { MissingWordResponse } from './components/MissingWordResponse';\nimport { MultipleChoiceResponse } from './components/MultipleChoiceResponse';\nimport { ShortAnswerResponse } from './components/ShortAnswerResponse';\nimport { TrueOrFalseResponse } from './components/TrueOrFalseResponse';\n\nexport interface ResponseItemComponentProps extends React.PropsWithChildren {\n interaction: Interaction;\n answers: StudentAnswer[];\n imageCdnUrl: string;\n user: User;\n showFeedback?: boolean;\n showAvatar?: boolean;\n anonymisedUserName?: string;\n}\nconst NoResponseRequired = () => <></>;\n\nexport const ResponseItemComponentLookup: {\n [typeId: number]: (props: ResponseItemComponentProps) => JSX.Element\n} = {\n [InteractionTypeId.Annotation]: NoResponseRequired,\n [InteractionTypeId.Image]: NoResponseRequired,\n [InteractionTypeId.MissingWord]: MissingWordResponse,\n [InteractionTypeId.MultipleChoice]: MultipleChoiceResponse,\n [InteractionTypeId.TrueOrFalse]: TrueOrFalseResponse,\n [InteractionTypeId.ShortAnswer]: ShortAnswerResponse,\n [InteractionTypeId.Illustration]: IllustrationResponse\n};","import React from 'react';\n\nimport { AnswerContainer } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/components/AnswerContainer';\nimport { ResponseItemComponentProps } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/ResponseItemComponentLookup';\n\n\nexport function MissingWordResponse(props: ResponseItemComponentProps) {\n if (!props.answers.length) return <></>;\n\n return (\n <ul className='list-unstyled'>\n {props.answers.map(answer => (\n <li key={answer.id}>\n <AnswerContainer\n answer={answer}\n textClassName='bg-white p-1 border border-gray-300 rounded'\n />\n </li>\n ))}\n </ul>\n );\n}","import React from 'react';\n\nimport { AnswerContainer } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/components/AnswerContainer';\nimport { ResponseItemComponentProps } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/ResponseItemComponentLookup';\n\nexport function MultipleChoiceResponse(props: ResponseItemComponentProps) {\n if (!props.answers.length) return <></>;\n\n return (\n <ul className='list-unstyled'>\n {props.answers.map(answer => (\n <li key={answer.id}>\n <AnswerContainer answer={answer} />\n </li>\n ))}\n </ul>\n );\n}","import React from 'react';\n\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { AnswerContainer } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/components/AnswerContainer';\nimport { ResponseItemComponentProps } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/ResponseItemComponentLookup';\n\nexport function TrueOrFalseResponse(props: ResponseItemComponentProps) {\n const answer = ArrayHelper.first(props.answers);\n\n if (!answer)\n return <></>;\n\n return (\n <AnswerContainer answer={answer} />\n );\n}","import React from 'react';\n\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { AnswerContainer } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/components/AnswerContainer';\nimport { ResponseItemComponentProps } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/ResponseItemComponentLookup';\n\nexport function ShortAnswerResponse(props: ResponseItemComponentProps): JSX.Element {\n const answer = ArrayHelper.first(props.answers);\n\n if (!answer)\n return <></>;\n\n return (\n <AnswerContainer answer={answer}>\n {props.children}\n </AnswerContainer>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"avatarContainer\":\"O7oaA\"};","import React from 'react';\n\nimport { ResponseItemComponentLookup } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/ResponseItemComponentLookup';\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { InteractionResponseCorrectness } from 'libs/shared/components/interaction-response/InteractionResponseCorrectness';\nimport { InteractionStudentDetailsHeader } from 'libs/shared/components/interaction-response/InteractionStudentDetailsHeader';\nimport { MarkResponse } from 'libs/shared/components/interaction-response/MarkResponse';\nimport { NoResponse } from 'libs/shared/components/interaction-response/response-types/NoResponse';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interaction, StudentAnswer, StudentResults } from 'libs/shared/interfaces';\nimport { InteractiveCorrectnessHelper } from 'libs/shared/utils/InteractiveCorrectnessHelper';\nimport { getStudentAttempt, getStudentResult } from 'libs/shared/utils/InteractiveHelper';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport styles from './interaction-response-item.scss';\n\ninterface InteractionResponseProps {\n interaction: Interaction;\n studentResults: StudentResults;\n imageCdnUrl: string;\n markInteraction: (answers: StudentAnswer[], status: InteractiveAnswerStatus) => void;\n markedStatus?: InteractiveAnswerStatus;\n showStudentDetails?: boolean;\n className?: string;\n showFeedback?: boolean;\n showAvatar?: boolean;\n anonymisedUserName?: string;\n responseComponentClass?: string;\n}\n\nexport function InteractionResponseItem(props: InteractionResponseProps): JSX.Element {\n const ResponseItemComponent = ResponseItemComponentLookup[props.interaction.typeId];\n\n if (!ResponseItemComponent)\n return <></>;\n\n const result = getStudentResult(props.studentResults);\n\n const studentAttempt = getStudentAttempt(props.interaction.id, result);\n\n const correctness = InteractiveCorrectnessHelper.isInteractionCorrect(props.interaction, result);\n\n return (\n <div className='position-relative'>\n <div className={`rounded ${props.className ?? ''}`}>\n <div className='d-flex'>\n {!!props.showStudentDetails &&\n <div className='me-2'>\n <div className={styles.avatarContainer}>\n <Avatar\n imageCdnUrl={props.imageCdnUrl}\n initials={props.anonymisedUserName\n ? UserHelper.getInitialsFromFullName(props.anonymisedUserName)\n : UserHelper.getInitials(props.studentResults.user?.name, props.studentResults.user?.surname)\n }\n imageUrl={props.anonymisedUserName ? null : props.studentResults.user?.avatar?.url}\n showAnonymousUser={!!props.studentResults?.sessionId}\n />\n </div>\n \n </div>\n }\n <div className='flex-grow-1'>\n {!!props.showStudentDetails &&\n <InteractionStudentDetailsHeader\n studentResults={props.studentResults}\n correctness={correctness}\n anonymisedUserName={props.anonymisedUserName}\n />\n }\n <div className='d-flex justify-content-between'>\n <div className={`flex-grow-1 mb-2 ${props.responseComponentClass ? props.responseComponentClass : ''}`}>\n {studentAttempt\n ? <ResponseItemComponent\n interaction={props.interaction}\n answers={studentAttempt.answers}\n imageCdnUrl={props.imageCdnUrl}\n user={props.studentResults.user}\n showFeedback={props.showFeedback}\n showAvatar={props.showAvatar}\n >\n <MarkResponse\n studentAttempt={studentAttempt}\n correctness={correctness}\n markInteraction={props.markInteraction}\n markedStatus={props.markedStatus}\n />\n </ResponseItemComponent>\n : <NoResponse />\n }\n </div>\n {!props.showStudentDetails &&\n <InteractionResponseCorrectness correctness={correctness} />\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n}","import { usePolling } from 'libs/common/react/hooks/UsePolling';\nimport { Flight } from 'libs/common/react/index';\n\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\n\nexport interface AnonSession {\n sessionId: string;\n sessionName: string;\n}\n\nexport interface AnonSessions extends Record<string, AnonSession> {}\n\nexport function useAnonSessions(shareId: string): AnonSessions {\n const fetch = Flight.useGetFetch();\n const anonSessionsRequest = shareId && ShareRequests.getAnonSessions(shareId);\n const anonSessionsResponse = Flight.useBasicFetch<AnonSession[]>(anonSessionsRequest);\n\n usePolling(() => fetch(anonSessionsRequest), 5000);\n\n if (!anonSessionsResponse.data?.length)\n return {};\n\n return anonSessionsResponse.data.reduce((prev, current) => ({ ...prev, [current.sessionId]: current }), {});\n}","import { useState } from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { InteractiveResultsRequests } from 'libs/shared/apps/analytics/flight-requests/InteractiveResultsRequests';\nimport { getMarkedAnswerId } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { StudentAnswer } from 'libs/shared/interfaces';\n\nconst getPhrase = LanguageService.encloseNamespace('reportsShared.dataHooks');\n\nexport type MarkedAnswerHash = { [id: string]: StudentAnswer };\n\n/**\n * This hook manages the storing of a marked answer hash in state and then the submitting\n * of those answers via an api call.\n */\nexport const useMarkAnswers = (interactiveId: string, interactiveMetadataId: string, onDone?: () => void) => {\n const [ markedAnswers, setMarkedAnswers ] = useState<MarkedAnswerHash>({});\n\n const dispatch = useDispatch();\n const alerts = useAlerts();\n\n function addMarkedAnswers(answers: StudentAnswer[], status: InteractiveAnswerStatus): void {\n answers.forEach(a => {\n setMarkedAnswers(m => ({ ...m, [getMarkedAnswerId(a)]: { ...a, status } }));\n });\n }\n\n function submitMarkedAnswers(): void {\n const answers = Object.keys(markedAnswers).map(key => markedAnswers[key]);\n\n if (!answers.length)\n return;\n\n let completeCount = 0;\n let successCount = 0;\n\n function onSuccess(): void {\n successCount++;\n }\n\n function onAlways(): void {\n completeCount++;\n\n if (completeCount === answers.length)\n onComplete();\n }\n\n function onComplete(): void {\n let alertMessage = '';\n let useErrorAlert = false;\n\n if (successCount === 0) {\n alertMessage = getPhrase('error', { smartCount: answers.length });\n useErrorAlert = true;\n }\n\n if (successCount < completeCount) {\n alertMessage = getPhrase('success', { smartCount: successCount })\n + ` ${getPhrase('partialError', { smartCount: completeCount - successCount })}`;\n }\n\n if (successCount === completeCount) {\n alertMessage = getPhrase('success', { smartCount: successCount });\n }\n\n useErrorAlert\n ? alerts.error(alertMessage)\n : alerts.success(alertMessage);\n\n setMarkedAnswers({});\n\n onDone && onDone();\n }\n\n answers.forEach(({ id, resultId, questionId, status }) => {\n Flight.fetch(dispatch, InteractiveResultsRequests.mark(\n interactiveId,\n interactiveMetadataId,\n id,\n { id, resultId, questionId, status },\n onSuccess,\n null,\n onAlways\n ));\n });\n }\n\n return {\n markedAnswers,\n addMarkedAnswers,\n submitMarkedAnswers\n };\n};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { MarkedAnswerHash } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { SpinnerButton } from 'libs/shared/components/spinner-button/SpinnerButton';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { Interaction } from 'libs/shared/interfaces';\n\nconst namespace = 'interactives.studentResponseList';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface StudentResponseListFooterProps {\n interactionsToMark: Interaction[];\n markedAnswers: MarkedAnswerHash;\n onClickSubmit: () => void;\n onClickClose: () => void;\n showSubmitButtonSpinner: boolean;\n isDemo?: boolean;\n}\n\nexport function StudentResponseListFooter(props: StudentResponseListFooterProps): JSX.Element {\n const numMarkedAnswers = Object.keys(props.markedAnswers).length;\n\n return (\n <div className='d-flex justify-content-end pt-3'>\n <div>\n {!props.showSubmitButtonSpinner &&\n <button className='btn btn-link' onClick={props.onClickClose}>\n {getPhrase('close')}\n </button>\n }\n {!!props.interactionsToMark.length && (\n <>\n {props.isDemo ? (\n <Tooltip\n id='submitAnswers'\n title={getPhrase('demoOnly')}\n spanHack\n spanHackClassName='d-inline-flex'\n >\n <button\n className='btn btn-outline-dark pointer-events-none'\n disabled={!numMarkedAnswers}\n >\n {getPhrase('submitAnswers')}\n </button>\n </Tooltip>\n ) : (\n <SpinnerButton\n variant='outline-dark'\n onClick={props.onClickSubmit}\n disabled={!numMarkedAnswers}\n showSpinner={props.showSubmitButtonSpinner}\n >\n {getPhrase('submitAnswers')}\n </SpinnerButton>\n )}\n </>\n )}\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { MarkedAnswerHash } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { ResultsSummary } from 'libs/shared/apps/analytics/interfaces/ResultsSummary';\nimport { SpinnerButton } from 'libs/shared/components/spinner-button/SpinnerButton';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { Interaction } from 'libs/shared/interfaces';\n\nconst namespace = 'interactives.studentResponseList';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface StudentResponseListHeaderProps {\n summary: ResultsSummary;\n interactionsToMark: Interaction[];\n markedAnswers: MarkedAnswerHash;\n onClickSubmit: () => void;\n showSubmitButtonSpinner: boolean;\n isDemo?: boolean;\n}\n\nexport function StudentResponseListHeader(props: StudentResponseListHeaderProps): JSX.Element {\n const numMarkedAnswers = Object.keys(props.markedAnswers).length;\n\n return (\n <div className='d-flex justify-content-between pb-3'>\n <div className='d-flex'>\n {!!props.summary.unanswered &&\n <div className='bg-light rounded p-2 me-2'>\n <strong className='me-2'>{getPhrase('unanswered')}</strong>\n {props.summary.unanswered}\n </div>\n }\n <div className='bg-light rounded p-2 me-2'>\n <strong className='me-2'>{getPhrase('score')}</strong>\n {props.summary.awaitingMarking\n ? <em>{getPhrase('pending')}</em>\n : `${Math.round(props.summary.percentCorrect * 100)}%`\n }\n </div>\n </div>\n {!!props.interactionsToMark.length && (\n <>\n {props.isDemo ? (\n <Tooltip id='submitAnswers' title={getPhrase('demoOnly')} spanHack>\n <button\n className='btn btn-outline-dark pointer-events-none'\n disabled={!numMarkedAnswers}\n >\n {getPhrase('submitAnswers')}\n </button>\n </Tooltip>\n ) : (\n <SpinnerButton\n variant='outline-dark'\n onClick={props.onClickSubmit}\n disabled={!numMarkedAnswers}\n showSpinner={props.showSubmitButtonSpinner}\n >\n {getPhrase('submitAnswers')}\n </SpinnerButton>\n )}\n </>\n )}\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"awaitingMarking\":\"MvGb5\"};","import React from 'react';\n\nimport { InteractionResponseItem } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/InteractionResponseItem';\nimport { AnonSessions } from 'libs/shared/apps/analytics/hooks/UseAnonSessions';\nimport { MarkedAnswerHash } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { anonymiseUserName, getUserOrAnonSession } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { getMarkedStatus, getStudentResultsSummary } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { InteractionResponse } from 'libs/shared/components/interaction-response/InteractionResponse';\nimport { InteractionLabel } from 'libs/shared/components/interactive-questions/InteractionLabel';\nimport { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interaction, Interactive, StudentAnswer, StudentResults } from 'libs/shared/interfaces';\nimport { InteractiveCorrectnessHelper } from 'libs/shared/utils/InteractiveCorrectnessHelper';\nimport { getInteractions, getStudentResult } from 'libs/shared/utils/InteractiveHelper';\n\nimport { StudentResponseListFooter } from './StudentResponseListFooter';\nimport { StudentResponseListHeader } from './StudentResponseListHeader';\n\nimport styles from './student-response-list.scss';\n\nfunction getInteractionsToMark(\n interactions: Interaction[],\n studentResults: StudentResults\n): Interaction[] {\n return interactions.filter(i => {\n return InteractiveCorrectnessHelper.isInteractionCorrect(\n i,\n getStudentResult(studentResults)\n ) === InteractionCorrectness.AwaitingMarking;\n });\n}\n\n// eslint-disable-next-line rulesdir/require-view-title\nfunction useScrollSelectedInteractionIntoView(): React.MutableRefObject<HTMLLIElement> {\n const ref = React.useRef<HTMLLIElement>(null);\n const [ scrolled, setScrolled ] = React.useState(false);\n\n // Only scroll once\n React.useEffect(() => {\n if (!ref.current || scrolled)\n return;\n\n setScrolled(true);\n requestAnimationFrame(() => ref.current.scrollIntoView({ behavior: 'smooth', block: 'center' }));\n }, [ ref.current, scrolled ]);\n\n return ref;\n}\n\ninterface StudentResponseListProps {\n interactive: Interactive;\n markedAnswers: MarkedAnswerHash;\n studentResults: StudentResults;\n addMarkedAnswers: (answer: StudentAnswer[], status: InteractiveAnswerStatus) => void;\n submitMarkedAnswers: () => void;\n onClickClose: () => void;\n imageCdnUrl: string;\n selectedInteractionId?: string;\n anonymiseUsers: boolean;\n reportsStyling?: boolean;\n isDemo?: boolean;\n anonSessions?: AnonSessions;\n}\n\nexport function StudentResponseList(props: StudentResponseListProps): JSX.Element {\n const [ showSpinner, setShowSpinner ] = React.useState(false);\n const selectedInteractionRef = useScrollSelectedInteractionIntoView();\n\n const summary = getStudentResultsSummary(props.interactive, props.studentResults);\n const interactions = getInteractions(props.interactive);\n const questionsToMark = getInteractionsToMark(interactions, props.studentResults);\n\n function onClickSubmit(): void {\n setShowSpinner(true);\n props.submitMarkedAnswers();\n }\n\n return (\n <>\n <StudentResponseListHeader\n summary={summary}\n interactionsToMark={questionsToMark}\n markedAnswers={props.markedAnswers}\n onClickSubmit={onClickSubmit}\n showSubmitButtonSpinner={showSpinner}\n isDemo={props.isDemo}\n />\n <ul className='list-unstyled'>\n {interactions.map((interaction, idx) => {\n const isSelected = interaction.id.toString() === props.selectedInteractionId?.toString();\n const markingRequired = questionsToMark.some(q => q.id === interaction.id);\n const anonymisedUserName = anonymiseUserName(\n getUserOrAnonSession(props.studentResults, props.anonSessions),\n props.anonymiseUsers\n );\n\n let className = 'p-2 mb-3 rounded';\n\n if (isSelected)\n className += ' border-2 border-info shadow';\n\n if (markingRequired)\n className += ` ${styles.awaitingMarking}`;\n else\n className += ' border';\n\n return (\n <li key={idx} className={className} ref={isSelected ? selectedInteractionRef : null}>\n <div className='d-flex mb-2'>\n <InteractionLabel\n interaction={interaction}\n iconClassName='flex-shrink-0'\n />\n </div>\n {props.reportsStyling ? (\n <InteractionResponse\n interaction={interaction}\n studentResults={props.studentResults}\n markedStatus={getMarkedStatus(interaction.id, props.studentResults, props.markedAnswers)}\n markInteraction={props.addMarkedAnswers}\n imageCdnUrl={props.imageCdnUrl}\n anonymisedUserName={anonymisedUserName}\n className='bg-light ps-2'\n showFeedback\n reportsStyling\n responseComponentClass='mx-n2'\n />\n ) : (\n <InteractionResponseItem\n interaction={interaction}\n studentResults={props.studentResults}\n markedStatus={getMarkedStatus(interaction.id, props.studentResults, props.markedAnswers)}\n markInteraction={props.addMarkedAnswers}\n imageCdnUrl={props.imageCdnUrl}\n anonymisedUserName={anonymisedUserName}\n showFeedback\n />\n )}\n </li>\n );\n })}\n </ul>\n <StudentResponseListFooter\n interactionsToMark={questionsToMark}\n markedAnswers={props.markedAnswers}\n onClickSubmit={onClickSubmit}\n onClickClose={props.onClickClose}\n showSubmitButtonSpinner={showSpinner}\n isDemo={props.isDemo}\n />\n </>\n );\n}","import { BaseError } from 'libs/common/backbone/core/BaseError';\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Core } from 'libs/common/core';\n\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { PrivateResourceError } from 'libs/shared/errors/general/private-resource/PrivateResourceError';\nimport { RegionLockedResourceError } from 'libs/shared/errors/general/region-locked-resource/RegionLockedResourceError';\nimport { UnspecifiedError } from 'libs/shared/errors/general/unspecified-error/UnspecifiedError';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nexport interface HttpErrorMap {\n notFound?: new () => BaseError;\n forbidden?: {\n rating?: new (description: string) => BaseError;\n yearLevel?: new (description: string) => BaseError;\n region?: new () => BaseError;\n privacy?: new (video?: VideoTypes) => BaseError;\n };\n badRequest?: new () => BaseError;\n internalServerError?: new () => BaseError;\n}\n\nexport type IgnoreHttpErrorMap = {\n [key in keyof HttpErrorMap]: boolean;\n};\n\nconst defaultErrors: HttpErrorMap = {\n notFound: NotFoundError,\n forbidden: {\n rating: PrivateResourceError,\n yearLevel: PrivateResourceError,\n region: RegionLockedResourceError,\n privacy: PrivateResourceError\n },\n badRequest: UnspecifiedError,\n internalServerError: UnspecifiedError\n};\n\nexport function handleHttpError(\n info: HttpStatus | Xhr,\n customErrorMap: HttpErrorMap = {},\n /**\n * Prevent certain errors in the errorMap from being thrown\n * so that you may implement your own handler\n */\n ignoreMap: IgnoreHttpErrorMap = {}\n): void {\n if (!info)\n return;\n\n let statusCode: HttpStatus;\n\n if (typeof(info) === 'number') {\n statusCode = info;\n } else {\n statusCode = info.status;\n }\n\n const errorMap = {\n ...defaultErrors,\n ...customErrorMap\n };\n\n if (!statusCode)\n return;\n\n if (!Core.ErrorHelper.isStatusCodeError(statusCode))\n return;\n\n if (statusCode === HttpStatus.InternalServer) {\n if (!ignoreMap.internalServerError)\n Core.ErrorHelper.throw(new UnspecifiedError());\n return;\n }\n\n if (statusCode === HttpStatus.NotFound) {\n if (!ignoreMap.notFound)\n Core.ErrorHelper.throw(new errorMap.notFound());\n return;\n }\n\n if (statusCode === HttpStatus.Forbidden) {\n /**\n * TODO: Work out how to go about handling all forbidden errors, such as region locking, year levels,\n * ratings, and privacy.\n */\n if (!ignoreMap.forbidden)\n Core.ErrorHelper.throw(new errorMap.forbidden.privacy());\n return;\n }\n\n if (!ignoreMap.badRequest)\n Core.ErrorHelper.throw(new errorMap.badRequest());\n}\n\nexport function handleXhrError(xhr: Xhr, customErrorMap?: HttpErrorMap): void {\n handleHttpError(xhr.status, customErrorMap);\n}","import { useEffect } from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { handleHttpError, HttpErrorMap, IgnoreHttpErrorMap } from 'libs/shared/errors/handlers/HttpErrorHandlers';\n\nfunction generateCacheKey(flightObjs: Array<Flight.Response<any>>): string {\n return flightObjs.map(obj => obj.statusCode).join(':');\n}\n\n// TODO: Change this to just `useHandleHttpError` and only accept a status code.\nexport function useHandleObjectError(\n _flightObjs: Flight.Response<any> | Array<Flight.Response<any>>,\n customErrors?: HttpErrorMap,\n ignoreErrors?: IgnoreHttpErrorMap\n): void {\n const flightObjs = Array.isArray(_flightObjs) ? _flightObjs : [_flightObjs];\n\n useEffect(() => {\n flightObjs.forEach(obj => {\n handleHttpError(obj.statusCode, customErrors, ignoreErrors);\n });\n }, [ generateCacheKey(flightObjs), customErrors, ignoreErrors ]);\n}","import React from 'react';\n\nimport { LayoutHelper } from 'libs/shared/utils/LayoutHelper';\n\nexport function useLockContentWidth(): void {\n React.useEffect(() => {\n LayoutHelper.lockContentWidth();\n return () => LayoutHelper.unlockContentWidth();\n }, []);\n}"],"names":["DEFAULT_POLLING_INTERVAL","usePolling","callback","pollingInterval","pollingTrigger","setPollingTrigger","timeoutRef","t","current","window","setTimeout","clearTimeout","AnswerContainer","props","answer","key","id","className","status","InteractiveAnswerStatus","getBgColour","SvgContainer","svgName","customAnswer","textClassName","text","children","getPhrase","LanguageService","NoResponseRequired","ResponseItemComponentLookup","answers","length","map","ArrayHelper","src","alt","interaction","name","InteractionResponseItem","ResponseItemComponent","typeId","result","studentResults","studentAttempt","correctness","InteractiveCorrectnessHelper","showStudentDetails","Avatar","imageCdnUrl","initials","anonymisedUserName","UserHelper","user","surname","imageUrl","avatar","url","showAnonymousUser","sessionId","InteractionStudentDetailsHeader","responseComponentClass","showFeedback","showAvatar","MarkResponse","markInteraction","markedStatus","NoResponse","InteractionResponseCorrectness","useAnonSessions","shareId","fetch","anonSessionsRequest","anonSessionsResponse","data","reduce","prev","useMarkAnswers","interactiveId","interactiveMetadataId","onDone","useState","markedAnswers","setMarkedAnswers","dispatch","alerts","addMarkedAnswers","forEach","a","m","submitMarkedAnswers","Object","keys","completeCount","successCount","resultId","questionId","I","onSuccess","onAlways","alertMessage","useErrorAlert","smartCount","error","success","StudentResponseListFooter","numMarkedAnswers","showSubmitButtonSpinner","onClick","onClickClose","interactionsToMark","isDemo","Tooltip","title","spanHack","spanHackClassName","disabled","SpinnerButton","variant","onClickSubmit","showSpinner","StudentResponseListHeader","summary","unanswered","awaitingMarking","Math","round","percentCorrect","StudentResponseList","ref","scrolled","setScrolled","setShowSpinner","selectedInteractionRef","requestAnimationFrame","scrollIntoView","behavior","block","interactive","interactions","questionsToMark","filter","i","InteractionCorrectness","getInteractionsToMark","idx","isSelected","toString","selectedInteractionId","markingRequired","some","q","anonSessions","anonymiseUsers","InteractionLabel","iconClassName","reportsStyling","InteractionResponse","defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","internalServerError","handleHttpError","info","customErrorMap","ignoreMap","statusCode","errorMap","generateCacheKey","flightObjs","obj","join","useHandleObjectError","_flightObjs","customErrors","ignoreErrors","Array","isArray","useEffect","useLockContentWidth"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[9673],{70376:(t,e,r)=>{r.d(e,{W:()=>s});var n=r(32735),a=r(91967);function i(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}var o=5e3;function s(t){var e,r,s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:o,u=(e=n.useState(!1),r=2,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var n,a,i,o,s=[],u=!0,l=!1;try{if(i=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;u=!1}else for(;!(u=(n=i.call(r)).done)&&(s.push(n.value),s.length!==e);u=!0);}catch(t){l=!0,a=t}finally{try{if(!u&&null!=r.return&&(o=r.return(),Object(o)!==o))return}finally{if(l)throw a}}return s}}(e,r)||function(t,e){if(t){if("string"==typeof t)return i(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?i(t,e):void 0}}(e,r)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),l=u[0],c=u[1],f=n.useRef(null),d=function(){c((function(t){return!t})),f.current=window.setTimeout(d,s)};return n.useEffect((function(){f.current=window.setTimeout(d,s)}),[]),n.useEffect((function(){a.q.isFunction(t)&&t()}),[l]),function(){return window.clearTimeout(f.current)}}},5255:(t,e,r)=>{r.d(e,{Y:()=>s});var n=r(70376),a=r(20354),i=r(30439);function o(t){return o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},o(t)}function s(t){var e,r=a.a.useGetFetch(),s=t&&i.o.getAnonSessions(t),u=a.a.useBasicFetch(s);return(0,n.W)((function(){return r(s)}),5e3),(null===(e=u.data)||void 0===e?void 0:e.length)?u.data.reduce((function(t,e){return Object.assign(Object.assign({},t),(r={},n=e.sessionId,a=e,(n=function(t){var e=function(t){if("object"!=o(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var r=e.call(t,"string");if("object"!=o(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==o(e)?e:e+""}(n))in r?Object.defineProperty(r,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):r[n]=a,r));var r,n,a}),{}):{}}},74901:(t,e,r)=>{function n(t){return function(t){if(Array.isArray(t))return a(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||function(t,e){if(t){if("string"==typeof t)return a(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?a(t,e):void 0}}(t)||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 a(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}r.d(e,{K:()=>i});var i=function(t){var e=[],r=[];return t.users&&e.push.apply(e,n(t.users)),t.classrooms&&r.push.apply(r,n(t.classrooms)),t.classroomGroups&&r.push.apply(r,n(t.classroomGroups)),{userId:e,groupId:r}}},60003:(t,e,r)=>{r.r(e),r.d(e,{InteractiveInsightsStudentsView:()=>E});var n=r(32735),a=r(81886),i=r(23481),o=r(2948),s=r(20354),u=r(5255),l=r(41196),c=r(26025),f=r(74901),d=r(40003),y=r(38143),v=r(16714),m=r(39151),b=r(20768),p=r(22902),h=r(79612),g=r(37802),S=r(14070),I=r(97291),A=r(53936),w=r(78057),j=r(10447);function O(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}var T=i.T.encloseNamespace("insights.interactiveInsightsStudents");function E(t){var e,r,i,E,k,B=(E=(0,o.D)(y.g.ANONYMISE_USERS),k=1,function(t){if(Array.isArray(t))return t}(E)||function(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var n,a,i,o,s=[],u=!0,l=!1;try{if(i=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;u=!1}else for(;!(u=(n=i.call(r)).done)&&(s.push(n.value),s.length!==e);u=!0);}catch(t){l=!0,a=t}finally{try{if(!u&&null!=r.return&&(o=r.return(),Object(o)!==o))return}finally{if(l)throw a}}return s}}(E,k)||function(t,e){if(t){if("string"==typeof t)return O(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?O(t,e):void 0}}(E,k)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[0],F=(0,g.r)(null).hasShareFlowV2,C=(0,p.T)().hasPermissions,U=s.a.useBasicFetch(m.L.config()),M=s.a.useBasicFetch(b.b.interactiveMetadata(t.interactiveId)),R=s.a.useBasicFetch((null===(e=M.data)||void 0===e?void 0:e.interactiveId)&&b.b.interactive(M.data.interactiveId)),N=(0,u.Y)(t.shareId),P=c.B.getAudienceAppLinkParams(),_=c.B.getDateRangeAppLinkParams(),L=(0,l.W)(t.interactiveId,Object.assign(Object.assign({},(0,d.wO)((0,d.Hb)(),_)),(0,f.K)(P)),!0),V=R.data&&M.data&&!!L.data;(0,h.M)({title:M.data?T("pageTitle",{video:null===(r=M.data)||void 0===r?void 0:r.name}):null});var W=Object.assign(Object.assign(Object.assign({},P),_),{shareId:t.shareId});return n.createElement("div",{className:"px-3"},n.createElement(A.j,{dateRangeAppLinkParams:_,tabs:(0,j.kj)(t.interactiveId,"results",W),video:M.data,hasAnalytics:C(v.C.ViewCustomerAnalytics),analyticsWebUrl:null===(i=U.data)||void 0===i?void 0:i.analyticsWebUrl,hasShareFlowV2:F,shareId:t.shareId}),n.createElement(w.R,{interactiveMetadata:M.data,viewStudentResults:function(t,e,r){a.Q.C$.trigger({application:I.O.INSIGHTS,action:S.e.Insights.INTERACTIVE_STUDENT_RESULTS,params:{studentId:"id"in t?t.id:void 0,interactiveMetadataId:e,interactionId:r,sessionId:"sessionId"in t?t.sessionId:void 0}})},interactive:R.data,results:L.data,filterBy:t.filterBy,sortBy:t.sortBy,isFetching:L.isFetching,anonymiseUsers:B,hasDataLoaded:V,anonSessions:N}))}}}]);
2
+ //# sourceMappingURL=9673-8a2740611a-lite.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts/9673-8a2740611a-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/common/src/react/hooks/UsePolling.ts","file:///app/packages/libs/shared/src/apps/analytics/hooks/UseAnonSessions.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/AudienceUtils.ts","file:///app/packages/projects/lite/src/apps/my-shares/views/interactive/students/InteractiveInsightsStudentsView.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nconst DEFAULT_POLLING_INTERVAL = 5000; // 5 seconds.\n\n/**\n * Hook to fire a callback at a set interval.\n * @param callback \n * @param pollingInterval \n * \n * Returns a function to clear the timeout.\n */\nexport function usePolling(callback: () => void, pollingInterval: number = DEFAULT_POLLING_INTERVAL): () => void {\n const [ pollingTrigger, setPollingTrigger ] = React.useState(false);\n\n const timeoutRef = React.useRef<number>(null);\n\n const poll = () => {\n setPollingTrigger(t => !t);\n\n timeoutRef.current = window.setTimeout(poll, pollingInterval);\n };\n\n React.useEffect(() => {\n timeoutRef.current = window.setTimeout(poll, pollingInterval);\n }, []);\n\n React.useEffect(() => {\n if (FunctionHelper.isFunction(callback))\n callback();\n }, [pollingTrigger]);\n\n return () => window.clearTimeout(timeoutRef.current);\n}","import { usePolling } from 'libs/common/react/hooks/UsePolling';\nimport { Flight } from 'libs/common/react/index';\n\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\n\nexport interface AnonSession {\n sessionId: string;\n sessionName: string;\n}\n\nexport interface AnonSessions extends Record<string, AnonSession> {}\n\nexport function useAnonSessions(shareId: string): AnonSessions {\n const fetch = Flight.useGetFetch();\n const anonSessionsRequest = shareId && ShareRequests.getAnonSessions(shareId);\n const anonSessionsResponse = Flight.useBasicFetch<AnonSession[]>(anonSessionsRequest);\n\n usePolling(() => fetch(anonSessionsRequest), 5000);\n\n if (!anonSessionsResponse.data?.length)\n return {};\n\n return anonSessionsResponse.data.reduce((prev, current) => ({ ...prev, [current.sessionId]: current }), {});\n}","import { AudienceQueryParams } from 'libs/shared/apps/analytics/interfaces/AudienceQueryParams';\n\nexport const getAudienceParams = (queryParams: AudienceQueryParams) => {\n const userId: string[] = [];\n const groupId: string[] = [];\n\n if (queryParams.users)\n userId.push(...queryParams.users);\n\n if (queryParams.classrooms)\n groupId.push(...queryParams.classrooms);\n\n if (queryParams.classroomGroups)\n groupId.push(...queryParams.classroomGroups);\n return {\n userId,\n groupId\n };\n};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\n\nimport { useAnonSessions } from 'libs/shared/apps/analytics/hooks/UseAnonSessions';\nimport { useFetchInteractiveResults } from 'libs/shared/apps/analytics/hooks/UseFetchInteractiveResults';\nimport { UserOrAnonSession } from 'libs/shared/apps/analytics/interfaces/UserOrAnonSession';\nimport { AnalyticsFilterHelper } from 'libs/shared/apps/analytics/utils/AnalyticsFilterUtils';\nimport { getAudienceParams } from 'libs/shared/apps/analytics/utils/AudienceUtils';\nimport { getInsightsDateRangePresets, getStartEndParams } from 'libs/shared/apps/analytics/utils/DateRangeUtils';\nimport { FilterStudentsBy, SortStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Config, Interactive, InteractiveMetadata } from 'libs/shared/interfaces';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { InsightsHeader } from 'apps/my-shares/components/insights-header/InsightsHeader';\nimport { InteractiveInsightsStudents } from 'apps/my-shares/components/interactive-insights-students/InteractiveInsightsStudents';\nimport { getInsightsInteractiveTabs } from 'apps/my-shares/utils/InsightsAppLinkUtils';\n\nconst namespace = 'insights.interactiveInsightsStudents';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InteractiveInsightsStudentsViewProps {\n interactiveId: string;\n sortBy: SortStudentsBy;\n filterBy: FilterStudentsBy;\n shareId?: string;\n}\n\nexport function InteractiveInsightsStudentsView(props: InteractiveInsightsStudentsViewProps) {\n const [anonymiseUsers] = useViewModel<boolean>(SharedViewModelKeys.ANONYMISE_USERS);\n\n const { hasShareFlowV2 } = useSettings(null);\n\n const { hasPermissions } = usePermissions();\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(\n InteractiveRequests.interactiveMetadata(props.interactiveId)\n );\n\n const interactive = Flight.useBasicFetch<Interactive>(interactiveMetadata.data?.interactiveId &&\n InteractiveRequests.interactive(interactiveMetadata.data.interactiveId));\n\n const anonSessions = useAnonSessions(props.shareId);\n\n const audienceAppLinkParams = AnalyticsFilterHelper.getAudienceAppLinkParams();\n const dateRangeAppLinkParams = AnalyticsFilterHelper.getDateRangeAppLinkParams();\n\n const results = useFetchInteractiveResults(props.interactiveId, {\n ...getStartEndParams(getInsightsDateRangePresets(), dateRangeAppLinkParams),\n ...getAudienceParams(audienceAppLinkParams)\n }, true);\n\n const hasDataLoaded = interactive.data && interactiveMetadata.data && !!results.data;\n\n useSetPageMetadata({ title: interactiveMetadata.data ? getPhrase('pageTitle', { video: interactiveMetadata.data?.name }) : null });\n\n function viewStudentResults(\n user: UserOrAnonSession,\n interactiveMetadataId: string,\n interactionId?: string\n ) {\n Core.AppLinkHelper.trigger({\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.INTERACTIVE_STUDENT_RESULTS,\n params: {\n studentId: 'id' in user ? user.id : undefined,\n interactiveMetadataId,\n interactionId,\n sessionId: 'sessionId' in user ? user.sessionId : undefined\n }\n });\n }\n\n const params = {\n ...audienceAppLinkParams,\n ...dateRangeAppLinkParams,\n shareId: props.shareId\n };\n\n return (\n <div className='px-3'>\n <InsightsHeader\n dateRangeAppLinkParams={dateRangeAppLinkParams}\n tabs={getInsightsInteractiveTabs(props.interactiveId, 'results', params)}\n video={interactiveMetadata.data}\n hasAnalytics={hasPermissions(PermissionName.ViewCustomerAnalytics)}\n analyticsWebUrl={config.data?.analyticsWebUrl}\n hasShareFlowV2={hasShareFlowV2}\n shareId={props.shareId}\n />\n\n <InteractiveInsightsStudents\n interactiveMetadata={interactiveMetadata.data}\n viewStudentResults={viewStudentResults}\n interactive={interactive.data}\n results={results.data}\n filterBy={props.filterBy}\n sortBy={props.sortBy}\n isFetching={results.isFetching}\n anonymiseUsers={anonymiseUsers}\n hasDataLoaded={hasDataLoaded}\n anonSessions={anonSessions}\n />\n </div>\n );\n}"],"names":["DEFAULT_POLLING_INTERVAL","usePolling","callback","pollingInterval","pollingTrigger","setPollingTrigger","timeoutRef","t","current","window","setTimeout","clearTimeout","useAnonSessions","shareId","fetch","anonSessionsRequest","anonSessionsResponse","data","length","reduce","prev","sessionId","getAudienceParams","queryParams","userId","groupId","users","push","classrooms","classroomGroups","getPhrase","InteractiveInsightsStudentsView","props","anonymiseUsers","hasShareFlowV2","hasPermissions","config","interactiveMetadata","interactiveId","interactive","anonSessions","audienceAppLinkParams","dateRangeAppLinkParams","results","hasDataLoaded","title","video","name","params","className","tabs","hasAnalytics","analyticsWebUrl","viewStudentResults","user","interactiveMetadataId","interactionId","application","action","studentId","id","undefined","filterBy","sortBy","isFetching"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[9882],{71553:(e,t,n)=>{n.d(t,{I:()=>i});var a=n(99940),r=n(62875);function s(e,t){return{currentUserId:e.id,currentCustomerId:e.customerId,dateRange:{start:t.start,end:t.end},userIds:t.userId,classroomsAndGroups:t.groupId}}var i={interactiveResultSet:function(e,t,n,i,o,c,u,d){return{url:o?"/api/domain/v3/analytics/interactives/".concat(e,"/metadata/").concat(t):"/api/domain/v2/analytics/interactives/".concat(e,"/metadata/").concat(t),key:(0,r.H)("interactive:result:set:".concat(e,":").concat(t),i),data:s(n,i),type:a.k.POST,normalize:!1,success:c,error:u,always:d}},mark:function(e,t,n,r,s,i,o){return{url:"/api/domain/v1/analytics/answers/".concat(n),key:"mark:answer:".concat(n,":").concat(r.resultId),type:a.k.PUT,data:r,normalize:!1,invalidationKeys:"interactive:result:set:".concat(e,":").concat(t),success:s,error:i,always:o}},pendingReviews:function(e){return{url:"/api/domain/v1/analytics/interactives/pending-reviews/summary",key:"interactives:pending:reviews",type:a.k.POST,data:e}},interactiveResultsReport:function(e){return{url:"{gateway}/v2/analytics/interactives/report",key:"interactive:results:report",data:e,type:a.k.POST,normalize:!1}}}},41196:(e,t,n)=>{n.d(t,{W:()=>o});var a=n(20354),r=n(71553),s=n(20768),i=n(31949);function o(e,t,n){var o,c=a.a.useBasicFetch(i.N.currentUser()),u=a.a.useBasicFetch(!!e&&s.b.interactiveMetadata(e)),d=a.a.useBasicFetch(!!(null===(o=u.data)||void 0===o?void 0:o.interactiveId)&&s.b.interactive(u.data.interactiveId)),l=!!c.data&&!!d.data&&!!t;return a.a.useBasicFetch(l&&r.I.interactiveResultSet(u.data.interactiveId,u.data.id,c.data,t,n))}},26136:(e,t,n)=>{n.d(t,{B2:()=>o,DV:()=>u,jP:()=>c});var a=n(76198),r=n(23481),s=n(64818),i=r.T.encloseNamespace("shared.analyticsUtils");function o(e,t){return e?t?(0,a._8)((n="sessionId"in e?e.sessionName:e.id,r=+"".concat(n).concat(Math.floor((new Date).getMinutes()/5)),{dictionaries:[a.O9,a.yd],separator:" ",length:2,style:"capital",seed:r})):"sessionId"in e?e.sessionName:s.l.getFullName(e):"";var n,r}function c(e,t){var n={sessionId:e,sessionName:i("anonymousUser")};return e&&t&&t[e]||n}function u(e,t){return e.user?e.user:c(e.sessionId,t)}},40003:(e,t,n)=>{n.d(t,{Hb:()=>o,wO:()=>u});var a=n(23481),r=n(110),s=(n(57266),a.T.encloseNamespace("shared.analyticsUtils"));function i(e){var t=r.O.convertDateToUTC(e);return r.O.format(t,"YYYY-MM-DDTHH:mm:ss")}function o(){var e=new Date(2021,0,1),t=(new Date).getFullYear(),n=t===e.getFullYear();return[{name:s("today"),startDate:new Date,endDate:new Date},{name:s("thisMonth"),startDate:new Date(t,(new Date).getMonth(),1),endDate:new Date},{name:s("lastThreeMonths"),startDate:new Date(t,(new Date).getMonth()-2,1),endDate:new Date},{name:s("lastSixMonths"),startDate:new Date(t,(new Date).getMonth()-5,1),endDate:new Date},{name:s("thisYear"),startDate:new Date(t,0,1),endDate:new Date},{name:s("lastYear"),startDate:new Date(t-1,0,1),endDate:new Date(t,0,0),disabled:n,tooltip:n?s("lastYearDisabled"):""},{name:s("allTime"),startDate:r.O.subtract(new Date,5,"years"),endDate:new Date,default:!0}]}function c(e){return r.O.format(e,"YYYY-MM-DD")}function u(e,t){var n=function(e){return i(r.O.startOf(e,"day"))},a=function(e){return i(r.O.endOf(e,"day"))},s=function(e,t){if(t)return e.find((function(e){return e.name===t}))}(e,t.rangeName);if(s)return{start:n(c(s.startDate)),end:a(c(s.endDate))};if(t.from&&t.to)return{start:n(t.from),end:a(t.to)};var o=e.find((function(e){return!!e.default}));return{start:n(c(o.startDate)),end:a(c(o.endDate))}}},39157:(e,t,n)=>{n.d(t,{HI:()=>m,R6:()=>u,Rt:()=>f,UU:()=>l,Zs:()=>d,nq:()=>v});var a=n(75896),r=n(94892),s=n(28972),i=n(8246),o=n(83140),c=n(80845);function u(e,t,n){var s={markingRequired:[],lowScore:[],highScore:[],completed:[],notCompleted:[]},i=(0,c.Q)(e).length;t.students.forEach((function(t){var o=Object.assign(Object.assign({},t),{summary:f(e,t)});o.summary.awaitingMarking?s.markingRequired.push(o):a.m.last(t.results).attempts.length===i?(s.completed.push(o),o.summary.percentCorrect>=((null==n?void 0:n.HIGH)||r.i.HIGH)&&s.highScore.push(o),o.summary.percentCorrect<((null==n?void 0:n.MODERATE)||r.i.MODERATE)&&s.lowScore.push(o)):s.notCompleted.push(o)}));var o=a.m.sortBy(s.lowScore,(function(e){return e.summary.percentCorrect})),u=a.m.sortBy(s.highScore,(function(e){return-e.summary.percentCorrect}));return Object.assign(Object.assign({},s),{lowScore:o,highScore:u})}function d(e,t){return(0,c.Wn)(e).find((function(e){return e.id.toString()===t.toString()}))}function l(e){return"".concat(e.questionId,":").concat(e.resultId)}function m(e,t,n){var a=(0,c.j_)(t),r=(0,c.f6)(e,a);return(null==r?void 0:r.answers.every((function(e){var t;return(null===(t=n[l(e)])||void 0===t?void 0:t.status)===i.N.Correct})))?i.N.Correct:(null==r?void 0:r.answers.every((function(e){var t;return(null===(t=n[l(e)])||void 0===t?void 0:t.status)===i.N.Incorrect})))?i.N.Incorrect:void 0}function v(e,t){var n=t.students.length,a=0,r=0,i=0,u=0,d=0;return t.students.forEach((function(t){var n=(0,c.j_)(t);if(n){d+=t.results.length;var l=o.A.isInteractionCorrect(e,n);l===s.w.Correct&&a++,l===s.w.UnAnswered&&i++,l===s.w.AwaitingMarking&&u++,l!==s.w.UnAnswered&&r++}})),{percentCorrect:n>0?a/n:0,correct:a,answered:r,unanswered:i,awaitingMarking:u,attempts:d}}function f(e,t){var n=(0,c.j_)(t),a=(0,c.Q)(e),r=a.length,i=0,u=0;a.forEach((function(e){var t=o.A.isInteractionCorrect(e,n);t===s.w.Correct&&i++,t===s.w.AwaitingMarking&&u++}));var d=r>0?i/r:0,l=new Set(a.map((function(e){return e.id}))),m=n.attempts.filter((function(e){var t;return!!l.has(null===(t=null==e?void 0:e.answers[0])||void 0===t?void 0:t.questionId)})).length;return{answered:n.attempts.length,attempts:t.results.length,unanswered:r-m,percentCorrect:d,correct:i,awaitingMarking:u}}},94892:(e,t,n)=>{n.d(t,{T:()=>r,i:()=>a});var a={HIGH:.75,MODERATE:.5},r={HIGH:.7,MODERATE:.7}},62875:(e,t,n)=>{function a(e,t,n){var a="".concat(e,":").concat(t.start,":").concat(t.end),r=Array.isArray(t.userId)?t.userId.sort().join(":"):t.userId,s=Array.isArray(t.groupId)?t.groupId.sort().join(":"):t.groupId;return r&&(a+=":".concat(r)),s&&(a+=":".concat(s)),n&&(a+=":".concat(n)),a}n.d(t,{H:()=>a})},57266:(e,t,n)=>{n.d(t,{e:()=>i});var a=n(81886),r=n(1048),s=n(75795),i={updateParams:function(e,t){var n=s.O.getCurrentRoute().appLink,i="string"==typeof n.params?a.Q.Ab.DeserializeQueryParams(n.params):n.params;t.keysToRemove&&(i=r.t.omit(i,t.keysToRemove));var o=(null==t?void 0:t.merge)?Object.assign(Object.assign({},i),e):e,c=Object.assign(Object.assign({},n),{params:o});r.t.isEqual(n,c)||a.Q.C$.trigger(c,r.t.omit(t,["merge","keysToRemove"]))}}}}]);
2
+ //# sourceMappingURL=9882-f1a9cc55ec-lite.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts/9882-f1a9cc55ec-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/analytics/flight-requests/InteractiveResultsRequests.ts","file:///app/packages/libs/shared/src/apps/analytics/hooks/UseFetchInteractiveResults.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/AnonymiseUserUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/DateRangeUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/InteractiveUtils.ts","file:///app/packages/libs/shared/src/constants/ScoreThresholds.ts","file:///app/packages/libs/shared/src/utils/AnalyticsRequestUtils.ts","file:///app/packages/libs/shared/src/utils/AppRouteHelper.ts"],"sourcesContent":["import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Flight } from 'libs/common/react/index';\n\nimport { MarkInteractiveAnswer } from 'libs/shared/apps/analytics/interfaces/MarkInteractiveAnswer';\nimport { InteractiveResultsReport } from 'libs/shared/apps/analytics/interfaces/requests/InteractiveResultsReport';\nimport { InteractivesPendingReviewsRequest } from 'libs/shared/apps/analytics/interfaces/requests/InteractivesPendingReviewsRequest';\nimport { AnalyticsRequestFilter, CurrentUser, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { getAnalyticsRequestKey } from 'libs/shared/utils/AnalyticsRequestUtils';\n\ninterface InteractiveResultFilters {\n currentUserId: string;\n currentCustomerId: string;\n dateRange?: { start: string, end: string }\n userIds?: string | string[];\n classroomsAndGroups?: string | string[];\n}\n\nfunction getInteractiveResultFilters(\n currentUser: CurrentUser,\n filter: AnalyticsRequestFilter\n): InteractiveResultFilters {\n return {\n currentUserId: currentUser.id,\n currentCustomerId: currentUser.customerId,\n dateRange: { start: filter.start, end: filter.end },\n userIds: filter.userId,\n classroomsAndGroups: filter.groupId\n };\n}\n\nexport const InteractiveResultsRequests = {\n /** \n * This endpoint returns data with a lot of duplicated ids,\n * e.g. student answers to the same question will have the same id.\n * Because of that, we don't normalize.\n */\n interactiveResultSet(\n interactiveId: string,\n interactiveMetadataId: string,\n currentUser: CurrentUser,\n filter: AnalyticsRequestFilter,\n includePublicResults: boolean,\n success?: (data: InteractiveResultSet) => void,\n error?: (data: any) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: includePublicResults ?\n `/api/domain/v3/analytics/interactives/${interactiveId}/metadata/${interactiveMetadataId}` :\n `/api/domain/v2/analytics/interactives/${interactiveId}/metadata/${interactiveMetadataId}`,\n key: getAnalyticsRequestKey(`interactive:result:set:${interactiveId}:${interactiveMetadataId}`, filter),\n data: getInteractiveResultFilters(currentUser, filter),\n type: HttpVerbs.POST,\n normalize: false,\n success,\n error,\n always\n };\n },\n \n /**\n * As the response from `interactiveResultSet` isn't normalised, we need to invalidate the cache\n * to update the results data.\n */\n mark(\n interactiveId: string,\n interactiveMetadataId: string,\n answerId: string,\n data: MarkInteractiveAnswer,\n success?: () => void,\n error?: (data: any) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: `/api/domain/v1/analytics/answers/${answerId}`,\n key: `mark:answer:${answerId}:${data.resultId}`,\n type: HttpVerbs.PUT,\n data,\n normalize: false,\n invalidationKeys: `interactive:result:set:${interactiveId}:${interactiveMetadataId}`,\n success,\n error,\n always\n };\n },\n\n pendingReviews(data: InteractivesPendingReviewsRequest): Flight.Request {\n return {\n url: `/api/domain/v1/analytics/interactives/pending-reviews/summary`,\n key: `interactives:pending:reviews`,\n type: HttpVerbs.POST,\n data\n };\n },\n\n interactiveResultsReport(data: InteractiveResultsReport): Flight.Request {\n return {\n url: '{gateway}/v2/analytics/interactives/report',\n key: 'interactive:results:report',\n data,\n type: HttpVerbs.POST,\n normalize: false\n };\n }\n};","import { Flight } from 'libs/common/flight';\n\nimport { InteractiveResultsRequests } from 'libs/shared/apps/analytics/flight-requests/InteractiveResultsRequests';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { AnalyticsRequestFilter, CurrentUser, Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\n\nexport function useFetchInteractiveResults(\n interactiveMetadataId: string,\n requestFilter: AnalyticsRequestFilter,\n includePublicResults?: boolean\n): Flight.Response<InteractiveResultSet> {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(!!interactiveMetadataId &&\n InteractiveRequests.interactiveMetadata(interactiveMetadataId));\n\n const interactive = Flight.useBasicFetch<Interactive>(!!interactiveMetadata.data?.interactiveId &&\n InteractiveRequests.interactive(interactiveMetadata.data.interactiveId));\n\n const shouldFetchResults = !!currentUser.data && !!interactive.data && (!!requestFilter);\n\n return Flight.useBasicFetch<InteractiveResultSet>(shouldFetchResults &&\n InteractiveResultsRequests.interactiveResultSet(\n interactiveMetadata.data.interactiveId,\n interactiveMetadata.data.id,\n currentUser.data,\n requestFilter,\n includePublicResults\n ));\n}","import { animals, colors, Config as UniqueNamesConfig, uniqueNamesGenerator } from 'unique-names-generator';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AnonSession, AnonSessions } from 'libs/shared/apps/analytics/hooks/UseAnonSessions';\nimport { UserOrAnonSession } from 'libs/shared/apps/analytics/interfaces/UserOrAnonSession';\nimport { StudentResults } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nconst namespace = 'shared.analyticsUtils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getUniqueNamesConfig(id: string): UniqueNamesConfig {\n /**\n * Generate a seed that is unique to each user but changes every 5 minutes.\n * \n * We use a seed so that if the same user's name is anonymised multiple times\n * in quick succession (e.g. multiple renders), the same name will be returned each time.\n * \n * We change the seed every 5 minutes so that students don't always have the same name.\n */\n const seed = +`${id}${Math.floor((new Date()).getMinutes() / 5)}`;\n\n return {\n dictionaries: [ colors, animals ],\n separator: ' ',\n length: 2,\n style: 'capital',\n seed\n };\n}\n\nexport function anonymiseUserName(user: UserOrAnonSession, shouldAnonymise: boolean): string {\n if (!user)\n return '';\n\n if (!shouldAnonymise)\n return 'sessionId' in user ? user.sessionName : UserHelper.getFullName(user);\n\n return uniqueNamesGenerator(getUniqueNamesConfig('sessionId' in user ? user.sessionName : user.id));\n}\n\nexport function getAnonSession(sessionId: string, anonSessions: AnonSessions): AnonSession {\n const fallback = {\n sessionId: sessionId,\n sessionName: getPhrase('anonymousUser')\n };\n\n if (!sessionId || !anonSessions)\n return fallback;\n\n const anonSession = anonSessions[sessionId];\n\n if (anonSession)\n return anonSession;\n\n return fallback;\n}\n\nexport function getUserOrAnonSession(result: StudentResults, anonSessions: AnonSessions): UserOrAnonSession {\n if (result.user)\n return result.user;\n\n return getAnonSession(result.sessionId, anonSessions);\n}\n","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { DateRangeQueryParams } from 'libs/shared/apps/analytics/interfaces/DateRangeQueryParams';\nimport { FilterQueryParams } from 'libs/shared/apps/analytics/interfaces/FilterQueryParams';\nimport { DateRange } from 'libs/shared/interfaces';\nimport { AppRouteHelper } from 'libs/shared/utils/AppRouteHelper';\n\nconst namespace = 'shared.analyticsUtils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function convertDateToUtcDateTimeString(date: Date): string {\n const utc = DateHelper.convertDateToUTC(date);\n return DateHelper.format(utc, 'YYYY-MM-DDTHH:mm:ss');\n}\n\nexport function getMinDate(): Date {\n return new Date(2021, 0, 1);\n}\n\nexport function getMaxDate(): Date {\n return new Date();\n}\n\nexport function getDefaultDateRange(dateRangePresets: DateRange[]): DateRange {\n return dateRangePresets.find(range => !!range.default);\n}\n\nexport function getPresetRangeByName(dateRangePresetss: DateRange[], rangeName: string): DateRange | undefined {\n if (!rangeName)\n return;\n\n const presets = dateRangePresetss;\n \n return presets.find(p => p.name === rangeName);\n}\n\nexport function getGenericDateRangePresets(): DateRange[] {\n const minDate = getMinDate();\n const currentYear = (new Date()).getFullYear();\n\n const isMinDateThisYear = currentYear === minDate.getFullYear();\n\n return [\n {\n name: getPhrase('today'),\n startDate: new Date(),\n endDate: new Date()\n },\n {\n name: getPhrase('thisMonth'),\n startDate: new Date(currentYear, new Date().getMonth(), 1),\n endDate: new Date()\n },\n {\n name: getPhrase('lastThreeMonths'),\n startDate: new Date(currentYear, new Date().getMonth() - 2, 1),\n endDate: new Date()\n },\n {\n name: getPhrase('lastSixMonths'),\n startDate: new Date(currentYear, new Date().getMonth() - 5, 1),\n endDate: new Date()\n },\n {\n name: getPhrase('lastTwelveMonths'),\n startDate: new Date(currentYear, new Date().getMonth() - 11, 1),\n endDate: new Date(),\n default: true\n },\n {\n name: getPhrase('thisYear'),\n startDate: new Date(currentYear, 0, 1),\n endDate: new Date()\n },\n {\n name: getPhrase('lastYear'),\n startDate: new Date(currentYear - 1, 0, 1),\n endDate: new Date(currentYear, 0, 0),\n disabled: isMinDateThisYear,\n tooltip: isMinDateThisYear ? getPhrase('lastYearDisabled') : ''\n }\n ];\n}\n\nexport function getInsightsDateRangePresets(): DateRange[] {\n const minDate = getMinDate();\n const currentYear = (new Date()).getFullYear();\n\n const isMinDateThisYear = currentYear === minDate.getFullYear();\n\n return [\n {\n name: getPhrase('today'),\n startDate: new Date(),\n endDate: new Date()\n },\n {\n name: getPhrase('thisMonth'),\n startDate: new Date(currentYear, new Date().getMonth(), 1),\n endDate: new Date()\n },\n {\n name: getPhrase('lastThreeMonths'),\n startDate: new Date(currentYear, new Date().getMonth() - 2, 1),\n endDate: new Date()\n },\n {\n name: getPhrase('lastSixMonths'),\n startDate: new Date(currentYear, new Date().getMonth() - 5, 1),\n endDate: new Date()\n },\n {\n name: getPhrase('thisYear'),\n startDate: new Date(currentYear, 0, 1),\n endDate: new Date()\n },\n {\n name: getPhrase('lastYear'),\n startDate: new Date(currentYear - 1, 0, 1),\n endDate: new Date(currentYear, 0, 0),\n disabled: isMinDateThisYear,\n tooltip: isMinDateThisYear ? getPhrase('lastYearDisabled') : ''\n },\n {\n name: getPhrase('allTime'),\n startDate: DateHelper.subtract(new Date(), 5, 'years'),\n endDate: new Date(),\n default: true\n }\n ];\n}\n\nexport function formatDateQueryParam(date: Date): string {\n return DateHelper.format(date, 'YYYY-MM-DD');\n}\n\nexport function getRouteQueryParams(dateRange: DateRange): DateRangeQueryParams {\n if (dateRange.name)\n return { rangeName: dateRange.name };\n\n return {\n from: formatDateQueryParam(dateRange.startDate),\n to: formatDateQueryParam(dateRange.endDate)\n };\n}\n\nexport function useGetDateRangeFromQueryParams(\n dateRangePresets: DateRange[],\n dateRangeQueryParams: DateRangeQueryParams\n): DateRange | null {\n const { to, from, rangeName } = dateRangeQueryParams;\n \n const presetRange = getPresetRangeByName(dateRangePresets, rangeName);\n\n if (presetRange) {\n if (!from && !to)\n return presetRange;\n\n /**\n * If a rangeName has been set, we don't use to and from so we remove them from the url params.\n */\n AppRouteHelper.updateParams(\n getRouteQueryParams(presetRange),\n { replace: true, merge: true, keysToRemove: [ 'from', 'to' ]}\n );\n return;\n }\n\n const defaultDateRange = getDefaultDateRange(dateRangePresets);\n\n /**\n * If a param is missing, or one of them isn't a valid date, short-circuit the logic below.\n */\n if (!from || !to || !DateHelper.isValid(from) || !DateHelper.isValid(to)) {\n AppRouteHelper.updateParams(\n getRouteQueryParams(defaultDateRange),\n { replace: true, merge: true, keysToRemove: ['rangeName']}\n );\n return;\n }\n\n let initialDateRangeValid = true;\n\n let startDate = DateHelper.convertDateToUTC(new Date(from));\n let endDate = DateHelper.convertDateToUTC(new Date(to));\n\n if (DateHelper.isBefore(startDate, getMinDate(), 'day')) {\n startDate = getMinDate();\n initialDateRangeValid = false;\n }\n\n if (DateHelper.isAfter(endDate, getMaxDate(), 'day')) {\n endDate = getMaxDate();\n initialDateRangeValid = false;\n }\n\n if (DateHelper.isAfter(startDate, endDate)) {\n startDate = defaultDateRange.startDate;\n endDate = defaultDateRange.endDate;\n initialDateRangeValid = false;\n }\n\n const dateRange: DateRange = {\n startDate,\n endDate,\n name: initialDateRangeValid\n ? rangeName || 'custom'\n : ''\n };\n\n if (initialDateRangeValid)\n return dateRange;\n\n /**\n * If one or both of the date params were invalid, we trigger a route update.\n */\n AppRouteHelper.updateParams(getRouteQueryParams(dateRange), { replace: true, merge: true, keysToRemove: ['rangeName']});\n}\n\nexport function getStartEndParams(\n dateRangePresetss: DateRange[],\n filterParams: FilterQueryParams\n): { start: string; end: string } {\n const getStartDate = (date: string) => convertDateToUtcDateTimeString(DateHelper.startOf(date, 'day'));\n const getEndDate = (date: string) => convertDateToUtcDateTimeString(DateHelper.endOf(date, 'day'));\n\n const presetRange = getPresetRangeByName(dateRangePresetss, filterParams.rangeName);\n\n /**\n * If the user has chosen a preset range, lookup the start and end dates as they won't be\n * in the query params.\n */\n if (presetRange)\n return {\n start: getStartDate(formatDateQueryParam(presetRange.startDate)),\n end: getEndDate(formatDateQueryParam(presetRange.endDate))\n };\n\n /**\n * If they have chosen a custom date range, use their chosen start and end dates.\n */\n if (filterParams.from && filterParams.to)\n return {\n start: getStartDate(filterParams.from),\n end: getEndDate(filterParams.to)\n };\n\n /**\n * The below should never be hit\n */\n const defaultRange = getDefaultDateRange(dateRangePresetss);\n\n return {\n start: getStartDate(formatDateQueryParam(defaultRange.startDate)),\n end: getEndDate(formatDateQueryParam(defaultRange.endDate))\n };\n}","import { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { MarkedAnswerHash } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { ResultsSummary } from 'libs/shared/apps/analytics/interfaces/ResultsSummary';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { ScoreThresholdDefaults, ScoreThresholds } from 'libs/shared/constants/ScoreThresholds';\nimport { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interaction, StudentAnswer, StudentResults } from 'libs/shared/interfaces';\nimport { Interactive, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { InteractiveCorrectnessHelper } from 'libs/shared/utils/InteractiveCorrectnessHelper';\nimport { flattenInteractions, getInteractions, getStudentAttempt, getStudentResult } from 'libs/shared/utils/InteractiveHelper';\n\ninterface StudentGroups {\n markingRequired: StudentResultsWithSummary[];\n lowScore: StudentResultsWithSummary[];\n highScore: StudentResultsWithSummary[];\n completed: StudentResultsWithSummary[];\n notCompleted: StudentResultsWithSummary[];\n}\n\nexport function groupStudents(\n interactive: Interactive,\n results: InteractiveResultSet,\n scoreThreshold?: ScoreThresholds\n): StudentGroups {\n const groups: StudentGroups = {\n markingRequired: [],\n lowScore: [],\n highScore: [],\n completed: [],\n notCompleted: []\n };\n\n const interactions = getInteractions(interactive);\n\n const numInteractions = interactions.length;\n \n results.students.forEach(s => {\n const withSummary = {\n ...s,\n summary: getStudentResultsSummary(interactive, s)\n };\n \n if (withSummary.summary.awaitingMarking) {\n groups.markingRequired.push(withSummary);\n return;\n }\n\n if (ArrayHelper.last(s.results).attempts.length === numInteractions) {\n groups.completed.push(withSummary);\n } else {\n groups.notCompleted.push(withSummary);\n return;\n }\n \n if (withSummary.summary.percentCorrect >= (scoreThreshold?.HIGH || ScoreThresholdDefaults.HIGH))\n groups.highScore.push(withSummary);\n \n if (withSummary.summary.percentCorrect < (scoreThreshold?.MODERATE || ScoreThresholdDefaults.MODERATE))\n groups.lowScore.push(withSummary);\n });\n \n const sortedLowScore = ArrayHelper.sortBy(groups.lowScore, s => s.summary.percentCorrect);\n const sortedHighScore = ArrayHelper.sortBy(groups.highScore, s => -s.summary.percentCorrect);\n \n return {\n ...groups,\n lowScore: sortedLowScore,\n highScore: sortedHighScore\n };\n}\n\nexport function getInteractionById(interactive: Interactive, interactionId: string): Interaction {\n const flattenedInteractions = flattenInteractions(interactive);\n return flattenedInteractions.find(i => i.id.toString() === interactionId.toString());\n}\n\n/**\n * We need to use the question and result ids as a list of one student's responses\n * to multiple questions will all have the same result id and a list of multiple\n * students responses to one question will all have the same questionId.\n */\nexport function getMarkedAnswerId(answer: StudentAnswer): string {\n return `${answer.questionId}:${answer.resultId}`;\n}\n\nexport function getMarkedStatus(\n interactionId: string,\n studentResults: StudentResults,\n markedAnswers: MarkedAnswerHash\n): InteractiveAnswerStatus {\n const result = getStudentResult(studentResults);\n const studentResponse = getStudentAttempt(interactionId, result);\n\n const isMarkedCorrect = studentResponse?.answers.every(a => {\n return markedAnswers[getMarkedAnswerId(a)]?.status === InteractiveAnswerStatus.Correct;\n });\n\n if (isMarkedCorrect)\n return InteractiveAnswerStatus.Correct;\n\n const isMarkedIncorrect = studentResponse?.answers.every(a => {\n return markedAnswers[getMarkedAnswerId(a)]?.status === InteractiveAnswerStatus.Incorrect;\n });\n\n if (isMarkedIncorrect)\n return InteractiveAnswerStatus.Incorrect;\n}\n\nexport function getInteractionResultsSummary(\n interaction: Interaction,\n results: InteractiveResultSet\n): ResultsSummary {\n const numStudents = results.students.length;\n let numCorrect = 0;\n let answered = 0;\n let unanswered = 0;\n let awaitingMarking = 0;\n let attempts = 0;\n\n results.students.forEach(s => {\n const result = getStudentResult(s);\n\n if (!result)\n return;\n\n attempts = attempts + s.results.length;\n\n const correctness = InteractiveCorrectnessHelper.isInteractionCorrect(interaction, result);\n\n if (correctness === InteractionCorrectness.Correct)\n numCorrect++;\n\n if (correctness === InteractionCorrectness.UnAnswered)\n unanswered++;\n\n if (correctness === InteractionCorrectness.AwaitingMarking)\n awaitingMarking++;\n\n if (correctness !== InteractionCorrectness.UnAnswered)\n answered++;\n });\n\n\n const percentCorrect = numStudents > 0\n ? numCorrect / numStudents\n : 0;\n\n return {\n percentCorrect,\n correct: numCorrect,\n answered,\n unanswered,\n awaitingMarking,\n attempts\n };\n}\n\nexport function getStudentResultsSummary(interactive: Interactive, studentResults: StudentResults): ResultsSummary {\n const result = getStudentResult(studentResults);\n\n const interactions = getInteractions(interactive);\n\n const numInteractions = interactions.length;\n\n let numCorrect = 0;\n let awaitingMarking = 0;\n\n interactions.forEach(i => {\n const correctness = InteractiveCorrectnessHelper.isInteractionCorrect(i, result);\n\n if (correctness === InteractionCorrectness.Correct)\n numCorrect++;\n\n if (correctness === InteractionCorrectness.AwaitingMarking)\n awaitingMarking++;\n });\n\n const percentCorrect = numInteractions > 0 ? numCorrect / numInteractions : 0;\n\n /**\n * Our interactions list has images and annotations filtered out.\n * We built a map of valid questions, so that we can calculate the unswered accurately.\n * We're doing this because of a bug that caused annotations and images to record answers in the player.\n * - Sha\n */\n const interactionIds = new Set(interactions.map(i => i.id));\n const answeredInteractions = result.attempts.filter(a => !!interactionIds.has(a?.answers[0]?.questionId)).length;\n\n return {\n answered: result.attempts.length,\n attempts: studentResults.results.length,\n unanswered: numInteractions - answeredInteractions,\n percentCorrect,\n correct: numCorrect,\n awaitingMarking\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 { AnalyticsRequestFilter } from 'libs/shared/interfaces';\n\nexport function getAnalyticsRequestKey(baseKey: string, filter: AnalyticsRequestFilter, sharerId?: string): string {\n let key = `${baseKey}:${filter.start}:${filter.end}`;\n\n const userIdKey = Array.isArray(filter.userId) ? filter.userId.sort().join(':') : filter.userId;\n const groupIdKey = Array.isArray(filter.groupId) ? filter.groupId.sort().join(':') : filter.groupId;\n\n if (userIdKey)\n key += `:${userIdKey}`;\n\n if (groupIdKey)\n key += `:${groupIdKey}`;\n\n if (sharerId)\n key += `:${sharerId}`;\n\n return key;\n}","import { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { ContextService } from 'libs/shared/services/ContextService';\n\ninterface UpdateParamsOptions extends Core.AppLinkOptions {\n merge?: boolean;\n keysToRemove?: string[]\n}\n\nexport const AppRouteHelper = {\n /**\n * Utility to update the params on the current appRoute.\n * \n * This is built on top of ContextService rather than build into AppLink\n * as we will generally only want to update params on appRoutes, not appLinks.\n */\n updateParams(params: HashObject, options?: UpdateParamsOptions): void {\n const { appLink } = ContextService.getCurrentRoute();\n\n let currentParams = typeof(appLink.params) === 'string'\n ? Core.LocationUtils.DeserializeQueryParams(appLink.params)\n : appLink.params as HashObject;\n\n if (options.keysToRemove)\n currentParams = ObjectHelper.omit(currentParams, options.keysToRemove);\n\n const updatedParams = options?.merge\n ? { ...currentParams, ...params }\n : params;\n\n const updatedAppLink = {\n ...appLink,\n params: updatedParams\n };\n\n /**\n * This prevents us pointlessly re-triggering if we're already on the right applink.\n */\n if (ObjectHelper.isEqual(appLink, updatedAppLink))\n return;\n \n Core.AppLinkHelper.trigger(updatedAppLink, ObjectHelper.omit(options, [ 'merge', 'keysToRemove' ]));\n }\n};"],"names":["getInteractiveResultFilters","currentUser","filter","currentUserId","id","currentCustomerId","customerId","dateRange","start","end","userIds","userId","classroomsAndGroups","groupId","InteractiveResultsRequests","interactiveResultSet","interactiveId","interactiveMetadataId","includePublicResults","success","error","always","url","key","data","type","normalize","mark","answerId","resultId","invalidationKeys","pendingReviews","interactiveResultsReport","useFetchInteractiveResults","requestFilter","interactiveMetadata","interactive","shouldFetchResults","I","getPhrase","anonymiseUserName","user","shouldAnonymise","sessionName","seed","Math","floor","Date","getMinutes","dictionaries","separator","length","style","getAnonSession","sessionId","anonSessions","fallback","getUserOrAnonSession","result","convertDateToUtcDateTimeString","date","utc","getInsightsDateRangePresets","minDate","currentYear","getFullYear","isMinDateThisYear","name","startDate","endDate","getMonth","disabled","tooltip","default","formatDateQueryParam","getStartEndParams","dateRangePresetss","filterParams","getStartDate","getEndDate","presetRange","rangeName","find","p","getPresetRangeByName","from","to","defaultRange","range","groupStudents","results","scoreThreshold","groups","markingRequired","lowScore","highScore","completed","notCompleted","numInteractions","students","forEach","s","withSummary","summary","getStudentResultsSummary","awaitingMarking","push","attempts","percentCorrect","HIGH","MODERATE","sortedLowScore","sortedHighScore","getInteractionById","interactionId","i","toString","getMarkedAnswerId","answer","questionId","getMarkedStatus","studentResults","markedAnswers","studentResponse","answers","every","a","status","getInteractionResultsSummary","interaction","numStudents","numCorrect","answered","unanswered","correctness","correct","interactions","interactionIds","Set","map","answeredInteractions","has","ScoreThresholdDefaults","ScoreThresholdInsights","getAnalyticsRequestKey","baseKey","sharerId","userIdKey","Array","isArray","sort","join","groupIdKey","AppRouteHelper","updateParams","params","options","appLink","currentParams","keysToRemove","updatedParams","merge","updatedAppLink"],"sourceRoot":""}