@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts/9295-eb130a0b17-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/components/new-badge/NewBadge.tsx","file:///app/packages/libs/shared/src/apps/share-v2/components/share-view-count/ShareViewCount.tsx","file:///app/packages/libs/shared/src/apps/share-v2/components/share-viewed-by-count/ShareViewedByCount.tsx","file:///app/packages/projects/lite/src/apps/assign/components/previous-assignments/previous-assignments.scss","file:///app/packages/projects/lite/src/apps/assign/components/previous-assignments/PreviousAssignments.tsx","file:///app/packages/libs/shared/src/components/recommended-badge/RecommendedBadge.tsx","file:///app/packages/projects/lite/src/apps/assign/views/flow-selector-view/components/flow-option-badge/FlowOptionBadge.tsx","file:///app/packages/projects/lite/src/apps/assign/views/flow-selector-view/components/flow-selector-options/flow-selector-options.scss","file:///app/packages/projects/lite/src/apps/assign/views/flow-selector-view/components/flow-selector-options/FlowSelectorOptions.tsx","file:///app/packages/projects/lite/src/apps/assign/views/flow-selector-view/hooks/useFlowSelectorData.ts","file:///app/packages/projects/lite/src/apps/assign/views/flow-selector-view/FlowSelectorView.tsx","file:///app/packages/projects/lite/src/apps/assign/views/assign-flow-view/AssignFlowView.tsx","file:///app/node_modules/timeago.js/esm/lang/en_US.js","file:///app/node_modules/timeago.js/esm/lang/zh_CN.js","file:///app/node_modules/timeago.js/esm/register.js","file:///app/node_modules/timeago.js/esm/utils/date.js","file:///app/node_modules/timeago.js/esm/format.js","file:///app/node_modules/timeago.js/esm/index.js"],"sourcesContent":["import React from 'react';\n\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'shared.newBadge';\n\ninterface NewBadgeProps {\n size: 'sm' | 'std';\n invert?: boolean;\n text?: string;\n className?: string;\n}\n\nexport function NewBadge(props: NewBadgeProps): JSX.Element {\n return (\n <span className={classNames(\n 'badge badge-wrapper rounded-pill d-flex justify-content-center',\n 'fw-medium text-blue',\n props.size === 'sm' ? 'badge-sm' : 'badge-std',\n props.invert ? 'bg-white' : 'bg-light-blue',\n props.className\n )}>\n {props.text || <Text phrase='new' namespace={namespace} />}\n </span>\n );\n}","import React from 'react';\n\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { MasterType } from 'libs/shared/enums/MasterType';\n\nconst namespace = 'sharev2.shareViewCount';\n\ninterface ShareViewCountProps {\n share: Share;\n}\n\nexport function ShareViewCount(props: ShareViewCountProps): JSX.Element {\n const isCollection = [ MasterType.Playlist, MasterType.Series ].includes(props.share.objectTypeId);\n \n if (isCollection)\n return <span>-</span>;\n\n return <Text namespace={namespace} phrase='viewCount' options={{ smartCount: props.share.viewCount || 0 }} />;\n}","import React from 'react';\n\nimport { ShareType } from 'libs/shared/apps/share-v2/enums/ShareType';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\ninterface ShareViewedByCountProps {\n share: Share;\n}\n\nexport function ShareViewedByCount(props: ShareViewedByCountProps): JSX.Element {\n const isCollection = [ MasterType.Playlist, MasterType.Series ].includes(props.share.objectTypeId);\n\n if (isCollection)\n return <span>-</span>;\n \n function getViewCount(): string {\n const shareAccessCount = props.share.accessCount || 0;\n if (props.share.type === ShareType.Open)\n return `${shareAccessCount}`;\n\n if (props.share.type === ShareType.Classroom) {\n const totalRecipients = props.share.recipients.length;\n return `${shareAccessCount}/${totalRecipients}`;\n }\n\n return `${shareAccessCount}`;\n }\n \n return (\n <span className='d-inline-flex flex-row gap-2 align-items-center'>\n <SvgContainer svgName={cvSvgLibrary.User} />\n <span>{getViewCount()}</span>\n </span>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"shareListItem\":\"vLROV\",\"visibleOnHover\":\"o2KJH\",\"shareAvatar\":\"zDcMp\",\"shareAvatarTitle\":\"U8yMQ\"};","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\nimport Scrollbars from 'react-custom-scrollbars-2';\nimport { format as formatDate } from 'timeago.js';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { AnalyticsOptions, HashObject } from 'libs/analytics/interfaces';\n\nimport { ShareAvatar } from 'libs/shared/apps/share-v2/components/share-avatar/ShareAvatar';\nimport { ShareViewCount } from 'libs/shared/apps/share-v2/components/share-view-count/ShareViewCount';\nimport { ShareViewedByCount } from 'libs/shared/apps/share-v2/components/share-viewed-by-count/ShareViewedByCount';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { ShareHelper } from 'libs/shared/apps/share-v2/utils/ShareHelper';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { Classroom } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './previous-assignments.scss';\n\nconst namespace = 'assign.previousAssignments';\n\ninterface PreviousAssignmentsHeaderProps {\n count: number;\n show: boolean;\n onToggle: () => void;\n}\n\nfunction PreviousAssignmentsHeader(props: PreviousAssignmentsHeaderProps): JSX.Element {\n return (\n <div className={classNames('d-flex align-items-center justify-content-between', props.show && 'mb-3')}>\n <h3 className='h6 m-0 p-0'><Text namespace={namespace} phrase='heading' options={{ count: props.count }} /></h3>\n <IconButton\n svgName={props.show ? cvSvgLibrary.ChevronUp : cvSvgLibrary.ChevronDown}\n onClick={props.onToggle}\n />\n </div>\n );\n}\n\nexport function PreviousAssignmentsListHeader(): JSX.Element {\n const columnClassNames = 'd-flex align-items-end justify-content-start fw-medium';\n \n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <Row className='gx-2 px-3 mb-2'>\n <Col xs={4} className={columnClassNames}>\n <Text phrase='assignedTo' />\n </Col>\n <Col xs={2} className={columnClassNames}>\n <Text phrase='views' />\n </Col>\n <Col xs={2} className={columnClassNames}>\n <Text phrase='viewedBy' />\n </Col>\n <Col xs={4} className={columnClassNames}>\n <Text phrase='dateCreated' />\n </Col>\n </Row>\n </LanguageNamespaceContext.Provider>\n );\n}\n\ntype ItemAnalytics = {\n data: HashObject;\n options: AnalyticsOptions;\n}\ninterface PreviousAssignmentListItemProps {\n share: Share;\n classrooms: Classroom[];\n getItemAppLink: (share: Share) => Core.AppLink;\n\n getItemAnalytics?: (share: Share) => ItemAnalytics;\n className?: string;\n}\n\nfunction PreviousAssignmentListItem(props: PreviousAssignmentListItemProps): JSX.Element {\n const shareClassroom = ShareHelper.getClassroomForShare(props.share, props.classrooms);\n\n const analytics = props.getItemAnalytics?.(props.share);\n\n return (\n <AppLink\n key={props.share.shareId}\n appLink={props.getItemAppLink(props.share)}\n analyticsData={analytics?.data}\n analyticsOptions={analytics?.options}\n className={classNames('d-block p-3 hover-bg-light-blue border border-top-0 no-hover-text-underline', styles.shareListItem, props.className)}\n >\n <Row className='gx-2'>\n <Col xs={4} className='d-flex align-items-center'>\n <ShareAvatar\n type={props.share.type}\n privacy={props.share.privacy}\n classroomName={shareClassroom?.name}\n svgSize={SvgContainerSize.Small}\n openClassroomName={props.share.options?.openClassroomName}\n className={classNames(styles.shareAvatar)}\n titleClassName={classNames('text-truncate', styles.shareAvatarTitle)}\n hideSubtitle\n />\n </Col>\n <Col xs={2} className='d-flex align-items-center justify-content-start'>\n <ShareViewCount share={props.share} />\n </Col>\n <Col xs={2} className='d-flex align-items-center justify-content-start'>\n <ShareViewedByCount share={props.share} />\n </Col>\n <Col xs={4} lg={3} className='d-flex align-items-center justify-content-start'>\n <span>{formatDate(props.share.dateCreated)}</span>\n </Col>\n <Col lg={1} className='align-items-center justify-content-end d-none d-lg-flex'>\n <span className={classNames('cursor-pointer text-info hover-text-underline', styles.visibleOnHover)}>\n <Text namespace={namespace} phrase='view' />\n </span>\n </Col>\n </Row>\n </AppLink>\n );\n}\n\ninterface PreviousAssignmentsListProps {\n assignments: Share[];\n classrooms: Classroom[];\n getItemAppLink: (share: Share) => Core.AppLink;\n getItemAnalytics?: (share: Share, yIndex: number) => ItemAnalytics;\n scrollHeightMax?: number;\n}\n\nexport function PreviousAssignmentsList(props: PreviousAssignmentsListProps): JSX.Element {\n return (\n <div className={classNames(\n 'd-flex flex-column border-top rounded-top overflow-hidden'\n )}>\n <Scrollbars\n autoHeight\n autoHeightMin={0}\n autoHeightMax={props.scrollHeightMax ?? 215}\n autoHide\n >\n {props.assignments.map((share, idx) => (\n <PreviousAssignmentListItem\n share={share}\n classrooms={props.classrooms}\n getItemAppLink={props.getItemAppLink}\n getItemAnalytics={share => props.getItemAnalytics?.(share, idx)}\n className={classNames(idx % 2 === 0 && 'bg-gray-100')}\n key={share.shareId}\n />\n ))}\n </Scrollbars>\n </div>\n );\n}\n\ninterface PreviousAssignmentsProps {\n show: boolean;\n assignments: Share[];\n classrooms: Classroom[];\n onToggle: () => void;\n getItemAppLink: (share: Share) => Core.AppLink;\n getItemAnalytics?: (share: Share, yIndex: number) => ItemAnalytics;\n}\n\nexport function PreviousAssignments(props: PreviousAssignmentsProps): JSX.Element {\n if (!props.assignments.length)\n return <></>;\n \n const noBottomPadding = props.show && props.assignments.length > 3;\n \n return (\n <div className={classNames('bg-white rounded-3 p-3', noBottomPadding && 'pb-0')}>\n <PreviousAssignmentsHeader count={props.assignments.length} onToggle={props.onToggle} show={props.show} />\n {props.show && (\n <>\n <PreviousAssignmentsListHeader />\n <PreviousAssignmentsList {...props} />\n </>\n )}\n </div>\n );\n}","import React from 'react';\n\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'shared.recommendedBadge';\n\ninterface RecommendedBadgeProps {\n invert?: boolean;\n text?: string;\n size: 'sm' | 'std';\n className?: string;\n}\n\nexport function RecommendedBadge(props: RecommendedBadgeProps): JSX.Element {\n return (\n <span className={classNames(\n 'badge badge-wrapper rounded-pill d-flex justify-content-center',\n 'fw-medium text-teal',\n props.size === 'sm' ? 'badge-sm' : 'badge-std',\n props.invert ? 'bg-white' : 'bg-light-teal',\n props.className\n )}>\n {props.text ??\n <Text phrase='recommended' namespace={namespace} />\n }\n </span>\n );\n}","import React from 'react';\n\nimport { NewBadge } from 'libs/shared/components/new-badge/NewBadge';\nimport { RecommendedBadge } from 'libs/shared/components/recommended-badge/RecommendedBadge';\n\nimport { AssignFlowSteps } from 'apps/assign/interfaces/Assign';\n\n\ninterface FlowOptionBadgeProps {\n hovered: boolean;\n hasClassrooms: boolean;\n type: AssignFlowSteps;\n}\n\nexport function FlowOptionBadge(props: FlowOptionBadgeProps): JSX.Element {\n if (props.type === 'existing-classroom') {\n if (props.hasClassrooms)\n return <RecommendedBadge size='sm' invert={props.hovered} />;\n return null;\n }\n\n if (props.type === 'open-classroom') {\n if (props.hasClassrooms)\n return <NewBadge size='sm' invert={props.hovered} />;\n return (\n <div className='d-flex align-items-center gap-2'>\n <NewBadge size='sm' invert={props.hovered} />\n <RecommendedBadge size='sm' invert={props.hovered} />\n </div>\n );\n }\n\n return null;\n}","// extracted by mini-css-extract-plugin\nexport default {\"optionItem\":\"Lu2bY\"};","import React from 'react';\nimport { ButtonProps } from 'react-bootstrap';\n\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { IconCircle } from 'libs/shared/components/icon-circle/IconCircle';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { useHover } from 'libs/shared/hooks/UseHover';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { AssignFlowSteps } from 'apps/assign/interfaces/Assign';\n\nimport styles from './flow-selector-options.scss';\n\nexport interface FlowOptionItem {\n id: AssignFlowSteps;\n title: string;\n subTitle?: string;\n badgeComponent?: ({ hovered }: {hovered: boolean}) => JSX.Element;\n}\n\nconst IdVariantMap: {[key in AssignFlowSteps]: ButtonProps['variant']} = {\n 'flow-selector': 'purple',\n 'existing-classroom': 'purple',\n 'open-classroom': 'blue'\n};\n\ninterface FlowSelectorOptionItemProps {\n item: FlowOptionItem;\n onClick: (option: FlowOptionItem) => void;\n}\n\nfunction FlowSelectorOptionItem(props: FlowSelectorOptionItemProps): JSX.Element {\n const [ hoverRef, hovered ] = useHover<HTMLDivElement>();\n\n const BadgeComponent = props.item.badgeComponent;\n\n return (\n <DivButton\n onClick={() => props.onClick(props.item)}\n className={classNames(\n 'd-flex flex-column gap-4 align-items-start align-self-stretch justify-content-center',\n 'text-left cursor-pointer p-3 border rounded-3 user-select-none hover-bg-light-blue',\n styles.optionItem\n )}\n ref={hoverRef}\n >\n <div className='d-flex flex-column gap-2 w-100'>\n <div className='d-flex flex-column flex-md-row justify-content-between align-items-start align-items-md-center gap-2'>\n <div className='d-flex align-items-center gap-2 order-2 order-md-0'>\n <div>\n <IconCircle\n svgName={cvSvgLibrary.Classrooms}\n svgSize={SvgContainerSize.Standard}\n variant={IdVariantMap[props.item.id]}\n textVariant='white'\n svgWrapperClassName='p-1'\n />\n </div>\n <h3 className='h6 m-0'>\n {props.item.title}\n </h3>\n </div>\n {!!BadgeComponent && <BadgeComponent hovered={hovered} />}\n </div>\n {props.item.subTitle && <p className='mb-0 text-gray-900'>{props.item.subTitle}</p>}\n </div>\n </DivButton>\n );\n}\n\ninterface FlowSelectorOptions {\n title?: string;\n options: [FlowOptionItem, FlowOptionItem];\n onClick: (option: FlowOptionItem) => void;\n}\n\nexport function FlowSelectorOptions(props: FlowSelectorOptions): JSX.Element {\n return (\n <div className='bg-white rounded-bottom-3 p-3 d-flex flex-column gap-3 justify-content-center align-items-center'>\n {!!props.title &&\n <h2 className='h4 m-0'>{props.title}</h2>\n }\n <div className='d-flex flex-column justify-content-center align-items-center gap-3 w-100'>\n {props.options.map(option => (\n <FlowSelectorOptionItem item={option} onClick={props.onClick} key={option.id} />\n ))}\n </div>\n </div>\n );\n}","import { Core } from 'libs/common/backbone/index';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { 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 { ShareHelper } from 'libs/shared/apps/share-v2/utils/ShareHelper';\nimport { SharableEntityType } from 'libs/shared/apps/share-v2/utils/ShareViewHelper';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { BasePaginatedCollection, Classroom } from 'libs/shared/interfaces';\n\nimport { getInsightsOverviewAppLink } from 'shared/utils/ObjectAppLinkHelper';\n\nimport { useAssignSharedData } from 'apps/assign/hooks/useAssignSharedData';\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\n\nconst SHOW_PREVIOUS_ASSIGNMENTS = 'show:previous:assignments';\n\ninterface UseAssignDataOptions {\n objectId: string;\n entityType: SharableEntityType;\n}\n\nexport function useFlowSelectorData(options: UseAssignDataOptions) {\n /**\n * We want to persist if the user has opened previous shares accordion\n * when they hit back or re-open the modal\n */\n const [ showPreviousAssignments, setShowPreviousAssignments ] =\n useViewModel<boolean>(SHOW_PREVIOUS_ASSIGNMENTS, false);\n\n const assignData = useAssignSharedData({\n entityType: options.entityType,\n objectId: options.objectId\n });\n\n const { isLoadingSettings, hasClassrooms } = useSettings(null);\n\n const previousShares = Flight.useBasicFetch<Share[]>(ShareRequests.getSharesByObjectId(options.objectId));\n // @todo Replace with backend filters\n const previousAssignments = previousShares.data?.filter(\n share => [ ShareType.Classroom, ShareType.Open ].includes(share.type)\n ) || [];\n const previousAssignmentClassroomIds = ArrayHelper.uniq(\n previousAssignments.map(ShareHelper.getClassroomIdFromShare).filter(x => !!x)\n );\n const previousAssignmentClassrooms = Flight.useBasicFetch<Classroom[]>(\n previousShares.hasCompleted &&\n ClassroomRequests.getClassroomsByIds(previousAssignmentClassroomIds, assignData.currentUser.data?.customerId)\n );\n const userClassrooms = Flight.useBasicFetch<BasePaginatedCollection<Classroom>>(\n hasClassrooms && ClassroomRequests.getPublished(assignData.currentUser.data?.customerId)\n );\n\n function getPreviousAssignItemAppLink(share: Share): Core.AppLink {\n const appLink = getInsightsOverviewAppLink(share);\n\n if (!appLink)\n return;\n\n return appLink;\n }\n\n function onTogglePreviousAssignment() {\n setShowPreviousAssignments(!showPreviousAssignments);\n }\n\n const dataLoaded = (\n assignData.loaded &&\n !isLoadingSettings &&\n !!previousShares.data &&\n !!previousAssignmentClassrooms.data &&\n !!userClassrooms.data\n );\n\n return {\n data: {\n loaded: dataLoaded,\n previousAssignments,\n previousAssignmentClassrooms\n },\n showPreviousAssignments,\n hasClassrooms: (hasClassrooms && !!userClassrooms.data?.data.length),\n canCreateClassrooms: assignData.canCreateClassrooms,\n getPreviousAssignItemAppLink,\n onTogglePreviousAssignment\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 { EntityType, LocationContext } from 'libs/analytics/interfaces';\n\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\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';\n\nimport { useClassroomExperience } from 'shared/hooks/useClassroomExperience';\n\nimport { PreviousAssignments } from 'apps/assign/components/previous-assignments/PreviousAssignments';\nimport { getAssignEventLogger } from 'apps/assign/utils/get-assign-event-logger/getAssignEventLogger';\n\nimport { FlowOptionBadge } from './components/flow-option-badge/FlowOptionBadge';\nimport { FlowOptionItem, FlowSelectorOptions } from './components/flow-selector-options/FlowSelectorOptions';\nimport { useFlowSelectorData } from './hooks/useFlowSelectorData';\n\nconst namespace = 'assign.flowSelectorView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface FlowSelectorViewProps extends MultiStepPopupViewProps {\n objectId: string;\n entityType: SharableEntityType;\n goToCreateClassroomPrompt: () => void;\n goToOpenClassroomFlow: () => void;\n goToExistingClassroomFlow: () => void;\n goToNoClassroomPrompt: () => void;\n goToNoExistingClassroomPrompt: () => void;\n}\n\nexport function FlowSelectorView(props: FlowSelectorViewProps): JSX.Element {\n const viewModel = useFlowSelectorData({\n entityType: props.entityType,\n objectId: props.objectId\n });\n\n const { experience } = useClassroomExperience();\n\n const {\n loaded,\n previousAssignmentClassrooms,\n previousAssignments\n } = viewModel.data;\n\n const { log, getData } = getAssignEventLogger({\n data: {\n entity: {\n id: props.objectId,\n type: props.entityType\n }\n },\n analyticsOptions: {\n location: LocationContext.Popup,\n entity: EntityType.Assign\n }\n });\n \n const choices: [FlowOptionItem, FlowOptionItem] = [\n {\n id: 'existing-classroom',\n title: getPhrase('existingClassroomTitle'),\n subTitle: getPhrase('existingClassroomDescription'),\n badgeComponent: ({ hovered }) => <FlowOptionBadge type='existing-classroom' hasClassrooms={viewModel.hasClassrooms && viewModel.canCreateClassrooms} hovered={hovered} />\n },\n {\n id: 'open-classroom',\n title: getPhrase('openClassroomTitle'),\n subTitle: getPhrase('openClassroomDescription'),\n badgeComponent: ({ hovered }) => <FlowOptionBadge type='open-classroom' hasClassrooms={viewModel.hasClassrooms && viewModel.canCreateClassrooms} hovered={hovered} />\n }\n ];\n\n function onClickFlowOption(option: FlowOptionItem) {\n if (option.id === 'existing-classroom') {\n if (experience === 'minimal') {\n props.goToNoClassroomPrompt();\n log({\n type: 'select-existing-classroom-flow',\n initialStep: 'no-classroom'\n });\n return;\n }\n /** \n * If a user clicks 'existing-classroom' flow and they dont have classrooms but can create classrooms then\n * We take them through the 'existing-classroom' flow with 'create-classroom-prompt' as initial step\n */\n if (!viewModel.hasClassrooms && viewModel.canCreateClassrooms) {\n props.goToCreateClassroomPrompt();\n log({\n type: 'select-existing-classroom-flow',\n initialStep: 'create-classroom'\n });\n return;\n }\n\n if (!viewModel.hasClassrooms && !viewModel.canCreateClassrooms) {\n props.goToNoExistingClassroomPrompt();\n log({\n type: 'select-existing-classroom-flow',\n initialStep: 'no-existing-classroom'\n });\n return;\n }\n \n props.goToExistingClassroomFlow();\n log({\n type: 'select-existing-classroom-flow'\n });\n } else if (option.id === 'open-classroom') {\n props.goToOpenClassroomFlow();\n\n log({\n type: 'select-open-classroom-flow'\n });\n }\n }\n\n function getItemAnalytics(share: Share, yIndex: number) {\n const { analyticsOptions, data } = getData({\n type: 'view-previous-assignment',\n share,\n yIndex\n });\n\n return {\n data,\n options: analyticsOptions\n };\n }\n\n return (\n <Popup\n size='lg'\n animation={props.animate}\n title={getPhrase('title')}\n closePopup={props.closePopup}\n bodyClassName='d-flex flex-column gap-3 p-0'\n contentClassName={classNames(loaded && 'bg-transparent border-0')}\n showLoadingSpinner={!loaded || props.loading}\n >\n <FlowSelectorOptions\n options={choices}\n onClick={onClickFlowOption}\n />\n\n <PreviousAssignments\n assignments={previousAssignments}\n show={viewModel.showPreviousAssignments}\n classrooms={previousAssignmentClassrooms.data}\n onToggle={viewModel.onTogglePreviousAssignment}\n getItemAppLink={viewModel.getPreviousAssignItemAppLink}\n getItemAnalytics={getItemAnalytics}\n />\n </Popup>\n );\n}","import React from 'react';\n\nimport { SharableEntityType } from 'libs/shared/apps/share-v2/utils/ShareViewHelper';\nimport { MultiStepPopup } from 'libs/shared/components/multistep-popup/MultiStepPopup';\nimport { PopupViewProps } from 'libs/shared/interfaces';\n\nimport { AssignFlowSteps } from 'apps/assign/interfaces/Assign';\nimport { ExistingClassroomFlowView, ExistingClassroomFlowViewProps } from 'apps/assign/views/existing-classroom-flow-view/ExistingClassroomFlowView';\nimport { FlowSelectorView, FlowSelectorViewProps } from 'apps/assign/views/flow-selector-view/FlowSelectorView';\nimport { OpenClassroomFlowView, OpenClassroomFlowViewProps } from 'apps/assign/views/open-classroom-flow-view/OpenClassroomFlowView';\n\ntype AllAssignFlowViewProps = FlowSelectorViewProps\n & ExistingClassroomFlowViewProps\n & OpenClassroomFlowViewProps;\n\ninterface AssignViewProps extends PopupViewProps {\n objectId: string;\n entityType: SharableEntityType;\n selectedFlow?: AssignFlowSteps\n}\n\nexport function AssignFlowView(props: AssignViewProps): JSX.Element {\n const [ selectedFlow, setSelectedFlow ] = React.useState<AssignFlowSteps>(props.selectedFlow ?? 'flow-selector');\n const [ existingClassroomInitialStep, setExistingClassroomInitialStep ] = React.useState<'create-classroom' | 'no-classroom' | 'no-existing-classroom'>(null);\n const [ animate, setAnimate ] = React.useState(true);\n\n function setFlow(flow: AssignFlowSteps) {\n setAnimate(false);\n setSelectedFlow(flow);\n }\n\n function goToCreateClassroomPrompt() {\n setExistingClassroomInitialStep('create-classroom');\n setFlow('existing-classroom');\n }\n\n function goToNoClassroomPrompt() {\n setExistingClassroomInitialStep('no-classroom');\n setFlow('existing-classroom');\n }\n\n function goToNoExistingClassroomPrompt() {\n setExistingClassroomInitialStep('no-existing-classroom');\n setFlow('existing-classroom');\n }\n\n const data: AllAssignFlowViewProps = {\n objectId: props.objectId,\n entityType: props.entityType,\n closePopup: props.closePopup,\n initialStep: existingClassroomInitialStep,\n goToCreateClassroomPrompt,\n goToNoClassroomPrompt,\n goToNoExistingClassroomPrompt,\n goToExistingClassroomFlow: () => setFlow('existing-classroom'),\n goToFlowSelector: () => setFlow('flow-selector'),\n goToOpenClassroomFlow: () => setFlow('open-classroom')\n };\n \n return (\n <MultiStepPopup<AllAssignFlowViewProps, AssignFlowSteps>\n data={data}\n step={selectedFlow}\n setStep={setFlow}\n closePopup={props.closePopup}\n animate={animate}\n steps={{\n 'flow-selector': { view: FlowSelectorView },\n 'open-classroom': { view: OpenClassroomFlowView },\n 'existing-classroom': { view: ExistingClassroomFlowView }\n }}\n />\n );\n}","var EN_US = ['second', 'minute', 'hour', 'day', 'week', 'month', 'year'];\nexport default function (diff, idx) {\n if (idx === 0)\n return ['just now', 'right now'];\n var unit = EN_US[Math.floor(idx / 2)];\n if (diff > 1)\n unit += 's';\n return [diff + \" \" + unit + \" ago\", \"in \" + diff + \" \" + unit];\n}\n//# sourceMappingURL=en_US.js.map","var ZH_CN = ['秒', '分钟', '小时', '天', '周', '个月', '年'];\nexport default function (diff, idx) {\n if (idx === 0)\n return ['刚刚', '片刻后'];\n var unit = ZH_CN[~~(idx / 2)];\n return [diff + \" \" + unit + \"\\u524D\", diff + \" \" + unit + \"\\u540E\"];\n}\n//# sourceMappingURL=zh_CN.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\n/**\n * All supported locales\n */\nvar Locales = {};\n/**\n * register a locale\n * @param locale\n * @param func\n */\nexport var register = function (locale, func) {\n Locales[locale] = func;\n};\n/**\n * get a locale, default is en_US\n * @param locale\n * @returns {*}\n */\nexport var getLocale = function (locale) {\n return Locales[locale] || Locales['en_US'];\n};\n//# sourceMappingURL=register.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\nvar SEC_ARRAY = [\n 60,\n 60,\n 24,\n 7,\n 365 / 7 / 12,\n 12,\n];\n/**\n * format Date / string / timestamp to timestamp\n * @param input\n * @returns {*}\n */\nexport function toDate(input) {\n if (input instanceof Date)\n return input;\n // @ts-ignore\n if (!isNaN(input) || /^\\d+$/.test(input))\n return new Date(parseInt(input));\n input = (input || '')\n // @ts-ignore\n .trim()\n .replace(/\\.\\d+/, '') // remove milliseconds\n .replace(/-/, '/')\n .replace(/-/, '/')\n .replace(/(\\d)T(\\d)/, '$1 $2')\n .replace(/Z/, ' UTC') // 2017-2-5T3:57:52Z -> 2017-2-5 3:57:52UTC\n .replace(/([+-]\\d\\d):?(\\d\\d)/, ' $1$2'); // -04:00 -> -0400\n return new Date(input);\n}\n/**\n * format the diff second to *** time ago, with setting locale\n * @param diff\n * @param localeFunc\n * @returns\n */\nexport function formatDiff(diff, localeFunc) {\n /**\n * if locale is not exist, use defaultLocale.\n * if defaultLocale is not exist, use build-in `en`.\n * be sure of no error when locale is not exist.\n *\n * If `time in`, then 1\n * If `time ago`, then 0\n */\n var agoIn = diff < 0 ? 1 : 0;\n /**\n * Get absolute value of number (|diff| is non-negative) value of x\n * |diff| = diff if diff is positive\n * |diff| = -diff if diff is negative\n * |0| = 0\n */\n diff = Math.abs(diff);\n /**\n * Time in seconds\n */\n var totalSec = diff;\n /**\n * Unit of time\n */\n var idx = 0;\n for (; diff >= SEC_ARRAY[idx] && idx < SEC_ARRAY.length; idx++) {\n diff /= SEC_ARRAY[idx];\n }\n /**\n * Math.floor() is alternative of ~~\n *\n * The differences and bugs:\n * Math.floor(3.7) -> 4 but ~~3.7 -> 3\n * Math.floor(1559125440000.6) -> 1559125440000 but ~~1559125440000.6 -> 52311552\n *\n * More information about the performance of algebraic:\n * https://www.youtube.com/watch?v=65-RbBwZQdU\n */\n diff = Math.floor(diff);\n idx *= 2;\n if (diff > (idx === 0 ? 9 : 1))\n idx += 1;\n return localeFunc(diff, idx, totalSec)[agoIn].replace('%s', diff.toString());\n}\n/**\n * calculate the diff second between date to be formatted an now date.\n * @param date\n * @param relativeDate\n * @returns {number}\n */\nexport function diffSec(date, relativeDate) {\n var relDate = relativeDate ? toDate(relativeDate) : new Date();\n return (+relDate - +toDate(date)) / 1000;\n}\n/**\n * nextInterval: calculate the next interval time.\n * - diff: the diff sec between now and date to be formatted.\n *\n * What's the meaning?\n * diff = 61 then return 59\n * diff = 3601 (an hour + 1 second), then return 3599\n * make the interval with high performance.\n **/\nexport function nextInterval(diff) {\n var rst = 1, i = 0, d = Math.abs(diff);\n for (; diff >= SEC_ARRAY[i] && i < SEC_ARRAY.length; i++) {\n diff /= SEC_ARRAY[i];\n rst *= SEC_ARRAY[i];\n }\n d = d % rst;\n d = d ? rst - d : rst;\n return Math.ceil(d);\n}\n//# sourceMappingURL=date.js.map","import { formatDiff, diffSec } from './utils/date';\nimport { getLocale } from './register';\n/**\n * format a TDate into string\n * @param date\n * @param locale\n * @param opts\n */\nexport var format = function (date, locale, opts) {\n // diff seconds\n var sec = diffSec(date, opts && opts.relativeDate);\n // format it with locale\n return formatDiff(sec, getLocale(locale));\n};\n//# sourceMappingURL=format.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\nimport en_US from './lang/en_US';\nimport zh_CN from './lang/zh_CN';\nimport { register } from './register';\nregister('en_US', en_US);\nregister('zh_CN', zh_CN);\nexport { format } from './format';\nexport { render, cancel } from './realtime';\nexport { register };\n//# sourceMappingURL=index.js.map"],"names":["namespace","NewBadge","props","className","size","invert","text","phrase","ShareViewCount","MasterType","includes","share","objectTypeId","Text","options","smartCount","viewCount","ShareViewedByCount","SvgContainer","svgName","shareAccessCount","accessCount","type","ShareType","totalRecipients","recipients","length","getViewCount","PreviousAssignmentsHeader","show","count","IconButton","onClick","onToggle","PreviousAssignmentsListHeader","columnClassNames","value","Row","Col","xs","PreviousAssignmentListItem","shareClassroom","ShareHelper","classrooms","analytics","getItemAnalytics","AppLink","key","shareId","appLink","getItemAppLink","analyticsData","data","analyticsOptions","ShareAvatar","privacy","classroomName","name","svgSize","S","openClassroomName","titleClassName","hideSubtitle","lg","dateCreated","PreviousAssignmentsList","autoHeight","autoHeightMin","autoHeightMax","scrollHeightMax","autoHide","assignments","map","idx","PreviousAssignments","noBottomPadding","RecommendedBadge","FlowOptionBadge","hasClassrooms","hovered","IdVariantMap","FlowSelectorOptionItem","hoverRef","BadgeComponent","item","badgeComponent","DivButton","ref","IconCircle","variant","id","textVariant","svgWrapperClassName","title","subTitle","FlowSelectorOptions","option","SHOW_PREVIOUS_ASSIGNMENTS","getPhrase","LanguageService","FlowSelectorView","viewModel","showPreviousAssignments","setShowPreviousAssignments","assignData","useAssignSharedData","entityType","objectId","useSettings","isLoadingSettings","previousShares","ShareRequests","previousAssignments","filter","previousAssignmentClassroomIds","ArrayHelper","x","previousAssignmentClassrooms","hasCompleted","ClassroomRequests","currentUser","customerId","userClassrooms","loaded","canCreateClassrooms","getPreviousAssignItemAppLink","onTogglePreviousAssignment","useFlowSelectorData","experience","useClassroomExperience","getAssignEventLogger","entity","location","log","getData","choices","Popup","animation","animate","closePopup","bodyClassName","contentClassName","showLoadingSpinner","loading","goToNoClassroomPrompt","initialStep","goToCreateClassroomPrompt","goToNoExistingClassroomPrompt","goToExistingClassroomFlow","goToOpenClassroomFlow","yIndex","AssignFlowView","selectedFlow","setSelectedFlow","existingClassroomInitialStep","setExistingClassroomInitialStep","setAnimate","setFlow","flow","goToFlowSelector","MultiStepPopup","step","setStep","steps","view","OpenClassroomFlowView","ExistingClassroomFlowView","EN_US","ZH_CN","Locales","register","locale","func","SEC_ARRAY","toDate","input","Date","isNaN","test","parseInt","trim","replace","format","date","opts","sec","relativeDate","diff","localeFunc","agoIn","totalSec","Math","abs","floor","toString","unit"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[9528],{38307:(e,t,n)=>{n.d(t,{c:()=>h,l:()=>g});var r=n(32735),a=n(232),i=n.n(a),o=n(8604),s=n(83345);const c={heatMap:"epapa",legend:"uhH4p"};function l(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 u="shared.engagementHeatMap",d="#f1f1f1",m=i().scale(["#daf07d","#08bd1a"]),v=[0,.01,.25,.5,.75,1];function p(e,t){return e?m(e/t).hex():d}function f(e,t){for(var n=[],r=0;r<e.length;r++){var a=r>0&&e[r-1],i=e[r],o=r<e.length-1&&e[r+1];i===a&&i===o||n.push("".concat(p(i,t)," ").concat(100/e.length*r,"%"))}return"linear-gradient(to right, ".concat(n.join(","),")")}function g(){var e=Math.max.apply(Math,v),t=100/v.length;return r.createElement("div",{className:"d-flex justify-content-between w-100"},r.createElement(s.x,{namespace:u,phrase:"less"}),r.createElement("div",{className:"d-flex mx-1 flex-grow-1 ".concat(c.legend)},v.map(function(n,a){return r.createElement("div",{key:a,style:{width:"".concat(t,"%"),backgroundColor:p(n,e)}})})),r.createElement(s.x,{namespace:u,phrase:"more"}))}function h(e){var t,n,a,i=(0,o.O)(e.engagement),s=null!==(t=e.max)&&void 0!==t?t:Math.max.apply(Math,function(e){if(Array.isArray(e))return l(e)}(a=i)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(a)||function(e,t){if(e){if("string"==typeof e)return l(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)?l(e,t):void 0}}(a)||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.")}());return r.createElement("div",{className:"border rounded ".concat(c.heatMap," ").concat(null!==(n=e.className)&&void 0!==n?n:""),style:{background:f(i,s)}})}},84621:(e,t,n)=>{n.d(t,{L:()=>o});var r=n(32735),a=n(83914);const i={icon:"sAmpy",count:"faDs4"};function o(e){return r.createElement("section",{className:"d-flex flex-column border rounded p-3 h-100"},r.createElement("div",{className:"d-flex ".concat(e.subtitle?"align-items-top":"align-items-center"," mb-2")},r.createElement("div",{className:"".concat(i.icon," ").concat(e.svgClassName," rounded-circle d-flex justify-content-center align-items-center")},r.createElement(a.x,{svgName:e.svgName,size:a.S.Small})),r.createElement("div",{className:"d-flex flex-column ms-2"},r.createElement("h2",{className:"h6 mb-0"},e.title)),"number"==typeof e.count&&r.createElement("div",{className:"".concat(i.count," d-flex justify-content-center align-items-center bg-light rounded-circle ms-auto")},e.count)),e.children)}},70072:(e,t,n)=>{n.d(t,{d:()=>r});var r={fontSize:"12px",fontFamily:'"Inter",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"',fontWeight:"400",color:"#313543"}},8604:(e,t,n)=>{function r(e){var t=e.videoDuration||0;return new Array(Math.ceil(t)).fill(null).map(function(t,n){return(null==e?void 0:e.heatMap[n])||0})}function a(e){return null==e?void 0:e.reduce(function(t,n){return t+n.engagementRate/e.length},0)}n.d(t,{O:()=>r,Q:()=>a})},39157:(e,t,n)=>{n.d(t,{HI:()=>m,R6:()=>l,Rt:()=>p,UU:()=>d,Zs:()=>u,nq:()=>v});var r=n(75896),a=n(94892),i=n(28972),o=n(8246),s=n(83140),c=n(80845);function l(e,t,n){var i={markingRequired:[],lowScore:[],highScore:[],completed:[],notCompleted:[]},o=(0,c.Q)(e),s=new Set(o.map(function(e){return e.id}));t.students.forEach(function(t){var o=Object.assign(Object.assign({},t),{summary:p(e,t)});o.summary.awaitingMarking?i.markingRequired.push(o):r.m.last(t.results).attempts.filter(function(e){var t;return!!s.has(null===(t=null==e?void 0:e.answers[0])||void 0===t?void 0:t.questionId)}).length===s.size?(i.completed.push(o),o.summary.percentCorrect>=((null==n?void 0:n.HIGH)||a.i.HIGH)&&i.highScore.push(o),o.summary.percentCorrect<((null==n?void 0:n.MODERATE)||a.i.MODERATE)&&i.lowScore.push(o)):i.notCompleted.push(o)});var l=r.m.sortBy(i.lowScore,function(e){return e.summary.percentCorrect}),u=r.m.sortBy(i.highScore,function(e){return-e.summary.percentCorrect});return Object.assign(Object.assign({},i),{lowScore:l,highScore:u})}function u(e,t){return(0,c.Wn)(e).find(function(e){return e.id.toString()===t.toString()})}function d(e){return"".concat(e.questionId,":").concat(e.resultId)}function m(e,t,n){var r=(0,c.j_)(t),a=(0,c.f6)(e,r);return(null==a?void 0:a.answers.every(function(e){var t;return(null===(t=n[d(e)])||void 0===t?void 0:t.status)===o.N.Correct}))?o.N.Correct:(null==a?void 0:a.answers.every(function(e){var t;return(null===(t=n[d(e)])||void 0===t?void 0:t.status)===o.N.Incorrect}))?o.N.Incorrect:void 0}function v(e,t){var n=t.students.length,r=0,a=0,o=0,l=0,u=0;return t.students.forEach(function(t){var n=(0,c.j_)(t);if(n){u+=t.results.length;var d=s.A.isInteractionCorrect(e,n);d===i.w.Correct&&r++,d===i.w.UnAnswered&&o++,d===i.w.AwaitingMarking&&l++,d!==i.w.UnAnswered&&a++}}),{percentCorrect:n>0?r/n:0,correct:r,answered:a,unanswered:o,awaitingMarking:l,attempts:u}}function p(e,t){var n=(0,c.j_)(t),r=(0,c.Q)(e),a=r.length,o=0,l=0;r.forEach(function(e){var t=s.A.isInteractionCorrect(e,n);t===i.w.Correct&&o++,t===i.w.AwaitingMarking&&l++});var u=a>0?o/a:0,d=new Set(r.map(function(e){return e.id})),m=n.attempts.filter(function(e){var t;return!!d.has(null===(t=null==e?void 0:e.answers[0])||void 0===t?void 0:t.questionId)}).length;return{answered:m,attempts:t.results.length,unanswered:a-m,percentCorrect:u,correct:o,awaitingMarking:l}}},77640:(e,t,n)=>{n.d(t,{t:()=>p});var r=n(32735),a=n(23481),i=n(31453),o=n(26136),s=n(97408),c=n(83914),l=n(76881),u=n(86613),d=n(64818),m=n(26521),v=a.T.encloseNamespace("shared.userRecipientItemMetadata");function p(e){var t=function(e){var t,n=e.user,r=e.anonymiseUsers,a=e.showDisplayName;if(n.sessionId||n.deleted){var i=(0,o.B)(n,r),s=i.split(" ").filter(function(e){return!!e});return{name:i,surname:s.slice(1).join(" "),avatarUrl:null}}return{name:r?(0,o.B)(n,!0):a?d.l.getDisplayName(n):d.l.getFullName(n),surname:n.surname,avatarUrl:null===(t=n.avatar)||void 0===t?void 0:t.url}}(e),n=t.name,a=t.surname,p=t.avatarUrl;return r.createElement(r.Fragment,null,r.createElement("div",{className:"".concat(m.Z.avatarContainer," ").concat(e.avatarClassName," d-inline-block flex-shrink-0")},r.createElement(s.q,{imageUrl:p,imageCdnUrl:e.imageCdnUrl,initials:d.l.getInitials(n,a),showAnonymousUser:!(e.anonymiseUsers||!e.user.sessionId&&!e.user.deleted),anonymiseUsers:e.anonymiseUsers,anonymousSvgSize:c.S.Small})),r.createElement("div",{className:e.detailsClassName},r.createElement("h4",{className:(0,i.A)("font-size-normal fw-normal m-0",e.nameClassName)},n),e.showSubText&&"id"in e.user&&r.createElement("p",{className:"text-secondary m-0"},e.getSubText?e.getSubText(e.user):function(e){var t=d.l.getUserType(e),n=d.l.getUserRole(e);if(t===l.Y.Staff)return n===u.i.Admin?v("admin"):v("staff");var r=d.l.getYearGroup(e);return(null==r?void 0:r.name)&&"Learners"!==r.name?r.name:v("student")}(e.user))))}p.defaults={showSubText:!0}},28972:(e,t,n)=>{var r;n.d(t,{w:()=>r}),function(e){e[e.Correct=0]="Correct",e[e.Incorrect=1]="Incorrect",e[e.AwaitingMarking=2]="AwaitingMarking",e[e.Answered=3]="Answered",e[e.UnAnswered=4]="UnAnswered",e[e.NotApplicable=5]="NotApplicable"}(r||(r={}))},8246:(e,t,n)=>{var r;n.d(t,{N:()=>r}),function(e){e[e.Incorrect=0]="Incorrect",e[e.Correct=1]="Correct",e[e.PendingReview=2]="PendingReview"}(r||(r={}))},54405:(e,t,n)=>{n.d(t,{X:()=>r});var r={interactive:function(){return{url:"/mocks/insights/interactive.json",key:"demo:interactive",normalize:!1}},interactiveMetadata:function(){return{url:"/mocks/insights/interactive-metadata.json",key:"demo:interactive:metadata",normalize:!1}},interactiveResults:function(){return{url:"/mocks/insights/interactive-results.json",key:"demo:interactive:results",normalize:!1}},videoViews:function(){return{url:"/mocks/insights/video-views.json",key:"demo:video:views",normalize:!1}},users:function(){return{url:"/mocks/insights/users.json",key:"demo:users",normalize:!1}},individualHeatmap:function(){return{url:"/mocks/insights/individual-heatmap.json",key:"demo:individual:heatmap",normalize:!1}},aggregateHeatmap:function(){return{url:"/mocks/insights/aggregate-heatmap.json",key:"demo:aggregate:heatmap",normalize:!1}}}},83140:(e,t,n)=>{n.d(t,{A:()=>f});var r=n(28972),a=n(8246),i=n(56644);function o(e){return o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o(e)}function s(e,t,n){return(t=function(e){var t=function(e){if("object"!=o(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=o(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==o(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function c(){return r.w.NotApplicable}function l(e,t){var n=e.actionableItems.filter(function(e){return e.isCorrect});return n.every(function(e){return!t(e.id)})?r.w.UnAnswered:n.every(function(e){var n;return e.name.trim().toLowerCase()===(null===(n=t(e.id))||void 0===n?void 0:n.trim().toLowerCase())})?r.w.Correct:r.w.Incorrect}function u(e,t){return e.actionableItems.every(function(e){return!t(e.id)})?r.w.UnAnswered:e.actionableItems.filter(function(e){return e.isCorrect}).every(function(e){var n,r=t(e.id);return(null==r?void 0:r.toString())===(null===(n=e.id)||void 0===n?void 0:n.toString())||r===e.name})?r.w.Correct:r.w.Incorrect}function d(e,t){return function(n){var r=null==t?void 0:t.attempts.find(function(t){return t.id===e.id});return null==r?void 0:r.answers.find(function(e){return e.id===n})}}function m(e,t){var n=d(e,t);return u(e,function(e){var t=n(e);return null==t?void 0:t.text})}function v(e,t){return function(e,t){var n;return e.actionableItems.forEach(function(e){var i=t(e.id);n=i?i.status!==a.N.Correct?i.status!==a.N.Incorrect?r.w.AwaitingMarking:r.w.Incorrect:r.w.Correct:r.w.UnAnswered}),n}(e,d(e,t))}var p=s(s(s(s(s(s(s({},i.Z9.Annotation,c),i.Z9.Image,c),i.Z9.MissingWord,function(e,t){var n=d(e,t);return l(e,function(e){var t=n(e);return null==t?void 0:t.text})}),i.Z9.MultipleChoice,m),i.Z9.ShortAnswer,v),i.Z9.TrueOrFalse,m),i.Z9.Illustration,v),f={notApplicable:c,awaitingMarking:function(){return r.w.AwaitingMarking},isMissingWordCorrect:l,isMultipleChoiceCorrect:u,isInteractionCorrect:function(e,t){return(0,p[e.typeId])(e,t)}}},9566:(e,t,n)=>{n.d(t,{$Z:()=>f,G6:()=>m,GJ:()=>p,VE:()=>y,_w:()=>v,po:()=>h,vJ:()=>g});var r=n(23481),a=n(110),i=n(33518),o=n(2510),s=n(4594),c=n(35223),l=n(14070),u=n(97291),d=r.T.encloseNamespace("myShares.demoInsights"),m={type:o.y.Link,privacy:i.e.JustMySchool,objectId:"0",objectTypeId:s.E.Interactive,viewCount:28,accessCount:15,dateCreated:(new Date).toISOString(),dateShared:(new Date).toISOString(),expireDate:null,link:{shortenedEmbedUrl:"",shortenedUrl:""},shareId:"0",ownerCustomerId:0,ownerId:0,recipients:[],options:{preventScrubbing:!1,immediateFeedback:!1}},v=Object.assign(Object.assign({},m),{type:o.y.Open,expireDate:a.O.add(new Date(m.dateCreated),30,"days").toISOString(),privacy:i.e.PinCode}),p={share:m,sharedObject:null,shareRecipients:null,dateShared:a.O.subtract(new Date,7,"days").toISOString()},f=Object.assign(Object.assign({},p),{share:v}),g={application:u.O.MY_SHARES,action:l.e.MyShares.INTERACTIVE_OVERVIEW_DEMO},h={application:u.O.MY_SHARES,action:l.e.MyShares.INTERACTIVE_OVERVIEW_OPEN_CLASSROOM_DEMO},y={svgName:c.vn.Analytics,label:d("demoInsights"),appLink:g,group:"insights",className:"btn btn-outline-dark"}},38926:(e,t,n)=>{n.r(t),n.d(t,{InteractiveInsightsOverviewDemoView:()=>A});var r=n(32735),a=n(23481),i=n(2948),o=n(20354),s=n(26025),c=n(2510),l=n(38143),u=n(39151),d=n(54405),m=n(31949),v=n(93322),p=n(79612),f=n(9540),g=n(54948),h=n(9566),y=n(10447),S=n(14070),w=n(97291);function E(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var b=a.T.encloseNamespace("insights.interactiveInsightsOverviewView");function A(e){var t,n,a,A,I,C,O=(I=(0,i.D)(l.g.ANONYMISE_USERS),C=1,function(e){if(Array.isArray(e))return e}(I)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,i,o,s=[],c=!0,l=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=i.call(n)).done)&&(s.push(r.value),s.length!==t);c=!0);}catch(e){l=!0,a=e}finally{try{if(!c&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(l)throw a}}return s}}(I,C)||function(e,t){if(e){if("string"==typeof e)return E(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?E(e,t):void 0}}(I,C)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[0];(0,v.F)();var M=o.a.useBasicFetch(m.N.currentUser()),N=o.a.useBasicFetch(u.L.config()),k=o.a.useBasicFetch(d.X.interactiveMetadata()),j=o.a.useBasicFetch(d.X.interactive()),R=s.B.getAudienceAppLinkParams(),_=s.B.getDateRangeAppLinkParams(),T=o.a.useBasicFetch(d.X.interactiveResults()),U=o.a.useBasicFetch(d.X.aggregateHeatmap()),x=o.a.useBasicFetch(d.X.videoViews());(0,p.M)({title:k.data?b("pageTitle",{video:null===(t=k.data)||void 0===t?void 0:t.name}):null});var D=M.data&&N.data&&k.data&&j.data&&T.data&&U.data&&!!x.data,L=Object.assign(Object.assign({},R),_),H=function(e,t,n){return n===c.y.Open?{resultsAppLink:{application:w.O.MY_SHARES,action:S.e.MyShares.INTERACTIVE_STUDENTS_OPEN_CLASSROOM_DEMO,args:[e],params:t},questionsAppLink:{application:w.O.MY_SHARES,action:S.e.MyShares.INTERACTIVE_QUESTIONS_OPEN_CLASSROOM_DEMO,args:[e],params:t},heatmapAppLink:{application:w.O.MY_SHARES,action:S.e.MyShares.INTERACTIVE_HEATMAP_OPEN_CLASSROOM_DEMO,args:[e],params:t}}:{resultsAppLink:{application:w.O.MY_SHARES,action:S.e.MyShares.INTERACTIVE_STUDENTS_DEMO,args:[e],params:t},questionsAppLink:{application:w.O.MY_SHARES,action:S.e.MyShares.INTERACTIVE_QUESTIONS_DEMO,args:[e],params:t},heatmapAppLink:{application:w.O.MY_SHARES,action:S.e.MyShares.INTERACTIVE_HEATMAP_DEMO,args:[e],params:t}}}("",L,e.type),V=e.type===c.y.Open?h._w:h.G6;return D?r.createElement("div",{className:"px-3"},r.createElement(f.j,{video:k.data,tabs:(0,y.aq)(null===(n=k.data)||void 0===n?void 0:n.id,"insights",L,e.type),dateRangeAppLinkParams:_,share:Object.assign(Object.assign({},V),{objectId:null===(a=k.data)||void 0===a?void 0:a.id}),yearGroups:[],markingRequired:e.type!==c.y.Open,isDemo:!0,hasData:!0}),r.createElement(g.m,{aggregateEngagement:U.data,interactive:j.data,interactiveMetadata:k.data,classroomStudents:null,results:T.data,osCount:null===(A=x.data)||void 0===A?void 0:A.osCount,config:N.data,interactiveInsightsAppLinks:H,anonymiseUsers:O,hasDataLoaded:D,share:V})):r.createElement(r.Fragment,null)}},26521:(e,t,n)=>{n.d(t,{Z:()=>r});const r={removeRecipient:"mCbMC",recipientItem:"kdcb0",showSpinner:"xH6Mu",avatarContainer:"Zcpg3",recipientDetails:"v5EmV",recipientDetailsWithRemoveButton:"_V928"}}}]);
2
+ //# sourceMappingURL=9528-4e954d9dff-lite.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts/9528-4e954d9dff-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/analytics/components/engagement-heat-map/engagement-heat-map.scss","file:///app/packages/libs/shared/src/apps/analytics/components/engagement-heat-map/EngagementHeatMap.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insight-card/insight-card.scss","file:///app/packages/libs/shared/src/apps/analytics/components/insight-card/InsightCard.tsx","file:///app/packages/libs/shared/src/apps/analytics/constants/ChartStyles.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/EngagementUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/InteractiveUtils.ts","file:///app/packages/libs/shared/src/apps/share/components/recipient-item/user-recipient-item-metadata/UserRecipientItemMetadata.tsx","file:///app/packages/libs/shared/src/enums/InteractionCorrectness.ts","file:///app/packages/libs/shared/src/enums/InteractiveAnswerStatus.ts","file:///app/packages/libs/shared/src/flight-requests/InsightsDemoRequests.ts","file:///app/packages/libs/shared/src/utils/InteractiveCorrectnessHelper.ts","file:///app/packages/projects/lite/src/apps/my-shares/constants/MySharesDemoInsights.ts","file:///app/packages/projects/lite/src/apps/my-shares/views/demo/overview/InteractiveInsightsOverviewDemoView.tsx","file:///app/packages/projects/lite/src/apps/my-shares/views/demo/overview/InteractiveInsightsOverviewDemoUtils.ts","file:///app/packages/libs/shared/src/apps/share/components/recipient-item/recipient-item.scss"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport default {\"heatMap\":\"epapa\",\"legend\":\"uhH4p\"};","import React from 'react';\nimport chroma from 'chroma-js';\n\nimport { getFullHeatMap } from 'libs/shared/apps/analytics/utils/EngagementUtils';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Engagement } from 'libs/shared/interfaces';\n\nimport styles from './engagement-heat-map.scss';\n\nconst namespace = 'shared.engagementHeatMap';\n\nconst ZERO_COLOUR = '#f1f1f1';\nconst MIN_COLOUR = '#daf07d';\nconst MAX_COLOUR = '#08bd1a';\n\nconst COLOUR_SCALE = chroma.scale([ MIN_COLOUR, MAX_COLOUR ]);\n\nconst LEGEND_VALUES = [ 0, 0.01, 0.25, 0.5, 0.75, 1 ];\n\nfunction getBackgroundColor(value: number, max: number): string {\n if (!value)\n return ZERO_COLOUR;\n\n return COLOUR_SCALE(value / max).hex();\n}\n\nfunction getGradient(data: number[], max: number): string {\n const gradient: string[] = [];\n\n for (let i = 0; i < data.length; i++) {\n const previousValue = i > 0 && data[i - 1];\n const currentValue = data[i];\n const nextValue = i < data.length - 1 && data[i + 1];\n\n /**\n * We want to capture colour changes but if a value has the same value\n * of both of its neighbours, we can skip it.\n */\n if (currentValue === previousValue && currentValue === nextValue)\n continue;\n\n gradient.push(`${getBackgroundColor(currentValue, max)} ${100 / data.length * i}%`);\n }\n\n return `linear-gradient(to right, ${gradient.join(',')})`;\n}\n\nexport function EngagementHeatMapLegend(): JSX.Element {\n const max = Math.max(...LEGEND_VALUES);\n const legendSquareWidthPercentage = 100 / LEGEND_VALUES.length;\n\n return (\n <div className='d-flex justify-content-between w-100'>\n <Text namespace={namespace} phrase='less' />\n <div className={`d-flex mx-1 flex-grow-1 ${styles.legend}`}>\n {LEGEND_VALUES.map((val, idx) => (\n <div\n key={idx}\n style={{\n width: `${legendSquareWidthPercentage}%`,\n backgroundColor: getBackgroundColor(val, max)\n }}\n />\n ))}\n </div>\n <Text namespace={namespace} phrase='more' />\n </div>\n );\n}\n\ninterface EngagementHeatMapProps {\n engagement: Engagement;\n max?: number;\n className?: string;\n}\n\nexport function EngagementHeatMap(props: EngagementHeatMapProps): JSX.Element {\n const heatMap = getFullHeatMap(props.engagement);\n const max = props.max ?? Math.max(...heatMap);\n\n return (\n <div\n className={`border rounded ${styles.heatMap} ${props.className ?? ''}`}\n style={{\n background: getGradient(heatMap, max)\n }}\n />\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"icon\":\"sAmpy\",\"count\":\"faDs4\"};","import React from 'react';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\n\nimport styles from './insight-card.scss';\n\ninterface InsightCardProps extends React.PropsWithChildren {\n svgName: string;\n svgClassName: string;\n title: string;\n subtitle?: string;\n count?: number;\n}\n\nexport function InsightCard(props: InsightCardProps) {\n return (\n <section className='d-flex flex-column border rounded p-3 h-100'>\n <div className={`d-flex ${props.subtitle ? 'align-items-top' : 'align-items-center'} mb-2`}>\n <div className={`${styles.icon} ${props.svgClassName} rounded-circle d-flex justify-content-center align-items-center`}>\n <SvgContainer svgName={props.svgName} size={SvgContainerSize.Small} />\n </div>\n <div className='d-flex flex-column ms-2'>\n <h2 className='h6 mb-0'>{props.title}</h2>\n </div>\n {typeof props.count === 'number' && (\n <div className={`${styles.count} d-flex justify-content-center align-items-center bg-light rounded-circle ms-auto`}>\n {props.count}\n </div>\n )}\n </div>\n {props.children}\n </section>\n );\n}","export const CHART_FONT_STYLES = {\n fontSize: '12px',\n fontFamily: `\"Inter\",-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,\"Helvetica Neue\",Arial,\"Noto Sans\",\"Liberation Sans\",sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\",\"Noto Color Emoji\"`,\n fontWeight: '400',\n color: '#313543'\n};","import { Engagement } from 'libs/shared/interfaces';\n\n/**\n * The heat map in the API response won't contain trailing zeros so we need to add those\n * in manually.\n */\nexport function getFullHeatMap(engagement: Engagement): number[] {\n const videoDuration = engagement.videoDuration || 0;\n \n return (new Array(Math.ceil(videoDuration))).fill(null).map((t, idx) => engagement?.heatMap[idx] || 0);\n}\n\nexport function getEngagementRate(engagement: Engagement[]): number {\n return engagement?.reduce((prev, next) => prev + next.engagementRate / engagement.length, 0);\n}","import { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { MarkedAnswerHash } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { ResultsSummary } from 'libs/shared/apps/analytics/interfaces/ResultsSummary';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { ScoreThresholdDefaults, ScoreThresholds } from 'libs/shared/constants/ScoreThresholds';\nimport { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interaction, StudentAnswer, StudentResults } from 'libs/shared/interfaces';\nimport { Interactive, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { InteractiveCorrectnessHelper } from 'libs/shared/utils/InteractiveCorrectnessHelper';\nimport { flattenInteractions, getInteractions, getStudentAttempt, getStudentResult } from 'libs/shared/utils/InteractiveHelper';\n\ninterface StudentGroups {\n markingRequired: StudentResultsWithSummary[];\n lowScore: StudentResultsWithSummary[];\n highScore: StudentResultsWithSummary[];\n completed: StudentResultsWithSummary[];\n notCompleted: StudentResultsWithSummary[];\n}\n\nexport function groupStudents(\n interactive: Interactive,\n results: InteractiveResultSet,\n scoreThreshold?: ScoreThresholds\n): StudentGroups {\n const groups: StudentGroups = {\n markingRequired: [],\n lowScore: [],\n highScore: [],\n completed: [],\n notCompleted: []\n };\n\n const interactions = getInteractions(interactive);\n const interactionIds = new Set(interactions.map(i => i.id));\n \n results.students.forEach(s => {\n const withSummary = {\n ...s,\n summary: getStudentResultsSummary(interactive, s)\n };\n \n if (withSummary.summary.awaitingMarking) {\n groups.markingRequired.push(withSummary);\n return;\n }\n\n const result = ArrayHelper.last(s.results);\n const answeredInteractions = result.attempts.filter(a => !!interactionIds.has(a?.answers[0]?.questionId)).length;\n\n if (answeredInteractions === interactionIds.size) {\n groups.completed.push(withSummary);\n } else {\n groups.notCompleted.push(withSummary);\n return;\n }\n \n if (withSummary.summary.percentCorrect >= (scoreThreshold?.HIGH || ScoreThresholdDefaults.HIGH))\n groups.highScore.push(withSummary);\n \n if (withSummary.summary.percentCorrect < (scoreThreshold?.MODERATE || ScoreThresholdDefaults.MODERATE))\n groups.lowScore.push(withSummary);\n });\n \n const sortedLowScore = ArrayHelper.sortBy(groups.lowScore, s => s.summary.percentCorrect);\n const sortedHighScore = ArrayHelper.sortBy(groups.highScore, s => -s.summary.percentCorrect);\n \n return {\n ...groups,\n lowScore: sortedLowScore,\n highScore: sortedHighScore\n };\n}\n\nexport function getInteractionById(interactive: Interactive, interactionId: string): Interaction {\n const flattenedInteractions = flattenInteractions(interactive);\n return flattenedInteractions.find(i => i.id.toString() === interactionId.toString());\n}\n\n/**\n * We need to use the question and result ids as a list of one student's responses\n * to multiple questions will all have the same result id and a list of multiple\n * students responses to one question will all have the same questionId.\n */\nexport function getMarkedAnswerId(answer: StudentAnswer): string {\n return `${answer.questionId}:${answer.resultId}`;\n}\n\nexport function getMarkedStatus(\n interactionId: string,\n studentResults: StudentResults,\n markedAnswers: MarkedAnswerHash\n): InteractiveAnswerStatus {\n const result = getStudentResult(studentResults);\n const studentResponse = getStudentAttempt(interactionId, result);\n\n const isMarkedCorrect = studentResponse?.answers.every(a => {\n return markedAnswers[getMarkedAnswerId(a)]?.status === InteractiveAnswerStatus.Correct;\n });\n\n if (isMarkedCorrect)\n return InteractiveAnswerStatus.Correct;\n\n const isMarkedIncorrect = studentResponse?.answers.every(a => {\n return markedAnswers[getMarkedAnswerId(a)]?.status === InteractiveAnswerStatus.Incorrect;\n });\n\n if (isMarkedIncorrect)\n return InteractiveAnswerStatus.Incorrect;\n}\n\nexport function getInteractionResultsSummary(\n interaction: Interaction,\n results: InteractiveResultSet\n): ResultsSummary {\n const numStudents = results.students.length;\n let numCorrect = 0;\n let answered = 0;\n let unanswered = 0;\n let awaitingMarking = 0;\n let attempts = 0;\n\n results.students.forEach(s => {\n const result = getStudentResult(s);\n\n if (!result)\n return;\n\n attempts = attempts + s.results.length;\n\n const correctness = InteractiveCorrectnessHelper.isInteractionCorrect(interaction, result);\n\n if (correctness === InteractionCorrectness.Correct)\n numCorrect++;\n\n if (correctness === InteractionCorrectness.UnAnswered)\n unanswered++;\n\n if (correctness === InteractionCorrectness.AwaitingMarking)\n awaitingMarking++;\n\n if (correctness !== InteractionCorrectness.UnAnswered)\n answered++;\n });\n\n\n const percentCorrect = numStudents > 0\n ? numCorrect / numStudents\n : 0;\n\n return {\n percentCorrect,\n correct: numCorrect,\n answered,\n unanswered,\n awaitingMarking,\n attempts\n };\n}\n\nexport function getStudentResultsSummary(interactive: Interactive, studentResults: StudentResults): ResultsSummary {\n const result = getStudentResult(studentResults);\n\n const interactions = getInteractions(interactive);\n\n const numInteractions = interactions.length;\n\n let numCorrect = 0;\n let awaitingMarking = 0;\n\n interactions.forEach(i => {\n const correctness = InteractiveCorrectnessHelper.isInteractionCorrect(i, result);\n\n if (correctness === InteractionCorrectness.Correct)\n numCorrect++;\n\n if (correctness === InteractionCorrectness.AwaitingMarking)\n awaitingMarking++;\n });\n\n const percentCorrect = numInteractions > 0 ? numCorrect / numInteractions : 0;\n\n /**\n * Our interactions list has images and annotations filtered out.\n * We built a map of valid questions, so that we can calculate the unswered accurately.\n * We're doing this because of a bug that caused annotations and images to record answers in the player.\n * - Sha\n */\n const interactionIds = new Set(interactions.map(i => i.id));\n const answeredInteractions = result.attempts.filter(a => !!interactionIds.has(a?.answers[0]?.questionId)).length;\n\n return {\n answered: answeredInteractions,\n attempts: studentResults.results.length,\n unanswered: numInteractions - answeredInteractions,\n percentCorrect,\n correct: numCorrect,\n awaitingMarking\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 { anonymiseUserName } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { UserRole } from 'libs/shared/enums/UserRole';\nimport { BaseObject, User } from 'libs/shared/interfaces';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport styles from '../recipient-item.scss';\n\nconst namespace = 'shared.userRecipientItemMetadata';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getSubText(user: User): string {\n const userType = UserHelper.getUserType(user);\n const role = UserHelper.getUserRole(user);\n\n if (userType === UserGroup.Staff) {\n if (role === UserRole.Admin)\n return getPhrase('admin');\n\n return getPhrase('staff');\n }\n\n const yearGroup = UserHelper.getYearGroup(user);\n \n /**\n * Tertiary puts all students into a single group called 'Learners'.\n * When a student is in the 'Learners' group, we don't want to display the group name,\n * but instead we want to just show \"Student\". - Sha\n */\n if (yearGroup?.name && yearGroup.name !== 'Learners')\n return yearGroup.name;\n\n return getPhrase('student');\n}\n\nfunction getUserProps({\n user, anonymiseUsers, showDisplayName\n}: {\n user: AnonUser,\n showDisplayName: boolean;\n anonymiseUsers?: boolean;\n}) {\n if (user.sessionId || user.deleted) {\n const anonName = anonymiseUserName(user, anonymiseUsers);\n const nameParts = anonName.split(' ').filter(n => !!n);\n\n return {\n name: anonName,\n surname: nameParts.slice(1).join(' '),\n avatarUrl: null\n };\n }\n\n return {\n name: anonymiseUsers\n ? anonymiseUserName(user, true)\n : showDisplayName\n ? UserHelper.getDisplayName(user)\n : UserHelper.getFullName(user),\n surname: user.surname,\n avatarUrl: user.avatar?.url\n };\n}\n\nUserRecipientItemMetadata.defaults = {\n showSubText: true\n};\n\ninterface UserRecipientItemMetadataProps {\n user: AnonUser;\n imageCdnUrl: string;\n detailsClassName?: string;\n avatarClassName?: string;\n showDisplayName: boolean;\n nameClassName?: string;\n showSubText?: boolean;\n anonymiseUsers?: boolean;\n getSubText?: (user: BaseObject) => string;\n}\n\nexport function UserRecipientItemMetadata(props: UserRecipientItemMetadataProps): JSX.Element {\n const { name, surname, avatarUrl } = getUserProps(props);\n\n return (\n <>\n <div className={`${styles.avatarContainer} ${props.avatarClassName} d-inline-block flex-shrink-0`}>\n <Avatar\n imageUrl={avatarUrl}\n imageCdnUrl={props.imageCdnUrl}\n initials={UserHelper.getInitials(name, surname)}\n showAnonymousUser={!props.anonymiseUsers && (!!props.user.sessionId || !!props.user.deleted)}\n anonymiseUsers={props.anonymiseUsers}\n anonymousSvgSize={SvgContainerSize.Small}\n />\n </div>\n\n <div className={props.detailsClassName}>\n <h4 className={classNames('font-size-normal fw-normal m-0', props.nameClassName)}>\n {name}\n </h4>\n {props.showSubText && `id` in props.user && <p className='text-secondary m-0'>{props.getSubText ? props.getSubText(props.user) : getSubText(props.user)}</p>}\n </div>\n </>\n );\n}","export enum InteractionCorrectness {\n Correct,\n Incorrect,\n AwaitingMarking,\n \n Answered,\n UnAnswered,\n NotApplicable\n}","export enum InteractiveAnswerStatus {\n Incorrect = 0,\n Correct = 1,\n PendingReview = 2\n}","import { Flight } from 'libs/common/react/index';\n\nexport const InsightsDemoRequests = {\n interactive(): Flight.Request {\n return {\n url: `/mocks/insights/interactive.json`,\n key: `demo:interactive`,\n normalize: false\n };\n },\n\n interactiveMetadata(): Flight.Request {\n return {\n url: `/mocks/insights/interactive-metadata.json`,\n key: `demo:interactive:metadata`,\n normalize: false\n };\n },\n\n interactiveResults(): Flight.Request {\n return {\n url: `/mocks/insights/interactive-results.json`,\n key: `demo:interactive:results`,\n normalize: false\n };\n },\n\n videoViews(): Flight.Request {\n return {\n url: `/mocks/insights/video-views.json`,\n key: `demo:video:views`,\n normalize: false\n };\n },\n\n users(): Flight.Request {\n return {\n url: `/mocks/insights/users.json`,\n key: `demo:users`,\n normalize: false\n };\n },\n\n individualHeatmap(): Flight.Request {\n return {\n url: `/mocks/insights/individual-heatmap.json`,\n key: `demo:individual:heatmap`,\n normalize: false\n };\n },\n\n aggregateHeatmap(): Flight.Request {\n return {\n url: `/mocks/insights/aggregate-heatmap.json`,\n key: `demo:aggregate:heatmap`,\n normalize: false\n };\n }\n};","import { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interaction, InteractionTypeId, InteractiveResult, StudentAnswer } from 'libs/shared/interfaces';\n\ntype GetStudentAnswerByActionableItemId = (id: string) => string;\n\nfunction notApplicable(): InteractionCorrectness {\n return InteractionCorrectness.NotApplicable;\n}\n\nfunction awaitingMarking(): InteractionCorrectness {\n return InteractionCorrectness.AwaitingMarking;\n}\n\nfunction isMissingWordCorrect(\n interaction: Interaction,\n getStudentAnswer: GetStudentAnswerByActionableItemId\n): InteractionCorrectness {\n const items = interaction.actionableItems.filter(a => a\n .isCorrect);\n\n if (items.every(a => !getStudentAnswer(a.id)))\n return InteractionCorrectness.UnAnswered;\n\n const correct = items.every(a => a.name.trim().toLowerCase() === getStudentAnswer(a.id)?.trim().toLowerCase());\n return correct ? InteractionCorrectness.Correct : InteractionCorrectness.Incorrect;\n}\n\nfunction isMultipleChoiceCorrect(\n interaction: Interaction,\n getStudentAnswer: GetStudentAnswerByActionableItemId\n): InteractionCorrectness {\n if (interaction.actionableItems.every(a => !getStudentAnswer(a.id)))\n return InteractionCorrectness.UnAnswered;\n \n const correctItems = interaction.actionableItems.filter(a => a.isCorrect);\n\n const correct = correctItems.every(a => {\n const studentAnswer = getStudentAnswer(a.id);\n\n /**\n * In the past we've only ever checked the answer name. But since we introduced the ability to have image interactions\n * with no question text, we've need to swap to saving the id. But past submissions still have the name\n * - Sha\n */\n return studentAnswer?.toString() === a.id?.toString() || studentAnswer === a.name;\n });\n return correct ? InteractionCorrectness.Correct : InteractionCorrectness.Incorrect;\n}\n\nfunction isMarkableAnswerMarkedCorrect(\n interaction: Interaction,\n getStudentAnswer: (id: string) => StudentAnswer\n): InteractionCorrectness {\n let correctness: InteractionCorrectness;\n\n // There should only be one actionableItem\n interaction.actionableItems.forEach(item => {\n const studentAnswer = getStudentAnswer(item.id);\n\n if (!studentAnswer) {\n correctness = InteractionCorrectness.UnAnswered;\n return;\n }\n\n if (studentAnswer.status === InteractiveAnswerStatus.Correct) {\n correctness = InteractionCorrectness.Correct;\n return;\n }\n\n if (studentAnswer.status === InteractiveAnswerStatus.Incorrect) {\n correctness = InteractionCorrectness.Incorrect;\n return;\n }\n\n correctness = InteractionCorrectness.AwaitingMarking;\n });\n\n return correctness;\n}\n\ntype IsCorrectFunction = (interaction: Interaction, result: InteractiveResult) => InteractionCorrectness;\n\nfunction getGetStudentAnswer(interaction: Interaction, result: InteractiveResult): (id: string) => StudentAnswer {\n return (id: string) => {\n const attempt = result?.attempts.find(a => a.id === interaction.id);\n return attempt?.answers.find(s => s.id === id);\n };\n}\n\nfunction wrapIsMissingWordCorrect(interaction: Interaction, result: InteractiveResult): InteractionCorrectness {\n const getStudentAnswer = getGetStudentAnswer(interaction, result);\n\n return isMissingWordCorrect(interaction, (id: string) => {\n const answer = getStudentAnswer(id);\n return answer?.text;\n });\n}\n\nfunction wrapIsMultipleChoiceCorrect(interaction: Interaction, result: InteractiveResult): InteractionCorrectness {\n const getStudentAnswer = getGetStudentAnswer(interaction, result);\n\n return isMultipleChoiceCorrect(interaction, (id: string) => {\n const answer = getStudentAnswer(id);\n return answer?.text;\n });\n}\n\nfunction wrapIsMarkableAnswerMarkedCorrect(\n interaction: Interaction,\n result: InteractiveResult\n): InteractionCorrectness {\n const getStudentAnswer = getGetStudentAnswer(interaction, result);\n return isMarkableAnswerMarkedCorrect(interaction, getStudentAnswer);\n}\n\nconst IsCorrectLookup: {[typeId: number]: IsCorrectFunction} = {\n [InteractionTypeId.Annotation]: notApplicable,\n [InteractionTypeId.Image]: notApplicable,\n [InteractionTypeId.MissingWord]: wrapIsMissingWordCorrect,\n [InteractionTypeId.MultipleChoice]: wrapIsMultipleChoiceCorrect,\n [InteractionTypeId.ShortAnswer]: wrapIsMarkableAnswerMarkedCorrect,\n [InteractionTypeId.TrueOrFalse]: wrapIsMultipleChoiceCorrect,\n [InteractionTypeId.Illustration]: wrapIsMarkableAnswerMarkedCorrect\n};\n\nfunction isInteractionCorrect(interaction: Interaction, result: InteractiveResult): InteractionCorrectness {\n const isCorrectFn = IsCorrectLookup[interaction.typeId];\n\n return isCorrectFn(interaction, result);\n}\n\nexport const InteractiveCorrectnessHelper = {\n notApplicable,\n awaitingMarking,\n isMissingWordCorrect,\n isMultipleChoiceCorrect,\n isInteractionCorrect\n};\n","import { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { SharePrivacy } from 'libs/shared/apps/share-v2/enums/SharePrivacy';\nimport { ShareType } from 'libs/shared/apps/share-v2/enums/ShareType';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { MySharesTableData } from 'apps/my-shares/components/my-shares-table/MySharesTableUtils';\n\nconst namespace = 'myShares.demoInsights';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst DEMO_INSIGHT_DAYS_AGO = 7;\n\nexport const DEMO_INSIGHTS_SHARE: Share = {\n type: ShareType.Link,\n privacy: SharePrivacy.JustMySchool,\n objectId: '0',\n objectTypeId: MasterType.Interactive,\n viewCount: 28,\n accessCount: 15,\n dateCreated: new Date().toISOString(),\n dateShared: new Date().toISOString(),\n expireDate: null,\n link: {\n shortenedEmbedUrl: '',\n shortenedUrl: ''\n },\n shareId: '0',\n ownerCustomerId: 0,\n ownerId: 0,\n recipients: [],\n options: {\n preventScrubbing: false,\n immediateFeedback: false\n }\n};\n\nexport const DEMO_INSIGHTS_OPEN_CLASSROOM_SHARE: Share = {\n ...DEMO_INSIGHTS_SHARE,\n type: ShareType.Open,\n expireDate: DateHelper.add(new Date(DEMO_INSIGHTS_SHARE.dateCreated), 30, 'days').toISOString(),\n privacy: SharePrivacy.PinCode\n};\n\nexport const DEMO_INSIGHTS_SHARE_TABLE_DATA: MySharesTableData = {\n share: DEMO_INSIGHTS_SHARE,\n sharedObject: null,\n shareRecipients: null,\n dateShared: DateHelper.subtract(new Date(), DEMO_INSIGHT_DAYS_AGO, 'days').toISOString()\n};\n\nexport const DEMO_INSIGHTS_OPEN_CLASSROOM_SHARE_TABLE_DATA: MySharesTableData = {\n ...DEMO_INSIGHTS_SHARE_TABLE_DATA,\n share: DEMO_INSIGHTS_OPEN_CLASSROOM_SHARE\n};\n\nexport const DEMO_INSIGHTS_APPLINK: Core.AppLink = {\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_OVERVIEW_DEMO\n};\n\nexport const DEMO_INSIGHTS_OPEN_CLASSROOM_APPLINK: Core.AppLink = {\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_OVERVIEW_OPEN_CLASSROOM_DEMO\n};\n\nexport const DEMO_INSIGHTS_ACTION: ActionOptions = {\n svgName: cvSvgLibrary.Analytics,\n label: getPhrase('demoInsights'),\n appLink: DEMO_INSIGHTS_APPLINK,\n group: 'insights',\n className: 'btn btn-outline-dark'\n};\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\n\nimport { BaseAnalyticsEventResponse } from 'libs/shared/apps/analytics/interfaces/BaseAnalyticsEvent';\nimport { AnalyticsFilterHelper } from 'libs/shared/apps/analytics/utils/AnalyticsFilterUtils';\nimport { ShareType } from 'libs/shared/apps/share-v2/enums/ShareType';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { InsightsDemoRequests } from 'libs/shared/flight-requests/InsightsDemoRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useLockContentWidth } from 'libs/shared/hooks/useLockContentWidth';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Config, CurrentUser, Engagement, Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\n\nimport { InsightsHeader } from 'apps/my-shares/components/insights-header/InsightsHeader';\nimport { InteractiveInsightsOverview } from 'apps/my-shares/components/interactive-insights-overview/InteractiveInsightsOverview';\nimport { DEMO_INSIGHTS_OPEN_CLASSROOM_SHARE, DEMO_INSIGHTS_SHARE } from 'apps/my-shares/constants/MySharesDemoInsights';\nimport { getInsightsDemoInteractiveTabs } from 'apps/my-shares/utils/InsightsAppLinkUtils';\nimport { getInteractiveInsightsAppLinks } from 'apps/my-shares/views/demo/overview/InteractiveInsightsOverviewDemoUtils';\n\nconst namespace = 'insights.interactiveInsightsOverviewView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InteractiveInsightsOverviewDemoViewProps {\n type?: ShareType;\n}\n\nexport function InteractiveInsightsOverviewDemoView(props: InteractiveInsightsOverviewDemoViewProps) {\n const [anonymiseUsers] = useViewModel<boolean>(SharedViewModelKeys.ANONYMISE_USERS);\n\n useLockContentWidth();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(\n InsightsDemoRequests.interactiveMetadata()\n );\n\n const interactive = Flight.useBasicFetch<Interactive>(InsightsDemoRequests.interactive());\n\n const audienceAppLinkParams = AnalyticsFilterHelper.getAudienceAppLinkParams();\n const dateRangeAppLinkParams = AnalyticsFilterHelper.getDateRangeAppLinkParams();\n\n const results = Flight.useBasicFetch<InteractiveResultSet>(InsightsDemoRequests.interactiveResults());\n\n const aggregateEngagement = Flight.useBasicFetch<Engagement>(\n InsightsDemoRequests.aggregateHeatmap()\n );\n\n const videoViews = Flight.useBasicFetch<BaseAnalyticsEventResponse>(\n InsightsDemoRequests.videoViews()\n );\n\n useSetPageMetadata({ title: interactiveMetadata.data ? getPhrase('pageTitle', { video: interactiveMetadata.data?.name }) : null });\n\n const hasDataLoaded =\n currentUser.data &&\n config.data &&\n interactiveMetadata.data &&\n interactive.data &&\n results.data &&\n aggregateEngagement.data &&\n !!videoViews.data;\n\n const params = {\n ...audienceAppLinkParams,\n ...dateRangeAppLinkParams\n };\n const interactiveInsightsAppLinks = getInteractiveInsightsAppLinks(\n '',\n params,\n props.type\n );\n\n const share = props.type === ShareType.Open ? DEMO_INSIGHTS_OPEN_CLASSROOM_SHARE : DEMO_INSIGHTS_SHARE;\n\n if (!hasDataLoaded)\n return <></>;\n \n return (\n <div className='px-3'>\n <InsightsHeader\n video={interactiveMetadata.data}\n tabs={getInsightsDemoInteractiveTabs(interactiveMetadata.data?.id, 'insights', params, props.type)}\n dateRangeAppLinkParams={dateRangeAppLinkParams}\n share={{\n ...share,\n objectId: interactiveMetadata.data?.id\n }}\n yearGroups={[]}\n markingRequired={props.type !== ShareType.Open}\n isDemo\n hasData\n />\n\n <InteractiveInsightsOverview\n aggregateEngagement={aggregateEngagement.data}\n interactive={interactive.data}\n interactiveMetadata={interactiveMetadata.data}\n classroomStudents={null}\n results={results.data}\n osCount={videoViews.data?.osCount}\n config={config.data}\n interactiveInsightsAppLinks={interactiveInsightsAppLinks}\n anonymiseUsers={anonymiseUsers}\n hasDataLoaded={hasDataLoaded}\n share={share}\n />\n </div>\n );\n}","import { HashObject } from 'libs/common/react/interfaces';\n\nimport { ShareType } from 'libs/shared/apps/share-v2/enums/ShareType';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nexport function getInteractiveInsightsAppLinks(id: string, params?: HashObject, type?: ShareType) {\n if (type === ShareType.Open) {\n return {\n resultsAppLink: {\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_STUDENTS_OPEN_CLASSROOM_DEMO,\n args: [id],\n params\n },\n questionsAppLink: {\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_QUESTIONS_OPEN_CLASSROOM_DEMO,\n args: [id],\n params\n },\n heatmapAppLink: {\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_HEATMAP_OPEN_CLASSROOM_DEMO,\n args: [id],\n params\n }\n };\n }\n \n return {\n resultsAppLink: {\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_STUDENTS_DEMO,\n args: [id],\n params\n },\n questionsAppLink: {\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_QUESTIONS_DEMO,\n args: [id],\n params\n },\n heatmapAppLink: {\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_HEATMAP_DEMO,\n args: [id],\n params\n }\n };\n}","// extracted by mini-css-extract-plugin\nexport default {\"removeRecipient\":\"mCbMC\",\"recipientItem\":\"kdcb0\",\"showSpinner\":\"xH6Mu\",\"avatarContainer\":\"Zcpg3\",\"recipientDetails\":\"v5EmV\",\"recipientDetailsWithRemoveButton\":\"_V928\"};"],"names":["namespace","ZERO_COLOUR","COLOUR_SCALE","LEGEND_VALUES","getBackgroundColor","value","max","hex","getGradient","data","gradient","i","length","previousValue","currentValue","nextValue","push","join","EngagementHeatMapLegend","Math","legendSquareWidthPercentage","className","Text","phrase","map","val","idx","key","style","width","backgroundColor","EngagementHeatMap","props","heatMap","engagement","background","InsightCard","subtitle","svgClassName","SvgContainer","svgName","size","S","title","count","children","CHART_FONT_STYLES","fontSize","fontFamily","fontWeight","color","getFullHeatMap","videoDuration","Array","ceil","fill","t","getEngagementRate","reduce","prev","next","engagementRate","groupStudents","interactive","results","scoreThreshold","groups","markingRequired","lowScore","highScore","completed","notCompleted","interactions","interactionIds","Set","id","students","forEach","s","withSummary","summary","getStudentResultsSummary","awaitingMarking","attempts","filter","a","has","answers","questionId","percentCorrect","HIGH","MODERATE","sortedLowScore","sortedHighScore","getInteractionById","interactionId","find","toString","getMarkedAnswerId","answer","resultId","getMarkedStatus","studentResults","markedAnswers","result","studentResponse","every","status","getInteractionResultsSummary","interaction","numStudents","numCorrect","answered","unanswered","correctness","correct","numInteractions","answeredInteractions","getPhrase","UserRecipientItemMetadata","user","anonymiseUsers","showDisplayName","sessionId","deleted","anonName","nameParts","split","n","name","surname","slice","avatarUrl","avatar","url","getUserProps","avatarClassName","imageUrl","imageCdnUrl","initials","showAnonymousUser","anonymousSvgSize","detailsClassName","nameClassName","showSubText","getSubText","userType","role","yearGroup","defaults","InteractionCorrectness","InteractiveAnswerStatus","InsightsDemoRequests","normalize","interactiveMetadata","interactiveResults","videoViews","users","individualHeatmap","aggregateHeatmap","notApplicable","isMissingWordCorrect","getStudentAnswer","items","actionableItems","isCorrect","trim","toLowerCase","isMultipleChoiceCorrect","studentAnswer","getGetStudentAnswer","attempt","wrapIsMultipleChoiceCorrect","text","wrapIsMarkableAnswerMarkedCorrect","item","isMarkableAnswerMarkedCorrect","IsCorrectLookup","InteractiveCorrectnessHelper","isInteractionCorrect","isCorrectFn","typeId","DEMO_INSIGHTS_SHARE","type","privacy","objectId","objectTypeId","viewCount","accessCount","dateCreated","Date","toISOString","dateShared","expireDate","link","shortenedEmbedUrl","shortenedUrl","shareId","ownerCustomerId","ownerId","recipients","options","preventScrubbing","immediateFeedback","DEMO_INSIGHTS_OPEN_CLASSROOM_SHARE","DEMO_INSIGHTS_SHARE_TABLE_DATA","share","sharedObject","shareRecipients","DEMO_INSIGHTS_OPEN_CLASSROOM_SHARE_TABLE_DATA","DEMO_INSIGHTS_APPLINK","application","action","DEMO_INSIGHTS_OPEN_CLASSROOM_APPLINK","DEMO_INSIGHTS_ACTION","label","appLink","group","LanguageService","InteractiveInsightsOverviewDemoView","SharedViewModelKeys","useLockContentWidth","currentUser","UserRequests","config","ConfigRequests","audienceAppLinkParams","dateRangeAppLinkParams","aggregateEngagement","useSetPageMetadata","video","hasDataLoaded","params","interactiveInsightsAppLinks","ShareType","resultsAppLink","args","questionsAppLink","heatmapAppLink","getInteractiveInsightsAppLinks","InsightsHeader","tabs","yearGroups","isDemo","hasData","InteractiveInsightsOverview","classroomStudents","osCount"],"sourceRoot":""}
@@ -1,2 +1,2 @@
1
- "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[9742],{91200:(e,t,a)=>{a.d(t,{Y:()=>s});var n=a(32735),r=a(68050),i=a(69111),l=a(79382);function o(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,n=Array(t);a<t;a++)n[a]=e[a];return n}function s(e){var t,a=function(e){if(Array.isArray(e))return o(e)}(t=Array(e.numItems))||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(t)||function(e,t){if(e){if("string"==typeof e)return o(e,t);var a={}.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?o(e,t):void 0}}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(),s=e.itemClassName||"";return n.createElement(n.Fragment,null,e.showHeading&&n.createElement("div",{className:"".concat(l.Z.partialHeading," mb-1 partial-loading-background")}),n.createElement(r.Z,{className:"mx-n1 mb-n2"},a.map(function(e,t){return n.createElement(i.Z,{key:t,xs:6,sm:4,lg:3,className:"".concat(s," px-1 pb-2")},n.createElement("div",{className:"".concat(l.Z.playlistItem," partial-loading-background rounded-3")}))})))}s.defaultProps={numItems:8}},23162:(e,t,a)=>{a.d(t,{t:()=>N});var n=a(32735),r=a(82602),i=a(23481),l=a(110),o=a(65858),s=a(83345),c="playlists.playlistCount";function u(e){var t=function(e){var t,a,n,r,i,l;return!!e&&(null!==(a=null===(t=e.videos)||void 0===t?void 0:t.count)&&void 0!==a?a:0)+(null!==(r=null===(n=e.interactives)||void 0===n?void 0:n.count)&&void 0!==r?r:0)+(null!==(l=null===(i=e.clips)||void 0===i?void 0:i.count)&&void 0!==l?l:0)}(e.playlist);return!1===t||Number.isNaN(t)?n.createElement(n.Fragment,null):n.createElement("span",{className:"text-shadow font-size-sm"},n.createElement(s.x,{namespace:c,phrase:"count",options:{smartCount:t}}))}var d=a(97408),m=a(97392),p=a(64818);function v(e){var t,a,r,i=e.playlist._liteOwner;if(null===(t=e.playlist._isClickViewCurated)||void 0===t?void 0:t.value)return n.createElement(m.F,null);if(!(null==i?void 0:i.id)||!(null===(a=e.currentUser)||void 0===a?void 0:a.id))return n.createElement(n.Fragment,null);if(i.id.toString()===e.currentUser.id.toString())return n.createElement(n.Fragment,null);var l="string"==typeof i.avatar?i.avatar:null===(r=i.avatar)||void 0===r?void 0:r.url;return n.createElement(d.q,{imageUrl:l,imageCdnUrl:e.imageCdnUrl,initials:p.l.getInitials(i.name,i.surname)})}var y=a(15611),f=a(69776),g=a(7432),h=a(11834),b=a(54610),E=a(80143),C=a(9085),w=a(67453),S=a(79382),P="playlists.playlistList";function N(e){var t,a,s=w.j.createUrl(e.data.cover&&e.data.cover.url,{size:b.h2.Medium,resizeType:b.Nq.Cover}),c=e.data.subjectPresentationAudiences&&e.data.subjectPresentationAudiences.data,d=(0,E.n)(c,e.presentationAudiences),m=S.Z.playlistItem,p=!!s||!!e.showFallbackImage;p&&(m+=" ".concat(S.Z.playlistItemGradient)),!p&&e.bgColourClassNames&&(m+=" ".concat(S.Z.playlistItem," ").concat((0,C.x)(e.data.name,e.bgColourClassNames))),"round"===e.itemStyle&&(m+=" rounded-3 overflow-hidden"),"round-left"===e.itemStyle&&(m+=" rounded-start-lg overflow-hidden");var N=Object.assign(Object.assign({},e.analyticsData),{id:null===(t=e.data)||void 0===t?void 0:t.id,name:null===(a=e.data)||void 0===a?void 0:a.name}),I=Object.assign(Object.assign({},e.analyticsOptions),{entity:o.py.Playlist});return n.createElement(y.F,{appLink:e.appLink,analyticsData:N,analyticsOptions:I,title:function(){var t;return!e.data.contentModifiedDate||(null===(t=e.data._isClickViewCurated)||void 0===t?void 0:t.value)?"":i.T.getPhrase(P,"lastUpdated",{timeago:(0,r.WU)(l.O.convertUTCToLocal(e.data.contentModifiedDate))})}()},n.createElement(g.Z,{data:s,alt:e.data.name,className:m},!!e.showFallbackImage&&n.createElement(h.oy,{type:h.mS.Playlist}),n.createElement("div",{className:"text-white ".concat(S.Z.playlistMetadata)},!!e.showCount&&n.createElement(u,{playlist:e.data}),n.createElement("h5",{className:"mb-0 ".concat(e.titleClassName||"")},n.createElement("span",{className:"text-shadow clamp-2"},e.data.name)),!!c&&!!c.length&&!!d&&n.createElement(f.P,{className:"".concat(e.audienceLabelClass?e.audienceLabelClass:""," mt-1"),audience:d,border:"white"})),!!e.showOwner&&!!e.imageCdnUrl&&n.createElement("div",{className:S.Z.ownerAvatarContainer},n.createElement(v,{playlist:e.data,currentUser:e.currentUser,imageCdnUrl:e.imageCdnUrl}))))}N.defaultProps={itemStyle:"square"}},31273:(e,t,a)=>{a.d(t,{P:()=>c});var n=a(32735),r=a(68050),i=a(69111),l=a(65858),o=a(23162),s={actionType:l.Vw.Click,entity:l.py.Playlist,location:l.LZ.PlaylistListItem,descriptor:l._S.Cover};function c(e){return n.createElement(r.Z,{as:"ul",className:"list-unstyled mx-n1"},e.extraPlaylistItem&&n.createElement(i.Z,{as:"li",key:"extra-playlist-item",xs:6,sm:4,lg:3,className:"mb-2 px-1 ".concat(e.itemContainerClassName?e.itemContainerClassName:"")},e.extraPlaylistItem),e.playlists.map(function(t){return n.createElement(i.Z,{as:"li",key:t.id,xs:6,sm:4,lg:3,className:"mb-2 px-1 ".concat(e.itemContainerClassName?e.itemContainerClassName:"")},n.createElement(o.t,{data:t,appLink:e.getPlaylistAppLink(t),imageCdnUrl:e.imageCdnUrl,currentUser:e.currentUser,presentationAudiences:e.presentationAudiences,bgColourClassNames:e.bgColourClassNames,showCount:e.showCount,showOwner:e.showOwner,showFallbackImage:e.showFallbackImage,titleClassName:e.itemTitleClassName,itemStyle:e.itemStyle,analyticsData:e.analyticsData,analyticsOptions:Object.assign(Object.assign({},e.analyticsOptions),s)}))}))}},94644:(e,t,a)=>{a.d(t,{r:()=>u});var n=a(50242),r=a(81886),i=a(67058),l=a(14553),o=a(49267),s=a(49075),c={notFound:i.d,forbidden:{rating:l.q,yearLevel:l.q,region:o.a,privacy:l.q},badRequest:s._,internalServerError:s._};function u(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(e){var i;i="number"==typeof e?e:e.status;var l=Object.assign(Object.assign({},c),t);i&&r.Q.Ry.isStatusCodeError(i)&&(i!==n.o.InternalServer?i!==n.o.NotFound?i!==n.o.Forbidden?a.badRequest||r.Q.Ry.throw(new l.badRequest):a.forbidden||r.Q.Ry.throw(new l.forbidden.privacy):a.notFound||r.Q.Ry.throw(new l.notFound):a.internalServerError||r.Q.Ry.throw(new s._))}}},60115:(e,t,a)=>{a.d(t,{K:()=>c});var n=a(32735),r=a(50242),i=a(91967),l=400,o=a(45719);function s(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,n=Array(t);a<t;a++)n[a]=e[a];return n}function c(e,t,a,c,u,d){var m,p,v,y,f=(m=(0,n.useState)(0),p=2,function(e){if(Array.isArray(e))return e}(m)||function(e,t){var a=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var n,r,i,l,o=[],s=!0,c=!1;try{if(i=(a=a.call(e)).next,0===t){if(Object(a)!==a)return;s=!1}else for(;!(s=(n=i.call(a)).done)&&(o.push(n.value),o.length!==t);s=!0);}catch(e){c=!0,r=e}finally{try{if(!s&&null!=a.return&&(l=a.return(),Object(l)!==l))return}finally{if(c)throw r}}return o}}(m,p)||function(e,t){if(e){if("string"==typeof e)return s(e,t);var a={}.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?s(e,t):void 0}}(m,p)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),g=f[0],h=f[1],b=t,E=(0,o.P)(function(t){if(!e)return null;var a=e(t);return a?a.key:null},c,u);return v={fetchNextPage:function(){if(t&&e&&E)return h(function(e){return e+1}),b(E.nextCursor)},hasMore:!!(null==E?void 0:E.nextCursor),isFetching:null==E?void 0:E.isFetching,scrollContainer:d},y=function(){if(!v.isFetching){if(v.scrollContainer){var e=v.scrollContainer;if(e.getBoundingClientRect().height+e.scrollTop<e.scrollHeight-l)return}else if(window.innerHeight+document.documentElement.scrollTop<document.documentElement.scrollHeight-l)return;v.fetchNextPage()}},(0,n.useEffect)(function(){var e=i.q.throttle(y,200),t=v.scrollContainer||window;return v.hasMore&&t.addEventListener("scroll",e),function(){return t.removeEventListener("scroll",e)}},[v.hasMore,v.fetchNextPage,v.scrollContainer]),(0,n.useEffect)(function(){E&&E.shouldInitialFetch&&t&&(b(),h(function(e){return e+1}))},[null==E?void 0:E.shouldInitialFetch,t]),(0,n.useEffect)(function(){var e,t;if((null==E?void 0:E.statusCode)&&i.q.isFunction(a)){var n=+(null===(t=null===(e=E.statusCode)||void 0===e?void 0:e.toString())||void 0===t?void 0:t.substr(0,1));n!==r.k.ClientError&&n!==r.k.ServerError||a(g,E.statusCode)}},[null==E?void 0:E.statusCode]),{items:null==E?void 0:E.items,hasMore:!!(null==E?void 0:E.nextCursor),nextCursor:null==E?void 0:E.nextCursor,isFetching:null==E?void 0:E.isFetching,totalItems:null==E?void 0:E.totalItems,hasFirstPageCompleted:null==E?void 0:E.hasFirstPageCompleted}}},89742:(e,t,a)=>{a.r(t),a.d(t,{PlaylistsView:()=>$});var n=a(32735),r=a(70680),i=a(23481),l=a(20354),o=a(65858),s=a(91200),c=a(31273),u=a(91967),d=a(76611),m=a(15611);function p(e){return p="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},p(e)}function v(e,t,a){return(t=function(e){var t=function(e){if("object"!=p(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var a=t.call(e,"string");if("object"!=p(a))return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==p(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}var y="playlists.playlistSortSelect",f=u.q.memoize(function(){return v(v(v(v(v({},d.o.RecentlyUpdated,{name:i.T.getPhrase(y,"recentlyUpdated")}),d.o.AtoZ,{name:i.T.getPhrase(y,"atoz")}),d.o.ZtoA,{name:i.T.getPhrase(y,"ztoa")}),d.o.Newest,{name:i.T.getPhrase(y,"newest")}),d.o.Oldest,{name:i.T.getPhrase(y,"oldest")})});function g(e){var t=e.type,a=e.getSortAppLink,r=e.variant,i=f();return n.createElement("div",{className:"dropdown"},n.createElement("button",{className:"btn btn-".concat(r," ms-2 dropdown-toggle"),type:"button",id:"sort-select","data-bs-toggle":"dropdown","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"},i[t].name),n.createElement("ul",{className:"dropdown-menu dropdown-menu-end dropdown-menu-right","aria-labelledby":"sort-select"},Object.values(d.o).map(function(e){var r="dropdown-item";return e===t&&(r+=" active"),n.createElement("li",{key:e},n.createElement(m.F,{className:r,appLink:a(e),analyticsData:{sort:i[e].name},analyticsOptions:{location:o.LZ.PlaylistListHeader,entity:o.py.Playlists,actionType:o.Vw.Sort,workflowPhase:o.eu.Complete}},i[e].name))})))}g.defaultProps={variant:"light"};var h=a(23257),b=a(70006),E=a(71521),C=a(83657),w=a(87801),S=a(83345),P=a(7733),N=a(16714),I=a(94644),L=a(39151),A=a(5112),x=a(31949),T=a(69883),k=a(60115),F=a(22902),O=a(79612),U=a(35223),_=a(14070),j=a(97291),M=a(44110),Z=a(26323),D=a(99742);const R={playlistMetadata:"vv8fW"};var V="playlists.favouritesPlaylistItem",Y=i.T.encloseNamespace(V);function B(e){var t={entity:o.py.Playlist,actionType:o.Vw.Click,location:o.LZ.PlaylistListItem},a=D.W.FAVOURITES_PLAYLIST.FAV_PLAYLIST_COVER,r={application:j.O.MY_FAVOURITES,action:_.e.MyFavourites.MY_FAVOURITES};return n.createElement(m.F,{appLink:r,analyticsData:{name:"Favourites",extraItem:"user-favourites"},analyticsOptions:t,title:Y("favouritesTitle")},n.createElement("div",{className:"position-relative"},n.createElement("div",{className:"text-white font-size-sm text-shadow ".concat(R.playlistMetadata)},!e.isLoadingCount&&n.createElement("span",null,n.createElement(S.x,{namespace:V,phrase:"count",options:{smartCount:e.count}})),n.createElement("h5",{className:"mb-0"},n.createElement("span",{className:"clamp-2"},Y("favouritesTitle")))),n.createElement("img",{src:a,alt:Y("favouritesTitle"),className:"w-100 h-100 rounded-3"})))}var q=a(12909),H=a(52931),z="playlists.playlists",W=i.T.encloseNamespace(z);function G(e){return{application:j.O.PLAYLISTS,action:_.e.Playlists.HOME,params:{sort:e}}}function $(e){var t,a=(0,r.I0)(),i=(0,T.Z)(),u=(0,F.T)(),d=u.hasLocalPermissions,m=u.getGatedPermission,p=u.isLoaded,v=l.a.useBasicFetch(L.L.config()),y=l.a.useBasicFetch(x.N.currentUser()),f=(0,M.i)(),D=!!y.data&&E.A.getOrSetSortType(y.data.id,e.sort),R=(0,Z.B)(null===(t=y.data)||void 0===t?void 0:t.id),V=R.count,Y=R.favourites,$={count:V,isLoadingCount:R.isLoading,data:Y},Q=!!D&&function(e){return A.C.getUserPlaylists(new b.l(D,e,h.e.All))},J=!!Q&&function(e){l.a.getFetch(a)(Q(e))};(0,O.M)({title:W("pageTitle"),description:W("pageDescription")});var K=!d(N.E.ViewPlaylistsLanding)&&D,X=(0,k.K)(!!K&&Q,J,function(e,t){if(1===e)return(0,I.r)(t);i.error(W("error"))}),ee=X.items,te=X.hasMore,ae=X.isFetching,ne=[{label:W("createPlaylist"),appLink:{application:j.O.PLAYLISTS,action:_.e.Playlists.NEW_PLAYLIST},svgName:U.vn.Plus,className:"btn btn-outline-dark",button:!0,analyticsData:{},analyticsOptions:{location:o.LZ.Banner,entity:o.py.Playlist,workflowPhase:o.eu.Start,actionType:o.Vw.Create}}],re=!!ee&&!!y.data&&!!v.data&&(!!f.data||f.hasError)&&!!p;return d(N.E.ViewPlaylistsLanding)?n.createElement(H.Y,null):n.createElement("div",{className:"bg-white px-3"},"soft-gate"===m(N.C.CreatePlaylist)&&n.createElement(q.H,null),n.createElement("div",{className:"d-flex justify-content-between align-items-end pb-3"},n.createElement("h1",{className:"h2 mb-0"},n.createElement(S.x,{namespace:z,phrase:"headerTitle"})),!!D&&n.createElement(C.e,{actions:ne,sortComponent:n.createElement(g,{variant:"outline-dark",type:D,getSortAppLink:G})})),re?n.createElement(c.P,{playlists:ee,getPlaylistAppLink:e.getPlaylistAppLink,imageCdnUrl:v.data.imageCdnUrl,currentUser:y.data,presentationAudiences:f.data||[],bgColourClassNames:P.o,itemContainerClassName:"columns-of-five",itemStyle:"round",showCount:!0,showOwner:!0,extraPlaylistItem:n.createElement(B,Object.assign({},$))}):n.createElement(s.Y,{itemClassName:"columns-of-five"}),re&&(te||ae)&&n.createElement(w._,{isFetching:ae,fetchNext:J}))}},52931:(e,t,a)=>{a.d(t,{Y:()=>y,v:()=>v});var n=a(32735),r=a(23481),i=a(65858),l=a(97958),o=a(83345),s=a(35223),c=a(99742),u=a(14070),d=a(97291),m="playlists.playlistsEmptyState",p=r.T.encloseNamespace(m);function v(e){return n.createElement(o.D.Provider,{value:m},n.createElement(l.u,{className:e.className},n.createElement(l.u.Image,{src:c.W.EmptyStates.Playlists.PLAYLISTS,altText:p("info"),size:e.imageSize}),n.createElement(l.u.Heading,{className:e.headingClassName},n.createElement(o.x,{phrase:"heading"})),n.createElement(l.u.Info,{className:"w-75"},n.createElement(o.x,{phrase:e.isStudent?"studentInfo":"info"})),!e.hideButton&&n.createElement(l.u.Cta,{text:r.T.getPhrase(m,"cta"),icon:s.vn.Plus,appLink:{application:d.O.PLAYLISTS,action:u.e.Playlists.NEW_PLAYLIST}})))}function y(){return n.createElement(o.D.Provider,{value:m},n.createElement(l.u,null,n.createElement(l.u.Image,{src:c.W.EmptyStates.Playlists.PLAYLISTS_PUBLIC,altText:p("info")}),n.createElement(l.u.Heading,null,n.createElement(o.x,{phrase:"heading"})),n.createElement(l.u.Info,null,n.createElement(o.x,{phrase:"info"})),n.createElement(l.u.Cta,{text:r.T.getPhrase(m,"publicCta"),appLink:{application:d.O.SIGN_UP,action:u.e.SignUp.SIGN_UP},analyticsData:{},analyticsOptions:{actionType:i.Vw.Click,location:i.LZ.PlaylistsLanding,entity:i.py.AppLink,workflowPhase:i.eu.Start,descriptor:i.Yu.SignUp}})))}},12909:(e,t,a)=>{a.d(t,{H:()=>d});var n=a(32735),r=a(15611),i=a(83914),l=a(83345),o=a(35223),s=a(14070),c=a(97291),u="signUp.softGateBanner";function d(){return n.createElement("div",{role:"alert",className:"bg-light-indigo text-indigo rounded p-2 mb-4 d-flex align-items-center"},n.createElement(i.x,{svgName:o.vn.StarOutline,size:i.S.Large}),n.createElement(l.x,{namespace:u,phrase:"softGate"})," ",n.createElement(r.F,{appLink:{application:c.O.SIGN_UP,action:s.e.SignUp.PREMIUM_FEATURES},className:"indigo-link text-indigo text-underline d-inline"},n.createElement(l.x,{namespace:u,phrase:"learnMore"})))}},44110:(e,t,a)=>{a.d(t,{i:()=>l});var n=a(20354),r=a(89454),i=a(86698),l=function(){var e=(0,i.y)({redirectOnError:!0}),t=e.activePresentation,a=e.getFallbackPresentation,l=t||a();return n.a.useBasicFetch(!!l&&r.O.presentationAudiences(l.id))}},26323:(e,t,a)=>{a.d(t,{B:()=>o});var n=a(20354),r=a(63419);function i(e){return function(e){if(Array.isArray(e))return l(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return l(e,t);var a={}.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?l(e,t):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function l(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,n=Array(t);a<t;a++)n[a]=e[a];return n}function o(e){var t,a,l,o,s,c,u,d,m,p=n.a.useBasicFetch(e&&r.P.getFavouritesVideosCount(e)),v=n.a.useBasicFetch(e&&r.P.getFavouritesClipsCount(e)),y=n.a.useBasicFetch(e&&r.P.getFavouritesInteractivesCount(e));return{count:(null===(t=p.data)||void 0===t?void 0:t.count)+(null===(a=y.data)||void 0===a?void 0:a.count)+(null===(l=v.data)||void 0===l?void 0:l.count),favourites:[].concat(i((null===(o=p.data)||void 0===o?void 0:o.data)||[]),i((null===(s=v.data)||void 0===s?void 0:s.data)||[]),i((null===(c=y.data)||void 0===c?void 0:c.data)||[])),isLoading:!(null===(u=p.data)||void 0===u?void 0:u.data)||!(null===(d=v.data)||void 0===d?void 0:d.data)||!(null===(m=y.data)||void 0===m?void 0:m.data)}}},79382:(e,t,a)=>{a.d(t,{Z:()=>n});const n={playlistItem:"CaRJx",playlistItemGradient:"BI7p2",playlistMetadata:"eDk1l",partialHeading:"w4lWh",ownerAvatarContainer:"JImqE"}},82602:(e,t,a)=>{a.d(t,{WU:()=>c});var n=["second","minute","hour","day","week","month","year"],r=["秒","分钟","小时","天","周","个月","年"],i={},l=function(e,t){i[e]=t},o=[60,60,24,7,365/7/12,12];function s(e){return e instanceof Date?e:!isNaN(e)||/^\d+$/.test(e)?new Date(parseInt(e)):(e=(e||"").trim().replace(/\.\d+/,"").replace(/-/,"/").replace(/-/,"/").replace(/(\d)T(\d)/,"$1 $2").replace(/Z/," UTC").replace(/([+-]\d\d):?(\d\d)/," $1$2"),new Date(e))}var c=function(e,t,a){var n=function(e,t){return(+(t?s(t):new Date)-+s(e))/1e3}(e,a&&a.relativeDate);return function(e,t){for(var a=e<0?1:0,n=e=Math.abs(e),r=0;e>=o[r]&&r<o.length;r++)e/=o[r];return(e=Math.floor(e))>(0==(r*=2)?9:1)&&(r+=1),t(e,r,n)[a].replace("%s",e.toString())}(n,function(e){return i[e]||i.en_US}(t))};l("en_US",function(e,t){if(0===t)return["just now","right now"];var a=n[Math.floor(t/2)];return e>1&&(a+="s"),[e+" "+a+" ago","in "+e+" "+a]}),l("zh_CN",function(e,t){if(0===t)return["刚刚","片刻后"];var a=r[~~(t/2)];return[e+" "+a+"前",e+" "+a+"后"]})}}]);
2
- //# sourceMappingURL=9742-5f99d74bb0-lite.chunk.js.map
1
+ "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[9742],{91200:(e,t,a)=>{a.d(t,{Y:()=>s});var n=a(32735),r=a(68050),i=a(69111),l=a(79382);function o(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,n=Array(t);a<t;a++)n[a]=e[a];return n}function s(e){var t,a=function(e){if(Array.isArray(e))return o(e)}(t=Array(e.numItems))||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(t)||function(e,t){if(e){if("string"==typeof e)return o(e,t);var a={}.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?o(e,t):void 0}}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(),s=e.itemClassName||"";return n.createElement(n.Fragment,null,e.showHeading&&n.createElement("div",{className:"".concat(l.Z.partialHeading," mb-1 partial-loading-background")}),n.createElement(r.Z,{className:"mx-n1 mb-n2"},a.map(function(e,t){return n.createElement(i.Z,{key:t,xs:6,sm:4,lg:3,className:"".concat(s," px-1 pb-2")},n.createElement("div",{className:"".concat(l.Z.playlistItem," partial-loading-background rounded-3")}))})))}s.defaultProps={numItems:8}},23162:(e,t,a)=>{a.d(t,{t:()=>N});var n=a(32735),r=a(82602),i=a(23481),l=a(110),o=a(65858),s=a(83345),c="playlists.playlistCount";function u(e){var t=function(e){var t,a,n,r,i,l;return!!e&&(null!==(a=null===(t=e.videos)||void 0===t?void 0:t.count)&&void 0!==a?a:0)+(null!==(r=null===(n=e.interactives)||void 0===n?void 0:n.count)&&void 0!==r?r:0)+(null!==(l=null===(i=e.clips)||void 0===i?void 0:i.count)&&void 0!==l?l:0)}(e.playlist);return!1===t||Number.isNaN(t)?n.createElement(n.Fragment,null):n.createElement("span",{className:"text-shadow font-size-sm"},n.createElement(s.x,{namespace:c,phrase:"count",options:{smartCount:t}}))}var d=a(97408),m=a(97392),p=a(64818);function v(e){var t,a,r,i=e.playlist._liteOwner;if(null===(t=e.playlist._isClickViewCurated)||void 0===t?void 0:t.value)return n.createElement(m.F,null);if(!(null==i?void 0:i.id)||!(null===(a=e.currentUser)||void 0===a?void 0:a.id))return n.createElement(n.Fragment,null);if(i.id.toString()===e.currentUser.id.toString())return n.createElement(n.Fragment,null);var l="string"==typeof i.avatar?i.avatar:null===(r=i.avatar)||void 0===r?void 0:r.url;return n.createElement(d.q,{imageUrl:l,imageCdnUrl:e.imageCdnUrl,initials:p.l.getInitials(i.name,i.surname)})}var y=a(15611),f=a(69776),g=a(7432),h=a(11834),b=a(54610),C=a(80143),E=a(9085),w=a(67453),P=a(79382),S="playlists.playlistList";function N(e){var t,a,s=w.j.createUrl(e.data.cover&&e.data.cover.url,{size:b.h2.Medium,resizeType:b.Nq.Cover}),c=e.data.subjectPresentationAudiences&&e.data.subjectPresentationAudiences.data,d=(0,C.n)(c,e.presentationAudiences),m=P.Z.playlistItem,p=!!s||!!e.showFallbackImage;p&&(m+=" ".concat(P.Z.playlistItemGradient)),!p&&e.bgColourClassNames&&(m+=" ".concat(P.Z.playlistItem," ").concat((0,E.x)(e.data.name,e.bgColourClassNames))),"round"===e.itemStyle&&(m+=" rounded-3 overflow-hidden"),"round-left"===e.itemStyle&&(m+=" rounded-start-lg overflow-hidden");var N=Object.assign(Object.assign({},e.analyticsData),{id:null===(t=e.data)||void 0===t?void 0:t.id,name:null===(a=e.data)||void 0===a?void 0:a.name}),I=Object.assign(Object.assign({},e.analyticsOptions),{entity:o.py.Playlist});return n.createElement(y.F,{appLink:e.appLink,analyticsData:N,analyticsOptions:I,title:function(){var t;return!e.data.contentModifiedDate||(null===(t=e.data._isClickViewCurated)||void 0===t?void 0:t.value)?"":i.T.getPhrase(S,"lastUpdated",{timeago:(0,r.WU)(l.O.convertUTCToLocal(e.data.contentModifiedDate))})}()},n.createElement(g.Z,{data:s,alt:e.data.name,className:m},!!e.showFallbackImage&&n.createElement(h.oy,{type:h.mS.Playlist}),n.createElement("div",{className:"text-white ".concat(P.Z.playlistMetadata)},!!e.showCount&&n.createElement(u,{playlist:e.data}),n.createElement("h5",{className:"mb-0 ".concat(e.titleClassName||"")},n.createElement("span",{className:"text-shadow clamp-2"},e.data.name)),!!c&&!!c.length&&!!d&&n.createElement(f.P,{className:"".concat(e.audienceLabelClass?e.audienceLabelClass:""," mt-1"),audience:d,border:"white"})),!!e.showOwner&&!!e.imageCdnUrl&&n.createElement("div",{className:P.Z.ownerAvatarContainer},n.createElement(v,{playlist:e.data,currentUser:e.currentUser,imageCdnUrl:e.imageCdnUrl}))))}N.defaultProps={itemStyle:"square"}},31273:(e,t,a)=>{a.d(t,{P:()=>c});var n=a(32735),r=a(68050),i=a(69111),l=a(65858),o=a(23162),s={actionType:l.Vw.Click,entity:l.py.Playlist,location:l.LZ.PlaylistListItem,descriptor:l._S.Cover};function c(e){return n.createElement(r.Z,{as:"ul",className:"list-unstyled mx-n1"},e.extraPlaylistItem&&n.createElement(i.Z,{as:"li",key:"extra-playlist-item",xs:6,sm:4,lg:3,className:"mb-2 px-1 ".concat(e.itemContainerClassName?e.itemContainerClassName:"")},e.extraPlaylistItem),e.playlists.map(function(t){return n.createElement(i.Z,{as:"li",key:t.id,xs:6,sm:4,lg:3,className:"mb-2 px-1 ".concat(e.itemContainerClassName?e.itemContainerClassName:"")},n.createElement(o.t,{data:t,appLink:e.getPlaylistAppLink(t),imageCdnUrl:e.imageCdnUrl,currentUser:e.currentUser,presentationAudiences:e.presentationAudiences,bgColourClassNames:e.bgColourClassNames,showCount:e.showCount,showOwner:e.showOwner,showFallbackImage:e.showFallbackImage,titleClassName:e.itemTitleClassName,itemStyle:e.itemStyle,analyticsData:e.analyticsData,analyticsOptions:Object.assign(Object.assign({},e.analyticsOptions),s)}))}))}},94644:(e,t,a)=>{a.d(t,{r:()=>u});var n=a(50242),r=a(81886),i=a(67058),l=a(14553),o=a(49267),s=a(49075),c={notFound:i.d,forbidden:{rating:l.q,yearLevel:l.q,region:o.a,privacy:l.q},badRequest:s._,internalServerError:s._};function u(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(e){var i;i="number"==typeof e?e:e.status;var l=Object.assign(Object.assign({},c),t);i&&r.Q.Ry.isStatusCodeError(i)&&(i!==n.o.InternalServer?i!==n.o.NotFound?i!==n.o.Forbidden?a.badRequest||r.Q.Ry.throw(new l.badRequest):a.forbidden||r.Q.Ry.throw(new l.forbidden.privacy):a.notFound||r.Q.Ry.throw(new l.notFound):a.internalServerError||r.Q.Ry.throw(new s._))}}},60115:(e,t,a)=>{a.d(t,{K:()=>c});var n=a(32735),r=a(50242),i=a(91967),l=400,o=a(45719);function s(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,n=Array(t);a<t;a++)n[a]=e[a];return n}function c(e,t,a,c,u,d){var m,p,v,y,f=(m=(0,n.useState)(0),p=2,function(e){if(Array.isArray(e))return e}(m)||function(e,t){var a=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var n,r,i,l,o=[],s=!0,c=!1;try{if(i=(a=a.call(e)).next,0===t){if(Object(a)!==a)return;s=!1}else for(;!(s=(n=i.call(a)).done)&&(o.push(n.value),o.length!==t);s=!0);}catch(e){c=!0,r=e}finally{try{if(!s&&null!=a.return&&(l=a.return(),Object(l)!==l))return}finally{if(c)throw r}}return o}}(m,p)||function(e,t){if(e){if("string"==typeof e)return s(e,t);var a={}.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?s(e,t):void 0}}(m,p)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),g=f[0],h=f[1],b=t,C=(0,o.P)(function(t){if(!e)return null;var a=e(t);return a?a.key:null},c,u);return v={fetchNextPage:function(){if(t&&e&&C)return h(function(e){return e+1}),b(C.nextCursor)},hasMore:!!(null==C?void 0:C.nextCursor),isFetching:null==C?void 0:C.isFetching,scrollContainer:d},y=function(){if(!v.isFetching){if(v.scrollContainer){var e=v.scrollContainer;if(e.getBoundingClientRect().height+e.scrollTop<e.scrollHeight-l)return}else if(window.innerHeight+document.documentElement.scrollTop<document.documentElement.scrollHeight-l)return;v.fetchNextPage()}},(0,n.useEffect)(function(){var e=i.q.throttle(y,200),t=v.scrollContainer||window;return v.hasMore&&t.addEventListener("scroll",e),function(){return t.removeEventListener("scroll",e)}},[v.hasMore,v.fetchNextPage,v.scrollContainer]),(0,n.useEffect)(function(){C&&C.shouldInitialFetch&&t&&(b(),h(function(e){return e+1}))},[null==C?void 0:C.shouldInitialFetch,t]),(0,n.useEffect)(function(){var e,t;if((null==C?void 0:C.statusCode)&&i.q.isFunction(a)){var n=+(null===(t=null===(e=C.statusCode)||void 0===e?void 0:e.toString())||void 0===t?void 0:t.substr(0,1));n!==r.k.ClientError&&n!==r.k.ServerError||a(g,C.statusCode)}},[null==C?void 0:C.statusCode]),{items:null==C?void 0:C.items,hasMore:!!(null==C?void 0:C.nextCursor),nextCursor:null==C?void 0:C.nextCursor,isFetching:null==C?void 0:C.isFetching,totalItems:null==C?void 0:C.totalItems,hasFirstPageCompleted:null==C?void 0:C.hasFirstPageCompleted}}},89742:(e,t,a)=>{a.r(t),a.d(t,{PlaylistsView:()=>$});var n=a(32735),r=a(70680),i=a(23481),l=a(20354),o=a(65858),s=a(91200),c=a(31273),u=a(91967),d=a(76611),m=a(15611);function p(e){return p="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},p(e)}function v(e,t,a){return(t=function(e){var t=function(e){if("object"!=p(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var a=t.call(e,"string");if("object"!=p(a))return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==p(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}var y="playlists.playlistSortSelect",f=u.q.memoize(function(){return v(v(v(v(v({},d.o.RecentlyUpdated,{name:i.T.getPhrase(y,"recentlyUpdated")}),d.o.AtoZ,{name:i.T.getPhrase(y,"atoz")}),d.o.ZtoA,{name:i.T.getPhrase(y,"ztoa")}),d.o.Newest,{name:i.T.getPhrase(y,"newest")}),d.o.Oldest,{name:i.T.getPhrase(y,"oldest")})});function g(e){var t=e.type,a=e.getSortAppLink,r=e.variant,i=f();return n.createElement("div",{className:"dropdown"},n.createElement("button",{className:"btn btn-".concat(r," ms-2 dropdown-toggle"),type:"button",id:"sort-select","data-bs-toggle":"dropdown","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"},i[t].name),n.createElement("ul",{className:"dropdown-menu dropdown-menu-end dropdown-menu-right","aria-labelledby":"sort-select"},Object.values(d.o).map(function(e){var r="dropdown-item";return e===t&&(r+=" active"),n.createElement("li",{key:e},n.createElement(m.F,{className:r,appLink:a(e),analyticsData:{sort:i[e].name},analyticsOptions:{location:o.LZ.PlaylistListHeader,entity:o.py.Playlists,actionType:o.Vw.Sort,workflowPhase:o.eu.Complete}},i[e].name))})))}g.defaultProps={variant:"light"};var h=a(23257),b=a(70006),C=a(71521),E=a(83657),w=a(87801),P=a(83345),S=a(7733),N=a(16714),I=a(94644),L=a(39151),A=a(5112),T=a(31949),k=a(69883),F=a(60115),x=a(22902),O=a(79612),U=a(35223),j=a(14070),_=a(97291),M=a(44110),Z=a(26323),D=a(99742);const V={playlistMetadata:"vv8fW"};var Y="playlists.favouritesPlaylistItem",R=i.T.encloseNamespace(Y);function q(e){var t={entity:o.py.Playlist,actionType:o.Vw.Click,location:o.LZ.PlaylistListItem},a=D.W.FAVOURITES_PLAYLIST.FAV_PLAYLIST_COVER,r={application:_.O.MY_FAVOURITES,action:j.e.MyFavourites.MY_FAVOURITES};return n.createElement(m.F,{appLink:r,analyticsData:{name:"Favourites",extraItem:"user-favourites"},analyticsOptions:t,title:R("favouritesTitle")},n.createElement("div",{className:"position-relative"},n.createElement("div",{className:"text-white font-size-sm text-shadow ".concat(V.playlistMetadata)},!e.isLoadingCount&&n.createElement("span",null,n.createElement(P.x,{namespace:Y,phrase:"count",options:{smartCount:e.count}})),n.createElement("h5",{className:"mb-0"},n.createElement("span",{className:"clamp-2"},R("favouritesTitle")))),n.createElement("img",{src:a,alt:R("favouritesTitle"),className:"w-100 h-100 rounded-3"})))}var B=a(52931),z="playlists.playlists",H=i.T.encloseNamespace(z);function W(e){return{application:_.O.PLAYLISTS,action:j.e.Playlists.HOME,params:{sort:e}}}function $(e){var t,a=(0,r.I0)(),i=(0,k.Z)(),u=(0,x.T)(),d=u.hasLocalPermissions,m=u.isLoaded,p=l.a.useBasicFetch(L.L.config()),v=l.a.useBasicFetch(T.N.currentUser()),y=(0,M.i)(),f=!!v.data&&C.A.getOrSetSortType(v.data.id,e.sort),D=(0,Z.B)(null===(t=v.data)||void 0===t?void 0:t.id),V=D.count,Y=D.favourites,R={count:V,isLoadingCount:D.isLoading,data:Y},$=!!f&&function(e){return A.C.getUserPlaylists(new b.l(f,e,h.e.All))},Q=!!$&&function(e){l.a.getFetch(a)($(e))};(0,O.M)({title:H("pageTitle"),description:H("pageDescription")});var G=!d(N.E.ViewPlaylistsLanding)&&f,J=(0,F.K)(!!G&&$,Q,function(e,t){if(1===e)return(0,I.r)(t);i.error(H("error"))}),K=J.items,X=J.hasMore,ee=J.isFetching,te=[{label:H("createPlaylist"),appLink:{application:_.O.PLAYLISTS,action:j.e.Playlists.NEW_PLAYLIST},svgName:U.vn.Plus,className:"btn btn-outline-dark",button:!0,analyticsData:{},analyticsOptions:{location:o.LZ.Banner,entity:o.py.Playlist,workflowPhase:o.eu.Start,actionType:o.Vw.Create}}],ae=!!K&&!!v.data&&!!p.data&&(!!y.data||y.hasError)&&!!m;return d(N.E.ViewPlaylistsLanding)?n.createElement(B.Y,null):n.createElement("div",{className:"bg-white px-3"},n.createElement("div",{className:"d-flex justify-content-between align-items-end pb-3"},n.createElement("h1",{className:"h2 mb-0"},n.createElement(P.x,{namespace:z,phrase:"headerTitle"})),!!f&&n.createElement(E.e,{actions:te,sortComponent:n.createElement(g,{variant:"outline-dark",type:f,getSortAppLink:W})})),ae?n.createElement(c.P,{playlists:K,getPlaylistAppLink:e.getPlaylistAppLink,imageCdnUrl:p.data.imageCdnUrl,currentUser:v.data,presentationAudiences:y.data||[],bgColourClassNames:S.o,itemContainerClassName:"columns-of-five",itemStyle:"round",showCount:!0,showOwner:!0,extraPlaylistItem:n.createElement(q,Object.assign({},R))}):n.createElement(s.Y,{itemClassName:"columns-of-five"}),ae&&(X||ee)&&n.createElement(w._,{isFetching:ee,fetchNext:Q}))}},52931:(e,t,a)=>{a.d(t,{Y:()=>y,v:()=>v});var n=a(32735),r=a(23481),i=a(65858),l=a(97958),o=a(83345),s=a(35223),c=a(99742),u=a(14070),d=a(97291),m="playlists.playlistsEmptyState",p=r.T.encloseNamespace(m);function v(e){return n.createElement(o.D.Provider,{value:m},n.createElement(l.u,{className:e.className},n.createElement(l.u.Image,{src:c.W.EmptyStates.Playlists.PLAYLISTS,altText:p("info"),size:e.imageSize}),n.createElement(l.u.Heading,{className:e.headingClassName},n.createElement(o.x,{phrase:"heading"})),n.createElement(l.u.Info,{className:"w-75"},n.createElement(o.x,{phrase:e.isStudent?"studentInfo":"info"})),!e.hideButton&&n.createElement(l.u.Cta,{text:r.T.getPhrase(m,"cta"),icon:s.vn.Plus,appLink:{application:d.O.PLAYLISTS,action:u.e.Playlists.NEW_PLAYLIST}})))}function y(){return n.createElement(o.D.Provider,{value:m},n.createElement(l.u,null,n.createElement(l.u.Image,{src:c.W.EmptyStates.Playlists.PLAYLISTS_PUBLIC,altText:p("info")}),n.createElement(l.u.Heading,null,n.createElement(o.x,{phrase:"heading"})),n.createElement(l.u.Info,null,n.createElement(o.x,{phrase:"info"})),n.createElement(l.u.Cta,{text:r.T.getPhrase(m,"publicCta"),appLink:{application:d.O.SIGN_UP,action:u.e.SignUp.SIGN_UP},analyticsData:{},analyticsOptions:{actionType:i.Vw.Click,location:i.LZ.PlaylistsLanding,entity:i.py.AppLink,workflowPhase:i.eu.Start,descriptor:i.Yu.SignUp}})))}},44110:(e,t,a)=>{a.d(t,{i:()=>l});var n=a(20354),r=a(89454),i=a(86698),l=function(){var e=(0,i.y)({redirectOnError:!0}),t=e.activePresentation,a=e.getFallbackPresentation,l=t||a();return n.a.useBasicFetch(!!l&&r.O.presentationAudiences(l.id))}},26323:(e,t,a)=>{a.d(t,{B:()=>o});var n=a(20354),r=a(63419);function i(e){return function(e){if(Array.isArray(e))return l(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return l(e,t);var a={}.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?l(e,t):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function l(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,n=Array(t);a<t;a++)n[a]=e[a];return n}function o(e){var t,a,l,o,s,c,u,d,m,p=n.a.useBasicFetch(e&&r.P.getFavouritesVideosCount(e)),v=n.a.useBasicFetch(e&&r.P.getFavouritesClipsCount(e)),y=n.a.useBasicFetch(e&&r.P.getFavouritesInteractivesCount(e));return{count:(null===(t=p.data)||void 0===t?void 0:t.count)+(null===(a=y.data)||void 0===a?void 0:a.count)+(null===(l=v.data)||void 0===l?void 0:l.count),favourites:[].concat(i((null===(o=p.data)||void 0===o?void 0:o.data)||[]),i((null===(s=v.data)||void 0===s?void 0:s.data)||[]),i((null===(c=y.data)||void 0===c?void 0:c.data)||[])),isLoading:!(null===(u=p.data)||void 0===u?void 0:u.data)||!(null===(d=v.data)||void 0===d?void 0:d.data)||!(null===(m=y.data)||void 0===m?void 0:m.data)}}},79382:(e,t,a)=>{a.d(t,{Z:()=>n});const n={playlistItem:"CaRJx",playlistItemGradient:"BI7p2",playlistMetadata:"eDk1l",partialHeading:"w4lWh",ownerAvatarContainer:"JImqE"}},82602:(e,t,a)=>{a.d(t,{WU:()=>c});var n=["second","minute","hour","day","week","month","year"],r=["秒","分钟","小时","天","周","个月","年"],i={},l=function(e,t){i[e]=t},o=[60,60,24,7,365/7/12,12];function s(e){return e instanceof Date?e:!isNaN(e)||/^\d+$/.test(e)?new Date(parseInt(e)):(e=(e||"").trim().replace(/\.\d+/,"").replace(/-/,"/").replace(/-/,"/").replace(/(\d)T(\d)/,"$1 $2").replace(/Z/," UTC").replace(/([+-]\d\d):?(\d\d)/," $1$2"),new Date(e))}var c=function(e,t,a){var n=function(e,t){return(+(t?s(t):new Date)-+s(e))/1e3}(e,a&&a.relativeDate);return function(e,t){for(var a=e<0?1:0,n=e=Math.abs(e),r=0;e>=o[r]&&r<o.length;r++)e/=o[r];return(e=Math.floor(e))>(0==(r*=2)?9:1)&&(r+=1),t(e,r,n)[a].replace("%s",e.toString())}(n,function(e){return i[e]||i.en_US}(t))};l("en_US",function(e,t){if(0===t)return["just now","right now"];var a=n[Math.floor(t/2)];return e>1&&(a+="s"),[e+" "+a+" ago","in "+e+" "+a]}),l("zh_CN",function(e,t){if(0===t)return["刚刚","片刻后"];var a=r[~~(t/2)];return[e+" "+a+"前",e+" "+a+"后"]})}}]);
2
+ //# sourceMappingURL=9742-3f6b75484a-lite.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts/9742-3f6b75484a-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/playlists/components/playlist-list/PartialPlaylistList.tsx","file:///app/packages/libs/shared/src/apps/playlists/components/playlist-count/PlaylistCount.tsx","file:///app/packages/libs/shared/src/apps/playlists/components/playlist-list/PlaylistOwnerAvatar.tsx","file:///app/packages/libs/shared/src/apps/playlists/components/playlist-list/PlaylistItem.tsx","file:///app/packages/libs/shared/src/apps/playlists/components/playlist-list/PlaylistList.tsx","file:///app/packages/libs/shared/src/errors/handlers/HttpErrorHandlers.ts","file:///app/packages/libs/shared/src/hooks/UseInfiniteScroll.ts","file:///app/packages/libs/shared/src/hooks/UseInfiniteList.ts","file:///app/packages/libs/shared/src/apps/playlists/components/sort-select/PlaylistSortSelect.tsx","file:///app/packages/projects/lite/src/apps/playlists/components/favourites-playlist-item/favourites-playlist-item.scss","file:///app/packages/projects/lite/src/apps/playlists/components/favourites-playlist-item/FavouritesPlaylistItem.tsx","file:///app/packages/projects/lite/src/apps/playlists/views/playlists/PlaylistsView.tsx","file:///app/packages/projects/lite/src/apps/playlists/views/playlists/empty-state/PlaylistsEmptyState.tsx","file:///app/packages/projects/lite/src/shared/hooks/usePresentationAudiences.ts","file:///app/packages/projects/lite/src/shared/views/favourites/hooks/useFavouritesCount.ts","file:///app/packages/libs/shared/src/apps/playlists/components/playlist-list/playlist.scss","file:///app/node_modules/timeago.js/esm/lang/en_US.js","file:///app/node_modules/timeago.js/esm/lang/zh_CN.js","file:///app/node_modules/timeago.js/esm/register.js","file:///app/node_modules/timeago.js/esm/utils/date.js","file:///app/node_modules/timeago.js/esm/format.js","file:///app/node_modules/timeago.js/esm/index.js"],"sourcesContent":["import * as React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport styles from './playlist.scss';\n\ninterface PartialPlaylistListProps {\n numItems?: number;\n itemClassName?: string;\n showHeading?: boolean;\n}\n\nPartialPlaylistList.defaultProps = {\n numItems: 8\n};\n\nexport function PartialPlaylistList(props: PartialPlaylistListProps): JSX.Element {\n const PARTIAL_PLAYLISTS = [...Array(props.numItems)];\n\n const className = props.itemClassName || '';\n\n return (\n <>\n {props.showHeading && <div className={`${styles.partialHeading} mb-1 partial-loading-background`} />}\n <Row className='mx-n1 mb-n2'>\n {PARTIAL_PLAYLISTS.map((p, idx) => (\n <Col key={idx} xs={6} sm={4} lg={3} className={`${className} px-1 pb-2`}>\n <div className={`${styles.playlistItem} partial-loading-background rounded-3`} />\n </Col>\n ))}\n </Row>\n </>\n );\n}","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Playlist } from 'libs/shared/interfaces';\n\nconst namespace = 'playlists.playlistCount';\n\nfunction getCount(playlist: Playlist): number | false {\n if (!playlist)\n return false;\n\n const videos = playlist.videos?.count ?? 0;\n const interactives = playlist.interactives?.count ?? 0;\n const clips = playlist.clips?.count ?? 0;\n\n return videos + interactives + clips;\n}\n\ninterface PlaylistCountProps {\n playlist: Playlist;\n}\n\nexport function PlaylistCount(props: PlaylistCountProps): JSX.Element {\n const count = getCount(props.playlist);\n\n if (count === false || Number.isNaN(count))\n return <></>;\n\n return (\n <span className='text-shadow font-size-sm'>\n <Text namespace={namespace} phrase='count' options={{ smartCount: count }} />\n </span>\n );\n}","import * as React from 'react';\n\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { ClickViewAvatar } from 'libs/shared/components/clickview-avatar/ClickViewAvatar';\nimport { CurrentUser, Playlist } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\ninterface PlaylistOwnerAvatarProps {\n playlist: Playlist;\n imageCdnUrl: string;\n currentUser?: CurrentUser;\n}\n\nexport function PlaylistOwnerAvatar(props: PlaylistOwnerAvatarProps): JSX.Element {\n const { _liteOwner } = props.playlist;\n\n if (props.playlist._isClickViewCurated?.value)\n return (\n <ClickViewAvatar />\n );\n\n if (!_liteOwner?.id || !props.currentUser?.id)\n return <></>;\n\n const currentUserIsOwner = _liteOwner.id.toString() === props.currentUser.id.toString();\n\n if (currentUserIsOwner)\n return <></>;\n\n const url = typeof _liteOwner.avatar === 'string' ? _liteOwner.avatar : _liteOwner.avatar?.url;\n\n return (\n <Avatar\n imageUrl={url}\n imageCdnUrl={props.imageCdnUrl}\n initials={UserHelper.getInitials(_liteOwner.name, _liteOwner.surname)}\n />\n );\n}","import * as React from 'react';\nimport { format } from 'timeago.js';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { AnalyticsOptions, EntityType, HashObject } from 'libs/analytics/interfaces';\n\nimport { PlaylistCount } from 'libs/shared/apps/playlists/components/playlist-count/PlaylistCount';\nimport { PlaylistOwnerAvatar } from 'libs/shared/apps/playlists/components/playlist-list/PlaylistOwnerAvatar';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { AudienceLabel } from 'libs/shared/components/audience-label/AudienceLabel';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { ImageSize, ResizeType } from 'libs/shared/enums/Images';\nimport { useMergeAudiences } from 'libs/shared/hooks/UseMergeAudiences';\nimport { CurrentUser, Playlist, PresentationAudience } from 'libs/shared/interfaces';\nimport { getBgColorClass } from 'libs/shared/utils/getBgColorClass';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\n\nimport styles from './playlist.scss';\n\nconst namespace = 'playlists.playlistList';\n\nexport type PlaylistItemStyle = 'square' | 'round' | 'round-left';\n\nexport interface PlaylistItemProps {\n data: Playlist;\n appLink: Core.AppLink;\n currentUser?: CurrentUser;\n presentationAudiences?: PresentationAudience[];\n bgColourClassNames?: string[];\n titleClassName?: string;\n imageCdnUrl?: string;\n itemStyle?: PlaylistItemStyle;\n showCount?: boolean;\n showOwner?: boolean;\n showFallbackImage?: boolean;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n audienceLabelClass?: string;\n}\n\nPlaylistItem.defaultProps = {\n itemStyle: 'square'\n};\n\nexport function PlaylistItem(props: PlaylistItemProps): JSX.Element {\n const imageUrl = ImageHelper.createUrl(props.data.cover && props.data.cover.url, {\n size: ImageSize.Medium,\n resizeType: ResizeType.Cover\n });\n\n const audiences = props.data.subjectPresentationAudiences &&\n props.data.subjectPresentationAudiences.data;\n\n const mergedAudience = useMergeAudiences(audiences, props.presentationAudiences);\n\n let className = styles.playlistItem;\n\n const showImage = !!imageUrl || !!props.showFallbackImage;\n\n if (showImage)\n className += ` ${styles.playlistItemGradient}`;\n\n if (!showImage && props.bgColourClassNames)\n className += ` ${styles.playlistItem} ${getBgColorClass(props.data.name, props.bgColourClassNames)}`;\n\n if (props.itemStyle === 'round')\n className += ` rounded-3 overflow-hidden`;\n\n if (props.itemStyle === 'round-left')\n className += ` rounded-start-lg overflow-hidden`;\n\n const analyticsData = { ...props.analyticsData,\n id: props.data?.id,\n name: props.data?.name\n };\n\n const analyticsOptions = {\n ...props.analyticsOptions,\n entity: EntityType.Playlist\n };\n\n const getTitle = () => {\n if (!props.data.contentModifiedDate || props.data._isClickViewCurated?.value)\n return '';\n\n return LanguageService.getPhrase(namespace, 'lastUpdated', {\n timeago: format(DateHelper.convertUTCToLocal(props.data.contentModifiedDate))\n });\n };\n\n return (\n <AppLink\n appLink={props.appLink}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n title={getTitle()}\n >\n <BaseImage data={imageUrl} alt={props.data.name} className={className}>\n {!!props.showFallbackImage && <ImageFallback type={ImageFallbackType.Playlist} />}\n <div className={`text-white ${styles.playlistMetadata}`}>\n {!!props.showCount && (\n <PlaylistCount playlist={props.data} />\n )}\n <h5 className={`mb-0 ${props.titleClassName || ''}`}><span className='text-shadow clamp-2'>{props.data.name}</span></h5>\n {!!audiences && !!audiences.length && !!mergedAudience &&\n <AudienceLabel\n className={`${props.audienceLabelClass ? props.audienceLabelClass : ''} mt-1`}\n audience={mergedAudience}\n border='white'\n />\n }\n </div>\n {!!props.showOwner && !!props.imageCdnUrl &&\n <div className={styles.ownerAvatarContainer}>\n <PlaylistOwnerAvatar\n playlist={props.data}\n currentUser={props.currentUser}\n imageCdnUrl={props.imageCdnUrl}\n />\n </div>\n }\n </BaseImage>\n </AppLink>\n );\n}","import * as React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, HashObject, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { CurrentUser, Playlist, PresentationAudience } from 'libs/shared/interfaces';\n\nimport { PlaylistItem, PlaylistItemStyle } from './PlaylistItem';\n\ninterface PlaylistListProps {\n playlists: Playlist[];\n getPlaylistAppLink: (playlist: Playlist) => Core.AppLink;\n currentUser?: CurrentUser;\n presentationAudiences?: PresentationAudience[];\n itemContainerClassName?: string;\n itemTitleClassName?: string;\n bgColourClassNames?: string[];\n itemStyle?: PlaylistItemStyle;\n imageCdnUrl?: string;\n showCount?: boolean;\n showOwner?: boolean;\n showFallbackImage?: boolean;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n extraPlaylistItem?: JSX.Element;\n}\n\nconst analyticsOptions: AnalyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.Playlist,\n location: LocationContext.PlaylistListItem,\n descriptor: ClickDescriptor.Cover\n};\n\nexport function PlaylistList(props: PlaylistListProps): JSX.Element {\n return (\n <Row as='ul' className='list-unstyled mx-n1'>\n {props.extraPlaylistItem && (\n <Col as='li' key='extra-playlist-item' xs={6} sm={4} lg={3} className={`mb-2 px-1 ${props.itemContainerClassName ? props.itemContainerClassName : ''}`}>\n {props.extraPlaylistItem}\n </Col>\n )}\n\n {props.playlists.map(p => (\n <Col as='li' key={p.id} xs={6} sm={4} lg={3} className={`mb-2 px-1 ${props.itemContainerClassName ? props.itemContainerClassName : ''}`}>\n <PlaylistItem\n data={p}\n appLink={props.getPlaylistAppLink(p)}\n imageCdnUrl={props.imageCdnUrl}\n currentUser={props.currentUser}\n presentationAudiences={props.presentationAudiences}\n bgColourClassNames={props.bgColourClassNames}\n showCount={props.showCount}\n showOwner={props.showOwner}\n showFallbackImage={props.showFallbackImage}\n titleClassName={props.itemTitleClassName}\n itemStyle={props.itemStyle}\n analyticsData={props.analyticsData}\n analyticsOptions={{ ...props.analyticsOptions, ...analyticsOptions }}\n />\n </Col>\n ))}\n </Row>\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 { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nconst SCROLL_TOLERANCE = 400; // value in px\n\ninterface UseInfiniteScrollOptions {\n fetchNextPage: () => void;\n hasMore: boolean;\n isFetching: boolean;\n scrollContainer?: HTMLElement;\n}\n\nexport function useInfiniteScroll(options: UseInfiniteScrollOptions): void {\n const handleScroll = (): void => {\n if (options.isFetching)\n return;\n\n if (!options.scrollContainer) {\n const currentScrollHeight = window.innerHeight + document.documentElement.scrollTop;\n \n const totalHeight = document.documentElement.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n } else {\n const { scrollContainer } = options;\n const currentScrollHeight = scrollContainer.getBoundingClientRect().height + scrollContainer.scrollTop;\n \n const totalHeight = scrollContainer.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n }\n\n options.fetchNextPage();\n };\n\n useEffect(() => {\n const onScroll = FunctionHelper.throttle(handleScroll, 200);\n\n const scrollContainer = options.scrollContainer || window;\n\n if (options.hasMore)\n scrollContainer.addEventListener('scroll', onScroll);\n\n return () => scrollContainer.removeEventListener('scroll', onScroll);\n }, [ options.hasMore, options.fetchNextPage, options.scrollContainer ]);\n}","import { useEffect, useState } from 'react';\n\nimport { HttpStatus, HttpStatusClass } from 'libs/common/backbone/enums/HttpStatus';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Flight } from 'libs/common/flight';\n\nimport { BaseObject, BasePaginatedCollection } from 'libs/shared/interfaces';\n\nimport { useInfiniteScroll } from './UseInfiniteScroll';\nimport { useSelectAllPages } from './UseSelectAllPages';\n\nexport interface UseInfiniteListResult<T extends BaseObject> {\n items: T[];\n hasMore: boolean;\n isFetching: boolean;\n nextCursor: string;\n totalItems?: number;\n hasFirstPageCompleted: boolean;\n}\n\n/**\n * Hook to extract an infinite list from the application state,\n * save it locally in state and only update when new data\n * is fetched.\n * \n * @param getRequest - callback function to get the request for each page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n * \n * @param fetchNext - callback function to fetch a page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n */\nexport function useInfiniteList<TObject = BaseObject, TResponse = BasePaginatedCollection<TObject>>(\n getRequest: ((cursor?: string) => Flight.Request) | false,\n fetchNext: ((cursor?: string) => void) | false,\n onError?: (pageNumber: number, statusCode: HttpStatus) => void,\n getItems?: (responseData: TResponse) => TObject[],\n getCursor?: (responseData: TResponse) => string,\n scrollContainer?: HTMLElement\n): UseInfiniteListResult<TObject> {\n const [ pagesFetched, setPagesFetched ] = useState(0);\n\n const fetchNextFn = fetchNext as (cursor?: string) => void;\n\n function getKey(cursor?: string): string {\n if (!getRequest)\n return null;\n\n const request = getRequest(cursor);\n\n if (!request)\n return null;\n\n return request.key;\n }\n\n const response = useSelectAllPages<TObject, TResponse>(\n getKey,\n getItems,\n getCursor\n );\n\n function fetchNextPage(): void {\n if (!fetchNext || !getRequest || !response)\n return;\n\n setPagesFetched(currentVal => currentVal + 1);\n return fetchNextFn(response.nextCursor);\n }\n\n useInfiniteScroll({\n fetchNextPage,\n hasMore: !!response?.nextCursor,\n isFetching: response?.isFetching,\n scrollContainer\n });\n\n useEffect(() => {\n if (!response)\n return;\n\n if (response.shouldInitialFetch && fetchNext) {\n fetchNextFn();\n setPagesFetched(currentVal => currentVal + 1);\n }\n }, [ response?.shouldInitialFetch, fetchNext ]);\n\n useEffect(() => {\n if (!response?.statusCode || !FunctionHelper.isFunction(onError))\n return;\n\n const httpStatusClass: HttpStatusClass = +(response.statusCode?.toString()?.substr(0, 1));\n\n if (httpStatusClass !== HttpStatusClass.ClientError && httpStatusClass !== HttpStatusClass.ServerError)\n return;\n\n onError(pagesFetched, response.statusCode);\n }, [response?.statusCode]);\n\n return {\n items: response?.items,\n hasMore: !!response?.nextCursor,\n nextCursor: response?.nextCursor,\n isFetching: response?.isFetching,\n totalItems: response?.totalItems,\n hasFirstPageCompleted: response?.hasFirstPageCompleted\n };\n}","import * as React from 'react';\nimport { ButtonProps } from 'react-bootstrap';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Core } from 'libs/common/core';\n\nimport { EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { PlaylistSortType } from 'libs/shared/apps/playlists/enums/PlaylistSortType';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\n\nconst namespace = 'playlists.playlistSortSelect';\n\nconst getSortTypes = FunctionHelper.memoize(() => {\n return {\n [PlaylistSortType.RecentlyUpdated]: {\n name: LanguageService.getPhrase(namespace, 'recentlyUpdated')\n },\n [PlaylistSortType.AtoZ]: {\n name: LanguageService.getPhrase(namespace, 'atoz')\n },\n [PlaylistSortType.ZtoA]: {\n name: LanguageService.getPhrase(namespace, 'ztoa')\n },\n [PlaylistSortType.Newest]: {\n name: LanguageService.getPhrase(namespace, 'newest')\n },\n [PlaylistSortType.Oldest]: {\n name: LanguageService.getPhrase(namespace, 'oldest')\n }\n };\n});\n\ninterface PlaylistSortSelectProps {\n type: PlaylistSortType;\n getSortAppLink: (sort: PlaylistSortType) => Core.AppLink;\n variant?: ButtonProps['variant'];\n}\n\nPlaylistSortSelect.defaultProps = {\n variant: 'light'\n};\n\nexport function PlaylistSortSelect(props: PlaylistSortSelectProps): JSX.Element {\n const { type, getSortAppLink, variant } = props;\n const sortTypes = getSortTypes();\n\n return (\n <div className='dropdown'>\n <button className={`btn btn-${variant} ms-2 dropdown-toggle`} type='button' id='sort-select' data-bs-toggle='dropdown' data-toggle='dropdown' aria-haspopup='true' aria-expanded='false'>\n {sortTypes[type].name}\n </button>\n <ul className='dropdown-menu dropdown-menu-end dropdown-menu-right' aria-labelledby='sort-select'>\n {Object.values(PlaylistSortType).map(k => {\n let className = 'dropdown-item';\n\n if (k === type)\n className += ' active';\n\n return (\n <li key={k}>\n <AppLink\n \n className={className}\n appLink={getSortAppLink(k)}\n analyticsData={{\n sort: sortTypes[k].name\n }}\n analyticsOptions={{\n location: LocationContext.PlaylistListHeader,\n entity: EntityType.Playlists,\n actionType: UserAction.Sort,\n workflowPhase: WorkflowPhase.Complete\n }}\n >\n {sortTypes[k].name}\n </AppLink>\n </li>\n );\n })}\n </ul>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"playlistMetadata\":\"vv8fW\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport styles from './favourites-playlist-item.scss';\n\nconst namespace = 'playlists.favouritesPlaylistItem';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface FavouritesPlaylistItemProps {\n data: VideoTypes[];\n count: number;\n isLoadingCount: boolean;\n}\n\nexport function FavouritesPlaylistItem(props: FavouritesPlaylistItemProps): JSX.Element {\n const analyticsData = {\n name: 'Favourites',\n extraItem: 'user-favourites'\n };\n\n const analyticsOptions = {\n entity: EntityType.Playlist,\n actionType: UserAction.Click,\n location: LocationContext.PlaylistListItem\n };\n\n const coverUrl = ImageUrls.FAVOURITES_PLAYLIST.FAV_PLAYLIST_COVER ;\n const appLink = {\n application: AppChannels.MY_FAVOURITES,\n action: Actions.MyFavourites.MY_FAVOURITES\n };\n\n return (\n <AppLink\n appLink={appLink}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n title={getPhrase('favouritesTitle')}\n >\n <div className='position-relative'>\n <div className={`text-white font-size-sm text-shadow ${styles.playlistMetadata}`}>\n {!props.isLoadingCount && (\n <span>\n <Text namespace={namespace} phrase='count' options={{ smartCount: props.count }} />\n </span>\n )}\n <h5 className={`mb-0`}><span className='clamp-2'>{getPhrase('favouritesTitle')}</span></h5>\n </div>\n \n <img src={coverUrl} alt={getPhrase('favouritesTitle')} className='w-100 h-100 rounded-3'/>\n </div>\n </AppLink>\n );\n}","import * as React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\n\nimport { EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { PartialPlaylistList } from 'libs/shared/apps/playlists/components/playlist-list/PartialPlaylistList';\nimport { PlaylistList } from 'libs/shared/apps/playlists/components/playlist-list/PlaylistList';\nimport { PlaylistSortSelect } from 'libs/shared/apps/playlists/components/sort-select/PlaylistSortSelect';\nimport { PlaylistSortType } from 'libs/shared/apps/playlists/enums/PlaylistSortType';\nimport { PlaylistType } from 'libs/shared/apps/playlists/enums/PlaylistType';\nimport { PlaylistCollectionIdentifier } from 'libs/shared/apps/playlists/interfaces/identifiers/PlaylistCollectionIdentifier';\nimport { PlaylistSortHelper } from 'libs/shared/apps/playlists/utils/PlaylistSortHelper';\nimport { Actions as ActionsComponent } from 'libs/shared/components/actions/Actions';\nimport { InfiniteScrollFooter } from 'libs/shared/components/infinite-scroll-footer/InfiniteScrollFooter';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { BG_COLOUR_CLASS_NAMES } from 'libs/shared/constants/ColourClassNames';\nimport { LocalPermissionName } from 'libs/shared/enums/PermissionName';\nimport { handleHttpError } from 'libs/shared/errors/handlers/HttpErrorHandlers';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { PlaylistRequests } from 'libs/shared/flight-requests/PlaylistRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useInfiniteList } from 'libs/shared/hooks/UseInfiniteList';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Config, CurrentUser, Playlist } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { usePresentationAudiences } from 'shared/hooks/usePresentationAudiences';\nimport { useFavouritesCount } from 'shared/views/favourites/hooks/useFavouritesCount';\n\nimport { FavouritesPlaylistItem } from 'apps/playlists/components/favourites-playlist-item/FavouritesPlaylistItem';\n\nimport { PlaylistsPublicEmptyState } from './empty-state/PlaylistsEmptyState';\n\nconst namespace = 'playlists.playlists';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getSortAppLink(sort: PlaylistSortType): Core.AppLink {\n return {\n application: AppChannels.PLAYLISTS,\n action: Actions.Playlists.HOME,\n params: {\n sort: sort\n }\n };\n}\n\ninterface PlaylistsViewProps {\n getPlaylistAppLink: (playlist: Playlist) => Core.AppLink;\n sort?: PlaylistSortType;\n}\n\nexport function PlaylistsView(props: PlaylistsViewProps): React.ReactElement {\n const dispatch = useDispatch();\n const alerts = useAlerts();\n const { hasLocalPermissions, isLoaded } = usePermissions();\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const user = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n \n const audiences = usePresentationAudiences();\n\n const sort = !!user.data && PlaylistSortHelper.getOrSetSortType(user.data.id, props.sort);\n\n const { count, favourites, isLoading } = useFavouritesCount(user.data?.id);\n\n const favouritesPlaylist = {\n count,\n isLoadingCount: isLoading,\n data: favourites\n };\n\n const getPlaylistRequest = !!sort && ((cursor?: string) =>\n PlaylistRequests.getUserPlaylists(new PlaylistCollectionIdentifier(sort, cursor, PlaylistType.All)));\n\n const fetchNext = !!getPlaylistRequest && ((cursor?: string) => {\n Flight.getFetch(dispatch)(getPlaylistRequest(cursor));\n });\n\n useSetPageMetadata({\n title: getPhrase('pageTitle'),\n description: getPhrase('pageDescription')\n });\n\n const shouldFetch = !hasLocalPermissions(LocalPermissionName.ViewPlaylistsLanding) && sort;\n\n const {\n items: playlists,\n hasMore,\n isFetching\n } = useInfiniteList<Playlist>(shouldFetch ? getPlaylistRequest : false, fetchNext, onError);\n\n function onError(pageNumber: number, httpStatus: HttpStatus): void {\n if (pageNumber === 1)\n return handleHttpError(httpStatus);\n\n alerts.error(getPhrase('error'));\n }\n\n const actions = [\n {\n label: getPhrase('createPlaylist'),\n appLink: { application: AppChannels.PLAYLISTS, action: Actions.Playlists.NEW_PLAYLIST },\n svgName: cvSvgLibrary.Plus,\n className: 'btn btn-outline-dark',\n button: true,\n analyticsData: {},\n analyticsOptions: {\n location: LocationContext.Banner,\n entity: EntityType.Playlist,\n workflowPhase: WorkflowPhase.Start,\n actionType: UserAction.Create\n }\n }\n ];\n\n const dataLoaded = (\n !!playlists &&\n !!user.data &&\n !!config.data &&\n (!!audiences.data || audiences.hasError) &&\n !!isLoaded\n );\n\n if (hasLocalPermissions(LocalPermissionName.ViewPlaylistsLanding))\n return <PlaylistsPublicEmptyState />;\n\n return (\n <div className='bg-white px-3'>\n <div className='d-flex justify-content-between align-items-end pb-3'>\n <h1 className='h2 mb-0'><Text namespace={namespace} phrase='headerTitle' /></h1>\n {!!sort &&\n <ActionsComponent\n actions={actions}\n sortComponent={(\n <PlaylistSortSelect\n variant='outline-dark'\n type={sort}\n getSortAppLink={getSortAppLink}\n />\n )}\n />\n }\n </div>\n {dataLoaded\n ? (\n <PlaylistList\n playlists={playlists}\n getPlaylistAppLink={props.getPlaylistAppLink}\n imageCdnUrl={config.data.imageCdnUrl}\n currentUser={user.data}\n presentationAudiences={audiences.data || []}\n bgColourClassNames={BG_COLOUR_CLASS_NAMES}\n itemContainerClassName='columns-of-five'\n itemStyle='round'\n showCount\n showOwner\n extraPlaylistItem={<FavouritesPlaylistItem {...favouritesPlaylist} />}\n />\n ) : <PartialPlaylistList itemClassName='columns-of-five' />\n }\n {(dataLoaded && (hasMore || isFetching)) &&\n <InfiniteScrollFooter isFetching={isFetching} fetchNext={fetchNext} />\n }\n </div>\n );\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EntityType, LocationContext, SignUpDescriptors, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'playlists.playlistsEmptyState';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface PlaylistEmptyStateProps {\n isStudent: boolean;\n hideButton?: boolean;\n className?: string;\n imageSize?: 'small' | 'medium';\n headingClassName?: string;\n}\n\nexport function PlaylistsEmptyState(props: PlaylistEmptyStateProps): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState className={props.className}>\n <EmptyState.Image src={ImageUrls.EmptyStates.Playlists.PLAYLISTS} altText={getPhrase('info')} size={props.imageSize} />\n\n <EmptyState.Heading className={props.headingClassName}><Text phrase='heading' /></EmptyState.Heading>\n\n <EmptyState.Info className='w-75'><Text phrase={props.isStudent ? 'studentInfo' : 'info'} /></EmptyState.Info>\n\n {!props.hideButton && <EmptyState.Cta\n text={LanguageService.getPhrase(namespace, 'cta')}\n icon={cvSvgLibrary.Plus}\n appLink={{\n application: AppChannels.PLAYLISTS,\n action: Actions.Playlists.NEW_PLAYLIST\n }}\n />}\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}\n\nexport function PlaylistsPublicEmptyState(): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={ImageUrls.EmptyStates.Playlists.PLAYLISTS_PUBLIC} altText={getPhrase('info')} />\n <EmptyState.Heading><Text phrase='heading' /></EmptyState.Heading>\n <EmptyState.Info><Text phrase='info' /></EmptyState.Info>\n <EmptyState.Cta\n text={LanguageService.getPhrase(namespace, 'publicCta')}\n appLink={{\n application: AppChannels.SIGN_UP,\n action: Actions.SignUp.SIGN_UP\n }}\n analyticsData={{}}\n analyticsOptions={{\n actionType: UserAction.Click,\n location: LocationContext.PlaylistsLanding,\n entity: EntityType.AppLink,\n workflowPhase: WorkflowPhase.Start,\n descriptor: SignUpDescriptors.SignUp\n }}\n />\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}","import { Flight } from 'libs/common/react/index';\n\nimport { AudienceRequests } from 'libs/shared/flight-requests/AudienceRequests';\nimport { PresentationAudience } from 'libs/shared/interfaces';\n\nimport { usePresentation } from 'shared/hooks/usePresentation';\n\nexport const usePresentationAudiences = () => {\n const { activePresentation, getFallbackPresentation } = usePresentation({ redirectOnError: true });\n\n const presentation = activePresentation || getFallbackPresentation();\n\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(\n !!presentation &&\n AudienceRequests.presentationAudiences(presentation.id)\n );\n\n return audiences;\n};","\nimport { Flight } from 'libs/common/flight';\n\nimport { FavouriteRequests } from 'libs/shared/flight-requests/FavouriteRequests';\nimport { FavouritesCountResponse } from 'libs/shared/interfaces';\n\nexport function useFavouritesCount(userId?: string) {\n// todo there is a beckend bug that we cannot group fetch these three number\n const favouriteVideosCount = Flight.useBasicFetch<FavouritesCountResponse>(userId &&\n FavouriteRequests.getFavouritesVideosCount(userId));\n const favouriteClipsCount = Flight.useBasicFetch<FavouritesCountResponse>(userId &&\n FavouriteRequests.getFavouritesClipsCount(userId));\n const favouriteInteractivesCount = Flight.useBasicFetch<FavouritesCountResponse>(userId &&\n FavouriteRequests.getFavouritesInteractivesCount(userId));\n \n const totalCount = favouriteVideosCount.data?.count\n + favouriteInteractivesCount.data?.count\n + favouriteClipsCount.data?.count;\n\n const favourites = [\n ...(favouriteVideosCount.data?.data || []),\n ...(favouriteClipsCount.data?.data || []),\n ...(favouriteInteractivesCount.data?.data || [])\n ];\n\n return {\n count: totalCount,\n favourites,\n isLoading: !favouriteVideosCount.data?.data\n || !favouriteClipsCount.data?.data\n || !favouriteInteractivesCount.data?.data\n };\n}","// extracted by mini-css-extract-plugin\nexport default {\"playlistItem\":\"CaRJx\",\"playlistItemGradient\":\"BI7p2\",\"playlistMetadata\":\"eDk1l\",\"partialHeading\":\"w4lWh\",\"ownerAvatarContainer\":\"JImqE\"};","var EN_US = ['second', 'minute', 'hour', 'day', 'week', 'month', 'year'];\nexport default function (diff, idx) {\n if (idx === 0)\n return ['just now', 'right now'];\n var unit = EN_US[Math.floor(idx / 2)];\n if (diff > 1)\n unit += 's';\n return [diff + \" \" + unit + \" ago\", \"in \" + diff + \" \" + unit];\n}\n//# sourceMappingURL=en_US.js.map","var ZH_CN = ['秒', '分钟', '小时', '天', '周', '个月', '年'];\nexport default function (diff, idx) {\n if (idx === 0)\n return ['刚刚', '片刻后'];\n var unit = ZH_CN[~~(idx / 2)];\n return [diff + \" \" + unit + \"\\u524D\", diff + \" \" + unit + \"\\u540E\"];\n}\n//# sourceMappingURL=zh_CN.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\n/**\n * All supported locales\n */\nvar Locales = {};\n/**\n * register a locale\n * @param locale\n * @param func\n */\nexport var register = function (locale, func) {\n Locales[locale] = func;\n};\n/**\n * get a locale, default is en_US\n * @param locale\n * @returns {*}\n */\nexport var getLocale = function (locale) {\n return Locales[locale] || Locales['en_US'];\n};\n//# sourceMappingURL=register.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\nvar SEC_ARRAY = [\n 60,\n 60,\n 24,\n 7,\n 365 / 7 / 12,\n 12,\n];\n/**\n * format Date / string / timestamp to timestamp\n * @param input\n * @returns {*}\n */\nexport function toDate(input) {\n if (input instanceof Date)\n return input;\n // @ts-ignore\n if (!isNaN(input) || /^\\d+$/.test(input))\n return new Date(parseInt(input));\n input = (input || '')\n // @ts-ignore\n .trim()\n .replace(/\\.\\d+/, '') // remove milliseconds\n .replace(/-/, '/')\n .replace(/-/, '/')\n .replace(/(\\d)T(\\d)/, '$1 $2')\n .replace(/Z/, ' UTC') // 2017-2-5T3:57:52Z -> 2017-2-5 3:57:52UTC\n .replace(/([+-]\\d\\d):?(\\d\\d)/, ' $1$2'); // -04:00 -> -0400\n return new Date(input);\n}\n/**\n * format the diff second to *** time ago, with setting locale\n * @param diff\n * @param localeFunc\n * @returns\n */\nexport function formatDiff(diff, localeFunc) {\n /**\n * if locale is not exist, use defaultLocale.\n * if defaultLocale is not exist, use build-in `en`.\n * be sure of no error when locale is not exist.\n *\n * If `time in`, then 1\n * If `time ago`, then 0\n */\n var agoIn = diff < 0 ? 1 : 0;\n /**\n * Get absolute value of number (|diff| is non-negative) value of x\n * |diff| = diff if diff is positive\n * |diff| = -diff if diff is negative\n * |0| = 0\n */\n diff = Math.abs(diff);\n /**\n * Time in seconds\n */\n var totalSec = diff;\n /**\n * Unit of time\n */\n var idx = 0;\n for (; diff >= SEC_ARRAY[idx] && idx < SEC_ARRAY.length; idx++) {\n diff /= SEC_ARRAY[idx];\n }\n /**\n * Math.floor() is alternative of ~~\n *\n * The differences and bugs:\n * Math.floor(3.7) -> 4 but ~~3.7 -> 3\n * Math.floor(1559125440000.6) -> 1559125440000 but ~~1559125440000.6 -> 52311552\n *\n * More information about the performance of algebraic:\n * https://www.youtube.com/watch?v=65-RbBwZQdU\n */\n diff = Math.floor(diff);\n idx *= 2;\n if (diff > (idx === 0 ? 9 : 1))\n idx += 1;\n return localeFunc(diff, idx, totalSec)[agoIn].replace('%s', diff.toString());\n}\n/**\n * calculate the diff second between date to be formatted an now date.\n * @param date\n * @param relativeDate\n * @returns {number}\n */\nexport function diffSec(date, relativeDate) {\n var relDate = relativeDate ? toDate(relativeDate) : new Date();\n return (+relDate - +toDate(date)) / 1000;\n}\n/**\n * nextInterval: calculate the next interval time.\n * - diff: the diff sec between now and date to be formatted.\n *\n * What's the meaning?\n * diff = 61 then return 59\n * diff = 3601 (an hour + 1 second), then return 3599\n * make the interval with high performance.\n **/\nexport function nextInterval(diff) {\n var rst = 1, i = 0, d = Math.abs(diff);\n for (; diff >= SEC_ARRAY[i] && i < SEC_ARRAY.length; i++) {\n diff /= SEC_ARRAY[i];\n rst *= SEC_ARRAY[i];\n }\n d = d % rst;\n d = d ? rst - d : rst;\n return Math.ceil(d);\n}\n//# sourceMappingURL=date.js.map","import { formatDiff, diffSec } from './utils/date';\nimport { getLocale } from './register';\n/**\n * format a TDate into string\n * @param date\n * @param locale\n * @param opts\n */\nexport var format = function (date, locale, opts) {\n // diff seconds\n var sec = diffSec(date, opts && opts.relativeDate);\n // format it with locale\n return formatDiff(sec, getLocale(locale));\n};\n//# sourceMappingURL=format.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\nimport en_US from './lang/en_US';\nimport zh_CN from './lang/zh_CN';\nimport { register } from './register';\nregister('en_US', en_US);\nregister('zh_CN', zh_CN);\nexport { format } from './format';\nexport { render, cancel } from './realtime';\nexport { register };\n//# sourceMappingURL=index.js.map"],"names":["PartialPlaylistList","props","PARTIAL_PLAYLISTS","Array","numItems","className","itemClassName","showHeading","map","p","idx","key","xs","sm","lg","defaultProps","namespace","PlaylistCount","count","playlist","videos","interactives","clips","getCount","Number","isNaN","Text","phrase","options","smartCount","PlaylistOwnerAvatar","_liteOwner","_isClickViewCurated","value","ClickViewAvatar","id","currentUser","toString","url","avatar","Avatar","imageUrl","imageCdnUrl","initials","UserHelper","name","surname","PlaylistItem","ImageHelper","data","cover","size","resizeType","audiences","subjectPresentationAudiences","mergedAudience","presentationAudiences","showImage","showFallbackImage","bgColourClassNames","getBgColorClass","itemStyle","analyticsData","analyticsOptions","entity","AppLink","appLink","title","contentModifiedDate","LanguageService","timeago","DateHelper","getTitle","BaseImage","alt","ImageFallback","type","showCount","titleClassName","length","AudienceLabel","audienceLabelClass","audience","border","showOwner","actionType","location","descriptor","PlaylistList","as","extraPlaylistItem","itemContainerClassName","playlists","getPlaylistAppLink","itemTitleClassName","defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","internalServerError","handleHttpError","info","customErrorMap","ignoreMap","statusCode","status","errorMap","SCROLL_TOLERANCE","useInfiniteList","getRequest","fetchNext","onError","getItems","getCursor","scrollContainer","handleScroll","useState","pagesFetched","setPagesFetched","fetchNextFn","response","cursor","request","fetchNextPage","currentVal","nextCursor","hasMore","isFetching","getBoundingClientRect","height","scrollTop","scrollHeight","window","innerHeight","document","documentElement","useEffect","onScroll","FunctionHelper","addEventListener","removeEventListener","shouldInitialFetch","httpStatusClass","substr","HttpStatus","items","totalItems","hasFirstPageCompleted","getSortTypes","PlaylistSortType","PlaylistSortSelect","getSortAppLink","variant","sortTypes","Object","values","k","sort","workflowPhase","getPhrase","FavouritesPlaylistItem","coverUrl","ImageUrls","application","action","extraItem","isLoadingCount","src","params","PlaylistsView","dispatch","alerts","usePermissions","hasLocalPermissions","isLoaded","config","ConfigRequests","user","UserRequests","usePresentationAudiences","PlaylistSortHelper","useFavouritesCount","favourites","favouritesPlaylist","isLoading","getPlaylistRequest","PlaylistRequests","PlaylistCollectionIdentifier","PlaylistType","useSetPageMetadata","description","shouldFetch","pageNumber","httpStatus","error","actions","label","svgName","button","dataLoaded","hasError","Actions","sortComponent","P","InfiniteScrollFooter","PlaylistsEmptyState","altText","imageSize","headingClassName","isStudent","hideButton","text","icon","PlaylistsPublicEmptyState","SignUp","redirectOnError","activePresentation","getFallbackPresentation","presentation","userId","favouriteVideosCount","favouriteClipsCount","favouriteInteractivesCount","EN_US","ZH_CN","Locales","register","locale","func","SEC_ARRAY","toDate","input","Date","test","parseInt","trim","replace","format","date","opts","sec","relativeDate","diff","localeFunc","agoIn","totalSec","Math","abs","floor","unit"],"sourceRoot":""}