@clickview/lite 0.82.2 → 0.83.0-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/dist/bundles.json +1 -1
  2. package/dist/languages/en.json +1 -1
  3. package/dist/scripts/1074-fdce06d863-lite.chunk.js +2 -0
  4. package/dist/scripts/1074-fdce06d863-lite.chunk.js.map +1 -0
  5. package/dist/scripts/{1199-da55d69853-lite.chunk.js → 1199-01cc084886-lite.chunk.js} +1 -1
  6. package/dist/scripts/{1199-da55d69853-lite.chunk.js.map → 1199-01cc084886-lite.chunk.js.map} +1 -1
  7. package/dist/scripts/{2664-87c8cbfa7f-lite.chunk.js → 2664-907153c03b-lite.chunk.js} +2 -2
  8. package/dist/scripts/2664-907153c03b-lite.chunk.js.map +1 -0
  9. package/dist/scripts/2970-024b1dd55d-lite.chunk.js +2 -0
  10. package/dist/scripts/2970-024b1dd55d-lite.chunk.js.map +1 -0
  11. package/dist/scripts/{8133-ffcff3b7fc-lite.chunk.js → 3392-f7f8cb65e5-lite.chunk.js} +3 -3
  12. package/dist/scripts/3392-f7f8cb65e5-lite.chunk.js.map +1 -0
  13. package/dist/scripts/3840-59e5e53cda-lite.chunk.js +2 -0
  14. package/dist/scripts/3840-59e5e53cda-lite.chunk.js.map +1 -0
  15. package/dist/scripts/{4177-285ddf9ae3-lite.chunk.js → 4177-2d876c7b14-lite.chunk.js} +2 -2
  16. package/dist/scripts/4177-2d876c7b14-lite.chunk.js.map +1 -0
  17. package/dist/scripts/{1336-1826f6e582-lite.chunk.js → 4208-0706461da6-lite.chunk.js} +2 -2
  18. package/dist/scripts/4208-0706461da6-lite.chunk.js.map +1 -0
  19. package/dist/scripts/{4578-7578bcf17a-lite.chunk.js → 4578-27028d26eb-lite.chunk.js} +2 -2
  20. package/dist/scripts/4578-27028d26eb-lite.chunk.js.map +1 -0
  21. package/dist/scripts/4598-8f5266e4c2-lite.chunk.js +2 -0
  22. package/dist/scripts/4598-8f5266e4c2-lite.chunk.js.map +1 -0
  23. package/dist/scripts/{4621-1f79d94416-lite.chunk.js → 4621-7fb0a05bcb-lite.chunk.js} +2 -2
  24. package/dist/scripts/4621-7fb0a05bcb-lite.chunk.js.map +1 -0
  25. package/dist/scripts/4806-a6f31d703c-lite.chunk.js +2 -0
  26. package/dist/scripts/4806-a6f31d703c-lite.chunk.js.map +1 -0
  27. package/dist/scripts/{4948-de1c75e7fb-lite.chunk.js → 4948-ba684e5f4f-lite.chunk.js} +1 -1
  28. package/dist/scripts/{4948-de1c75e7fb-lite.chunk.js.map → 4948-ba684e5f4f-lite.chunk.js.map} +1 -1
  29. package/dist/scripts/4985-7e02d5df40-lite.chunk.js +2 -0
  30. package/dist/scripts/4985-7e02d5df40-lite.chunk.js.map +1 -0
  31. package/dist/scripts/{5554-17bb3b86fc-lite.chunk.js → 5554-f1f3baf822-lite.chunk.js} +2 -2
  32. package/dist/scripts/5554-f1f3baf822-lite.chunk.js.map +1 -0
  33. package/dist/scripts/5712-7cee70c6b4-lite.chunk.js +2 -0
  34. package/dist/scripts/5712-7cee70c6b4-lite.chunk.js.map +1 -0
  35. package/dist/scripts/6550-d99e0ed75d-lite.chunk.js +2 -0
  36. package/dist/scripts/6550-d99e0ed75d-lite.chunk.js.map +1 -0
  37. package/dist/scripts/{6909-a9b8930e37-lite.chunk.js → 6909-ba75701156-lite.chunk.js} +2 -2
  38. package/dist/scripts/6909-ba75701156-lite.chunk.js.map +1 -0
  39. package/dist/scripts/7148-1ced1b5dce-lite.chunk.js +2 -0
  40. package/dist/scripts/7148-1ced1b5dce-lite.chunk.js.map +1 -0
  41. package/dist/scripts/7568-55e9b01367-lite.chunk.js +3 -0
  42. package/dist/scripts/7568-55e9b01367-lite.chunk.js.map +1 -0
  43. package/dist/scripts/{7617-9d34c841e6-lite.chunk.js → 7617-211f084b70-lite.chunk.js} +2 -2
  44. package/dist/scripts/7617-211f084b70-lite.chunk.js.map +1 -0
  45. package/dist/scripts/7742-514844bd1a-lite.chunk.js +2 -0
  46. package/dist/scripts/7742-514844bd1a-lite.chunk.js.map +1 -0
  47. package/dist/scripts/7843-cbebf1a786-lite.chunk.js +2 -0
  48. package/dist/scripts/7843-cbebf1a786-lite.chunk.js.map +1 -0
  49. package/dist/scripts/8077-870bd8e245-lite.chunk.js +3 -0
  50. package/dist/scripts/8077-870bd8e245-lite.chunk.js.map +1 -0
  51. package/dist/scripts/843-4dbc5df109-lite.chunk.js +3 -0
  52. package/dist/scripts/843-4dbc5df109-lite.chunk.js.LICENSE.txt +1 -0
  53. package/dist/scripts/843-4dbc5df109-lite.chunk.js.map +1 -0
  54. package/dist/scripts/8735-e74a148502-lite.chunk.js +2 -0
  55. package/dist/scripts/8735-e74a148502-lite.chunk.js.map +1 -0
  56. package/dist/scripts/8856-2d332952ae-lite.chunk.js +2 -0
  57. package/dist/scripts/8856-2d332952ae-lite.chunk.js.map +1 -0
  58. package/dist/scripts/904-2784e45cfc-lite.chunk.js +2 -0
  59. package/dist/scripts/904-2784e45cfc-lite.chunk.js.map +1 -0
  60. package/dist/scripts/{9042-fdc5ecb459-lite.chunk.js → 9042-fd7e79b891-lite.chunk.js} +1 -1
  61. package/dist/scripts/{9042-fdc5ecb459-lite.chunk.js.map → 9042-fd7e79b891-lite.chunk.js.map} +1 -1
  62. package/dist/scripts/9295-eb130a0b17-lite.chunk.js +2 -0
  63. package/dist/scripts/9295-eb130a0b17-lite.chunk.js.map +1 -0
  64. package/dist/scripts/9528-4e954d9dff-lite.chunk.js +2 -0
  65. package/dist/scripts/9528-4e954d9dff-lite.chunk.js.map +1 -0
  66. package/dist/scripts/{9742-5f99d74bb0-lite.chunk.js → 9742-3f6b75484a-lite.chunk.js} +2 -2
  67. package/dist/scripts/9742-3f6b75484a-lite.chunk.js.map +1 -0
  68. package/dist/scripts/979-6a70a0e616-lite.chunk.js +2 -0
  69. package/dist/scripts/979-6a70a0e616-lite.chunk.js.map +1 -0
  70. package/dist/scripts/{3612-8c6423bd51-lite.chunk.js → 9911-8892b6dbfe-lite.chunk.js} +2 -2
  71. package/dist/scripts/{3612-8c6423bd51-lite.chunk.js.map → 9911-8892b6dbfe-lite.chunk.js.map} +1 -1
  72. package/dist/scripts/bundle-f926852f33.min.js +3 -0
  73. package/dist/scripts/{bundle-9a3e49399a.min.js.map → bundle-f926852f33.min.js.map} +1 -1
  74. package/package.json +1 -1
  75. package/dist/css/2074-lite-ac8da6c78b.chunk.css +0 -4
  76. package/dist/scripts/1202-d96ad80884-lite.chunk.js +0 -2
  77. package/dist/scripts/1202-d96ad80884-lite.chunk.js.map +0 -1
  78. package/dist/scripts/1336-1826f6e582-lite.chunk.js.map +0 -1
  79. package/dist/scripts/2074-39b86b9a22-lite.chunk.js +0 -2
  80. package/dist/scripts/2074-39b86b9a22-lite.chunk.js.map +0 -1
  81. package/dist/scripts/2664-87c8cbfa7f-lite.chunk.js.map +0 -1
  82. package/dist/scripts/2888-2596e106a5-lite.chunk.js +0 -2
  83. package/dist/scripts/2888-2596e106a5-lite.chunk.js.map +0 -1
  84. package/dist/scripts/289-669c0c8222-lite.chunk.js +0 -2
  85. package/dist/scripts/289-669c0c8222-lite.chunk.js.map +0 -1
  86. package/dist/scripts/3840-98c79fc0d8-lite.chunk.js +0 -2
  87. package/dist/scripts/3840-98c79fc0d8-lite.chunk.js.map +0 -1
  88. package/dist/scripts/3893-2856933742-lite.chunk.js +0 -2
  89. package/dist/scripts/3893-2856933742-lite.chunk.js.map +0 -1
  90. package/dist/scripts/4006-9dfe9cec1b-lite.chunk.js +0 -3
  91. package/dist/scripts/4006-9dfe9cec1b-lite.chunk.js.map +0 -1
  92. package/dist/scripts/4177-285ddf9ae3-lite.chunk.js.map +0 -1
  93. package/dist/scripts/4578-7578bcf17a-lite.chunk.js.map +0 -1
  94. package/dist/scripts/4621-1f79d94416-lite.chunk.js.map +0 -1
  95. package/dist/scripts/4806-f36469abb7-lite.chunk.js +0 -2
  96. package/dist/scripts/4806-f36469abb7-lite.chunk.js.map +0 -1
  97. package/dist/scripts/4985-bdfa839f8f-lite.chunk.js +0 -2
  98. package/dist/scripts/4985-bdfa839f8f-lite.chunk.js.map +0 -1
  99. package/dist/scripts/5554-17bb3b86fc-lite.chunk.js.map +0 -1
  100. package/dist/scripts/5579-a9c152057f-lite.chunk.js +0 -2
  101. package/dist/scripts/5579-a9c152057f-lite.chunk.js.map +0 -1
  102. package/dist/scripts/5712-e784cfe89c-lite.chunk.js +0 -2
  103. package/dist/scripts/5712-e784cfe89c-lite.chunk.js.map +0 -1
  104. package/dist/scripts/6070-a390fdce21-lite.chunk.js +0 -2
  105. package/dist/scripts/6070-a390fdce21-lite.chunk.js.map +0 -1
  106. package/dist/scripts/6909-a9b8930e37-lite.chunk.js.map +0 -1
  107. package/dist/scripts/7401-98135f09e8-lite.chunk.js +0 -2
  108. package/dist/scripts/7401-98135f09e8-lite.chunk.js.map +0 -1
  109. package/dist/scripts/7617-9d34c841e6-lite.chunk.js.map +0 -1
  110. package/dist/scripts/7742-342db3ce4f-lite.chunk.js +0 -2
  111. package/dist/scripts/7742-342db3ce4f-lite.chunk.js.map +0 -1
  112. package/dist/scripts/7843-f6033528ce-lite.chunk.js +0 -2
  113. package/dist/scripts/7843-f6033528ce-lite.chunk.js.map +0 -1
  114. package/dist/scripts/787-dcb3a0a26c-lite.chunk.js +0 -2
  115. package/dist/scripts/787-dcb3a0a26c-lite.chunk.js.map +0 -1
  116. package/dist/scripts/8077-9fdb522d7e-lite.chunk.js +0 -2
  117. package/dist/scripts/8077-9fdb522d7e-lite.chunk.js.map +0 -1
  118. package/dist/scripts/8133-ffcff3b7fc-lite.chunk.js.map +0 -1
  119. package/dist/scripts/8364-ff63447d36-lite.chunk.js +0 -3
  120. package/dist/scripts/8364-ff63447d36-lite.chunk.js.map +0 -1
  121. package/dist/scripts/8672-6967ce8a23-lite.chunk.js +0 -2
  122. package/dist/scripts/8672-6967ce8a23-lite.chunk.js.map +0 -1
  123. package/dist/scripts/9295-4242401e60-lite.chunk.js +0 -2
  124. package/dist/scripts/9295-4242401e60-lite.chunk.js.map +0 -1
  125. package/dist/scripts/9742-5f99d74bb0-lite.chunk.js.map +0 -1
  126. package/dist/scripts/979-4b893e5603-lite.chunk.js +0 -2
  127. package/dist/scripts/979-4b893e5603-lite.chunk.js.map +0 -1
  128. package/dist/scripts/9911-9272b96e46-lite.chunk.js +0 -2
  129. package/dist/scripts/9911-9272b96e46-lite.chunk.js.map +0 -1
  130. package/dist/scripts/bundle-9a3e49399a.min.js +0 -3
  131. /package/dist/css/{787-lite-5a317efacd.chunk.css → 2970-lite-5a317efacd.chunk.css} +0 -0
  132. /package/dist/css/{6070-lite-45dc286aab.chunk.css → 6550-lite-45dc286aab.chunk.css} +0 -0
  133. /package/dist/css/{2888-lite-856c02f000.chunk.css → 7148-lite-856c02f000.chunk.css} +0 -0
  134. /package/dist/css/{8364-lite-db31e36b79.chunk.css → 843-lite-db31e36b79.chunk.css} +0 -0
  135. /package/dist/css/{9911-lite-856c02f000.chunk.css → 8735-lite-856c02f000.chunk.css} +0 -0
  136. /package/dist/css/{5579-lite-f8e496136d.chunk.css → 8856-lite-f8e496136d.chunk.css} +0 -0
  137. /package/dist/css/{289-lite-2435a34b13.chunk.css → 904-lite-2435a34b13.chunk.css} +0 -0
  138. /package/dist/css/{1202-lite-4a892bdbf2.chunk.css → 9528-lite-4a892bdbf2.chunk.css} +0 -0
  139. /package/dist/css/{3612-lite-2b4142796a.chunk.css → 9911-lite-2b4142796a.chunk.css} +0 -0
  140. /package/dist/scripts/{4006-9dfe9cec1b-lite.chunk.js.LICENSE.txt → 3392-f7f8cb65e5-lite.chunk.js.LICENSE.txt} +0 -0
  141. /package/dist/scripts/{8133-ffcff3b7fc-lite.chunk.js.LICENSE.txt → 7568-55e9b01367-lite.chunk.js.LICENSE.txt} +0 -0
  142. /package/dist/scripts/{8364-ff63447d36-lite.chunk.js.LICENSE.txt → 8077-870bd8e245-lite.chunk.js.LICENSE.txt} +0 -0
  143. /package/dist/scripts/{bundle-9a3e49399a.min.js.LICENSE.txt → bundle-f926852f33.min.js.LICENSE.txt} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/979-4b893e5603-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/share-v2/enums/SharePrivacy.ts","file:///app/packages/libs/shared/src/apps/share-v2/utils/ShareViewHelper.tsx","file:///app/packages/libs/shared/src/apps/share/components/shared-object-image/shared-object-image.scss","file:///app/packages/libs/shared/src/apps/share/components/shared-object-image/SharedObjectImage.tsx","file:///app/packages/libs/shared/src/apps/share/views/share/components/share-integrations/ShareIntegrationsHelper.ts","file:///app/packages/libs/shared/src/components/divider/divider.scss","file:///app/packages/libs/shared/src/components/divider/Divider.tsx","file:///app/packages/libs/shared/src/components/thumbnails/collection/title/collection-thumbnail-title.scss","file:///app/packages/libs/shared/src/components/thumbnails/collection/title/CollectionThumbnailTitle.tsx","file:///app/packages/libs/shared/src/components/thumbnails/collection/collection-thumbnail.scss","file:///app/packages/libs/shared/src/components/thumbnails/collection/CollectionThumbnail.tsx","file:///app/packages/libs/shared/src/utils/get-event-logger/getEventLogger.ts","file:///app/packages/projects/lite/src/apps/assign/components/flow-controls/FlowControls.tsx","file:///app/packages/projects/lite/src/apps/assign/hooks/useAssignSharedData.ts","file:///app/packages/projects/lite/src/apps/assign/utils/AssignHelper.ts","file:///app/packages/projects/lite/src/apps/assign/utils/get-assign-event-logger/getAssignEventLogger.ts","file:///app/packages/projects/lite/src/apps/assign/components/assign-details/components/assign-details-tabs/AssignDetailsTabs.tsx","file:///app/packages/projects/lite/src/apps/assign/components/assign-details/components/assign-embed/AssignEmbed.tsx","file:///app/packages/projects/lite/src/apps/assign/components/assign-details/components/integration-list/IntegrationList.tsx","file:///app/packages/projects/lite/src/apps/assign/components/assign-details/components/integration-list/integration-list.scss","file:///app/packages/projects/lite/src/apps/assign/components/assign-details/components/integration-list/get-integration-handlers.ts","file:///app/packages/projects/lite/src/apps/assign/components/assign-details/components/assign-integrations/AssignIntegrations.tsx","file:///app/packages/projects/lite/src/apps/assign/components/assign-details/components/assign-overview/AssignOverview.tsx","file:///app/packages/projects/lite/src/apps/assign/components/assign-details/components/assign-overview/assign-overview.scss","file:///app/packages/libs/shared/src/components/full-screen/FullScreen.tsx","file:///app/packages/libs/shared/src/components/full-screen/hooks/useFullScreenActions.ts","file:///app/packages/libs/shared/src/components/qr-code/QrCode.tsx","file:///app/packages/libs/shared/src/components/qr-code/qr-code.scss","file:///app/packages/libs/shared/src/components/qr-code/images/Base64ClickViewLogo.ts","file:///app/packages/libs/shared/src/components/qr-code/hooks/useQrCodeActions.tsx","file:///app/packages/projects/lite/src/apps/assign/components/assign-details/components/assign-full-screen/AssignFullScreen.tsx","file:///app/packages/projects/lite/src/apps/assign/components/assign-details/components/assign-full-screen/assign-full-screen.scss","file:///app/packages/projects/lite/src/apps/assign/components/assign-details/components/assign-qr-code/AssignQrCode.tsx","file:///app/packages/projects/lite/src/apps/assign/components/assign-details/components/assign-share-link/AssignShareLink.tsx","file:///app/packages/projects/lite/src/apps/assign/components/assign-details/components/assign-join-code/AssignJoinCode.tsx","file:///app/packages/projects/lite/src/apps/assign/components/assign-details/AssignDetails.tsx","file:///app/packages/projects/lite/src/apps/assign/components/assign-details/components/assign-share-link/assign-share-link.scss","file:///app/packages/projects/lite/src/apps/assign/components/assign-details/components/assign-qr-code/assign-qr-code.scss","file:///app/packages/projects/lite/src/apps/assign/components/assign-details/components/assign-join-code/assign-join-code.scss","file:///app/packages/projects/lite/src/apps/assign/views/assign-details-view/AssignDetailsView.tsx","file:///app/packages/projects/lite/src/shared/components/instructions/instructions.scss","file:///app/packages/projects/lite/src/shared/components/instructions/Instructions.tsx","file:///app/packages/projects/lite/src/shared/hooks/useClassroomExperience.ts"],"sourcesContent":["export enum SharePrivacy {\n Public = 'Public',\n PinCode = 'PinCode',\n PasswordProtected = 'PasswordProtected',\n ProtectedOverrideRestriction = 'ProtectedOverrideRestriction',\n JustMySchoolOverrideRestriction = 'JustMySchoolOverrideRestriction',\n Protected = 'Protected',\n JustMySchool = 'JustMySchool',\n Direct = 'Direct'\n}","import { Flight } from 'libs/common/react/index';\n\nimport { AnalyticsOptions, EntityType } from 'libs/analytics/interfaces';\n\nimport { ShareViewHelper as OldShareViewHelper } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport type { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { IntegrationId } from 'libs/shared/enums/IntegrationId';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { PlaylistRequests } from 'libs/shared/flight-requests/PlaylistRequests';\nimport { SeriesRequests } from 'libs/shared/flight-requests/SeriesRequests';\nimport type { Clip, Interactive, InteractiveMetadata, Playlist, Series, Subject, Video } from 'libs/shared/interfaces';\nimport { IntegrationHelper } from 'libs/shared/utils/IntegrationHelper';\n\nexport type SharableEntityType = 'video' | 'playlist' | 'subject' | 'series' | 'interactive' | 'clip';\nexport type SharableEntity = Video | Playlist | Subject | Series | InteractiveMetadata | Clip;\nexport interface ShareSettingsFormFields {\n preventScrubbing: boolean;\n immediateFeedback: boolean;\n}\n\nexport const ShareViewHelper = {\n canEmbed(type: SharableEntityType): boolean {\n return [ 'video', 'interactive', 'clip' ].includes(type);\n },\n\n /**\n * Only interactive entities can update share settings currently\n */\n canAddPolicies(type: SharableEntityType): boolean {\n return ['interactive'].includes(type);\n },\n\n getEnabledIntegrations(googleClassroomSetting: boolean, msftTeamsSetting: boolean): IntegrationId[] {\n const integrations = IntegrationHelper.getShareIntegrations(googleClassroomSetting, msftTeamsSetting);\n return integrations.filter(i => i.enabled).map(i => i.id);\n },\n\n getShareSettingsInitialValues(share: Share, interactive: Interactive | null) {\n return {\n preventScrubbing: share?.options?.preventScrubbing ?? interactive?.preventScrubbing ?? false,\n immediateFeedback: share?.options?.immediateFeedback ?? interactive?.immediateFeedback ?? false\n };\n },\n \n getEnabledSettingsField(entityType: SharableEntityType): {[key in `show${Capitalize<keyof ShareSettingsFormFields>}Field`]: boolean} {\n return {\n showImmediateFeedbackField: entityType === 'interactive',\n showPreventScrubbingField: entityType === 'interactive'\n };\n },\n\n getSharableEntityType(share: Share): SharableEntityType {\n switch (share.objectTypeId) {\n case MasterType.Video:\n return 'video';\n case MasterType.Playlist:\n return 'playlist';\n case MasterType.Subject:\n return 'subject';\n case MasterType.Series:\n return 'series';\n case MasterType.Interactive:\n return 'interactive';\n case MasterType.Clip:\n return 'clip';\n }\n },\n\n /**\n * Methods from old ShareViewHelper imported here for namespacing\n */\n getFetchFunctionByType: (type: SharableEntityType) => {\n switch (type) {\n case 'playlist': {\n return (id: string) => Flight.useBasicFetch<Playlist>(PlaylistRequests.playlistWithThumbnailAndCount(id));\n }\n\n case 'series': {\n return (id: string) => Flight.useBasicFetch<Series>(SeriesRequests.seriesWithThumbnailAndCount(id));\n }\n }\n \n return OldShareViewHelper.getFetchFunctionByType(type);\n },\n\n getAnalyticsEntity(entityType: string): EntityType {\n return OldShareViewHelper.getAnalyticsEntity(entityType);\n },\n\n getAnalyticsOptions(entityType: SharableEntityType): AnalyticsOptions {\n return OldShareViewHelper.getAnalyticsOptions(entityType);\n }\n};","// extracted by mini-css-extract-plugin\nexport default {\"thumbnailFallbackSvg\":\"D4JFs\",\"posterFallbackSvg\":\"bjUWl\",\"coverFallbackSvg\":\"kdLpt\",\"thumbnailContainer\":\"d3CKN\",\"insightsMask\":\"KM76U\",\"requireMarking\":\"peLH7\",\"badge\":\"mVu0E\",\"bar\":\"zO3MS\",\"a\":\"K1jW5\",\"expandBar\":\"YITJl\",\"b\":\"tCpLF\",\"c\":\"lC0cq\"};","import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { ShareViewHelper } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { CollectionThumbnail } from 'libs/shared/components/thumbnails/collection/CollectionThumbnail';\nimport { VideoThumbnail } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { BG_COLOUR_CLASS_NAMES } from 'libs/shared/constants/ColourClassNames';\nimport { ImageSize, ImageType } from 'libs/shared/enums/Images';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ThumbnailTextPosition } from 'libs/shared/enums/ThumbnailTextPosition';\nimport { BaseObject, Image, Playlist, Series } from 'libs/shared/interfaces';\nimport { getBgColorClass } from 'libs/shared/utils/getBgColorClass';\nimport { ImageHelper, ImageOptions } from 'libs/shared/utils/ImageHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport styles from './shared-object-image.scss';\n\nconst namespace = 'shared.sharedObjectImage';\n\nconst BASE_IMAGE_CLASS_NAME = 'rounded overflow-hidden';\n\ninterface ImageProps {\n image: Image;\n imageType: ImageType;\n imageClassName?: string;\n imageFallbackComponent: JSX.Element;\n}\n\nfunction getImageProps(object: BaseObject): ImageProps {\n const image = ImageHelper.getDisplayImageFromObject(object);\n\n if (VideoHelper.isVideoType(object))\n return {\n image,\n imageType: ImageType.Thumbnails,\n imageClassName: BASE_IMAGE_CLASS_NAME,\n imageFallbackComponent: <ImageFallback type={ImageFallbackType.Video} />\n };\n\n switch (object.typeId) {\n case MasterType.Series:\n return {\n image,\n imageType: ImageType.TallPosters,\n imageClassName: BASE_IMAGE_CLASS_NAME,\n imageFallbackComponent:\n <ImageFallback type={ImageFallbackType.Series} svgContainerClassName={styles.posterFallbackSvg} />\n };\n\n case MasterType.Playlist:\n return {\n image,\n imageType: ImageType.Covers,\n imageClassName: !image?.url\n ? `${BASE_IMAGE_CLASS_NAME} ${getBgColorClass(object.name, BG_COLOUR_CLASS_NAMES)}`\n : BASE_IMAGE_CLASS_NAME,\n imageFallbackComponent: (\n <ImageFallback\n type={ImageFallbackType.Playlist}\n svgContainerClassName={image?.url ? styles.coverFallbackSvg : 'd-none'}\n extraClasses={!image?.url && 'bg-transparent'}\n />\n )\n };\n }\n}\n\nfunction InsightsMask() {\n return (\n <div className={`d-flex pointer-events-none position-absolute bottom-0 start-0 h-100 w-100 z-1 justify-content-center align-items-center`}>\n <div className='position-absolute bg-dark bg-gradient opacity-50 w-100 h-100 z-0 rounded-3'></div>\n <div className='d-flex align-items-end gap-2 h-50 z-1'>\n <div className='d-flex align-items-end h-50'>\n <div className={`${styles.bar} ${styles.a} rounded shadow`}></div>\n </div>\n <div className='d-flex align-items-end h-75'>\n <div className={`${styles.bar} ${styles.b} rounded shadow`}></div>\n </div>\n <div className='d-flex align-items-end h-100'>\n <div className={`${styles.bar} ${styles.c} rounded shadow`}></div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction getImageRatio(object: BaseObject): ImageFallbackType {\n if (VideoHelper.isVideoType(object))\n return 16 / 9;\n\n if (object.typeId === MasterType.Playlist)\n return 1;\n\n if (object.typeId === MasterType.Series)\n return 9 / 16;\n}\n\nSharedObjectImage.defaultProps = {\n imageOptions: { size: ImageSize.Small }\n};\n\ninterface SharedObjectImageProps {\n object: BaseObject;\n locationContext: LocationContext;\n appLink?: Core.AppLink;\n showVideoMetadata?: boolean;\n fixedHeight?: boolean;\n requireMarking?: number;\n imageOptions?: ImageOptions;\n showInsightsMask?: boolean;\n showCollectionMask?: boolean;\n showVideoCount?: boolean;\n thumbnailSize?: 'sm' | 'md';\n imageClassName?: string;\n hideBottomBar?: boolean;\n onlyCount?: boolean;\n}\n\nexport function SharedObjectImage(props: SharedObjectImageProps): JSX.Element {\n const ref = React.useCallback((el: HTMLDivElement) => {\n if (!el || !props.fixedHeight)\n return;\n\n el.style.width = `${el.offsetHeight * getImageRatio(props.object)}px`;\n }, []);\n\n const useVideoThumbnail = VideoHelper.isVideoType(props.object);\n\n const {\n image,\n imageType,\n imageClassName,\n imageFallbackComponent\n } = getImageProps(props.object);\n\n const thumbnailMetadata = !props.showVideoMetadata ? {\n hideDuration: true,\n hideMask: true,\n hideRating: true,\n hideVideoBadgeType: true,\n hideBottomBar: true\n } : {\n hideBottomBar: props.hideBottomBar\n };\n\n return (\n <div className='d-flex align-items-center justify-content-center w-100 h-100'>\n <div ref={ref} className={props.fixedHeight ? 'h-100' : 'w-100'}>\n {useVideoThumbnail &&\n <div className={`${styles.thumbnailContainer} position-relative`}>\n {props.showInsightsMask && <InsightsMask />}\n <AppLink appLink={props.appLink}>\n <VideoThumbnail\n video={props.object}\n size={props.thumbnailSize}\n imageOptions={props.imageOptions}\n textPosition={ThumbnailTextPosition.Independent}\n type='cosmetic'\n imageClassName={props.imageClassName}\n {...thumbnailMetadata}\n />\n </AppLink>\n {!!props.requireMarking && (\n <div className={`${props.showInsightsMask && styles.requireMarking} position-absolute bottom-0 end-0 z-1 m-2`}>\n <div className={`${styles.badge} d-flex align-items-center bg-light-ultramarine text-ultramarine fw-semibold rounded-pill w-fit mt-1 px-2`}>\n <Text namespace={namespace} phrase='requireMarking' options={{ smartCount: props.requireMarking }} />\n </div>\n </div>\n )}\n </div>\n }\n {!useVideoThumbnail &&\n <>\n {'videos' in (props.object as Playlist | Series) ? (\n <CollectionThumbnail\n collection={props.object}\n imageOptions={props.imageOptions}\n appLink={props.appLink}\n analyticsData={{\n id: props.object.id,\n name: props.object.name\n }}\n analyticsOptions={{\n entity: ShareViewHelper.getAnalyticsEntity(props.object.type),\n actionType: UserAction.Click,\n location: props.locationContext\n }}\n showMask={props.showCollectionMask}\n showVideoCount={props.showVideoCount}\n onlyCount={props.onlyCount}\n />\n ) : (\n <BaseImage\n data={image?.url}\n imageType={imageType}\n imageOptions={props.imageOptions}\n appLink={props.appLink}\n className={imageClassName}\n analyticsData={{\n id: props.object.id,\n name: props.object.name\n }}\n analyticsOptions={{\n entity: ShareViewHelper.getAnalyticsEntity(props.object.type),\n actionType: UserAction.Click,\n location: props.locationContext\n }}\n >\n {imageFallbackComponent}\n </BaseImage>\n )}\n </>\n }\n </div>\n </div>\n );\n}","import { LocationUtils } from 'libs/common/backbone/core/LocationUtils';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\n\nconst POPUP_FEATURES = 'toolbar=0,location=0,menubar=0,width=600,height=600';\n\n/**\n * ⚠️ Hacky solution warning ⚠️\n * \n * Both Google Classroom and MS Teams provide an SDK to do essentially what this file does.\n * However when using their SDK, we lose control of how the items are displayed on our page.\n * \n * Ed-puzzle seems like it does what we've done here\n * so i've taken a leaf out of their book and taken a similar approach.\n * This puts us at risk of them changing their SDK and our implementation not changing\n * \n * If MS Teams or Google Classroom stop working, this is most likely why. But we should be able\n * to simply find out what their new parameters are and open a popup to the new shape in\n * order to fix any issues \n * \n * High risk, low reward 🤙\n * \n * - Sha\n */\nexport const ShareIntegrationsHelper = {\n launchGoogleClassroom(link: string) {\n const url = UrlHelper.urlBuilder('https://classroom.google.com/share', { link });\n LocationUtils.PageLoad(url, true, POPUP_FEATURES);\n },\n launchMicrosoftTeams(link: string) {\n const url = UrlHelper.urlBuilder('https://teams.microsoft.com/share', {\n href: link,\n preview: false,\n referrer: LocationUtils.GetCurrentHostname(),\n s: Date.now()\n });\n LocationUtils.PageLoad(url, true, POPUP_FEATURES);\n }\n};","// extracted by mini-css-extract-plugin\nexport default {\"divider\":\"rpkqv\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport styles from './divider.scss';\n\nconst namespace = 'shared.divider';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface DividerProps {\n text?: string;\n noUpperCase?: boolean;\n className?: string;\n}\n\ninterface DividerCSSProperties extends React.CSSProperties {\n '--divider-content'?: string;\n '--divider-text-transform'?: React.CSSProperties['textTransform'];\n}\n\nfunction buildStyle(props: DividerProps) {\n const content = props.text || getPhrase('or');\n \n const style: DividerCSSProperties = {\n '--divider-content': `'${content}'`,\n '--divider-text-transform': props.noUpperCase ? 'none' : 'uppercase'\n };\n\n return style;\n}\n\nexport function Divider(props: DividerProps): JSX.Element {\n return <div className={classNames('my-2 w-100 border-bottom position-relative', styles.divider, props.className)} style={buildStyle(props)}></div>;\n}","// extracted by mini-css-extract-plugin\nexport default {\"thumbnailTitle\":\"OsWjL\"};","import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\n\nimport styles from './collection-thumbnail-title.scss';\n\ninterface BaseCollectionThumbnailTitleProps {\n title: string;\n}\n\nfunction BaseCollectionThumbnailTitle(props: BaseCollectionThumbnailTitleProps): JSX.Element {\n return (\n <h3 title={props.title} className='h6'>{props.title}</h3>\n );\n}\n\ninterface CollectionThumbnailTitleProps extends BaseCollectionThumbnailTitleProps {\n appLink: Core.AppLink;\n}\n\nexport function CollectionThumbnailTitle(props: CollectionThumbnailTitleProps) {\n if (!props.appLink) {\n return (\n <BaseCollectionThumbnailTitle {...props} />\n );\n }\n \n return (\n <AppLink appLink={props.appLink} className={`${styles.thumbnailTitle}`}>\n <BaseCollectionThumbnailTitle {...props} />\n </AppLink>\n );\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"badge\":\"M4zat\",\"mask\":\"r0Ztg\",\"thumbnailContainer\":\"uD9dz\"};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { AnalyticsOptions, EntityType, UserAction } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { CollectionThumbnailTitle } from 'libs/shared/components/thumbnails/collection/title/CollectionThumbnailTitle';\nimport { VideoThumbnail } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { TitleSubText } from 'libs/shared/components/title-sub-text/TitleSubText';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ThumbnailTextPosition } from 'libs/shared/enums/ThumbnailTextPosition';\nimport { Playlist, Series } from 'libs/shared/interfaces';\nimport { ImageOptions } from 'libs/shared/utils/ImageHelper';\nimport { MasterTypeHelper } from 'libs/shared/utils/MasterTypeHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './collection-thumbnail.scss';\n\nconst namespace = 'shared.collectionThumbnail';\n\ntype SupportedContentType = Playlist | Series;\n\ninterface CollectionThumbnailProps {\n appLink?: Core.AppLink\n collection: SupportedContentType;\n imageOptions?: ImageOptions;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n showMask?: boolean;\n showVideoCount?: boolean;\n onlyCount?: boolean;\n title?: string;\n titleAppLink?: Core.AppLink;\n subText?: string;\n subTextAppLink?: Core.AppLink;\n hoverText?: string;\n}\n\nexport function CollectionThumbnail(props: CollectionThumbnailProps) {\n function getFirstVideo() {\n let collectionVideos = props.collection?.videos;\n\n if (!collectionVideos)\n return;\n\n if (!collectionVideos.count && props.collection.typeId === MasterType.Playlist) {\n const playlist = props.collection as Playlist;\n\n if (playlist.clips.count)\n collectionVideos = playlist.clips;\n\n if (playlist.interactives.count)\n collectionVideos = playlist.interactives;\n }\n\n return ArrayHelper.first(collectionVideos.data);\n }\n\n function getVideoCount() {\n let totalCount = 0;\n\n if (props.collection.videos && props.collection.videos.count) {\n totalCount += props.collection.videos.count;\n }\n\n if (props.collection.typeId === MasterType.Playlist) {\n const playlist = props.collection as Playlist;\n\n if (playlist.interactives?.count)\n totalCount += playlist.interactives.count;\n\n if (playlist.clips?.count)\n totalCount += playlist.clips.count;\n }\n\n return totalCount;\n }\n\n function getEntityType(collection: SupportedContentType) {\n if (MasterTypeHelper.isType<Playlist>(collection, MasterType.Playlist)) {\n return EntityType.Playlist;\n }\n\n if (MasterTypeHelper.isType<Series>(collection, MasterType.Series)) {\n return EntityType.Series;\n }\n }\n\n const firstVideo = getFirstVideo();\n const videoCount = getVideoCount();\n const showTexts = props.title?.length || props.subText?.length;\n\n const analyticsData = {\n id: props.collection.id.toString(),\n name: props.collection.name,\n\n ...props.analyticsData\n };\n\n const analyticsOptions = {\n actionType: UserAction.Click,\n entity: getEntityType(props.collection),\n \n ...props.analyticsOptions\n };\n\n return (\n <div>\n <div className={`position-relative ${styles.thumbnailContainer} z-1`}>\n <AppLink\n appLink={props.appLink}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n preventFocus\n >\n {props.showMask &&\n <div className={`${styles.mask} position-absolute w-100 h-100 rounded-3 bg-dark bg-gradient z-1 bg-opacity-50 pointer-events-none`}>\n <div className={`${styles.badge} d-flex align-items-center w-fit flex-grow-0 bg-dark rounded-pill ps-1 m-2`}>\n <SvgContainer svgName={cvSvgLibrary.Play} className='svg-container text-white' />\n <p className='d-inline fw-medium text-white mb-0'>\n {props.hoverText?.length ?\n <span>{props.hoverText}</span> :\n <Text namespace={namespace} phrase='playAll' />\n }\n </p>\n </div>\n </div>\n }\n\n {firstVideo &&\n <VideoThumbnail\n video={firstVideo}\n imageOptions={props.imageOptions}\n textPosition={ThumbnailTextPosition.Independent}\n type='cosmetic'\n hideMask\n hideRating\n hideDuration\n hideVideoTypeBadge\n />\n }\n\n {!firstVideo &&\n <div className='ratio ratio-16x9 bg-light rounded-3'>\n <div className='d-flex justify-content-center align-items-center'>\n <SvgContainer svgName={cvSvgLibrary.Play} className='w-33 opacity-25 text-gray-400' />\n </div>\n </div>\n }\n\n {props.showVideoCount &&\n <div className={`${styles.badge} d-flex align-items-center w-fit bg-dark bg-opacity-75 rounded-pill position-absolute bottom-0 end-0 ps-1 m-2`}>\n <SvgContainer svgName={cvSvgLibrary.Series} className='svg-container text-white me-1' />\n <p className='d-inline fw-semibold text-white mb-0'>\n {props.onlyCount\n ? <span>{videoCount}</span>\n : <Text namespace={namespace} phrase='videos' options={{ count: videoCount, smartCount: videoCount }} />\n }\n </p>\n </div>\n }\n </AppLink>\n\n </div>\n \n {showTexts &&\n <div className='mt-2 d-flex flex-column'>\n {props.subText &&\n <TitleSubText title={props.subText} appLink={props.subTextAppLink}>\n {props.subText}\n </TitleSubText>\n }\n {props.title &&\n <CollectionThumbnailTitle\n title={props.collection.name}\n appLink={props.titleAppLink}\n />\n }\n </div>\n }\n </div>\n );\n}","import { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions, HashObject } from 'libs/analytics/interfaces';\n\n/**\n * Base type that every event needs to extend from\n */\nexport interface BaseEventLogData<T extends string = string> {\n type: T;\n}\n\n/**\n * Utility type to map event types to config types\n */\nexport type EventLogConfig<TEvents extends BaseEventLogData> = {\n [K in TEvents['type']]: BaseConfigData<Extract<TEvents, { type: K }>>;\n};\n\ninterface BaseConfigData<T extends BaseEventLogData> {\n isValid?: (data: T) => boolean;\n analyticsOptions: AnalyticsOptions;\n logBaseData?: boolean;\n}\n\ninterface GetEventLoggerOptions<TData extends HashObject, TEvents extends BaseEventLogData> {\n baseData: TData;\n /**\n * Event type config map\n */\n config: EventLogConfig<TEvents>;\n /**\n * Base analytics options\n */\n analyticsOptions: AnalyticsOptions;\n\n shouldLog?: boolean;\n}\n\n/**\n * Method build and log events which are typed using map\n * passed in from config\n */\nexport function getEventLogger<\n TData extends HashObject = HashObject,\n TEvents extends BaseEventLogData = BaseEventLogData\n>(\n options: GetEventLoggerOptions<TData, TEvents>\n) {\n /**\n * Types to assist hinting in our log / getData methods\n */\n type EventType = TEvents['type']; // type of event\n type EventData = Extract<TEvents, { type: EventType }>; // restrict the data to the passed type\n \n /**\n * Get analytics data and options for a given event type\n */\n function getData(\n data: EventData,\n logAnalyticsOptions?: AnalyticsOptions\n ) {\n const logDataConfig = options.config[data.type];\n\n if (!logDataConfig?.isValid(data))\n return;\n\n const mergedData = {\n ...(logDataConfig.logBaseData === false ? {} : options.baseData),\n ...data\n };\n \n const sanitizedData = ObjectHelper.omit<typeof data>(mergedData, ['type']);\n\n const analyticsOptions = AnalyticsHelper.mergeOptions(\n logDataConfig.analyticsOptions,\n [\n options.analyticsOptions,\n logAnalyticsOptions\n ]\n );\n\n return {\n data: sanitizedData,\n analyticsOptions\n };\n }\n\n /**\n * Similar to `getData` except it logs the analytics event\n * for a given type if its valid\n */\n function log(\n data: EventData,\n logAnalyticsOptions?: AnalyticsOptions\n ) {\n if (!options.shouldLog)\n return;\n\n const analytics = getData(data, logAnalyticsOptions);\n\n if (!analytics)\n return;\n\n AnalyticsHelper.logUserAction(analytics.data, analytics.analyticsOptions);\n }\n\n return {\n getData,\n log\n };\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\n\nconst namespace = 'assign.flowControls';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface FlowControlsProps {\n showSpinner?: boolean;\n hideNextButton?: boolean;\n hideBackButton?: boolean;\n disableNextButton?: boolean;\n disableBackButton?: boolean;\n backButtonText?: string;\n hideCreateClassroomButton?: boolean;\n nextButtonText?: string;\n nextButtonTooltip?: string;\n onClickNext?: () => void;\n onClickBack?: () => void;\n onClickCreateClassroom?: () => void;\n leftComponent?: JSX.Element;\n}\n\nexport function FlowControls(props: FlowControlsProps): JSX.Element {\n const hideBackButton = props.hideBackButton || !props.onClickBack;\n const hideNextButton = props.hideNextButton || !props.onClickNext;\n const hideCreateClassroomButton = props.hideCreateClassroomButton || !props.onClickCreateClassroom;\n \n if (hideBackButton && hideNextButton && hideCreateClassroomButton)\n return <></>;\n \n return (\n <PopupButtons className='justify-content-between'>\n <div>\n {!!props.leftComponent && props.leftComponent}\n {!hideCreateClassroomButton && (\n <PopupButtons.Submit variant='link' onClick={props.onClickCreateClassroom} text={getPhrase('createClassroom')} className='text-info p-0' />\n )}\n </div>\n <div className='d-flex'>\n {!hideBackButton && (\n <PopupButtons.Cancel variant='link' onClick={props.onClickBack} text={props.backButtonText || getPhrase('back')} />\n )}\n {!hideNextButton && (\n <Tooltip title={props.nextButtonTooltip} disable={!props.nextButtonTooltip} placement='top' spanHack>\n <PopupButtons.Submit\n variant='dark'\n onClick={props.onClickNext}\n text={props.nextButtonText || getPhrase('next')}\n disabled={props.disableNextButton}\n showSpinner={props.showSpinner}\n />\n </Tooltip>\n )}\n </div>\n </PopupButtons>\n );\n}","import { Flight } from 'libs/common/react/index';\n\nimport { SharableEntityType, ShareViewHelper } from 'libs/shared/apps/share-v2/utils/ShareViewHelper';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { Config, CurrentUser, Interactive, InteractiveMetadata } from 'libs/shared/interfaces';\nimport { MasterTypeHelper } from 'libs/shared/utils/MasterTypeHelper';\n\nexport interface UseAssignSharedDataOptions {\n objectId: string;\n entityType: SharableEntityType;\n}\n\nexport function useAssignSharedData(options: UseAssignSharedDataOptions) {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const entity = ShareViewHelper.getFetchFunctionByType(options.entityType)(options.objectId, currentUser.data?.id);\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n /**\n * Fetch interactive videos options to set them as defaults\n * if the interactive share data does not have any options set.\n * We only fetch this if its an interactive share entity\n */\n const interactive = Flight.useBasicFetch<Interactive>(\n MasterTypeHelper.isType<InteractiveMetadata>(entity.data, MasterType.Interactive) && entity.data.interactiveId &&\n InteractiveRequests.interactive(entity.data.interactiveId)\n );\n\n const { hasPermissions, getGatedPermission, isLoaded } = usePermissions();\n\n const hasStudentExp = hasPermissions(PermissionName.StudentExperience);\n const canCreateClassrooms = hasPermissions(PermissionName.CreateClassrooms);\n const openClassroomGatedPermission = getGatedPermission(PermissionName.ShareToOpenClassrooms);\n \n const dataLoaded = (\n !!currentUser.data &&\n !!entity.data &&\n !!config.data &&\n !!isLoaded\n );\n \n return {\n loaded: dataLoaded,\n currentUser,\n entity,\n interactive,\n config,\n hasStudentExp,\n canCreateClassrooms,\n openClassroomGatedPermission\n };\n}","import { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { InstanceRegion } from 'libs/shared/enums/InstanceRegion';\nimport { BaseObject, ClassroomGroup, User } from 'libs/shared/interfaces';\n\nexport const AssignHelper = {\n getRecipients(entities: ClassroomGroup[] | User[]): string[] {\n if (!entities.length)\n return [];\n \n return entities.map(e => e.id);\n },\n \n getLearnersForGroups(groups: ClassroomGroup[]): User[] {\n const learners = groups.reduce<User[]>((prev, curr) => ([\n ...prev, ...(curr.users.data ?? [])\n ]), []);\n\n return ArrayHelper.uniq(learners, 'id');\n },\n\n getSelectedEntities<T extends BaseObject>(selectedEntities: T[], entity: T): T[] {\n const selected = selectedEntities.find(e => e.id?.toString() === entity.id?.toString());\n\n if (selected)\n return selectedEntities.filter(e => e.id?.toString() !== entity.id?.toString());\n\n return [ ...selectedEntities, entity ];\n },\n\n getContactSupportUrl(marketingUrl: string, instanceRegion: InstanceRegion): string {\n if (!marketingUrl || !instanceRegion)\n return;\n \n let path = '/contact-us/support'; // new websites\n\n if (instanceRegion === InstanceRegion.NZ) {\n path = '/contact-us/';\n }\n \n return UrlHelper.safeUrlConcat(marketingUrl, path);\n }\n};","import { AnalyticsOptions, AssignDescriptors, EntityType, EventVersion, ShareDescriptors, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { ShareViewHelper } from 'libs/shared/apps/share-v2/utils/ShareViewHelper';\nimport { EventLogConfig, getEventLogger } from 'libs/shared/utils/get-event-logger/getEventLogger';\n\nimport { AssignLogData, BaseAssignData } from './interfaces/GetAssignEventLogger';\n\nexport type AssignLogFn = ReturnType<typeof getAssignEventLogger>['log'];\n\n// #region Validation Methods\nfunction isValidShare(data: AssignLogData): boolean {\n if (!('share' in data))\n return false;\n\n return !!data.share;\n}\n// #endregion\n\n// #region Config \nfunction getLogDataConfig(options: AssignEventLoggerOptions): EventLogConfig<AssignLogData> {\n return {\n /**\n * Share - Assign\n */\n 'create-existing-classroom': {\n isValid: isValidShare,\n analyticsOptions: {\n actionType: UserAction.Create,\n entity: EntityType.Assign,\n workflowPhase: WorkflowPhase.Complete,\n descriptor: AssignDescriptors.ExistingClassroom\n }\n },\n 'share-existing-classroom': {\n isValid: () => true,\n logBaseData: false,\n analyticsOptions: {\n actionType: UserAction.Share,\n entity: ShareViewHelper.getAnalyticsEntity(options.data.entity.type),\n workflowPhase: WorkflowPhase.Complete,\n descriptor: AssignDescriptors.ExistingClassroom,\n eventVersion: EventVersion.V5\n }\n },\n 'create-open-classroom': {\n isValid: isValidShare,\n analyticsOptions: {\n actionType: UserAction.Create,\n entity: EntityType.Assign,\n workflowPhase: WorkflowPhase.Complete,\n descriptor: AssignDescriptors.OpenClassroom\n }\n },\n 'share-open-classroom': {\n isValid: () => true,\n logBaseData: false,\n analyticsOptions: {\n actionType: UserAction.Share,\n entity: ShareViewHelper.getAnalyticsEntity(options.data.entity.type),\n workflowPhase: WorkflowPhase.Complete,\n descriptor: AssignDescriptors.OpenClassroom,\n eventVersion: EventVersion.V5\n }\n },\n 'view-assignment': {\n isValid: isValidShare,\n analyticsOptions: {\n actionType: UserAction.Click,\n entity: EntityType.Assign,\n workflowPhase: WorkflowPhase.Complete,\n descriptor: AssignDescriptors.ViewAssignment\n }\n },\n 'select-existing-classroom-flow': {\n isValid: () => true,\n analyticsOptions: {\n actionType: UserAction.Click,\n workflowPhase: WorkflowPhase.Start,\n descriptor: AssignDescriptors.ExistingClassroom,\n entity: EntityType.Assign\n }\n },\n 'select-open-classroom-flow': {\n isValid: () => true,\n analyticsOptions: {\n actionType: UserAction.Click,\n workflowPhase: WorkflowPhase.Start,\n descriptor: AssignDescriptors.OpenClassroom,\n entity: EntityType.Assign\n }\n },\n 'view-previous-assignment': {\n isValid: isValidShare,\n analyticsOptions: {\n actionType: UserAction.Click,\n workflowPhase: WorkflowPhase.Discard,\n entity: EntityType.Assign,\n descriptor: AssignDescriptors.ViewPreviousAssignment\n }\n },\n 'close-assign-popup': {\n isValid: () => true,\n analyticsOptions: {\n actionType: UserAction.Click,\n workflowPhase: WorkflowPhase.Discard, // Usually discarded unless called form 'assign-details' step\n entity: EntityType.Assign,\n descriptor: AssignDescriptors.ClosePopup\n }\n },\n 'create-new-classroom': {\n isValid: data => !!data.classroom,\n analyticsOptions: {\n actionType: UserAction.Create,\n workflowPhase: WorkflowPhase.Next,\n descriptor: AssignDescriptors.CreateClassroom,\n entity: EntityType.Assign\n }\n },\n 'select-narrow-selection': {\n isValid: data => !!data.classroom,\n analyticsOptions: {\n actionType: UserAction.Click,\n entity: EntityType.Assign,\n workflowPhase: WorkflowPhase.Next,\n descriptor: AssignDescriptors.NarrowSelection\n }\n },\n 'click-create-classroom': {\n isValid: () => true,\n analyticsOptions: {\n actionType: UserAction.Click,\n entity: EntityType.Assign,\n workflowPhase: WorkflowPhase.Next,\n descriptor: AssignDescriptors.CreateClassroom\n }\n },\n\n /**\n * General\n */\n 'copy-embed-html': {\n isValid: () => true,\n logBaseData: false,\n analyticsOptions: {\n actionType: UserAction.Share,\n workflowPhase: WorkflowPhase.Complete,\n entity: ShareViewHelper.getAnalyticsEntity(options.data.entity.type),\n descriptor: ShareDescriptors.CopyEmbedHtml,\n eventVersion: EventVersion.V5\n }\n },\n 'copy-share-link': {\n isValid: () => true,\n logBaseData: false,\n analyticsOptions: {\n actionType: UserAction.Share,\n workflowPhase: WorkflowPhase.Complete,\n entity: ShareViewHelper.getAnalyticsEntity(options.data.entity.type),\n descriptor: ShareDescriptors.CopyLink,\n eventVersion: EventVersion.V5\n }\n },\n 'print-qr-code': {\n isValid: () => true,\n analyticsOptions: {\n actionType: UserAction.Print,\n entity: EntityType.Assign, // default\n workflowPhase: WorkflowPhase.Complete,\n descriptor: AssignDescriptors.PrintQrCode\n }\n },\n 'download-qr-code': {\n isValid: () => true,\n analyticsOptions: {\n actionType: UserAction.Download,\n entity: EntityType.Assign, // default\n workflowPhase: WorkflowPhase.Complete,\n descriptor: AssignDescriptors.DownloadQrCode\n }\n },\n 'request-full-screen': {\n isValid: () => true,\n analyticsOptions: {\n actionType: UserAction.Click,\n entity: EntityType.Assign, // default\n workflowPhase: WorkflowPhase.Complete,\n descriptor: AssignDescriptors.FullScreen\n }\n }\n };\n}\n\n// #endregion\n\n// #region Implementation\ninterface AssignEventLoggerOptions {\n data: BaseAssignData;\n analyticsOptions: AnalyticsOptions;\n shouldLog?: boolean;\n}\n\nexport function getAssignEventLogger(options: AssignEventLoggerOptions) {\n const { getData, log } = getEventLogger({\n analyticsOptions: options.analyticsOptions,\n baseData: options.data,\n config: getLogDataConfig(options),\n shouldLog: options.shouldLog ?? true\n });\n\n return {\n log,\n getData\n };\n}\n// #endregion","import React from 'react';\n\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { ShareIntegrationsStack } from 'libs/shared/apps/share/views/share/components/share-integrations/ShareIntegrationsStack';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\n\nconst namespace = 'assign.assignDetailsTabs';\n\ninterface TabItemProps {\n tab: AssignDetailsTab;\n active: AssignDetailsTab;\n onClick: (tab: AssignDetailsTab) => void;\n}\n\nfunction TabItem(props: React.PropsWithChildren<TabItemProps>): JSX.Element {\n const active = props.tab === props.active;\n\n return (\n <button\n className={classNames(\n 'rounded-pill d-flex align-items-center gap-1 ps-1',\n active ? 'bg-dark text-white' : 'bg-light'\n )}\n onClick={() => props.onClick(props.tab)}\n >\n {props.children}\n </button>\n );\n}\n\nexport type AssignDetailsTab = 'overview' | 'share-link' | 'qr-code' | 'embed' | 'integrations' | 'join-code';\n\ninterface AssingDetailsTabsProps {\n active: AssignDetailsTab;\n onClick: (screen: AssignDetailsTab) => void;\n hideTabs?: AssignDetailsTab[];\n}\n\n// [icon, phrase]\nconst TabIconAndPhraseMap: {[key in AssignDetailsTab]: [string, string]} = {\n 'overview': [ '', '' ],\n 'share-link': [ cvSvgLibrary.Link, 'shareLink' ],\n 'qr-code': [ cvSvgLibrary.QrCode, 'qrCode' ],\n 'embed': [ cvSvgLibrary.Code, 'embed' ],\n 'join-code': [ cvSvgLibrary.Key, 'joinCode' ],\n 'integrations': [ '', 'integrations' ] // Integrations uses different component\n};\n\nconst AvailableTabs: AssignDetailsTab[] = [ 'share-link', 'join-code', 'qr-code', 'embed', 'integrations' ];\n\nexport function AssingDetailsTabs(props: AssingDetailsTabsProps): JSX.Element {\n const enabledTabs = AvailableTabs.filter(tab => !props.hideTabs?.includes(tab));\n\n if (!enabledTabs.length)\n return <></>;\n \n return (\n <div className='d-flex justify-content-center mb-3 gap-3 flex-wrap'>\n {enabledTabs.map(tab => {\n const [ icon, phrase ] = TabIconAndPhraseMap[tab];\n\n if (tab === 'integrations') {\n return (\n <TabItem tab={tab} {...props} key={tab}>\n <ShareIntegrationsStack size='sm' noTooltip />\n <Text namespace={namespace} phrase={phrase} />\n </TabItem>\n );\n }\n\n return (\n <TabItem tab={tab} {...props} key={tab}>\n <SvgContainer svgName={icon} />\n <Text namespace={namespace} phrase={phrase} />\n </TabItem>\n );\n })}\n </div>\n );\n}\n","import React from 'react';\n\nimport { EmbedDetails } from 'libs/shared/apps/share/components/copy-embed-html/CopyEmbedHtml';\nimport { CopyEmbedHtml } from 'libs/shared/apps/share-v2/components/copy-embed-html/CopyEmbedHtml';\nimport { ShareType } from 'libs/shared/apps/share-v2/enums/ShareType';\nimport { SharableEntityType } from 'libs/shared/apps/share-v2/utils/ShareViewHelper';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { BaseObject } from 'libs/shared/interfaces';\n\nimport { Instructions } from 'shared/components/instructions/Instructions';\n\nimport { AssignDetailsTab, AssingDetailsTabs } from 'apps/assign/components/assign-details/components/assign-details-tabs/AssignDetailsTabs';\nimport { AssignLogFn } from 'apps/assign/utils/get-assign-event-logger/getAssignEventLogger';\n\nimport { AssignDetailsFlow } from '../../AssignDetails';\n\nconst namespace = 'assign.assignEmbed';\n\nexport interface AssignEmbedProps {\n entity: BaseObject;\n entityId: string;\n entityType: SharableEntityType;\n embedUrl: string;\n liteUrl: string;\n shareId: string;\n joinCode?: string;\n onClickTab: (tab: AssignDetailsTab) => void;\n flow?: AssignDetailsFlow;\n log?: AssignLogFn;\n hideTabs?: AssignDetailsTab[];\n shareType: ShareType;\n onShareAction: () => void;\n}\n\nfunction JoinCodeInstructions() {\n return (\n <Instructions>\n <Instructions.Step number={1}>\n <Text phrase='step1' />\n </Instructions.Step>\n <Instructions.Step number={2}>\n <Text phrase='endStep' />\n </Instructions.Step>\n </Instructions>\n );\n}\n\nfunction SignInInstruction() {\n return (\n <Instructions>\n <Instructions.Step number={1}>\n <Text phrase='step1' />\n </Instructions.Step>\n <Instructions.Step number={2}>\n <Text phrase='step2SignIn' />\n </Instructions.Step>\n <Instructions.Step number={3}>\n <Text phrase='endStep' />\n </Instructions.Step>\n </Instructions>\n );\n}\n\nexport function AssignEmbed(props: AssignEmbedProps): JSX.Element {\n function onCopyLogEvent(embedDetails: EmbedDetails) {\n props.log && props.log({\n type: 'copy-embed-html',\n embedDetails,\n id: props.entityId,\n shareId: props.shareId,\n shareType: props.shareType\n });\n props.onShareAction();\n }\n \n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <div className='w-100'>\n <AssingDetailsTabs active='embed' onClick={props.onClickTab} hideTabs={props.hideTabs} />\n <div className='container-fluid bg-light py-3 bg-light rounded-3 p-3'>\n <div className='row gy-4'>\n <div className='col-lg-5 col-12 d-flex flex-column justify-content-center'>\n {props.joinCode ?\n <JoinCodeInstructions /> :\n <SignInInstruction />\n }\n </div>\n <div className='col-lg-7 col-12 d-flex flex-column-reverse gap-3'>\n <CopyEmbedHtml\n analyticsOptions={{}}\n embedUrl={props.embedUrl}\n entity={props.entity}\n entityId={props.entityId}\n entityType={props.entityType}\n liteUrl={props.liteUrl}\n shareId={props.shareId}\n hideLabel\n hasInputBg\n onCopy={onCopyLogEvent}\n styling='normal-v2'\n />\n </div>\n </div>\n </div>\n </div>\n </LanguageNamespaceContext.Provider>\n );\n}","import React from 'react';\nimport { Scrollbars } from 'react-custom-scrollbars-2';\n\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { ExternalLink } from 'libs/shared/components/external-link/ExternalLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { InstanceRegion } from 'libs/shared/enums/InstanceRegion';\n\nimport { getIntegrationHandlers } from 'apps/assign/components/assign-details/components/integration-list/get-integration-handlers';\n\nimport integrationsList from './integration-list.json';\n\nimport styles from './integration-list.scss';\n\nconst namespace = 'assign.integrationList';\n\ninterface IntegrationItemProps {\n integration: any;\n className: string;\n onClick: () => void;\n}\n\nfunction IntegrationItem(props: IntegrationItemProps): JSX.Element {\n const Tag = props.onClick ? 'div' : 'a';\n\n return (\n <div className={classNames('col-6 mb-2', props.className)}>\n <Tag\n href={props.onClick ? undefined : props.integration.link}\n className='d-flex align-items-center border rounded-1 p-2 text-decoration-none hover-bg-light-blue fw-medium cursor-pointer'\n target='_blank'\n rel='noopener noreferrer'\n onClick={props.onClick || undefined}\n >\n <span\n className={`d-block ${styles.integrationIcon}`}\n style={{ backgroundImage: `url(${props.integration.icon})` }}\n />\n <span className='text-center flex-grow-1'>{props.integration.name}</span>\n </Tag>\n </div>\n );\n}\n\ninterface IntegrationListProps {\n instanceRegion?: InstanceRegion;\n itemClassName?: string;\n maxHeight?: string | number;\n contactSupportLink: string;\n hideSupportLink?: boolean;\n shareLink?: string;\n onShareAction: () => void;\n}\n\nexport function IntegrationList(props: IntegrationListProps): JSX.Element {\n const handlers = getIntegrationHandlers(props.shareLink, props.onShareAction);\n \n const integrations = integrationsList.filter(item => {\n let valid = !!item.icon && (!!item.link || handlers[item.id as keyof typeof handlers]);\n\n if (props.instanceRegion && item.instanceRegions.length)\n valid = item.instanceRegions.includes(props.instanceRegion);\n\n return valid;\n });\n \n return (\n <div className='bg-white rounded-3'>\n <Scrollbars autoHeight autoHeightMax={props.maxHeight || 308}>\n <div className='container-fluid py-3'>\n <div className='row mx-0 px-2'>\n {integrations.map((integration, index) => {\n return (\n <IntegrationItem\n integration={integration}\n key={index}\n className={props.itemClassName}\n onClick={handlers[integration.id as keyof typeof handlers]}\n />\n );\n })}\n {!props.hideSupportLink &&\n <div className='col-12 text-center'>\n <ExternalLink href={props.contactSupportLink} className='btn btn-link text-info p-0' newTab>\n <Text namespace={namespace} phrase='cantFindIntegration' />\n </ExternalLink>\n </div>\n }\n </div>\n </div>\n </Scrollbars>\n </div>\n );\n}\n\n","// extracted by mini-css-extract-plugin\nexport default {\"integrationIcon\":\"_cwyZ\"};","import { ShareIntegrationsHelper } from 'libs/shared/apps/share/views/share/components/share-integrations/ShareIntegrationsHelper';\n\nexport function getIntegrationHandlers(link: string, onShareAction: () => void): Record<string, () => void> {\n if (!link)\n return {};\n\n return {\n googleClassroom() {\n ShareIntegrationsHelper.launchGoogleClassroom(link);\n\n // Callback must be after launching the popup\n // to prevent firefox from hanging, because our callback makes an API call - Sha\n onShareAction();\n },\n microsoftTeams() {\n ShareIntegrationsHelper.launchMicrosoftTeams(link);\n\n // Callback must be after launching the popup\n // to prevent firefox from hanging, because our callback makes an API call - Sha\n onShareAction();\n }\n };\n}","import React from 'react';\n\nimport { EntityType, LocationContext, SignUpDescriptors, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { ShareHelper } from 'libs/shared/apps/share-v2/utils/ShareHelper';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { InstanceRegion } from 'libs/shared/enums/InstanceRegion';\nimport { BaseObject } from 'libs/shared/interfaces';\n\nimport { Instructions } from 'shared/components/instructions/Instructions';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { AssignDetailsTab, AssingDetailsTabs } from 'apps/assign/components/assign-details/components/assign-details-tabs/AssignDetailsTabs';\n\nimport { IntegrationList } from '../integration-list/IntegrationList';\n\nconst namespace = 'assign.assignIntegrations';\n\nexport interface AssignIntegrationsProps {\n entity: BaseObject;\n joinCode?: string;\n instanceRegion: InstanceRegion;\n contactSupportLink: string;\n onClickTab: (tab: AssignDetailsTab) => void;\n liteUrl: string;\n shareLink: string;\n hideTabs?: AssignDetailsTab[];\n showRequestAccess: boolean;\n onShareAction: () => void;\n}\n\nfunction JoinCodeInstructions() {\n return (\n <Instructions>\n <Instructions.Step number={1}>\n <Text phrase='step1JoinCode' />\n </Instructions.Step>\n <Instructions.Step number={2}>\n <Text phrase='step2JoinCode' />\n </Instructions.Step>\n <Instructions.Step number={3}>\n <Text phrase='step4' />\n </Instructions.Step>\n </Instructions>\n );\n}\n\nfunction SignInInstructions() {\n return (\n <Instructions>\n <Instructions.Step number={1}>\n <Text phrase='step1SignIn' />\n </Instructions.Step>\n <Instructions.Step number={2}>\n <Text phrase='step2SignIn' />\n </Instructions.Step>\n <Instructions.Step number={3}>\n <Text phrase='step3SignIn' />\n </Instructions.Step>\n <Instructions.Step number={4}>\n <Text phrase='step4' />\n </Instructions.Step>\n </Instructions>\n );\n}\n\nfunction RequestFullSchoolAccess(): JSX.Element {\n return (\n <div>\n <p><Text phrase='requestAccessDescription' /></p>\n\n <AppLink\n className='btn btn-outline-dark hover-bg-white'\n appLink={{\n application: AppChannels.SIGN_UP,\n action: Actions.SignUp.UPGRADE\n }}\n analyticsData={{}}\n analyticsOptions={{\n actionType: UserAction.Click,\n location: LocationContext.AssignFlowView,\n entity: EntityType.AppLink,\n descriptor: SignUpDescriptors.Upgrade,\n workflowPhase: WorkflowPhase.Start\n }}\n >\n <Text namespace={namespace} phrase='requestAccess' />\n </AppLink>\n </div>\n );\n}\n\ninterface IntegrationsInstructionsWrapperProps {\n showRequestAccess: boolean;\n joinCode: string;\n}\n\nfunction IntegrationsInstructionsWrapper({\n showRequestAccess,\n joinCode\n}: IntegrationsInstructionsWrapperProps): JSX.Element {\n if (showRequestAccess)\n return <RequestFullSchoolAccess />;\n\n if (joinCode)\n return <JoinCodeInstructions />;\n \n return <SignInInstructions />;\n}\n\nexport function AssignIntegrations(props: AssignIntegrationsProps): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <div>\n <AssingDetailsTabs active='integrations' onClick={props.onClickTab} hideTabs={props.hideTabs} />\n <div className='container-fluid py-3 bg-light rounded-3 p-3'>\n <div className='row gy-4'>\n <div className='col-12 col-lg-5 d-flex flex-column justify-content-center'>\n <IntegrationsInstructionsWrapper showRequestAccess={props.showRequestAccess} joinCode={props.joinCode} />\n </div>\n <div className='col-12 col-lg-7'>\n <IntegrationList\n instanceRegion={props.instanceRegion}\n contactSupportLink={props.contactSupportLink}\n shareLink={ShareHelper.getLink({\n liteUrl: props.liteUrl,\n shareLink: props.shareLink,\n joinCode: props.joinCode\n })}\n onShareAction={props.onShareAction}\n />\n </div>\n </div>\n </div>\n </div>\n </LanguageNamespaceContext.Provider>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { SharedObjectImage } from 'libs/shared/apps/share/components/shared-object-image/SharedObjectImage';\nimport { ShareIntegrationsStack } from 'libs/shared/apps/share/views/share/components/share-integrations/ShareIntegrationsStack';\nimport { SharableEntity } from 'libs/shared/apps/share-v2/utils/ShareViewHelper';\nimport { Divider } from 'libs/shared/components/divider/Divider';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nimport { AssignDetailsTab } from '../assign-details-tabs/AssignDetailsTabs';\n\nimport styles from './assign-overview.scss';\n\nconst namespace = 'assign.assignOverview';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface ShareLinkOptionProps {\n screen: AssignDetailsTab;\n onClick: (screen: AssignDetailsTab) => void;\n}\n\nfunction ShareLinkOption(props: React.PropsWithChildren<ShareLinkOptionProps>): JSX.Element {\n return (\n <button\n className={classNames(\n 'rounded ratio ratio-1x1 border border-light hover-bg-light-blue',\n styles.shareButton\n )}\n onClick={() => props.onClick(props.screen)}\n >\n <div className='d-flex flex-column align-items-center justify-content-center gap-1 p-2 '>\n {props.children}\n </div>\n </button>\n );\n}\n\ninterface AssignOverviewImageProps {\n entity: SharableEntity;\n}\n\nfunction AssignOverviewImage(props: AssignOverviewImageProps): JSX.Element {\n return (\n <div className={classNames('d-flex align-items-center justify-content-center', styles.overviewImage)}>\n <figure\n style={{ backgroundImage: `url(${ImageUrls.Assign.ASSIGN_DETAILS.OVERVIEW_TEXT})` }}\n className={classNames('m-0', styles.text)}\n />\n <figure\n style={{ backgroundImage: `url(${ImageUrls.Assign.ASSIGN_DETAILS.OVERVIEW_BG})` }}\n className={classNames('position-relative m-0', styles.background)}\n >\n <div className={classNames('position-absolute', styles.entity)}>\n <SharedObjectImage\n object={props.entity}\n locationContext={LocationContext.AssignFlowView}\n thumbnailSize='md'\n showVideoCount\n onlyCount\n />\n </div>\n </figure>\n </div>\n );\n}\n\nexport interface AssignOverviewProps {\n entity: SharableEntity;\n onClickTab: (screen: AssignDetailsTab) => void;\n}\n\nexport function AssignOverview(props: AssignOverviewProps): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <div className={classNames('mx-auto', styles.wrapper)}>\n <div className='d-flex flex-column align-items-center text-center mb-4 gap-3'>\n\n <AssignOverviewImage entity={props.entity} />\n\n <h3 className='m-0 d-flex flex-column flex-md-row align-items-center gap-2'>\n <SvgContainer svgName={cvSvgLibrary.Check} className={classNames('d-inline-block svg-container md bg-green rounded-circle text-white')}/>\n <Text phrase='title' />\n </h3>\n <p className='m-0'>\n <Text phrase='description' />\n </p>\n </div>\n \n <Divider text={getPhrase('dividerText')} className='mb-4' noUpperCase />\n\n <div className='d-flex justify-content-center gap-3 flex-wrap'>\n <ShareLinkOption screen='share-link' onClick={props.onClickTab}>\n <SvgContainer svgName={cvSvgLibrary.Link} />\n <Text phrase='shareLink' />\n </ShareLinkOption>\n <ShareLinkOption screen='qr-code' onClick={props.onClickTab}>\n <SvgContainer svgName={cvSvgLibrary.QrCode} />\n <Text phrase='qrCode' />\n </ShareLinkOption>\n <ShareLinkOption screen='embed' onClick={props.onClickTab}>\n <SvgContainer svgName={cvSvgLibrary.Code} />\n <Text phrase='embed' />\n </ShareLinkOption>\n <ShareLinkOption screen='integrations' onClick={props.onClickTab}>\n <span className={classNames('d-inline-flex align-items-center', styles.integrations)}>\n <ShareIntegrationsStack size='sm' noTooltip />\n </span>\n <Text phrase='integrations' />\n </ShareLinkOption>\n </div>\n </div>\n </LanguageNamespaceContext.Provider>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"wrapper\":\"QB4Pm\",\"shareButton\":\"r9K_x\",\"integrations\":\"tTimT\",\"overviewImage\":\"McyhP\",\"text\":\"u6Z4r\",\"background\":\"RtZpT\",\"entity\":\"m6eZK\"};","import React from 'react';\nimport { Button, ButtonProps } from 'react-bootstrap';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { Text } from '../text/Text';\n\nconst namespace = 'shared.fullScreen';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\ninterface FullScreenButtonProps {\n variant?: ButtonProps['variant'];\n text?: string;\n hideIcon?: boolean;\n onClick: () => void;\n}\n\nfunction FsButton(props: FullScreenButtonProps) {\n if (!document.fullscreenEnabled)\n return <></>;\n\n const buttonText = props.text || getPhrase('buttonText');\n \n return (\n <div className='w-100 text-center'>\n <Button variant={props.variant || 'link'} className='d-inline-flex justify-content-center text-info p-0' onClick={props.onClick}>\n <span>{buttonText}</span>\n {!props.hideIcon &&\n <SvgContainer svgName={cvSvgLibrary.NewWindow} />\n }\n </Button>\n </div>\n );\n}\n\ninterface FullScreenProps {\n isFullScreen: boolean;\n controlsRef: React.MutableRefObject<HTMLDivElement>;\n}\n\nexport function FullScreen(props: React.PropsWithChildren<FullScreenProps>) {\n if (!document.fullscreenEnabled)\n return <></>;\n \n function exitFullScreen() {\n document.exitFullscreen();\n }\n \n return (\n <div className={classNames('vw-100 vh-100 bg-white', !props.isFullScreen && 'd-none')} ref={props.controlsRef}>\n <div className='position-absolute top-0 end-0 pe-4 pt-4 z-1'>\n <Button variant='outline-dark' className='d-inline-flex align-items-center gap-1' onClick={exitFullScreen}>\n <Text namespace={namespace} phrase='exitFullScreen' />\n <SvgContainer svgName={cvSvgLibrary.Close} />\n </Button>\n </div>\n {props.children}\n </div>\n );\n}\n\nFullScreen.Button = FsButton;","import React from 'react';\n\nfunction handleFullScreenChange<T extends HTMLElement>(target: T, setIsFullScreen: (fullscreen: boolean) => void) {\n if (document.fullscreenElement === target) {\n setIsFullScreen(true);\n return;\n }\n\n setIsFullScreen(false);\n}\n\nexport function useFullScreenActions<T extends HTMLElement = HTMLDivElement>() {\n const ref = React.useRef<T>(null);\n \n const [ isFullScreen, setIsFullScreen ] = React.useState(false);\n\n const isSupported = document.fullscreenEnabled;\n\n React.useEffect(() => {\n if (!ref.current)\n return;\n\n const onFullScreenChange = () => {\n handleFullScreenChange(ref.current, setIsFullScreen);\n };\n\n ref.current?.addEventListener('fullscreenchange', onFullScreenChange);\n\n return () => ref.current?.removeEventListener('fullscreenchange', onFullScreenChange);\n }, [ref.current]);\n \n function requestFullScreen() {\n if (!ref.current || !isSupported)\n return;\n\n ref.current.requestFullscreen && ref.current.requestFullscreen();\n }\n\n function exitFullScreen() {\n document.exitFullscreen().finally(() => {\n setIsFullScreen(false);\n });\n }\n \n return {\n ref,\n isFullScreen,\n isSupported,\n requestFullScreen,\n exitFullScreen\n };\n}","import React from 'react';\nimport { QRCode } from 'react-qrcode-logo';\n\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { Base64ClickViewLogo } from './images/Base64ClickViewLogo';\n\nimport styles from './qr-code.scss';\n\nexport type QrCodeSizePreset = 'sm' | 'md' | 'lg';\ntype QrCodeSizeCustom = 'custom';\ntype QrCodeSize = QrCodeSizePreset | QrCodeSizeCustom;\n\ninterface BaseQrCodeProps {\n id?: string;\n size: QrCodeSize;\n value: string;\n containerClassName?: string;\n qrRef?: React.MutableRefObject<QRCode>;\n}\n\ninterface DefaultQrCodeProps extends BaseQrCodeProps {\n size: QrCodeSizePreset;\n}\n\ninterface CustomQrCodeProps extends BaseQrCodeProps {\n size: QrCodeSizeCustom;\n customSize: number;\n}\n\ntype QrCodeProps = DefaultQrCodeProps | CustomQrCodeProps;\n\nconst sizeClassMap: {[key in QrCodeSizePreset]: string} = {\n sm: styles.containerSm,\n md: styles.containerMd,\n lg: styles.containerLg\n};\n\nconst qrSizeMap: {[key in QrCodeSize]: number} = {\n sm: 100, // px\n md: 200,\n lg: 400,\n custom: 0\n};\n\nconst OUTER_RADIUS = 10;\nconst INNER_RADIUS = 1;\n\nexport function QrCode(props: QrCodeProps): JSX.Element {\n const qrSize = props.size === 'custom' ? props.customSize : qrSizeMap[props.size];\n const qrSizeClass = props.size === 'custom' ? props.containerClassName : sizeClassMap[props.size];\n\n return (\n <div className={classNames(\n 'position-relative d-flex justify-content-center align-items-center flex-column',\n 'border border-dark rounded-3 bg-white',\n qrSizeClass\n )}>\n <QRCode\n id={props.id || 'cv-qr-code'}\n value={props.value}\n bgColor='white'\n size={qrSize}\n logoImage={Base64ClickViewLogo}\n logoPaddingStyle='circle'\n logoPadding={1}\n eyeRadius={[\n { outer: [ OUTER_RADIUS, 0, 0, 0 ], inner: [ INNER_RADIUS, 0, 0, 0 ]}, // top left\n { outer: [ 0, OUTER_RADIUS, 0, 0 ], inner: [ 0, INNER_RADIUS, 0, 0 ]}, // top right\n { outer: [ 0, 0, 0, OUTER_RADIUS ], inner: [ 0, 0, 0, INNER_RADIUS ]} // bottom left\n ]}\n removeQrCodeBehindLogo\n ref={props.qrRef}\n />\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"containerSm\":\"oAKIc\",\"containerMd\":\"Ml3L5\",\"containerLg\":\"cWnjp\"};","export const Base64ClickViewLogo = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOEAAADhCAMAAAAJbSJIAAAAYFBMVEX////4mB34lhX5qEz4kQD4kwD4lAD+79/4lxf4jwD//vv938L5rFb96NP+9On4lQv6tWf+9/D5pUX8z6D6u3n4nzP82LP5pD/7xo/4nSr6s2X6vX77xpH5rVn5pED/+vVbzc80AAACrElEQVR4nO3di3LTMBSE4R7HDjEF3IaWlmvf/y0RlA4RjWNZHqHZo/97Au1k4m6OZPXqCgAAAAAAAAAAAAAAAAAAAAAAAP/BzW3tFZR2tDe1l1DYbhqua6+hrF1n48faiygqJLTxrvYqSvqV0IZ3b2uvo5zfCW26/1B7IcU8J7Ru/772Skr5k9AO/afaSynkJWF43jzWXksZfxNaf1N7MUWcJLT9w1Pt5RRwmtAmjxUuSmgHhxUuTmgOK9y/Cf1VuFcJ3VW41wm9VbgzCa2bPFW4cwntMDqqcGcTuqpwMwkdVbi5hLY/OpnCzSZ0U+HmE4bnjYsKdyFh+DJ6qHAXE1r/tfb6truc0Hr9CreQ0KbP6o/UpYTWDeIVbjGh/BRuOWH4MkpXuJSE1n+pvcwNkhJKT+HSElp3kK1wiQnD80a1wqUm1J3CpSdUncKtSCg6hVuTMFQ4wSncqoSSG6nrEipO4VYmFJzCrU4oN4Vbn1CtwmUkFKtwOQm1NlKzEoaWqlPh8hKG541MhctNaMNOpMJlJ5SpcPkJVTZSNyQUmcJtSahR4bYlVJjCbUwosJG6NaH1D7UjLOAzXPoEvX8PvT9L3f89dN9pVA74ZSeU2eHP/n0oc0qD3/jnA+6dz2ncz9rcz0vdz7zHb7WXvNLavSeJohZh/zCiMkCMsI9/YpQpahHO07yQ2lCLJCacpIpaJPFs4lGqqEXSzpeKFbUIZ4Qli1qEs/ru37fovysWtUjj7z0JTdTmtfz+oft3SAfhohZp9l1uuYnavDbvVBDZ+kzU4t0mDopapL07hlQnavMau+vLS1GLRHfu/XBS1CIt3ZuocEYtRzP3lypufSZq5B5hza3PRE3c5+2vqEX836vv/38j+P//FgAAAAAAAAAAAAAAAAAAAAAAALJ+AoAWHaLlWtXqAAAAAElFTkSuQmCC';\n","import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { QRCode } from 'react-qrcode-logo';\nimport printJS from 'print-js';\n\nimport { DevError } from 'libs/common/backbone/errors/DevError';\nimport { Core } from 'libs/common/backbone/index';\n\nimport { QrCode, QrCodeSizePreset } from '../QrCode';\n\ninterface PrintOptions {\n id: string;\n name?: string;\n size?: QrCodeSizePreset;\n onDone?: () => void;\n}\n\ninterface DownloadOptions {\n type?: 'png' | 'jpg' | 'webp',\n name?: string;\n size?: QrCodeSizePreset;\n}\n\ninterface QrCodeDownloadProps {\n options: Required<DownloadOptions>;\n value: string;\n onDone?: () => void;\n}\n\nfunction QrCodeDownload(props: QrCodeDownloadProps): JSX.Element {\n const downloadRef = React.useRef<QRCode>();\n React.useEffect(() => {\n const timeout = setTimeout(() => {\n downloadRef.current?.download(props.options.type, props.options.name);\n typeof props.onDone === 'function' && props.onDone();\n }, 200); // Some delay is require for images to load\n\n return () => {\n clearTimeout(timeout);\n };\n }, []);\n \n return (\n <div className='d-none'>\n <QrCode size={props.options.size} value={props.value} qrRef={downloadRef} />\n </div>\n );\n}\n\nexport function useQrCodeActions() {\n const ref = React.useRef<QRCode>();\n const [ isPrinting, setIsPrinting ] = React.useState(false);\n const [ isDownloading, setIsDownloading ] = React.useState(false);\n\n /**\n * We render a different QR Code according to what we need\n */\n function download({ name, size = 'lg', type = 'png' }: DownloadOptions): void {\n if (!ref.current)\n return;\n \n const printRegion = document.getElementById('print-region');\n\n if (!printRegion)\n Core.ErrorHelper.throw(new DevError('Could not find print region in layout'));\n\n const root = createRoot(printRegion);\n\n setIsDownloading(true);\n \n root.render(\n <QrCodeDownload\n options={{ name, size, type }}\n value={ref.current.props.value}\n onDone={() => {\n root.unmount();\n setIsDownloading(false);\n }}\n />\n );\n }\n\n function print({ id, name, size = 'lg', onDone }: PrintOptions) {\n if (!ref.current)\n return;\n \n const printRegion = document.getElementById('print-region');\n\n if (!printRegion)\n Core.ErrorHelper.throw(new DevError('Could not find print region in layout'));\n\n const root = createRoot(printRegion);\n\n root.render(\n <div className='d-none vw-100 vh-100'>\n <div id={id} className='w-100 h-100 d-flex align-items-center justify-content-center'>\n <QrCode size={size} value={ref.current.props.value} />\n </div>\n </div>\n );\n\n setIsPrinting(true);\n\n window.setTimeout(() => {\n printJS({\n printable: id,\n type: 'html',\n documentTitle: name || 'ClickView - QRCode',\n targetStyles: ['*'],\n imageStyle: '*',\n style: '@page { size: A4; margin: 1.5cm 0; }',\n onLoadingEnd: () => {\n typeof onDone === 'function' && onDone();\n setIsPrinting(false);\n root.unmount();\n },\n onError: () => {\n setIsPrinting(false);\n root.unmount();\n }\n });\n }, 200); // Some delay is require for images to load\n }\n\n return { ref, isPrinting, isDownloading, download, print };\n}","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { SharedObjectImage } from 'libs/shared/apps/share/components/shared-object-image/SharedObjectImage';\nimport { SharableEntity } from 'libs/shared/apps/share-v2/utils/ShareViewHelper';\nimport { QrCode } from 'libs/shared/components/qr-code/QrCode';\nimport { QrCodeSizePreset } from 'libs/shared/components/qr-code/QrCode';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\n\nimport { Instructions } from 'shared/components/instructions/Instructions';\n\nimport styles from './assign-full-screen.scss';\n\nconst namespace = 'assign.fullScreen';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface AssignQrDetailsProps {\n value: string;\n}\n\nfunction AssignQrDetails(props: AssignQrDetailsProps): JSX.Element {\n const breakpoints = useBreakpoints();\n\n const size: QrCodeSizePreset = (breakpoints.sm || breakpoints.xs) ? 'md' : 'lg';\n\n return (\n <Row>\n <Col xs={12} md={10} lg={8} xl={6} className='bg-light p-4 rounded mx-auto d-flex flex-column align-items-center'>\n <div className='mb-3 text-center'>\n <span className='fs-3 fw-bold'>\n <Text namespace={namespace} phrase='scanQr' />\n </span>\n </div>\n <QrCode size={size} value={props.value} />\n </Col>\n </Row>\n );\n}\n\ninterface AssignJoinCodeDetailsProps {\n link: string;\n joinCode: string;\n}\n\nfunction AssignJoinCodeDetails(props: AssignJoinCodeDetailsProps): JSX.Element {\n return (\n <Row>\n <Col xs={12} md={8} lg={5} className={'bg-light p-4 d-block rounded mx-auto'}>\n <Instructions>\n <Instructions.Step number={1}>\n <Text namespace={namespace} phrase='goToLink' />\n </Instructions.Step>\n <Instructions.Textbox value={props.link}/>\n <Instructions.Step number={2}>\n <Text namespace={namespace} phrase='enterJoinCode' />\n </Instructions.Step>\n <Instructions.Textbox value={props.joinCode} size='lg' />\n </Instructions>\n </Col>\n </Row>\n );\n}\n\ninterface AssignLinkDetailsProps {\n link: string;\n}\n\nfunction AssignLinkDetails(props: AssignLinkDetailsProps): JSX.Element {\n return (\n <div className='d-flex align-items-center'>\n <div className={classNames('bg-light p-4 d-block rounded mx-auto w-auto', styles.assignLinkDetails)}>\n <Instructions bottomSpacing='none'>\n <Instructions.Textbox label={getPhrase('goToLink')} value={props.link} />\n </Instructions>\n </div>\n </div>\n );\n}\n\ninterface AssignFullScreen {\n entity: SharableEntity;\n locationContext: LocationContext;\n}\n\nexport function AssignFullScreen(props: React.PropsWithChildren<AssignFullScreen>): JSX.Element {\n return (\n <div className='container p-4'>\n <Row>\n <Col>\n <h3 className='text-center'>\n <Text namespace={namespace} phrase='watchVideo' />\n </h3>\n </Col>\n </Row>\n <Row className='mb-4'>\n <Col xs={12} sm={8} md={6} lg={3} className='mx-auto'>\n <SharedObjectImage\n object={props.entity}\n thumbnailSize='md'\n locationContext={props.locationContext}\n showVideoMetadata\n hideBottomBar\n />\n </Col>\n </Row>\n {props.children}\n </div>\n );\n}\n\nAssignFullScreen.QrDetails = AssignQrDetails;\nAssignFullScreen.JoinCode = AssignJoinCodeDetails;\nAssignFullScreen.LinkDetails = AssignLinkDetails;","// extracted by mini-css-extract-plugin\nexport default {\"assignLinkDetails\":\"P4XQf\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { SharableEntity } from 'libs/shared/apps/share-v2/utils/ShareViewHelper';\nimport { FullScreen } from 'libs/shared/components/full-screen/FullScreen';\nimport { useFullScreenActions } from 'libs/shared/components/full-screen/hooks/useFullScreenActions';\nimport { useQrCodeActions } from 'libs/shared/components/qr-code/hooks/useQrCodeActions';\nimport { QrCode } from 'libs/shared/components/qr-code/QrCode';\nimport { SpinnerButton } from 'libs/shared/components/spinner-button/SpinnerButton';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nimport { Instructions } from 'shared/components/instructions/Instructions';\n\nimport { AssignDetailsTab, AssingDetailsTabs } from 'apps/assign/components/assign-details/components/assign-details-tabs/AssignDetailsTabs';\nimport { AssignLogFn } from 'apps/assign/utils/get-assign-event-logger/getAssignEventLogger';\n\nimport { AssignDetailsFlow } from '../../AssignDetails';\nimport { AssignFullScreen } from '../assign-full-screen/AssignFullScreen';\n\nimport styles from './assign-qr-code.scss';\n\nconst namespace = 'assign.assignQrCode';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface AssignQrCodeProps {\n shareLink: string;\n entity: SharableEntity;\n joinCode?: string;\n onClickTab: (tab: AssignDetailsTab) => void;\n flow?: AssignDetailsFlow;\n log?: AssignLogFn;\n hideTabs?: AssignDetailsTab[];\n onShareAction: () => void;\n}\n\nexport function AssignQrCode(props: AssignQrCodeProps): JSX.Element {\n const qrCode = useQrCodeActions();\n const fullScreen = useFullScreenActions();\n const fileName = getPhrase('fileName', { name: props.entity.name });\n \n function getSteps() {\n if (props.joinCode)\n return {\n 1: 'step1',\n 2: 'stepWatchVideo'\n };\n\n return {\n 1: 'step1',\n 2: 'step2SignIn',\n 3: 'stepWatchVideo'\n };\n }\n\n function getQrCodeValue() {\n if (props.joinCode) {\n return `${props.shareLink}?joinCode=${props.joinCode}`;\n }\n\n return props.shareLink;\n }\n\n function onClickDownload() {\n props.log && props.log({\n type: 'download-qr-code',\n entity: props.entity,\n flow: props.flow\n });\n \n qrCode.download({ name: fileName });\n props.onShareAction();\n }\n\n function onClickPrint() {\n props.log && props.log({\n type: 'print-qr-code',\n entity: props.entity,\n flow: props.flow\n });\n\n const name = fileName;\n qrCode.print({\n id: name,\n name: name\n });\n props.onShareAction();\n }\n\n function onClickFullScreen() {\n props.log && props.log({\n type: 'request-full-screen',\n entity: props.entity,\n flow: props.flow,\n tab: 'qr-code'\n });\n fullScreen.requestFullScreen();\n props.onShareAction();\n }\n\n const steps = getSteps();\n const qrValue = getQrCodeValue();\n \n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <div>\n <AssingDetailsTabs active='qr-code' onClick={props.onClickTab} hideTabs={props.hideTabs} />\n <div className={`d-block mx-auto ${styles.container}`}>\n <div className='container-fluid py-3 bg-light rounded-3 p-3'>\n <div className='row gy-4'>\n <div className='col-lg-7 col-12 d-flex flex-column justify-content-center'>\n <Instructions>\n {Object.entries(steps).map(([ step, phrase ]) => (\n <Instructions.Step number={step} key={step}>\n <Text phrase={phrase} />\n </Instructions.Step>\n ))}\n </Instructions>\n <div className='d-flex flex-column flex-md-row gap-2 mb-2'>\n <SpinnerButton\n variant='outline-dark'\n className='w-100'\n showSpinner={qrCode.isPrinting}\n spinnerText={getPhrase('printing')}\n onClick={onClickPrint}\n >\n <Text phrase='printButton' />\n </SpinnerButton>\n <SpinnerButton\n showSpinner={qrCode.isDownloading}\n variant='outline-dark'\n className='w-100'\n onClick={onClickDownload}\n spinnerText={getPhrase('downloading')}\n >\n <Text phrase='downloadButton' />\n </SpinnerButton>\n </div>\n <FullScreen.Button onClick={onClickFullScreen} hideIcon />\n </div>\n <div className='col-lg-5 col-12'>\n <QrCode\n size='md'\n value={qrValue}\n qrRef={qrCode.ref}\n />\n </div>\n </div>\n </div>\n </div>\n </div>\n <FullScreen isFullScreen={fullScreen.isFullScreen} controlsRef={fullScreen.ref}>\n <AssignFullScreen entity={props.entity} locationContext={LocationContext.AssignFlowView}>\n <AssignFullScreen.QrDetails value={qrValue} />\n </AssignFullScreen>\n </FullScreen>\n </LanguageNamespaceContext.Provider>\n );\n}","import React from 'react';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { ShareHelper } from 'libs/shared/apps/share-v2/utils/ShareHelper';\nimport { FullScreen } from 'libs/shared/components/full-screen/FullScreen';\nimport { useFullScreenActions } from 'libs/shared/components/full-screen/hooks/useFullScreenActions';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { BaseObject } from 'libs/shared/interfaces';\n\nimport { Instructions } from 'shared/components/instructions/Instructions';\n\nimport { AssignDetailsTab, AssingDetailsTabs } from 'apps/assign/components/assign-details/components/assign-details-tabs/AssignDetailsTabs';\nimport { AssignLogFn } from 'apps/assign/utils/get-assign-event-logger/getAssignEventLogger';\n\nimport { AssignDetailsFlow } from '../../AssignDetails';\nimport { AssignFullScreen } from '../assign-full-screen/AssignFullScreen';\n\nimport styles from './assign-share-link.scss';\n\nconst namespace = 'assign.assignShareLink';\n\nexport interface AssignShareLinkProps {\n entity: BaseObject;\n liteUrl: string;\n shareLink: string;\n onClickTab: (tab: AssignDetailsTab) => void;\n joinCode?: string;\n flow?: AssignDetailsFlow;\n log?: AssignLogFn;\n hideTabs?: AssignDetailsTab[];\n onShareAction: () => void;\n}\n\ninterface JoinCodeInstructionsProps {\n link: string;\n onShareAction: () => void;\n}\n\nfunction JoinCodeInstructions(props: JoinCodeInstructionsProps) {\n return (\n <Instructions>\n <Instructions.Step number={1}>\n <Text phrase='step1' />\n </Instructions.Step>\n <Instructions.Textbox\n value={props.link}\n showCopyButton\n onCopy={props.onShareAction}\n />\n <Instructions.Step number={2}>\n <Text phrase='endStep' />\n </Instructions.Step>\n </Instructions>\n );\n}\n\ninterface SignInInstructionsProps {\n link: string;\n onShareAction: () => void;\n}\n\nfunction SignInInstructions(props: SignInInstructionsProps): JSX.Element {\n return (\n <Instructions>\n <Instructions.Step number={1}>\n <Text phrase='step1' />\n </Instructions.Step>\n <Instructions.Textbox\n value={props.link}\n showCopyButton\n onCopy={props.onShareAction}\n />\n <Instructions.Step number={2}>\n <Text phrase='step2SignIn' />\n </Instructions.Step>\n <Instructions.Step number={3}>\n <Text phrase='endStep' />\n </Instructions.Step>\n </Instructions>\n );\n}\n\nexport function AssignShareLink(props: AssignShareLinkProps): JSX.Element {\n const fullScreen = useFullScreenActions();\n\n const link = ShareHelper.getLink({\n liteUrl: props.liteUrl,\n shareLink: props.shareLink,\n joinCode: props.joinCode\n });\n\n function onClickFullScreen() {\n typeof props.log === 'function' &&\n props.log({\n type: 'request-full-screen',\n entity: props.entity,\n flow: props.flow,\n tab: 'share-link'\n });\n fullScreen.requestFullScreen();\n props.onShareAction();\n }\n \n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <div>\n <AssingDetailsTabs active='share-link' onClick={props.onClickTab} hideTabs={props.hideTabs} />\n <div className={`bg-light rounded-3 mx-auto py-3 px-sm-5 px-3 d-block ${styles.container}`}>\n {props.joinCode\n ? <JoinCodeInstructions link={link} onShareAction={props.onShareAction} />\n : <SignInInstructions link={link} onShareAction={props.onShareAction} />\n }\n <FullScreen.Button onClick={onClickFullScreen} hideIcon />\n </div>\n </div>\n <FullScreen isFullScreen={fullScreen.isFullScreen} controlsRef={fullScreen.ref}>\n <AssignFullScreen entity={props.entity} locationContext={LocationContext.AssignFlowView}>\n <AssignFullScreen.LinkDetails link={link} />\n </AssignFullScreen>\n </FullScreen>\n </LanguageNamespaceContext.Provider>\n );\n}","import React from 'react';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\nimport { UrlHelper } from 'libs/analytics/utils/UrlHelper';\n\nimport { FullScreen } from 'libs/shared/components/full-screen/FullScreen';\nimport { useFullScreenActions } from 'libs/shared/components/full-screen/hooks/useFullScreenActions';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { BaseObject } from 'libs/shared/interfaces';\n\nimport { Instructions } from 'shared/components/instructions/Instructions';\n\nimport { AssignDetailsTab, AssingDetailsTabs } from 'apps/assign/components/assign-details/components/assign-details-tabs/AssignDetailsTabs';\nimport { AssignLogFn } from 'apps/assign/utils/get-assign-event-logger/getAssignEventLogger';\n\nimport { AssignDetailsFlow } from '../../AssignDetails';\nimport { AssignFullScreen } from '../assign-full-screen/AssignFullScreen';\n\nimport styles from './assign-join-code.scss';\n\nconst namespace = 'assign.assignJoinCode';\n\nexport interface AssignJoinCodeProps {\n entity: BaseObject;\n liteUrl: string;\n shareLink: string;\n onClickTab: (tab: AssignDetailsTab) => void;\n joinCode: string;\n flow?: AssignDetailsFlow;\n log?: AssignLogFn;\n hideTabs?: AssignDetailsTab[];\n onShareAction: () => void;\n}\n\ninterface JoinCodeInstructionsProps {\n playUrl: string;\n joinCode: string;\n onShareAction: () => void;\n}\n\nfunction getDisplayUrl(href: string): string {\n let displayUrl = '';\n try {\n const urlObj = new URL(href);\n displayUrl = urlObj.host + urlObj.pathname;\n } catch (e) {\n // fallback to original if invalid URL\n displayUrl = href;\n }\n\n return displayUrl;\n}\n\nfunction JoinCodeInstructions(props: JoinCodeInstructionsProps) {\n // Use JS URL to remove protocol from props.playUrl\n const displayUrl = getDisplayUrl(props.playUrl);\n \n return (\n <Instructions>\n <Instructions.Step number={1}>\n <Text phrase='step1' options={{ href: props.playUrl, url: displayUrl }} />\n </Instructions.Step>\n <Instructions.Step number={2}>\n <Text phrase='step2' />\n </Instructions.Step>\n <Instructions.Textbox\n value={props.joinCode}\n align='center'\n showCopyButton\n onCopy={props.onShareAction}\n />\n <Instructions.Step number={3}>\n <Text phrase='step3' />\n </Instructions.Step>\n <Instructions.Step number={4}>\n <Text phrase='step4' />\n </Instructions.Step>\n </Instructions>\n );\n}\n\nexport function AssignJoinCode(props: AssignJoinCodeProps): JSX.Element {\n const fullScreen = useFullScreenActions();\n\n const playUrl = UrlHelper.safeUrlConcat(props.liteUrl, '/play');\n\n function onClickFullScreen() {\n typeof props.log === 'function' &&\n props.log({\n type: 'request-full-screen',\n entity: props.entity,\n flow: props.flow,\n tab: 'share-link'\n });\n fullScreen.requestFullScreen();\n props.onShareAction();\n }\n\n if (!props.joinCode)\n return <></>;\n \n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <div>\n <AssingDetailsTabs active='join-code' onClick={props.onClickTab} hideTabs={props.hideTabs} />\n <div className={`bg-light rounded-3 mx-auto py-3 px-sm-5 px-3 d-block ${styles.container}`}>\n <JoinCodeInstructions playUrl={playUrl} joinCode={props.joinCode} onShareAction={props.onShareAction} />\n <FullScreen.Button onClick={onClickFullScreen} hideIcon />\n </div>\n </div>\n <FullScreen isFullScreen={fullScreen.isFullScreen} controlsRef={fullScreen.ref}>\n <AssignFullScreen entity={props.entity} locationContext={LocationContext.AssignFlowView}>\n <AssignFullScreen.JoinCode joinCode={props.joinCode} link={playUrl} />\n </AssignFullScreen>\n </FullScreen>\n </LanguageNamespaceContext.Provider>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { ShareType } from 'libs/shared/apps/share-v2/enums/ShareType';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { SharePincode } from 'libs/shared/apps/share-v2/interfaces/SharePincode';\nimport { SharableEntity, SharableEntityType } from 'libs/shared/apps/share-v2/utils/ShareViewHelper';\nimport { InstanceRegion } from 'libs/shared/enums/InstanceRegion';\n\nimport { AssignDetailsTab } from 'apps/assign/components/assign-details/components/assign-details-tabs/AssignDetailsTabs';\nimport { AssignEmbed, AssignEmbedProps } from 'apps/assign/components/assign-details/components/assign-embed/AssignEmbed';\nimport { AssignIntegrations, AssignIntegrationsProps } from 'apps/assign/components/assign-details/components/assign-integrations/AssignIntegrations';\nimport { AssignOverview, AssignOverviewProps } from 'apps/assign/components/assign-details/components/assign-overview/AssignOverview';\nimport { AssignQrCode, AssignQrCodeProps } from 'apps/assign/components/assign-details/components/assign-qr-code/AssignQrCode';\nimport { AssignShareLink, AssignShareLinkProps } from 'apps/assign/components/assign-details/components/assign-share-link/AssignShareLink';\nimport { AssignLogFn } from 'apps/assign/utils/get-assign-event-logger/getAssignEventLogger';\n\nimport { AssignJoinCode, AssignJoinCodeProps } from './components/assign-join-code/AssignJoinCode';\n\nconst namespace = 'assign.assignDetails';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport type AssignDetailsFlow = 'existing-classroom' | 'open-classroom';\ninterface AssignDetailsProps {\n entityId: string;\n entity: SharableEntity;\n entityType: SharableEntityType;\n share: Share;\n liteUrl: string;\n instanceRegion: InstanceRegion;\n contactSupportLink: string;\n showRequestAccess: boolean;\n sharePincode?: SharePincode;\n initialScreen?: AssignDetailsTab;\n title?: string;\n hideTitle?: boolean;\n log?: AssignLogFn;\n onShareAction: () => void;\n}\n\ntype AllAssignDetailsScreenProps =\n & AssignOverviewProps\n & AssignShareLinkProps\n & AssignQrCodeProps\n & AssignEmbedProps\n & AssignIntegrationsProps\n & AssignJoinCodeProps;\n\nconst AssignDetailsConfig: {[key in AssignDetailsTab]: {\n component: (props: AllAssignDetailsScreenProps) => JSX.Element;\n}} = {\n 'overview': { component: AssignOverview },\n 'share-link': { component: AssignShareLink },\n 'qr-code': { component: AssignQrCode },\n 'embed': { component: AssignEmbed },\n 'integrations': { component: AssignIntegrations },\n 'join-code': { component: AssignJoinCode }\n};\n\nconst ShareTypeFlowMap: {[key in ShareType]?: 'existing-classroom' | 'open-classroom'} = {\n [ShareType.Open]: 'open-classroom',\n [ShareType.Classroom]: 'existing-classroom'\n};\n\nexport function AssignDetails(props: AssignDetailsProps): JSX.Element {\n const [ screen, setScreen ] = React.useState<AssignDetailsTab>(props.initialScreen ?? 'share-link');\n\n const shouldHideTitle = props.hideTitle || screen === 'overview';\n const hideTabs: AssignDetailsTab[] = [];\n if (!props.sharePincode?.code)\n hideTabs.push('join-code');\n\n const data: AllAssignDetailsScreenProps = {\n entity: props.entity,\n onClickTab: setScreen,\n entityId: props.entityId,\n entityType: props.entityType,\n liteUrl: props.liteUrl,\n instanceRegion: props.instanceRegion,\n joinCode: props.sharePincode?.code,\n shareId: props.share.shareId,\n embedUrl: props.share.link.shortenedEmbedUrl,\n shareLink: props.share.link.shortenedUrl,\n contactSupportLink: props.contactSupportLink,\n flow: ShareTypeFlowMap[props.share.type],\n log: props.log,\n hideTabs,\n showRequestAccess: props.showRequestAccess,\n onShareAction: props.onShareAction,\n shareType: props.share.type\n };\n \n const Component = AssignDetailsConfig[screen].component;\n\n const title = props.title || getPhrase('title');\n \n return (\n <div className='d-flex flex-column align-items-center justify-content-center py-3 gap-4'>\n {!shouldHideTitle &&\n <h3 className='mb-0'><span>{title}</span></h3>\n }\n \n <Component {...data} />\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"container\":\"HrK3n\"};","// extracted by mini-css-extract-plugin\nexport default {\"container\":\"OCQzr\"};","// extracted by mini-css-extract-plugin\nexport default {\"container\":\"MdqeM\"};","import React from 'react';\n\nimport { AppLinkHelper } from 'libs/common/backbone/core';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\n\nimport { EntityType, LocationContext, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { SharePrivacy } from 'libs/shared/apps/share-v2/enums/SharePrivacy';\nimport { ShareRequests } from 'libs/shared/apps/share-v2/flight-requests/ShareRequests';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { SharePincode } from 'libs/shared/apps/share-v2/interfaces/SharePincode';\nimport { SharableEntityType } from 'libs/shared/apps/share-v2/utils/ShareViewHelper';\nimport { MultiStepPopupViewProps } from 'libs/shared/components/multistep-popup/MultiStepPopup';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { Text } from 'libs/shared/components/text/Text';\n\nimport { useClassroomExperience } from 'shared/hooks/useClassroomExperience';\nimport { getInsightsOverviewAppLink } from 'shared/utils/ObjectAppLinkHelper';\n\nimport { AssignDetails } from 'apps/assign/components/assign-details/AssignDetails';\nimport { AssignDetailsTab } from 'apps/assign/components/assign-details/components/assign-details-tabs/AssignDetailsTabs';\nimport { FlowControls } from 'apps/assign/components/flow-controls/FlowControls';\nimport { useAssignSharedData } from 'apps/assign/hooks/useAssignSharedData';\nimport { AssignHelper } from 'apps/assign/utils/AssignHelper';\nimport { getAssignEventLogger } from 'apps/assign/utils/get-assign-event-logger/getAssignEventLogger';\n\nconst namespace = 'assign.assignDetailsView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface AssignDetailsViewProps extends MultiStepPopupViewProps {\n objectId: string;\n entityType: SharableEntityType;\n shareId: string;\n initialDetailsScreen?: AssignDetailsTab;\n detailsTitle?: string;\n goToSelectClassroom?: () => void;\n}\n\nexport function AssignDetailsView(\n props: AssignDetailsViewProps\n) {\n const fetch = Flight.useGetFetch();\n\n const { experience } = useClassroomExperience();\n\n const { config, loaded, entity, currentUser } = useAssignSharedData({\n entityType: props.entityType,\n objectId: props.objectId\n });\n\n const { log } = getAssignEventLogger({\n data: {\n entity: {\n id: props.objectId,\n type: props.entityType\n }\n },\n analyticsOptions: {\n entity: EntityType.Assign,\n location: LocationContext.Popup\n }\n });\n\n const share = Flight.useBasicFetch<Share>(ShareRequests.getShare(props.shareId));\n \n const isPincodePrivacy = share.data?.privacy === SharePrivacy.PinCode;\n const pincode = Flight.useBasicFetch<SharePincode>(\n isPincodePrivacy && ShareRequests.getPincodeByShareId(props.shareId)\n );\n\n function onClickBack() {\n log({\n type: 'close-assign-popup',\n share: share.data\n }, {\n workflowPhase: WorkflowPhase.Complete\n });\n \n props.closePopup();\n }\n \n function onClickNext() {\n const appLink = getInsightsOverviewAppLink(share.data);\n\n if (!appLink)\n return;\n\n log({\n type: 'view-assignment',\n share: share.data\n });\n\n AppLinkHelper.trigger(appLink);\n props.closePopup();\n }\n\n function onShareAction() {\n fetch(ShareRequests.updateDateShared(props.shareId));\n }\n\n const initialScreen: AssignDetailsTab = props.initialDetailsScreen || 'overview';\n\n const contactSupportLink = AssignHelper.getContactSupportUrl(\n config.data?.marketingSiteUrl,\n currentUser.data?.instanceRegion\n );\n \n\n const showLoadingSpinner = (\n !loaded ||\n props.loading ||\n !share.data ||\n (isPincodePrivacy && !pincode.data)\n );\n\n const leftComponent = props.goToSelectClassroom && (\n <button className='btn btn-link text-info' onClick={props.goToSelectClassroom}>\n <Text namespace={namespace} phrase='assignAnother' />\n </button>\n );\n\n return (\n <Popup\n size='lg'\n showLoadingSpinner={showLoadingSpinner}\n closePopup={props.closePopup}\n bodyClassName='d-flex flex-column gap-3'\n animation={props.animate}\n hideTitle\n >\n <AssignDetails\n title={props.detailsTitle}\n entityId={props.objectId}\n entityType={props.entityType}\n share={share.data}\n sharePincode={pincode.data}\n entity={entity.data}\n liteUrl={config.data.liteUrl}\n instanceRegion={currentUser.data.instanceRegion}\n initialScreen={props.initialDetailsScreen || initialScreen}\n contactSupportLink={contactSupportLink}\n log={log}\n showRequestAccess={experience === 'minimal'}\n onShareAction={onShareAction}\n />\n <FlowControls\n backButtonText={getPhrase('backButtonText')}\n nextButtonText={getPhrase('nextButtonText')}\n onClickBack={onClickBack}\n onClickNext={onClickNext}\n hideCreateClassroomButton\n leftComponent={leftComponent}\n />\n </Popup>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"orderedListWithBackground\":\"ezbBL\",\"number\":\"hs0Fv\",\"code\":\"h0c9p\",\"large\":\"_leUV\",\"success\":\"f_XNL\"};","import React from 'react';\nimport CopyToClipboard from 'react-copy-to-clipboard';\n\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './instructions.scss';\n\nconst COPY_TIMEOUT = 2000;\n\nconst namespace = 'shared.instructions';\n\ninterface BoxOverlayProps {\n show: boolean;\n text?: string;\n}\n\nfunction BoxOverlay(props: BoxOverlayProps): JSX.Element {\n return (\n <div className={classNames(\n styles.success,\n 'col-12 position-absolute w-100 h-100 start-0 top-0',\n 'd-inline-flex align-items-center text-white justify-content-center text-truncate bg-success fs-3',\n props.show ? 'opacity-1' : 'opacity-0'\n )}>\n {props.text ?? <Text namespace={namespace} phrase='copied' />}\n </div>\n );\n}\n\ninterface StepProps {\n number: number | string;\n}\n\nfunction Step(props: React.PropsWithChildren<StepProps>): JSX.Element {\n return (\n <li className='d-flex align-items-center'>\n <div className='align-self-start'>\n <span className={`${styles.number}`}>{props.number}</span>\n </div>\n <div className='w-100'>\n {props.children}\n </div>\n </li>\n );\n}\n\ninterface CodeProps {\n code: string;\n className?: string;\n size: 'md' | 'lg';\n}\n\nfunction Code(props: CodeProps): JSX.Element {\n const [ copied, setCopied ] = React.useState(false);\n\n function onCopy(): void {\n setCopied(true);\n\n setTimeout(() => setCopied(false), COPY_TIMEOUT);\n }\n\n return (\n <CopyToClipboard onCopy={onCopy} text={props.code}>\n <div className={classNames(\n `position-relative bg-white border rounded-3 text-center overflow-hidden fw-semibold cursor-pointer ${styles.code}`,\n props.size === 'lg' && `py-3 ${styles.large}`,\n props.size === 'md' && 'py-2',\n props.className\n )}>\n {props.code}\n <SvgContainer\n svgName={cvSvgLibrary.Copy}\n size={SvgContainerSize.Large}\n className='ms-2 svg-container d-inline-block lg align-middle'\n />\n <BoxOverlay show={copied} />\n </div>\n </CopyToClipboard>\n );\n}\n\ninterface TextboxProps {\n value: string;\n label?: string;\n className?: string;\n showCopyButton?: boolean;\n copiedText?: string;\n onCopy?: () => void;\n align?: 'left' | 'center';\n size?: 'sm' | 'lg'\n}\n\nfunction Textbox(props: TextboxProps): JSX.Element {\n const { size = 'sm' } = props;\n\n const [ copied, setCopied ] = React.useState<boolean>(false);\n \n function onCopy(): void {\n if (!props.showCopyButton)\n return;\n\n setCopied(true);\n\n typeof props.onCopy === 'function' && props.onCopy();\n\n setTimeout(() => setCopied(false), COPY_TIMEOUT);\n }\n \n let textClassName = props.showCopyButton ? 'text-left cursor-pointer' : 'text-center';\n const buttonClassName = props.align === 'left' ? 'col-1' : '';\n if (props.align === 'center') {\n textClassName = '';\n }\n\n return (\n <CopyToClipboard onCopy={onCopy} text={props.value}>\n <div>\n {props.label && <h3 className='mb-3 text-center'>{props.label}</h3>}\n <div className={classNames(\n 'bg-white border rounded-3 overflow-hidden px-4 py-3 text-truncate mb-0',\n 'position-relative align-items-center gx-2 gy-0',\n size === 'sm' ? 'h5' : 'h1',\n props.align === 'left' ? 'row' : 'd-flex justify-content-center gap-3',\n props.showCopyButton ? 'text-left cursor-pointer' : 'text-center',\n props.className\n )}>\n <div className={classNames(\n textClassName,\n 'text-truncate'\n )}>\n {props.value}\n </div>\n {props.showCopyButton &&\n <div className={classNames(buttonClassName)}>\n <SvgContainer\n svgName={cvSvgLibrary.Copy}\n size={SvgContainerSize.Standard}\n className='svg-container d-inline-block std'\n onClick={onCopy}\n />\n </div>\n }\n {props.showCopyButton &&\n <BoxOverlay show={copied} />\n }\n </div>\n </div>\n </CopyToClipboard>\n );\n}\n\ntype InstructionsSpacing = 'none' | 'sm' | 'md' | 'lg';\n\ninterface InstructionsProps {\n spacing?: InstructionsSpacing;\n bottomSpacing?: InstructionsSpacing;\n className?: string;\n}\n\nconst bottomSpacingMap: {[key in InstructionsSpacing]: string} = {\n none: 'mb-0',\n md: 'mb-3',\n sm: 'mb-2',\n lg: 'mb-4'\n};\n\nconst itemSpacingMap: {[key in InstructionsSpacing]: string} = {\n none: '',\n sm: 'gap-2',\n md: 'gap-3',\n lg: 'gap-4'\n};\n\nexport function Instructions(props: React.PropsWithChildren<InstructionsProps>): JSX.Element {\n return (\n <ol className={classNames(\n 'd-flex flex-column',\n bottomSpacingMap[props.bottomSpacing || 'md'],\n itemSpacingMap[props.spacing || 'md'],\n styles.orderedListWithBackground,\n props.className\n )}>\n {props.children}\n </ol>\n );\n}\n\nInstructions.Step = Step;\nInstructions.Code = Code;\nInstructions.Textbox = Textbox;","import { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\n\ntype ClassroomExperience = 'none' | 'minimal' | 'full';\n\nexport function useClassroomExperience() {\n const { hasShareFlowV2, hasClassrooms, isLoadingSettings } = useSettings(null);\n const { hasPermissions, isLoaded, getGatedPermission } = usePermissions();\n\n function getExperience(): ClassroomExperience {\n if (!hasClassrooms)\n return 'none';\n\n if (getGatedPermission(PermissionName.ViewClassrooms) === 'soft-gate')\n return 'minimal';\n\n if (hasPermissions(PermissionName.ViewClassrooms))\n return 'full';\n \n if (hasShareFlowV2)\n return 'minimal';\n }\n\n return {\n experience: getExperience(),\n loading: isLoadingSettings || !isLoaded\n };\n}"],"names":["SharePrivacy","ShareViewHelper","canEmbed","type","includes","canAddPolicies","getEnabledIntegrations","googleClassroomSetting","msftTeamsSetting","filter","i","enabled","map","id","getShareSettingsInitialValues","share","interactive","preventScrubbing","options","immediateFeedback","getEnabledSettingsField","entityType","showImmediateFeedbackField","showPreventScrubbingField","getSharableEntityType","objectTypeId","getFetchFunctionByType","getAnalyticsEntity","getAnalyticsOptions","namespace","BASE_IMAGE_CLASS_NAME","InsightsMask","className","SharedObjectImage","props","ref","el","object","fixedHeight","style","width","offsetHeight","VideoHelper","typeId","MasterType","useVideoThumbnail","image","ImageHelper","imageType","imageClassName","imageFallbackComponent","ImageFallback","svgContainerClassName","url","getBgColorClass","name","extraClasses","getImageProps","thumbnailMetadata","showVideoMetadata","hideBottomBar","hideDuration","hideMask","hideRating","hideVideoBadgeType","showInsightsMask","AppLink","appLink","VideoThumbnail","video","size","thumbnailSize","imageOptions","textPosition","ThumbnailTextPosition","requireMarking","Text","phrase","smartCount","CollectionThumbnail","collection","analyticsData","analyticsOptions","entity","actionType","location","locationContext","showMask","showCollectionMask","showVideoCount","onlyCount","BaseImage","data","defaultProps","POPUP_FEATURES","ShareIntegrationsHelper","launchGoogleClassroom","link","launchMicrosoftTeams","href","preview","referrer","s","Date","now","getPhrase","LanguageService","buildStyle","content","text","noUpperCase","Divider","BaseCollectionThumbnailTitle","title","CollectionThumbnailTitle","firstVideo","collectionVideos","videos","count","playlist","clips","interactives","ArrayHelper","getFirstVideo","videoCount","totalCount","getVideoCount","showTexts","length","subText","toString","MasterTypeHelper","preventFocus","SvgContainer","svgName","hoverText","hideVideoTypeBadge","TitleSubText","subTextAppLink","titleAppLink","getEventLogger","getData","logAnalyticsOptions","logDataConfig","config","isValid","mergedData","logBaseData","baseData","log","shouldLog","analytics","FlowControls","hideBackButton","onClickBack","hideNextButton","onClickNext","hideCreateClassroomButton","onClickCreateClassroom","leftComponent","variant","onClick","backButtonText","nextButtonTooltip","disable","placement","spanHack","nextButtonText","disabled","disableNextButton","showSpinner","useAssignSharedData","currentUser","objectId","interactiveId","hasPermissions","getGatedPermission","isLoaded","hasStudentExp","canCreateClassrooms","openClassroomGatedPermission","loaded","AssignHelper","getRecipients","entities","e","getLearnersForGroups","groups","learners","reduce","prev","curr","users","getSelectedEntities","selectedEntities","find","getContactSupportUrl","marketingUrl","instanceRegion","path","isValidShare","getLogDataConfig","workflowPhase","descriptor","eventVersion","classroom","getAssignEventLogger","TabItem","active","tab","children","TabIconAndPhraseMap","AvailableTabs","AssingDetailsTabs","enabledTabs","hideTabs","icon","key","ShareIntegrationsStack","noTooltip","JoinCodeInstructions","Instructions","number","SignInInstruction","IntegrationItem","Tag","undefined","integration","target","rel","backgroundImage","IntegrationList","onShareAction","handlers","shareLink","googleClassroom","microsoftTeams","integrations","item","valid","instanceRegions","autoHeight","autoHeightMax","maxHeight","index","itemClassName","hideSupportLink","ExternalLink","contactSupportLink","newTab","SignInInstructions","RequestFullSchoolAccess","application","action","IntegrationsInstructionsWrapper","showRequestAccess","joinCode","ShareLinkOption","screen","AssignOverviewImage","ImageUrls","FullScreen","document","fullscreenEnabled","isFullScreen","controlsRef","Button","exitFullscreen","useFullScreenActions","setIsFullScreen","isSupported","current","onFullScreenChange","fullscreenElement","handleFullScreenChange","addEventListener","removeEventListener","requestFullScreen","requestFullscreen","exitFullScreen","buttonText","hideIcon","sizeClassMap","sm","md","lg","qrSizeMap","custom","QrCode","qrSize","customSize","qrSizeClass","containerClassName","QRCode","value","bgColor","logoImage","logoPaddingStyle","logoPadding","eyeRadius","outer","inner","removeQrCodeBehindLogo","qrRef","QrCodeDownload","downloadRef","timeout","setTimeout","download","onDone","clearTimeout","AssignFullScreen","Row","Col","xs","QrDetails","breakpoints","useBreakpoints","xl","JoinCode","LinkDetails","bottomSpacing","label","showCopyButton","onCopy","displayUrl","urlObj","URL","host","pathname","getDisplayUrl","playUrl","align","AssignDetailsConfig","component","onClickTab","fullScreen","ShareHelper","liteUrl","flow","isPrinting","setIsPrinting","isDownloading","setIsDownloading","qrCode","printRegion","getElementById","DevError","root","render","unmount","print","window","printable","documentTitle","targetStyles","imageStyle","onLoadingEnd","onError","fileName","steps","qrValue","Object","entries","step","SpinnerButton","spinnerText","CopyEmbedHtml","embedUrl","entityId","shareId","hideLabel","hasInputBg","embedDetails","shareType","styling","UrlHelper","ShareTypeFlowMap","ShareType","AssignDetails","initialScreen","setScreen","shouldHideTitle","hideTitle","sharePincode","code","push","shortenedEmbedUrl","shortenedUrl","Component","AssignDetailsView","fetch","experience","useClassroomExperience","ShareRequests","isPincodePrivacy","privacy","pincode","initialDetailsScreen","marketingSiteUrl","showLoadingSpinner","loading","goToSelectClassroom","Popup","closePopup","bodyClassName","animation","animate","detailsTitle","BoxOverlay","show","bottomSpacingMap","none","itemSpacingMap","spacing","Step","Code","copied","setCopied","S","Textbox","textClassName","buttonClassName","hasShareFlowV2","hasClassrooms","isLoadingSettings"],"sourceRoot":""}
@@ -1,2 +0,0 @@
1
- "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[9911],{41196:(e,t,n)=>{n.d(t,{W:()=>o});var r=n(20354),a=n(93479),i=n(20768),s=n(31949);function o(e,t,n){var o,l=r.a.useBasicFetch(s.N.currentUser()),u=r.a.useBasicFetch(!!e&&i.b.interactiveMetadata(e)),d=r.a.useBasicFetch(!!(null===(o=u.data)||void 0===o?void 0:o.interactiveId)&&i.b.interactive(u.data.interactiveId)),c=!!l.data&&!!d.data;return r.a.useBasicFetch(c&&a.I.interactiveResultSet(u.data.interactiveId,u.data.id,l.data,t,n))}},3218:(e,t,n)=>{n.d(t,{R:()=>k});var r=n(32735),a=n(69087),i=n(26136),s=n(39157),o=n(69186),l=n(86572),u=n(28972),d=n(83140),c=n(80845),m=n(23481),f=n(2102),v=n(36532),b=m.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},b("close")),!!e.interactionsToMark.length&&r.createElement(r.Fragment,null,e.isDemo?r.createElement(v.u,{id:"submitAnswers",title:b("demoOnly"),spanHack:!0,spanHackClassName:"d-inline-flex"},r.createElement("button",{className:"btn btn-outline-dark pointer-events-none",disabled:!t},b("submitAnswers"))):r.createElement(f.m,{variant:"outline-dark",onClick:e.onClickSubmit,disabled:!t,showSpinner:e.showSubmitButtonSpinner},b("submitAnswers")))))}var h=m.T.encloseNamespace("interactives.studentResponseList");function p(e){var t=Object.keys(e.markedAnswers).length;return r.createElement("div",{className:"d-flex justify-content-between pb-3"},r.createElement("div",{className:"d-flex"},!!e.summary.unanswered&&r.createElement("div",{className:"bg-light rounded p-2 me-2"},r.createElement("strong",{className:"me-2"},h("unanswered")),e.summary.unanswered),r.createElement("div",{className:"bg-light rounded p-2 me-2"},r.createElement("strong",{className:"me-2"},h("score")),e.summary.awaitingMarking?r.createElement("em",null,h("pending")):"".concat(Math.round(100*e.summary.percentCorrect),"%"))),!!e.interactionsToMark.length&&r.createElement(r.Fragment,null,e.isDemo?r.createElement(v.u,{id:"submitAnswers",title:h("demoOnly"),spanHack:!0},r.createElement("button",{className:"btn btn-outline-dark pointer-events-none",disabled:!t},h("submitAnswers"))):r.createElement(f.m,{variant:"outline-dark",onClick:e.onClickSubmit,disabled:!t,showSpinner:e.showSubmitButtonSpinner},h("submitAnswers"))))}const g={awaitingMarking:"MvGb5"};function w(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,i,s,o=[],l=!0,u=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(r=i.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&&(s=n.return(),Object(s)!==s))return}finally{if(u)throw a}}return o}}(e,t)||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}}(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 S(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function k(e){var t,n,m,f,v=w(r.useState(!1),2),b=v[0],h=v[1],S=(t=r.useRef(null),n=w(r.useState(!1),2),m=n[0],f=n[1],r.useEffect(function(){t.current&&!m&&(f(!0),requestAnimationFrame(function(){return t.current.scrollIntoView({behavior:"smooth",block:"center"})}))},[t.current,m]),t),k=(0,s.Rt)(e.interactive,e.studentResults),A=(0,c.Q)(e.interactive),C=function(e,t){return e.filter(function(e){return d.A.isInteractionCorrect(e,(0,c.j_)(t))===u.w.AwaitingMarking})}(A,e.studentResults);function I(){h(!0),e.submitMarkedAnswers()}return r.createElement(r.Fragment,null,r.createElement(p,{summary:k,interactionsToMark:C,markedAnswers:e.markedAnswers,onClickSubmit:I,showSubmitButtonSpinner:b,isDemo:e.isDemo}),r.createElement("ul",{className:"list-unstyled"},A.map(function(t,n){var u,d=t.id.toString()===(null===(u=e.selectedInteractionId)||void 0===u?void 0:u.toString()),c=C.some(function(e){return e.id===t.id}),m=(0,i.B)(e.studentResults.user,e.anonymiseUsers),f="p-2 mb-3 rounded";return d&&(f+=" border-2 border-info shadow"),f+=c?" ".concat(g.awaitingMarking):" border",r.createElement("li",{key:n,className:f,ref:d?S:null},r.createElement("div",{className:"d-flex mb-2"},r.createElement(l.y,{interaction:t,iconClassName:"flex-shrink-0"})),e.reportsStyling?r.createElement(o.O,{interaction:t,studentResults:e.studentResults,markedStatus:(0,s.HI)(t.id,e.studentResults,e.markedAnswers),markInteraction:e.addMarkedAnswers,imageCdnUrl:e.imageCdnUrl,anonymisedUserName:m,className:"bg-light ps-2",showFeedback:!0,reportsStyling:!0,responseComponentClass:"mx-n2"}):r.createElement(a.d,{interaction:t,studentResults:e.studentResults,markedStatus:(0,s.HI)(t.id,e.studentResults,e.markedAnswers),markInteraction:e.addMarkedAnswers,imageCdnUrl:e.imageCdnUrl,anonymisedUserName:m,showFeedback:!0}))})),r.createElement(y,{interactionsToMark:C,markedAnswers:e.markedAnswers,onClickSubmit:I,onClickClose:e.onClickClose,showSubmitButtonSpinner:b,isDemo:e.isDemo}))}},94644:(e,t,n)=>{n.d(t,{r:()=>d});var r=n(50242),a=n(81886),i=n(67058),s=n(14553),o=n(49267),l=n(49075),u={notFound:i.d,forbidden:{rating:s.q,yearLevel:s.q,region:o.a,privacy:s.q},badRequest:l._,internalServerError:l._};function d(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 i;i="number"==typeof e?e:e.status;var s=Object.assign(Object.assign({},u),t);i&&a.Q.Ry.isStatusCodeError(i)&&(i!==r.o.InternalServer?i!==r.o.NotFound?i!==r.o.Forbidden?n.badRequest||a.Q.Ry.throw(new s.badRequest):n.forbidden||a.Q.Ry.throw(new s.forbidden.privacy):n.notFound||a.Q.Ry.throw(new s.notFound):n.internalServerError||a.Q.Ry.throw(new l._))}}},91286:(e,t,n)=>{n.d(t,{v:()=>s});var r=n(32735),a=n(94644);function i(e){return e.map(function(e){return e.statusCode}).join(":")}function s(e,t,n){var s=Array.isArray(e)?e:[e];(0,r.useEffect)(function(){s.forEach(function(e){(0,a.r)(e.statusCode,t,n)})},[i(s),t,n])}},9447:(e,t,n)=>{n.d(t,{Y:()=>s});var r=n(20354),a=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 s(e){var t,n=r.a.useBasicFetch(a.o.getAnonSessions(e));return{items:(null===(t=n.data)||void 0===t?void 0:t.reduce(function(e,t){return Object.assign(Object.assign({},e),(n={},r=t.sessionId,a={sessionId:(s=t).sessionId,name:s.sessionName},(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,s},{}))||{},hasCompleted:n.hasCompleted,isFetching:n.isFetching}}},5780:(e,t,n)=>{n.d(t,{p:()=>u});var r=n(20354),a=n(2510),i=n(18488),s=n(4594),o=n(3010),l=n(88630);function u(e){var t,n,u,d,c=r.a.useGetFetch(),m=r.a.useBasicFetch(i.o.getShare(e)),f=(null===(t=m.data)||void 0===t?void 0:t.type)===a.y.Classroom&&(null===(d=null===(u=null===(n=m.data)||void 0===n?void 0:n.recipients)||void 0===u?void 0:u.find(function(e){return e.recipientTypeId===s.E.Classroom}))||void 0===d?void 0:d.recipientId),v=function(e){return l.F.getClassroomStudents(f,e)},b=(0,o.i)(f&&v,function(e){return c(v(e))});return Object.assign(Object.assign({},b),{hasCompleted:!f||b.hasCompleted})}},52389:(e,t,n)=>{n.d(t,{_:()=>v});var r=n(2948),a=n(20354),i=n(41196),s=n(18488),o=n(38143),l=n(91286),u=n(9447),d=n(5780);function c(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}}function m(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var f=[{id:"0",attempts:[{id:"0",answeredAt:0,answers:[]}]}];function v(e){var t,n,v,b,y=(v=(0,r.D)(o.g.HIDE_STAFF_RESULTS),b=1,function(e){if(Array.isArray(e))return e}(v)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,i,s,o=[],l=!0,u=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(r=i.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&&(s=n.return(),Object(s)!==s))return}finally{if(u)throw a}}return o}}(v,b)||c(v,b)||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],h=a.a.useBasicFetch(s.o.getShare(e)),p=(0,i.W)(null===(t=h.data)||void 0===t?void 0:t.objectId,null,e),g=(0,u.Y)(e),w=(0,d.p)(e);(0,l.v)(p);var S=p.hasCompleted&&g.hasCompleted&&w.hasCompleted;if(!S)return{data:null,hasCompleted:!1};var k=new Set,A=p.data.students.map(function(e){var t,n=null===(t=e.user)||void 0===t?void 0:t.userType;return y&&1===n?null:e.user?(k.add(e.user.id),e):Object.assign(Object.assign({},e),{user:g.items[e.sessionId]||{sessionId:e.sessionId}})}).filter(function(e){return!!e});return(null===(n=null==w?void 0:w.items)||void 0===n?void 0:n.length)&&A.push.apply(A,function(e){return function(e){if(Array.isArray(e))return m(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||c(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}(w.items.filter(function(e){return!k.has(e.id)}).map(function(e){return{user:e,results:f,isPlaceholder:!0}}))),{hasCompleted:S,isFetching:h.isFetching||p.isFetching||g.isFetching||w.isFetching,data:Object.assign(Object.assign({},p.data),{students:A})}}},2900:(e,t,n)=>{n.r(t),n.d(t,{InsightsStudentResultsView:()=>g});var r=n(32735),a=n(23481),i=n(20354),s=n(2948),o=n(9193),l=n(26136),u=n(18488),d=n(3218),c=n(9111),m=n(38143),f=n(39151),v=n(20768),b=n(91286),y=n(52389);function h(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 p=a.T.encloseNamespace("shared.insightsStudentResults");function g(e){var t,n,a,g,w,S,k,A=(S=(0,s.D)(m.g.ANONYMISE_USERS),k=1,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,i,s,o=[],l=!0,u=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(r=i.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&&(s=n.return(),Object(s)!==s))return}finally{if(u)throw a}}return o}}(S,k)||function(e,t){if(e){if("string"==typeof e)return h(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)?h(e,t):void 0}}(S,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],C=i.a.useBasicFetch(f.L.config()),I=i.a.useBasicFetch(u.o.getShare(e.shareId)),E=i.a.useBasicFetch((null===(t=I.data)||void 0===t?void 0:t.objectId)&&v.b.interactiveMetadata(I.data.objectId)),j=i.a.useBasicFetch((null===(n=E.data)||void 0===n?void 0:n.interactiveId)&&v.b.interactive(E.data.interactiveId)),F=(0,y._)(e.shareId);(0,b.v)([I,j,E]);var R=(0,o.D)(null===(a=j.data)||void 0===a?void 0:a.id,null===(g=E.data)||void 0===g?void 0:g.id,e.closePopup),N=R.markedAnswers,O=R.addMarkedAnswers,M=R.submitMarkedAnswers,B=null===(w=F.data)||void 0===w?void 0:w.students.find(function(t){var n,r,a,i,s;return e.userId?(null===(r=null===(n=t.user)||void 0===n?void 0:n.id)||void 0===r?void 0:r.toString())===(null===(a=e.userId)||void 0===a?void 0:a.toString()):!!e.sessionId&&(null===(i=t.sessionId)||void 0===i?void 0:i.toString())===(null===(s=e.sessionId)||void 0===s?void 0:s.toString())}),T=B?p("heading",{studentName:(0,l.B)(B.user,A)}):"",U=C.hasCompleted&&I.hasCompleted&&E.hasCompleted&&j.hasCompleted&&F.hasCompleted;return r.createElement(c.G,{title:T,showLoadingSpinner:!U,closePopup:e.closePopup,size:"lg"},U&&r.createElement(d.R,{interactive:j.data,studentResults:B,markedAnswers:N,addMarkedAnswers:O,submitMarkedAnswers:M,imageCdnUrl:C.data.imageCdnUrl,selectedInteractionId:e.interactionId,onClickClose:e.closePopup,anonymiseUsers:A}))}}}]);
2
- //# sourceMappingURL=9911-9272b96e46-lite.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/9911-9272b96e46-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/analytics/hooks/UseFetchInteractiveResults.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/projects/lite/src/apps/my-shares/hooks/useAnonSessions.ts","file:///app/packages/projects/lite/src/apps/my-shares/hooks/useInsightsClassroomStudents.ts","file:///app/packages/projects/lite/src/apps/my-shares/hooks/useInsightsInteractiveResults.ts","file:///app/packages/projects/lite/src/apps/my-shares/views/interactive/insights-student-results/InsightsStudentResultsView.tsx"],"sourcesContent":["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 shareId?: string\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;\n\n return Flight.useBasicFetch<InteractiveResultSet>(shouldFetchResults &&\n InteractiveResultsRequests.interactiveResultSet(\n interactiveMetadata.data.interactiveId,\n interactiveMetadata.data.id,\n currentUser.data,\n requestFilter,\n shareId\n ));\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { MarkedAnswerHash } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { SpinnerButton } from 'libs/shared/components/spinner-button/SpinnerButton';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { Interaction } from 'libs/shared/interfaces';\n\nconst namespace = 'interactives.studentResponseList';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface StudentResponseListFooterProps {\n interactionsToMark: Interaction[];\n markedAnswers: MarkedAnswerHash;\n onClickSubmit: () => void;\n onClickClose: () => void;\n showSubmitButtonSpinner: boolean;\n isDemo?: boolean;\n}\n\nexport function StudentResponseListFooter(props: StudentResponseListFooterProps): JSX.Element {\n const numMarkedAnswers = Object.keys(props.markedAnswers).length;\n\n return (\n <div className='d-flex justify-content-end pt-3'>\n <div>\n {!props.showSubmitButtonSpinner &&\n <button className='btn btn-link' onClick={props.onClickClose}>\n {getPhrase('close')}\n </button>\n }\n {!!props.interactionsToMark.length && (\n <>\n {props.isDemo ? (\n <Tooltip\n id='submitAnswers'\n title={getPhrase('demoOnly')}\n spanHack\n spanHackClassName='d-inline-flex'\n >\n <button\n className='btn btn-outline-dark pointer-events-none'\n disabled={!numMarkedAnswers}\n >\n {getPhrase('submitAnswers')}\n </button>\n </Tooltip>\n ) : (\n <SpinnerButton\n variant='outline-dark'\n onClick={props.onClickSubmit}\n disabled={!numMarkedAnswers}\n showSpinner={props.showSubmitButtonSpinner}\n >\n {getPhrase('submitAnswers')}\n </SpinnerButton>\n )}\n </>\n )}\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { MarkedAnswerHash } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { ResultsSummary } from 'libs/shared/apps/analytics/interfaces/ResultsSummary';\nimport { SpinnerButton } from 'libs/shared/components/spinner-button/SpinnerButton';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { Interaction } from 'libs/shared/interfaces';\n\nconst namespace = 'interactives.studentResponseList';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface StudentResponseListHeaderProps {\n summary: ResultsSummary;\n interactionsToMark: Interaction[];\n markedAnswers: MarkedAnswerHash;\n onClickSubmit: () => void;\n showSubmitButtonSpinner: boolean;\n isDemo?: boolean;\n}\n\nexport function StudentResponseListHeader(props: StudentResponseListHeaderProps): JSX.Element {\n const numMarkedAnswers = Object.keys(props.markedAnswers).length;\n\n return (\n <div className='d-flex justify-content-between pb-3'>\n <div className='d-flex'>\n {!!props.summary.unanswered &&\n <div className='bg-light rounded p-2 me-2'>\n <strong className='me-2'>{getPhrase('unanswered')}</strong>\n {props.summary.unanswered}\n </div>\n }\n <div className='bg-light rounded p-2 me-2'>\n <strong className='me-2'>{getPhrase('score')}</strong>\n {props.summary.awaitingMarking\n ? <em>{getPhrase('pending')}</em>\n : `${Math.round(props.summary.percentCorrect * 100)}%`\n }\n </div>\n </div>\n {!!props.interactionsToMark.length && (\n <>\n {props.isDemo ? (\n <Tooltip id='submitAnswers' title={getPhrase('demoOnly')} spanHack>\n <button\n className='btn btn-outline-dark pointer-events-none'\n disabled={!numMarkedAnswers}\n >\n {getPhrase('submitAnswers')}\n </button>\n </Tooltip>\n ) : (\n <SpinnerButton\n variant='outline-dark'\n onClick={props.onClickSubmit}\n disabled={!numMarkedAnswers}\n showSpinner={props.showSubmitButtonSpinner}\n >\n {getPhrase('submitAnswers')}\n </SpinnerButton>\n )}\n </>\n )}\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"awaitingMarking\":\"MvGb5\"};","import React from 'react';\n\nimport { InteractionResponseItem } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/InteractionResponseItem';\nimport { MarkedAnswerHash } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { anonymiseUserName } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { getMarkedStatus, getStudentResultsSummary } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { InteractionResponse } from 'libs/shared/components/interaction-response/InteractionResponse';\nimport { InteractionLabel } from 'libs/shared/components/interactive-questions/InteractionLabel';\nimport { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interaction, Interactive, StudentAnswer, StudentResults } from 'libs/shared/interfaces';\nimport { InteractiveCorrectnessHelper } from 'libs/shared/utils/InteractiveCorrectnessHelper';\nimport { getInteractions, getStudentResult } from 'libs/shared/utils/InteractiveHelper';\n\nimport { StudentResponseListFooter } from './StudentResponseListFooter';\nimport { StudentResponseListHeader } from './StudentResponseListHeader';\n\nimport styles from './student-response-list.scss';\n\nfunction getInteractionsToMark(\n interactions: Interaction[],\n studentResults: StudentResults\n): Interaction[] {\n return interactions.filter(i => {\n return InteractiveCorrectnessHelper.isInteractionCorrect(\n i,\n getStudentResult(studentResults)\n ) === InteractionCorrectness.AwaitingMarking;\n });\n}\n\n// eslint-disable-next-line rulesdir/require-view-title\nfunction useScrollSelectedInteractionIntoView(): React.MutableRefObject<HTMLLIElement> {\n const ref = React.useRef<HTMLLIElement>(null);\n const [ scrolled, setScrolled ] = React.useState(false);\n\n // Only scroll once\n React.useEffect(() => {\n if (!ref.current || scrolled)\n return;\n\n setScrolled(true);\n requestAnimationFrame(() => ref.current.scrollIntoView({ behavior: 'smooth', block: 'center' }));\n }, [ ref.current, scrolled ]);\n\n return ref;\n}\n\ninterface StudentResponseListProps {\n interactive: Interactive;\n markedAnswers: MarkedAnswerHash;\n studentResults: StudentResults;\n addMarkedAnswers: (answer: StudentAnswer[], status: InteractiveAnswerStatus) => void;\n submitMarkedAnswers: () => void;\n onClickClose: () => void;\n imageCdnUrl: string;\n selectedInteractionId?: string;\n anonymiseUsers: boolean;\n reportsStyling?: boolean;\n isDemo?: boolean;\n}\n\nexport function StudentResponseList(props: StudentResponseListProps): JSX.Element {\n const [ showSpinner, setShowSpinner ] = React.useState(false);\n const selectedInteractionRef = useScrollSelectedInteractionIntoView();\n\n const summary = getStudentResultsSummary(props.interactive, props.studentResults);\n const interactions = getInteractions(props.interactive);\n const questionsToMark = getInteractionsToMark(interactions, props.studentResults);\n\n function onClickSubmit(): void {\n setShowSpinner(true);\n props.submitMarkedAnswers();\n }\n\n return (\n <>\n <StudentResponseListHeader\n summary={summary}\n interactionsToMark={questionsToMark}\n markedAnswers={props.markedAnswers}\n onClickSubmit={onClickSubmit}\n showSubmitButtonSpinner={showSpinner}\n isDemo={props.isDemo}\n />\n <ul className='list-unstyled'>\n {interactions.map((interaction, idx) => {\n const isSelected = interaction.id.toString() === props.selectedInteractionId?.toString();\n const markingRequired = questionsToMark.some(q => q.id === interaction.id);\n const anonymisedUserName = anonymiseUserName(\n props.studentResults.user,\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 { Flight } from 'libs/common/react/index';\n\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { AnonSession } from 'libs/shared/apps/share/interfaces/AnonSession';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\n\nfunction toAnonUser(anonSession: AnonSession) {\n return { sessionId: anonSession.sessionId, name: anonSession.sessionName } as AnonUser;\n}\n\nexport function useAnonSessions(shareId: string) {\n const anonSessions = Flight.useBasicFetch<AnonSession[]>(ShareRequests.getAnonSessions(shareId));\n\n const anonSessionMap = anonSessions.data\n ?.reduce<Record<string, AnonUser>>((prev, next) => {\n return {\n ...prev,\n [next.sessionId]: toAnonUser(next)\n };\n }, {});\n\n return {\n items: anonSessionMap || {},\n hasCompleted: anonSessions.hasCompleted,\n isFetching: anonSessions.isFetching\n };\n}","import { Flight } from 'libs/common/react/index';\n\nimport { ShareType } from 'libs/shared/apps/share-v2/enums/ShareType';\nimport { ShareRequests } from 'libs/shared/apps/share-v2/flight-requests/ShareRequests';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { useFetchAll } from 'libs/shared/hooks/UseFetchAll';\nimport { User } from 'libs/shared/interfaces/models/User';\n\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\n\nexport function useInsightsClassroomStudents(shareId: string) {\n const fetch = Flight.useGetFetch();\n\n const share = Flight.useBasicFetch<Share>(ShareRequests.getShare(shareId));\n \n const classroomId = share.data?.type === ShareType.Classroom &&\n share.data?.recipients?.find(r => r.recipientTypeId === MasterType.Classroom)?.recipientId;\n\n const getRequest = (cursor: string) => ClassroomRequests.getClassroomStudents(classroomId, cursor);\n const result = useFetchAll<User>(classroomId && getRequest, cursor => fetch(getRequest(cursor)));\n\n return {\n ...result,\n hasCompleted: !classroomId || result.hasCompleted\n };\n}","import { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\n\nimport { useFetchInteractiveResults } from 'libs/shared/apps/analytics/hooks/UseFetchInteractiveResults';\nimport { ShareRequests } from 'libs/shared/apps/share-v2/flight-requests/ShareRequests';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { InteractiveResult, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\n\nimport { useAnonSessions } from 'apps/my-shares/hooks/useAnonSessions';\nimport { useInsightsClassroomStudents } from 'apps/my-shares/hooks/useInsightsClassroomStudents';\n\nconst EMPTY_INTERACTIVE_RESULTS: InteractiveResult[] = [\n {\n id: '0',\n attempts: [{ id: '0', answeredAt: 0, answers: []}]\n }\n];\n\nexport function useInsightsInteractiveResults(shareId: string) {\n const [hideStaffResults] = useViewModel<boolean>(SharedViewModelKeys.HIDE_STAFF_RESULTS);\n\n const share = Flight.useBasicFetch<Share>(ShareRequests.getShare(shareId));\n const results = useFetchInteractiveResults(share.data?.objectId, null, shareId);\n\n const anonSessions = useAnonSessions(shareId);\n\n const classroomStudents = useInsightsClassroomStudents(shareId);\n\n useHandleObjectError(results);\n\n const hasCompleted = (\n results.hasCompleted &&\n anonSessions.hasCompleted &&\n classroomStudents.hasCompleted\n );\n\n if (!hasCompleted) {\n return {\n data: null as InteractiveResultSet,\n hasCompleted: false\n };\n }\n\n const studentHash = new Set<string>();\n\n const students = results.data.students.map(s => {\n // Domain is returning userType as a number - Sha\n const userType = s.user?.userType as unknown as number;\n if (hideStaffResults && userType === 1)\n return null;\n\n if (s.user) {\n studentHash.add(s.user.id);\n return s;\n }\n\n /**\n * Set the user to our anon user, so we can display the name they entered\n * when completing the interactive - Sha\n */\n return {\n ...s,\n user: anonSessions.items[s.sessionId] || { sessionId: s.sessionId } as AnonUser\n };\n }).filter(s => !!s);\n\n /**\n * If we have classroom students, we're adding any students who haven't attempted to the list\n * with an empty attempt. This is so the student list can show all classroom students - Sha\n */\n if (classroomStudents?.items?.length) {\n students.push(...classroomStudents.items\n .filter(s => !studentHash.has(s.id))\n .map(user => ({ user, results: EMPTY_INTERACTIVE_RESULTS, isPlaceholder: true })));\n }\n\n const isFetching = share.isFetching\n || results.isFetching\n || anonSessions.isFetching\n || classroomStudents.isFetching;\n\n return {\n hasCompleted,\n isFetching,\n data: {\n ...results.data,\n students\n }\n };\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\n\nimport { useMarkAnswers } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { anonymiseUserName } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { ShareRequests } from 'libs/shared/apps/share-v2/flight-requests/ShareRequests';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { StudentResponseList } from 'libs/shared/apps/student-response-list/StudentResponseList';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { Config, Interactive, InteractiveMetadata } from 'libs/shared/interfaces';\nimport { PopupViewProps } from 'libs/shared/interfaces';\n\nimport { useInsightsInteractiveResults } from 'apps/my-shares/hooks/useInsightsInteractiveResults';\n\nconst namespace = 'shared.insightsStudentResults';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InteractiveStudentResultsViewProps extends PopupViewProps {\n shareId: string;\n interactionId: string;\n userId: string;\n sessionId: string;\n}\n\nexport function InsightsStudentResultsView(props: InteractiveStudentResultsViewProps): JSX.Element {\n const [anonymiseUsers] = useViewModel<boolean>(SharedViewModelKeys.ANONYMISE_USERS);\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const share = Flight.useBasicFetch<Share>(ShareRequests.getShare(props.shareId));\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(\n share.data?.objectId &&\n InteractiveRequests.interactiveMetadata(share.data.objectId)\n );\n\n const interactive = Flight.useBasicFetch<Interactive>(\n interactiveMetadata.data?.interactiveId &&\n InteractiveRequests.interactive(interactiveMetadata.data.interactiveId)\n );\n\n const results = useInsightsInteractiveResults(props.shareId);\n\n useHandleObjectError([ share, interactive, interactiveMetadata ]);\n\n const { markedAnswers, addMarkedAnswers, submitMarkedAnswers } = useMarkAnswers(\n interactive.data?.id,\n interactiveMetadata.data?.id,\n props.closePopup\n );\n\n const studentResults = results.data?.students.find(s => {\n if (props.userId)\n return s.user?.id?.toString() === props.userId?.toString();\n\n if (props.sessionId)\n return s.sessionId?.toString() === props.sessionId?.toString();\n\n return false;\n });\n\n const popupTitle = studentResults\n ? getPhrase('heading', { studentName: anonymiseUserName(studentResults.user, anonymiseUsers) })\n : '';\n\n const dataLoaded = (\n config.hasCompleted &&\n share.hasCompleted &&\n interactiveMetadata.hasCompleted &&\n interactive.hasCompleted &&\n results.hasCompleted\n );\n\n return (\n <Popup\n title={popupTitle}\n showLoadingSpinner={!dataLoaded}\n closePopup={props.closePopup}\n size='lg'\n >\n {dataLoaded &&\n <StudentResponseList\n interactive={interactive.data}\n studentResults={studentResults}\n markedAnswers={markedAnswers}\n addMarkedAnswers={addMarkedAnswers}\n submitMarkedAnswers={submitMarkedAnswers}\n imageCdnUrl={config.data.imageCdnUrl}\n selectedInteractionId={props.interactionId}\n onClickClose={props.closePopup}\n anonymiseUsers={anonymiseUsers}\n />\n }\n </Popup>\n );\n}\n"],"names":["useFetchInteractiveResults","interactiveMetadataId","requestFilter","shareId","currentUser","interactiveMetadata","interactive","data","interactiveId","shouldFetchResults","I","id","getPhrase","LanguageService","StudentResponseListFooter","props","numMarkedAnswers","Object","keys","markedAnswers","length","className","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","current","requestAnimationFrame","scrollIntoView","behavior","block","studentResults","interactions","questionsToMark","filter","i","InteractiveCorrectnessHelper","InteractionCorrectness","getInteractionsToMark","submitMarkedAnswers","map","interaction","idx","isSelected","toString","selectedInteractionId","markingRequired","some","q","anonymisedUserName","user","anonymiseUsers","key","InteractionLabel","iconClassName","reportsStyling","InteractionResponse","markedStatus","markInteraction","addMarkedAnswers","imageCdnUrl","showFeedback","responseComponentClass","InteractionResponseItem","defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","internalServerError","handleHttpError","info","customErrorMap","ignoreMap","statusCode","status","errorMap","generateCacheKey","flightObjs","obj","join","useHandleObjectError","_flightObjs","customErrors","ignoreErrors","Array","isArray","useEffect","forEach","useAnonSessions","anonSessions","items","reduce","prev","next","sessionId","anonSession","name","sessionName","hasCompleted","isFetching","useInsightsClassroomStudents","fetch","share","classroomId","type","recipients","find","r","recipientTypeId","recipientId","getRequest","cursor","result","EMPTY_INTERACTIVE_RESULTS","attempts","answeredAt","answers","useInsightsInteractiveResults","hideStaffResults","results","objectId","classroomStudents","studentHash","Set","students","s","userType","add","push","has","isPlaceholder","InsightsStudentResultsView","config","closePopup","userId","popupTitle","studentName","dataLoaded","showLoadingSpinner","size","interactionId"],"sourceRoot":""}