@clickview/lite 0.48.0-rc.7 → 0.48.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 (128) hide show
  1. package/dist/bundles.json +1 -1
  2. package/dist/scripts/{170-1f815b85a1-lite.chunk.js → 170-2d124965b7-lite.chunk.js} +2 -2
  3. package/dist/scripts/{170-1f815b85a1-lite.chunk.js.map → 170-2d124965b7-lite.chunk.js.map} +1 -1
  4. package/dist/scripts/{1818-b9f9297d6d-lite.chunk.js → 1818-72409e60a9-lite.chunk.js} +1 -1
  5. package/dist/scripts/{1818-b9f9297d6d-lite.chunk.js.map → 1818-72409e60a9-lite.chunk.js.map} +1 -1
  6. package/dist/scripts/{1863-cf9df40052-lite.chunk.js → 1863-e7c4a6f342-lite.chunk.js} +1 -1
  7. package/dist/scripts/{1863-cf9df40052-lite.chunk.js.map → 1863-e7c4a6f342-lite.chunk.js.map} +1 -1
  8. package/dist/scripts/{1958-9889c1ad24-lite.chunk.js → 1958-5336189397-lite.chunk.js} +1 -1
  9. package/dist/scripts/{1958-9889c1ad24-lite.chunk.js.map → 1958-5336189397-lite.chunk.js.map} +1 -1
  10. package/dist/scripts/{2086-a247f6e201-lite.chunk.js → 2086-f7082703d0-lite.chunk.js} +1 -1
  11. package/dist/scripts/{2086-a247f6e201-lite.chunk.js.map → 2086-f7082703d0-lite.chunk.js.map} +1 -1
  12. package/dist/scripts/{2118-462a279c5a-lite.chunk.js → 2118-ec2a5f1e9b-lite.chunk.js} +2 -2
  13. package/dist/scripts/{2118-462a279c5a-lite.chunk.js.map → 2118-ec2a5f1e9b-lite.chunk.js.map} +1 -1
  14. package/dist/scripts/{2182-5c9db07f5b-lite.chunk.js → 2182-8e4d603a1b-lite.chunk.js} +1 -1
  15. package/dist/scripts/{2182-5c9db07f5b-lite.chunk.js.map → 2182-8e4d603a1b-lite.chunk.js.map} +1 -1
  16. package/dist/scripts/{2279-5e92c84310-lite.chunk.js → 2279-252e92e1d8-lite.chunk.js} +1 -1
  17. package/dist/scripts/{2279-5e92c84310-lite.chunk.js.map → 2279-252e92e1d8-lite.chunk.js.map} +1 -1
  18. package/dist/scripts/{2355-6cd89fa80d-lite.chunk.js → 2355-c588dc3ce2-lite.chunk.js} +1 -1
  19. package/dist/scripts/{2355-6cd89fa80d-lite.chunk.js.map → 2355-c588dc3ce2-lite.chunk.js.map} +1 -1
  20. package/dist/scripts/{2469-aa5bbbb17f-lite.chunk.js → 2469-46411b862e-lite.chunk.js} +1 -1
  21. package/dist/scripts/{2469-aa5bbbb17f-lite.chunk.js.map → 2469-46411b862e-lite.chunk.js.map} +1 -1
  22. package/dist/scripts/{2672-0fc559f1d1-lite.chunk.js → 2672-b01985cee8-lite.chunk.js} +1 -1
  23. package/dist/scripts/{2672-0fc559f1d1-lite.chunk.js.map → 2672-b01985cee8-lite.chunk.js.map} +1 -1
  24. package/dist/scripts/{2734-6c6d57d0f3-lite.chunk.js → 2734-6a7beb2ce2-lite.chunk.js} +1 -1
  25. package/dist/scripts/{2734-6c6d57d0f3-lite.chunk.js.map → 2734-6a7beb2ce2-lite.chunk.js.map} +1 -1
  26. package/dist/scripts/{287-ba98be7f21-lite.chunk.js → 287-3cbed16363-lite.chunk.js} +1 -1
  27. package/dist/scripts/{287-ba98be7f21-lite.chunk.js.map → 287-3cbed16363-lite.chunk.js.map} +1 -1
  28. package/dist/scripts/{2875-0e5f209e47-lite.chunk.js → 2875-aefd69a61f-lite.chunk.js} +1 -1
  29. package/dist/scripts/{2875-0e5f209e47-lite.chunk.js.map → 2875-aefd69a61f-lite.chunk.js.map} +1 -1
  30. package/dist/scripts/{3042-6650521d8b-lite.chunk.js → 3042-7c1b5e4ff7-lite.chunk.js} +1 -1
  31. package/dist/scripts/{3042-6650521d8b-lite.chunk.js.map → 3042-7c1b5e4ff7-lite.chunk.js.map} +1 -1
  32. package/dist/scripts/{3158-31baada6cc-lite.chunk.js → 3158-2147de456d-lite.chunk.js} +1 -1
  33. package/dist/scripts/{3158-31baada6cc-lite.chunk.js.map → 3158-2147de456d-lite.chunk.js.map} +1 -1
  34. package/dist/scripts/{3296-6d80e4dd56-lite.chunk.js → 3296-f3732c93d9-lite.chunk.js} +1 -1
  35. package/dist/scripts/{3296-6d80e4dd56-lite.chunk.js.map → 3296-f3732c93d9-lite.chunk.js.map} +1 -1
  36. package/dist/scripts/{3541-7ebd9db295-lite.chunk.js → 3541-15581012d3-lite.chunk.js} +1 -1
  37. package/dist/scripts/{3541-7ebd9db295-lite.chunk.js.map → 3541-15581012d3-lite.chunk.js.map} +1 -1
  38. package/dist/scripts/{3841-95df66e647-lite.chunk.js → 3841-bfae79638b-lite.chunk.js} +2 -2
  39. package/dist/scripts/{3841-95df66e647-lite.chunk.js.map → 3841-bfae79638b-lite.chunk.js.map} +1 -1
  40. package/dist/scripts/{3888-0bee9a9309-lite.chunk.js → 3888-87c1075a1b-lite.chunk.js} +1 -1
  41. package/dist/scripts/{3888-0bee9a9309-lite.chunk.js.map → 3888-87c1075a1b-lite.chunk.js.map} +1 -1
  42. package/dist/scripts/{4138-75a2bb69ab-lite.chunk.js → 4138-b9b03c9900-lite.chunk.js} +1 -1
  43. package/dist/scripts/{4138-75a2bb69ab-lite.chunk.js.map → 4138-b9b03c9900-lite.chunk.js.map} +1 -1
  44. package/dist/scripts/{4778-ebe369973c-lite.chunk.js → 4778-3c9f2b7f76-lite.chunk.js} +2 -2
  45. package/dist/scripts/{4778-ebe369973c-lite.chunk.js.map → 4778-3c9f2b7f76-lite.chunk.js.map} +1 -1
  46. package/dist/scripts/{4942-a27a31e79e-lite.chunk.js → 4942-acce40b333-lite.chunk.js} +2 -2
  47. package/dist/scripts/{4942-a27a31e79e-lite.chunk.js.map → 4942-acce40b333-lite.chunk.js.map} +1 -1
  48. package/dist/scripts/{5075-f8719465be-lite.chunk.js → 5075-53172298fe-lite.chunk.js} +1 -1
  49. package/dist/scripts/{5075-f8719465be-lite.chunk.js.map → 5075-53172298fe-lite.chunk.js.map} +1 -1
  50. package/dist/scripts/{5157-cd12e2e443-lite.chunk.js → 5157-47a0f5c088-lite.chunk.js} +1 -1
  51. package/dist/scripts/{5157-cd12e2e443-lite.chunk.js.map → 5157-47a0f5c088-lite.chunk.js.map} +1 -1
  52. package/dist/scripts/{5268-f4db3933ff-lite.chunk.js → 5268-9b7560f3b1-lite.chunk.js} +2 -2
  53. package/dist/scripts/{5268-f4db3933ff-lite.chunk.js.map → 5268-9b7560f3b1-lite.chunk.js.map} +1 -1
  54. package/dist/scripts/{5442-01ffd95162-lite.chunk.js → 5442-5ddfa2d951-lite.chunk.js} +1 -1
  55. package/dist/scripts/{5442-01ffd95162-lite.chunk.js.map → 5442-5ddfa2d951-lite.chunk.js.map} +1 -1
  56. package/dist/scripts/{5591-98cfe6c6e5-lite.chunk.js → 5591-119d72ede5-lite.chunk.js} +1 -1
  57. package/dist/scripts/{5591-98cfe6c6e5-lite.chunk.js.map → 5591-119d72ede5-lite.chunk.js.map} +1 -1
  58. package/dist/scripts/{5595-3763b14d77-lite.chunk.js → 5595-628d4f252c-lite.chunk.js} +2 -2
  59. package/dist/scripts/5595-628d4f252c-lite.chunk.js.map +1 -0
  60. package/dist/scripts/{6102-4d948a5e48-lite.chunk.js → 6102-751dbbbf33-lite.chunk.js} +3 -3
  61. package/dist/scripts/{6102-4d948a5e48-lite.chunk.js.map → 6102-751dbbbf33-lite.chunk.js.map} +1 -1
  62. package/dist/scripts/{6158-0c5e44f800-lite.chunk.js → 6158-d123add596-lite.chunk.js} +1 -1
  63. package/dist/scripts/{6158-0c5e44f800-lite.chunk.js.map → 6158-d123add596-lite.chunk.js.map} +1 -1
  64. package/dist/scripts/{6263-8957d50afe-lite.chunk.js → 6263-24e67b7df2-lite.chunk.js} +1 -1
  65. package/dist/scripts/{6263-8957d50afe-lite.chunk.js.map → 6263-24e67b7df2-lite.chunk.js.map} +1 -1
  66. package/dist/scripts/{6330-c66465bd6d-lite.chunk.js → 6330-9a2a5fc07e-lite.chunk.js} +1 -1
  67. package/dist/scripts/{6330-c66465bd6d-lite.chunk.js.map → 6330-9a2a5fc07e-lite.chunk.js.map} +1 -1
  68. package/dist/scripts/{671-003843ca84-lite.chunk.js → 671-5571f33165-lite.chunk.js} +1 -1
  69. package/dist/scripts/{671-003843ca84-lite.chunk.js.map → 671-5571f33165-lite.chunk.js.map} +1 -1
  70. package/dist/scripts/{7167-efe85af16e-lite.chunk.js → 7167-dc4c954c2b-lite.chunk.js} +1 -1
  71. package/dist/scripts/{7167-efe85af16e-lite.chunk.js.map → 7167-dc4c954c2b-lite.chunk.js.map} +1 -1
  72. package/dist/scripts/7293-58f4a7cf47-lite.chunk.js +2 -0
  73. package/dist/scripts/{7293-afd3349468-lite.chunk.js.map → 7293-58f4a7cf47-lite.chunk.js.map} +1 -1
  74. package/dist/scripts/{7301-f20e4bdb8f-lite.chunk.js → 7301-7c9342ef0c-lite.chunk.js} +1 -1
  75. package/dist/scripts/{7301-f20e4bdb8f-lite.chunk.js.map → 7301-7c9342ef0c-lite.chunk.js.map} +1 -1
  76. package/dist/scripts/{7708-ece31b78a9-lite.chunk.js → 7708-e91903481a-lite.chunk.js} +1 -1
  77. package/dist/scripts/{7708-ece31b78a9-lite.chunk.js.map → 7708-e91903481a-lite.chunk.js.map} +1 -1
  78. package/dist/scripts/{771-eb60e33941-lite.chunk.js → 771-5612b4ffc2-lite.chunk.js} +2 -2
  79. package/dist/scripts/{771-eb60e33941-lite.chunk.js.map → 771-5612b4ffc2-lite.chunk.js.map} +1 -1
  80. package/dist/scripts/{7855-37bcdd134e-lite.chunk.js → 7855-4b69540a71-lite.chunk.js} +1 -1
  81. package/dist/scripts/{7855-37bcdd134e-lite.chunk.js.map → 7855-4b69540a71-lite.chunk.js.map} +1 -1
  82. package/dist/scripts/{8024-66413cc05b-lite.chunk.js → 8024-765a4170c7-lite.chunk.js} +2 -2
  83. package/dist/scripts/{8024-66413cc05b-lite.chunk.js.map → 8024-765a4170c7-lite.chunk.js.map} +1 -1
  84. package/dist/scripts/{823-58d27c255b-lite.chunk.js → 823-33c5207c68-lite.chunk.js} +1 -1
  85. package/dist/scripts/{823-58d27c255b-lite.chunk.js.map → 823-33c5207c68-lite.chunk.js.map} +1 -1
  86. package/dist/scripts/8261-69854ff4d5-lite.chunk.js +2 -0
  87. package/dist/scripts/8261-69854ff4d5-lite.chunk.js.map +1 -0
  88. package/dist/scripts/{8466-ee9d40ee97-lite.chunk.js → 8466-cea62163e8-lite.chunk.js} +1 -1
  89. package/dist/scripts/{8466-ee9d40ee97-lite.chunk.js.map → 8466-cea62163e8-lite.chunk.js.map} +1 -1
  90. package/dist/scripts/{8681-41edd08b98-lite.chunk.js → 8681-49db3daae6-lite.chunk.js} +2 -2
  91. package/dist/scripts/{8681-41edd08b98-lite.chunk.js.map → 8681-49db3daae6-lite.chunk.js.map} +1 -1
  92. package/dist/scripts/{8772-9ae4d77363-lite.chunk.js → 8772-6c11095cea-lite.chunk.js} +1 -1
  93. package/dist/scripts/{8772-9ae4d77363-lite.chunk.js.map → 8772-6c11095cea-lite.chunk.js.map} +1 -1
  94. package/dist/scripts/{8906-b75b51bd0f-lite.chunk.js → 8906-2f6b5e4c5c-lite.chunk.js} +2 -2
  95. package/dist/scripts/{8906-b75b51bd0f-lite.chunk.js.map → 8906-2f6b5e4c5c-lite.chunk.js.map} +1 -1
  96. package/dist/scripts/{920-4de8efbcf1-lite.chunk.js → 920-acc6596891-lite.chunk.js} +1 -1
  97. package/dist/scripts/{920-4de8efbcf1-lite.chunk.js.map → 920-acc6596891-lite.chunk.js.map} +1 -1
  98. package/dist/scripts/{9212-8f95fbd9b9-lite.chunk.js → 9212-cc987a13bf-lite.chunk.js} +1 -1
  99. package/dist/scripts/{9212-8f95fbd9b9-lite.chunk.js.map → 9212-cc987a13bf-lite.chunk.js.map} +1 -1
  100. package/dist/scripts/{9242-2e533bdc0d-lite.chunk.js → 9242-144e7728ad-lite.chunk.js} +1 -1
  101. package/dist/scripts/{9242-2e533bdc0d-lite.chunk.js.map → 9242-144e7728ad-lite.chunk.js.map} +1 -1
  102. package/dist/scripts/{9264-d2285d4310-lite.chunk.js → 9264-518952f13f-lite.chunk.js} +1 -1
  103. package/dist/scripts/{9264-d2285d4310-lite.chunk.js.map → 9264-518952f13f-lite.chunk.js.map} +1 -1
  104. package/dist/scripts/{9478-8eacf2fe47-lite.chunk.js → 9478-4b3c088537-lite.chunk.js} +2 -2
  105. package/dist/scripts/{9478-8eacf2fe47-lite.chunk.js.map → 9478-4b3c088537-lite.chunk.js.map} +1 -1
  106. package/dist/scripts/{9484-be04a34bbf-lite.chunk.js → 9484-b85011dbea-lite.chunk.js} +2 -2
  107. package/dist/scripts/{9484-be04a34bbf-lite.chunk.js.map → 9484-b85011dbea-lite.chunk.js.map} +1 -1
  108. package/dist/scripts/{bundle-8f540a1154.min.js → bundle-c158cdd3a9.min.js} +3 -3
  109. package/dist/scripts/{bundle-8f540a1154.min.js.map → bundle-c158cdd3a9.min.js.map} +1 -1
  110. package/package.json +1 -1
  111. package/dist/scripts/5595-3763b14d77-lite.chunk.js.map +0 -1
  112. package/dist/scripts/7293-afd3349468-lite.chunk.js +0 -2
  113. package/dist/scripts/8261-72453f1978-lite.chunk.js +0 -2
  114. package/dist/scripts/8261-72453f1978-lite.chunk.js.map +0 -1
  115. /package/dist/scripts/{170-1f815b85a1-lite.chunk.js.LICENSE.txt → 170-2d124965b7-lite.chunk.js.LICENSE.txt} +0 -0
  116. /package/dist/scripts/{2118-462a279c5a-lite.chunk.js.LICENSE.txt → 2118-ec2a5f1e9b-lite.chunk.js.LICENSE.txt} +0 -0
  117. /package/dist/scripts/{3841-95df66e647-lite.chunk.js.LICENSE.txt → 3841-bfae79638b-lite.chunk.js.LICENSE.txt} +0 -0
  118. /package/dist/scripts/{4778-ebe369973c-lite.chunk.js.LICENSE.txt → 4778-3c9f2b7f76-lite.chunk.js.LICENSE.txt} +0 -0
  119. /package/dist/scripts/{4942-a27a31e79e-lite.chunk.js.LICENSE.txt → 4942-acce40b333-lite.chunk.js.LICENSE.txt} +0 -0
  120. /package/dist/scripts/{5268-f4db3933ff-lite.chunk.js.LICENSE.txt → 5268-9b7560f3b1-lite.chunk.js.LICENSE.txt} +0 -0
  121. /package/dist/scripts/{6102-4d948a5e48-lite.chunk.js.LICENSE.txt → 6102-751dbbbf33-lite.chunk.js.LICENSE.txt} +0 -0
  122. /package/dist/scripts/{771-eb60e33941-lite.chunk.js.LICENSE.txt → 771-5612b4ffc2-lite.chunk.js.LICENSE.txt} +0 -0
  123. /package/dist/scripts/{8024-66413cc05b-lite.chunk.js.LICENSE.txt → 8024-765a4170c7-lite.chunk.js.LICENSE.txt} +0 -0
  124. /package/dist/scripts/{8681-41edd08b98-lite.chunk.js.LICENSE.txt → 8681-49db3daae6-lite.chunk.js.LICENSE.txt} +0 -0
  125. /package/dist/scripts/{8906-b75b51bd0f-lite.chunk.js.LICENSE.txt → 8906-2f6b5e4c5c-lite.chunk.js.LICENSE.txt} +0 -0
  126. /package/dist/scripts/{9478-8eacf2fe47-lite.chunk.js.LICENSE.txt → 9478-4b3c088537-lite.chunk.js.LICENSE.txt} +0 -0
  127. /package/dist/scripts/{9484-be04a34bbf-lite.chunk.js.LICENSE.txt → 9484-b85011dbea-lite.chunk.js.LICENSE.txt} +0 -0
  128. /package/dist/scripts/{bundle-8f540a1154.min.js.LICENSE.txt → bundle-c158cdd3a9.min.js.LICENSE.txt} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"scripts/2469-aa5bbbb17f-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/share/utils/ShareHelper.ts","file:///app/packages/libs/shared/src/components/actions/Actions.tsx","file:///app/packages/libs/shared/src/components/actions/actions.scss","file:///app/packages/libs/shared/src/components/actions/ActionsDropdown.tsx","file:///app/packages/libs/shared/src/errors/handlers/HttpErrorHandlers.ts","file:///app/packages/projects/lite/src/apps/student-feed/components/recent-activities/recent-activities.scss","file:///app/packages/projects/lite/src/apps/student-feed/components/recent-activities/RecentActivities.tsx","file:///app/packages/projects/lite/src/apps/student-feed/components/student-feed/partial-loading/partial-student-feed.scss","file:///app/packages/projects/lite/src/apps/student-feed/components/student-feed/partial-loading/PartialStudentFeed.tsx","file:///app/packages/projects/lite/src/apps/student-feed/utils/StudentFeedHelper.ts","file:///app/packages/projects/lite/src/apps/student-feed/components/student-feed-date-filter/student-feed-date-filter.scss","file:///app/packages/projects/lite/src/apps/student-feed/components/student-feed-date-filter/StudentFeedDateFilter.tsx","file:///app/packages/projects/lite/src/apps/student-feed/components/student-feed-header/StudentFeedHeader.tsx","file:///app/packages/projects/lite/src/apps/student-feed/flight-requests/StudentFeedRequests.ts","file:///app/packages/projects/lite/src/apps/student-feed/hooks/useGetStudentFeedDateRange.ts","file:///app/packages/projects/lite/src/apps/student-feed/views/student-feed/empty-state/student-feed-empty-state.scss","file:///app/packages/projects/lite/src/apps/student-feed/views/student-feed/empty-state/StudentFeedEmptyState.tsx","file:///app/packages/projects/lite/src/apps/student-feed/components/feed-card-header/feed-card-header.scss","file:///app/packages/projects/lite/src/apps/student-feed/components/feed-card-header/FeedCardHeader.tsx","file:///app/packages/projects/lite/src/apps/student-feed/components/feed-video-thumbnail/feed-video-thumbnail.scss","file:///app/packages/projects/lite/src/apps/student-feed/components/feed-video-thumbnail/FeedVideoThumbnail.tsx","file:///app/packages/projects/lite/src/apps/student-feed/hooks/useStudentFeedActions.ts","file:///app/packages/projects/lite/src/apps/student-feed/components/feed-video/FeedVideo.tsx","file:///app/packages/projects/lite/src/apps/student-feed/components/feed-video-collection-indicators/feed-video-collection-indicators.scss","file:///app/packages/projects/lite/src/apps/student-feed/components/feed-video-collection-indicators/FeedVideoIndicator.tsx","file:///app/packages/projects/lite/src/apps/student-feed/components/feed-video-collection-indicators/FeedVideoCollectionIndicators.tsx","file:///app/packages/projects/lite/src/apps/student-feed/components/feed-video-collection-item/FeedVideoCollectionItem.tsx","file:///app/packages/projects/lite/src/apps/student-feed/components/small-feed-video-collection-item/SmallFeedVideoCollectionItem.tsx","file:///app/packages/projects/lite/src/apps/student-feed/components/feed-video-collection/empty-state/FeedVideoCollectionEmptyState.tsx","file:///app/packages/projects/lite/src/apps/student-feed/components/feed-video-collection/feed-video-collection.scss","file:///app/packages/projects/lite/src/apps/student-feed/components/feed-video-collection/FeedVideoCollection.tsx","file:///app/packages/projects/lite/src/apps/student-feed/components/student-feed/StudentFeed.tsx","file:///app/packages/projects/lite/src/apps/student-feed/views/student-feed/LazyFeed.tsx","file:///app/packages/projects/lite/src/apps/student-feed/views/student-feed/useGetFeedRequests.ts","file:///app/packages/projects/lite/src/apps/student-feed/views/student-feed/StudentFeedView.tsx","file:///app/node_modules/react-bootstrap/esm/Row.js","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 { format } from 'timeago.js';\n\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { CheckMarkStatus } from 'libs/shared/components/check-mark-button/CheckMarkButton';\nimport { ShareActivityStatus } from 'libs/shared/enums/ShareActivityStatus';\n\ninterface ObjectWithDateShared {\n dateShared: string;\n}\n\ntype GroupedByDate<T extends ObjectWithDateShared> = { [date: string]: T[] };\n\nexport const ShareHelper = {\n groupByDateShared<T extends ObjectWithDateShared>(data: T[]): GroupedByDate<T> {\n const dateToObjectMapping: GroupedByDate<T> = ArrayHelper.groupBy(data, 'dateShared');\n\n const sortedDates = Object.keys(dateToObjectMapping).sort().reverse();\n\n // Create a sorted mapping between dates and the \"ObjectWithDateShared\" objects\n return sortedDates.reduce((acc: GroupedByDate<T>, date) => {\n const heading = format(date);\n\n if (!acc[heading])\n acc[heading] = [];\n\n acc[heading] = acc[heading].concat(dateToObjectMapping[date]);\n return acc;\n }, {});\n },\n\n mapActivityStatusToCheckMarkStatus(activityStatus: ShareActivityStatus): CheckMarkStatus {\n switch (activityStatus) {\n case ShareActivityStatus.Complete:\n return CheckMarkStatus.Complete;\n case ShareActivityStatus.Incomplete:\n return CheckMarkStatus.Incomplete;\n case ShareActivityStatus.None:\n return CheckMarkStatus.None;\n }\n },\n\n mapCheckMarkStatusToActivityStatus(checkMarkStatus: CheckMarkStatus): ShareActivityStatus {\n switch (checkMarkStatus) {\n case CheckMarkStatus.Complete:\n return ShareActivityStatus.Complete;\n case CheckMarkStatus.Incomplete:\n return ShareActivityStatus.Incomplete;\n case CheckMarkStatus.None:\n return ShareActivityStatus.None;\n }\n }\n};","import * as React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { BaseObject } from 'libs/shared/interfaces';\n\nimport { ActionButton } from './ActionButton';\nimport { ActionsDropdown } from './ActionsDropdown';\n\nexport interface ActionOptions {\n order?: number;\n label?: string | (() => JSX.Element);\n appLink?: Core.AppLink;\n href?: string;\n onClick?: () => void;\n svgName?: string;\n className?: string;\n button?: boolean; // If true, a button will be rendered. Otherwise the action will be rendered in the dropdown.\n tooltip?: string;\n showSpinner?: boolean;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n disabled?: boolean;\n openInNewTab?: boolean; // Only used if appLink or href is provided\n group?: string;\n lazyPlaceholder?: boolean;\n}\n\nexport type ActionGenerator = (obj: BaseObject) => ActionOptions[];\n\ninterface ActionsProps {\n actions: ActionOptions[];\n className?: string;\n actionsDropdownClassName?: string;\n dropdownToggleSvgSize?: SvgContainerSize;\n sortComponent?: JSX.Element;\n fetchMore?: () => void;\n}\n\nexport function Actions(props: ActionsProps): JSX.Element {\n const orderedActions = React.useMemo(() => props.actions.sort((a, b) => a.order - b.order), [props.actions]);\n\n const buttonActions: ActionOptions[] = [];\n const moreActions: ActionOptions[] = [];\n\n orderedActions.forEach(a => {\n if (a.button)\n buttonActions.push(a);\n else\n moreActions.push(a);\n });\n\n let className = 'd-flex';\n\n if (props.className)\n className += ` ${props.className}`;\n\n if (!buttonActions.length && !moreActions.length)\n return <></>;\n\n return (\n <div className={className}>\n <>\n <span className='d-flex align-items-center'>\n {buttonActions.length ? buttonActions.map((a, idx) => (\n <React.Fragment key={idx}>\n {(() => {\n if (a.label) {\n const label = FunctionHelper.isFunction(a.label)\n ? a.label\n : () => <>{a.label}</>;\n \n return (\n <ActionButton\n appLink={a.appLink}\n href={a.href}\n onClick={a.onClick}\n svgName={a.svgName}\n className={a.className}\n tooltip={a.tooltip}\n showSpinner={a.showSpinner}\n analyticsData={a.analyticsData}\n analyticsOptions={a.analyticsOptions}\n openInNewTab={a.openInNewTab}\n disabled={a.disabled}\n >\n {label()}\n </ActionButton>\n );\n }\n\n const iconButton = (\n <IconButton\n appLink={a.appLink}\n href={a.href}\n onClick={a.onClick}\n svgName={a.svgName}\n className={a.className}\n analyticsData={a.analyticsData}\n analyticsOptions={a.analyticsOptions}\n openInNewTab={a.openInNewTab}\n disabled={a.disabled}\n />\n );\n\n return a.tooltip\n ? <Tooltip title={a.tooltip} spanHack>{iconButton}</Tooltip>\n : iconButton;\n })()}\n </React.Fragment>\n )) : <></>}\n {props.sortComponent && props.sortComponent}\n {moreActions.length ? (\n <ActionsDropdown\n actions={moreActions}\n dropdownToggleClassName={props.actionsDropdownClassName}\n dropdownToggleSvgSize={props.dropdownToggleSvgSize}\n fetchMore={props.fetchMore}\n />\n ) : <></>}\n </span>\n </>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"dropdownToggle\":\"UCAnJ\"};","import * as React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Core } from 'libs/common/core';\nimport { RandomHelper } from 'libs/common/react/utils/RandomHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { ActionOptions } from './Actions';\n\nimport styles from './actions.scss';\n\nfunction LazyDropdownItems(): JSX.Element {\n return (\n <>\n <div style={{ padding: '0.53125rem 1rem' }}>\n <div className='partial-loading-background' style={{ height: '1.0625rem', width: '8rem' }}></div>\n </div>\n <div style={{ padding: '0.53125rem 1rem' }}>\n <div className='partial-loading-background' style={{ height: '1.0625rem', width: '12rem' }}></div>\n </div>\n <div style={{ padding: '0.53125rem 1rem' }}>\n <div className='partial-loading-background' style={{ height: '1.0625rem', width: '11rem' }}></div>\n </div>\n <div style={{ padding: '0.53125rem 1rem' }}>\n <div className='partial-loading-background' style={{ height: '1.0625rem', width: '9rem' }}></div>\n </div>\n </>\n );\n}\n\nfunction getDropdownItemClassName(actionClassName?: string): string {\n let className = 'dropdown-item';\n\n if (actionClassName)\n className += ` ${actionClassName}`;\n\n return className;\n}\n\nexport type DropdownActionOptions = Omit<ActionOptions, 'button'>;\n\ninterface ActionsDropdownItemProps {\n action: DropdownActionOptions;\n}\n\nfunction ActionsDropdownItem(props: ActionsDropdownItemProps): React.ReactElement {\n const label = FunctionHelper.isFunction(props.action.label)\n ? props.action.label\n : () => <>{props.action.label}</>;\n\n if (props.action.appLink)\n return (\n <AppLink\n appLink={props.action.appLink}\n onClick={props.action.onClick}\n className={getDropdownItemClassName(props.action.className)}\n analyticsData={props.action.analyticsData}\n analyticsOptions={props.action.analyticsOptions}\n openInNewTab={props.action.openInNewTab}\n disabled={props.action.disabled}\n >\n {props.action.svgName && <SvgContainer svgName={props.action.svgName} className='d-inline-block svg-container me-2 align-middle' />}\n <span className='align-middle'>{label()}</span>\n </AppLink>\n );\n\n function onClick(e: React.MouseEvent | React.KeyboardEvent): void {\n e.preventDefault();\n\n if (props.action.analyticsData && props.action.analyticsOptions)\n AnalyticsHelper.logUserAction(props.action.analyticsData, props.action.analyticsOptions);\n\n if (FunctionHelper.isFunction(props.action.onClick))\n props.action.onClick();\n\n if (props.action.href)\n Core.LocationUtils.PageLoad(props.action.href, props.action.openInNewTab);\n }\n\n if (props.action.href) {\n return (\n <a\n className={getDropdownItemClassName(props.action.className)}\n onClick={onClick}\n href={props.action.href}\n >\n {props.action.svgName && <SvgContainer svgName={props.action.svgName} className='d-inline-block svg-container me-2 align-middle' />}\n <span className='align-middle'>{label()}</span>\n </a>\n );\n }\n\n return (\n <span\n className={`cursor-pointer ${getDropdownItemClassName(props.action.className)}`}\n onClick={onClick}\n role='button'\n tabIndex={0}\n onKeyDown={(e: React.KeyboardEvent) => e.key === 'Enter' && onClick(e)}\n >\n {props.action.svgName && <SvgContainer svgName={props.action.svgName} className='d-inline-block svg-container me-2' />}\n {label()}\n </span>\n );\n}\n\ninterface ActionsDropdownProps {\n actions: DropdownActionOptions[];\n className?: string;\n dropdownToggleClassName?: string;\n dropdownToggleSvgSize?: SvgContainerSize;\n fetchMore?: () => void;\n}\n\nActionsDropdown.defaultProps = {\n dropdownToggleClassName: 'btn btn-light',\n dropdownToggleSvgSize: SvgContainerSize.Small\n};\n\nexport function ActionsDropdown(props: ActionsDropdownProps): React.ReactElement {\n if (!props.actions || !props.actions.length)\n return <></>;\n\n const isLazy = props.actions.some(a => a.lazyPlaceholder);\n\n let className = 'dropdown';\n\n if (props.className)\n className += ` ${props.className}`;\n\n // Generate unique id to avoid collisions.\n const dropdownToggleId = `actions-dropdown-${RandomHelper.getRandomInt()}`;\n\n let dropdownToggleClassName = `dropdown-toggle px-0 ${styles.dropdownToggle}`;\n\n if (props.dropdownToggleClassName)\n dropdownToggleClassName += ` ${props.dropdownToggleClassName}`;\n\n let currentGroup: string;\n\n return (\n <div className={className}>\n <button\n className={dropdownToggleClassName}\n type='button'\n id={dropdownToggleId}\n data-bs-toggle='dropdown'\n data-toggle='dropdown'\n aria-haspopup='true'\n aria-expanded='false'\n onClick={isLazy ? props.fetchMore : null}\n >\n <SvgContainer svgName={cvSvgLibrary.More} size={props.dropdownToggleSvgSize} />\n </button>\n <div className='dropdown-menu dropdown-menu-end dropdown-menu-right' aria-labelledby={dropdownToggleId}>\n {isLazy ?\n <LazyDropdownItems /> :\n props.actions.map((a, idx) => {\n const showDivider = currentGroup !== undefined && currentGroup !== a.group;\n currentGroup = a.group;\n \n if (a.tooltip) {\n return (\n <React.Fragment key={idx}>\n {showDivider && <hr className='dropdown-divider' role='separator'></hr>}\n <Tooltip title={a.tooltip} spanHack>\n <ActionsDropdownItem action={a} />\n </Tooltip>\n \n </React.Fragment>\n );\n }\n \n return (\n <React.Fragment key={idx}>\n {showDivider && <hr className='dropdown-divider' role='separator'></hr>}\n <ActionsDropdownItem action={a} />\n </React.Fragment>\n );\n })\n }\n </div>\n </div>\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}\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};\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.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}","// extracted by mini-css-extract-plugin\nexport default {\"avatar\":\"y1nvt\",\"higherWidgetBtn\":\"EQjTN\"};","import React from 'react';\nimport { format } from 'timeago.js';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { ShareHelper } from 'libs/shared/apps/share/utils/ShareHelper';\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { CheckMarkStatus } from 'libs/shared/components/check-mark-button/CheckMarkButton';\nimport { VideoThumbnail } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { FixedWidget } from 'libs/shared/components/widgets/fixed-widget';\nimport { FixedWidgetItemProps } from 'libs/shared/components/widgets/items/FixedWidgetItemProps';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ThumbnailTextPosition } from 'libs/shared/enums/ThumbnailTextPosition';\nimport { WidgetContents } from 'libs/shared/enums/WidgetContents';\nimport { CanFavouriteFunc, Config, FavouriteFunc, SetActivityStatusFunc, VideoTypes, WidgetType } from 'libs/shared/interfaces';\nimport { RecentActivity } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport styles from './recent-activities.scss';\n\nconst namespace = 'studentFeed.recentActivities';\n\nconst getAppLink = (data: RecentActivity<VideoTypes>) => {\n if (data.shareId) {\n return {\n application: AppChannels.SHARE,\n action: Actions.Share.VIEW_SHARE_LINK,\n args: [data.shareId]\n };\n }\n\n switch (data.object?.typeId) {\n case MasterType.Video: {\n return {\n application: AppChannels.VIDEOS,\n action: Actions.Videos.PLAY_VIDEO,\n args: [ data.object.id, TextHelper.slugify(data.object.name) ]\n };\n }\n\n case MasterType.Clip: {\n return {\n application: AppChannels.CLIPS,\n action: Actions.Clips.PLAY_CLIP,\n args: [ data.object.id, TextHelper.slugify(data.object.name) ]\n };\n }\n\n case MasterType.Interactive: {\n return {\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.VIEW_INTERACTIVE,\n args: [ data.object.id, TextHelper.slugify(data.object.name) ]\n };\n }\n\n default:\n return null;\n }\n};\n\ntype WidgetItemProps = FixedWidgetItemProps<RecentActivity<VideoTypes>> & {\n config: Config;\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n setActivityStatus: SetActivityStatusFunc;\n};\n\nfunction WidgetItem(props: WidgetItemProps): JSX.Element {\n return (\n <div className={`p-1 flex-shrink-0 position-relative col-6 col-sm-4 col-md-3`}>\n <VideoThumbnail\n video={props.data.object}\n type='static'\n appLink={getAppLink(props.data)}\n textPosition={ThumbnailTextPosition.Overlay}\n imageOptions={{ size: ImageSize.Medium }}\n preload={props.preloadImage}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n // Disabling activity status for performance reasons (28/2/24) - Sha\n // checkMarkStatus={ShareHelper.mapActivityStatusToCheckMarkStatus(props.data.share?.activityStatus)}\n checkMarkStatus={CheckMarkStatus.None}\n setCheckMarkStatus={status => {\n return props.setActivityStatus(\n props.data.shareId,\n props.data.object,\n ShareHelper.mapCheckMarkStatusToActivityStatus(status)\n );\n }}\n />\n\n {!!props.data.share?.owner?.id && (\n <div className='d-flex align-items-center mt-1'>\n <div className={`${styles.avatar} me-1 flex-shrink-0`}>\n <Avatar\n imageCdnUrl={props.config.imageCdnUrl}\n initials={UserHelper.getInitials(props.data.share.owner.name, props.data.share.owner.surname)}\n imageUrl={props.data.share.owner.avatar?.url}\n />\n </div>\n <div className='d-flex flex-column'>\n <h3 className='font-size-normal mb-0'>{UserHelper.getDisplayName(props.data.share.owner)}</h3>\n <small>\n {format(props.data.share.dateShared)}\n {!!props.data.share.recipient && props.data.share.recipient?.typeId !== MasterType.User && (\n <> &bull; {props.data.share.recipient.name}</>\n )}\n </small>\n </div>\n </div>\n )}\n </div>\n );\n}\n\ninterface RecentActivitiesProps {\n recentActivities: RecentActivity<VideoTypes>[];\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n setActivityStatus: SetActivityStatusFunc;\n config: Config;\n}\n\nexport function RecentActivities(props: RecentActivitiesProps): JSX.Element {\n if (!props.recentActivities)\n return <></>;\n\n const hasRecentActivityWithOwner = !!props.recentActivities.find(a => !!a.share?.owner?.id);\n\n return (\n <div className='pb-3'>\n <FixedWidget<FixedWidgetItemProps<RecentActivity<VideoTypes>>>\n name={LanguageService.getPhrase(namespace, 'continueActivity')}\n type={WidgetType.Row}\n contents={WidgetContents.RecentActivities}\n childComponent={WidgetItem}\n extraChildComponentProps={{\n config: props.config,\n setFavourite: props.setFavourite,\n canFavourite: props.canFavourite,\n setActivityStatus: props.setActivityStatus\n }}\n collection={props.recentActivities}\n leftWidgetButtonClassName={hasRecentActivityWithOwner ? styles.higherWidgetBtn : ''}\n rightWidgetButtonClassName={hasRecentActivityWithOwner ? styles.higherWidgetBtn : ''}\n prefetched\n />\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"partialAvatar\":\"kgqoG\",\"partialName\":\"yctHY\",\"partialDateShared\":\"Vno44\",\"partialThumbnail\":\"OIIaa\",\"partialAction\":\"acv6h\",\"partialSeries\":\"S2Srj\",\"partialTitle\":\"fkwl5\",\"partialDescription\":\"Nim0N\"};","import React from 'react';\n\nimport styles from './partial-student-feed.scss';\n\n/**\n * If you change this component in a way that changes it height,\n * please also update the SINGLE_ITEM_SIZE in <LazyFeed />\n */\nfunction PartialFeedCard(): JSX.Element {\n return (\n <div className='pb-4'>\n <div className='mb-2'>\n <div className='d-flex align-items-center'>\n <div className={`${styles.partialAvatar} me-2 rounded-circle partial-loading-background`} />\n <div className='d-flex flex-column'>\n <div className={`partial-loading-background mb-1 ${styles.partialName}`} />\n <div className={`partial-loading-background ${styles.partialDateShared}`} />\n </div>\n </div>\n </div>\n\n <div className={`partial-loading-background rounded ${styles.partialThumbnail}`} />\n\n <div className='d-flex align-items-center my-1'>\n <div className={`partial-loading-background me-1 ${styles.partialAction}`} />\n <div className={`partial-loading-background ms-1 ${styles.partialAction}`} />\n </div>\n\n <div className={`partial-loading-background mb-1 ${styles.partialSeries}`} />\n\n <div className={`partial-loading-background mb-1 ${styles.partialTitle}`} />\n\n <div className={`partial-loading-background mt-1 ${styles.partialDescription}`} />\n </div>\n );\n}\n\ninterface PartialStudentFeedProps {\n items: number;\n}\n\nexport function PartialStudentFeed(props: PartialStudentFeedProps): JSX.Element {\n return (\n <>\n {new Array(props.items).fill(null).map((l, i) => <PartialFeedCard key={i} />)}\n </>\n );\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { DateRange } from 'libs/shared/interfaces';\n\nconst namespace = 'studentFeed.utils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\n// Sets the end date hours, minutes, and seconds to the very last second of that date\nfunction normalizeEndDate(date: Date): Date {\n date.setHours(23);\n date.setMinutes(59);\n date.setSeconds(59);\n\n return date;\n}\n\nfunction getLastWeekEndDate(): Date {\n const date = new Date();\n\n // Converts today's date to the friday of last week\n date.setDate(date.getDate() + 5 - 7 - (date.getDay() || 7));\n\n return normalizeEndDate(date);\n}\n\nfunction getLastMonthEndDate(): Date {\n const localDate = new Date(new Date().getFullYear(), new Date().getMonth(), 0);\n return normalizeEndDate(localDate);\n}\n\nexport const StudentFeedHelper = {\n getPresetDateRanges(): DateRange[] {\n return [\n {\n name: getPhrase('mostRecent'),\n default: true\n },\n {\n name: getPhrase('lastWeek'),\n endDate: getLastWeekEndDate()\n },\n {\n name: getPhrase('lastMonth'),\n endDate: getLastMonthEndDate()\n }\n ];\n }\n};","// extracted by mini-css-extract-plugin\nexport default {\"dropdownDescription\":\"wmk99\"};","import React from 'react';\nimport { Dropdown } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { DateRange } from 'libs/shared/interfaces';\n\nimport { StudentFeedHelper } from 'apps/student-feed/utils/StudentFeedHelper';\n\nimport styles from './student-feed-date-filter.scss';\n\nconst namespace = 'studentFeed.studentFeedDateFilter';\n\ninterface StudentFeedDateFilterProps {\n dateRange: DateRange;\n floating?: boolean;\n scrollToCurrent: () => void;\n}\n\nexport function StudentFeedDateFilter(props: StudentFeedDateFilterProps): JSX.Element {\n if (!props.dateRange)\n return <></>;\n\n const options = StudentFeedHelper.getPresetDateRanges();\n\n function onSelect(selection: DateRange): void {\n const currentAppLink = Core.AppLinkHelper.getCurrentAppLink();\n\n const currentParams = (currentAppLink.params || {}) as HashObject;\n\n const date = DateHelper.format(selection.endDate, 'YYYY-MM-DD');\n\n if (currentParams.date === date) {\n props.scrollToCurrent();\n return;\n }\n\n const params = ObjectHelper.omit(currentParams, ['date']);\n\n if (selection.endDate) params.date = DateHelper.format(selection.endDate, 'YYYY-MM-DD');\n\n Core.AppLinkHelper.trigger({\n ...currentAppLink,\n params\n }, { replace: true });\n }\n\n return (\n <Dropdown>\n <Dropdown.Toggle\n id='student-feed-date-filter'\n variant='outline-dark'\n className={props.floating ? 'rounded-pill px-3' : ''}\n size={props.floating ? 'lg' : undefined}\n >\n <Text namespace={namespace} phrase='jumpTo' />\n </Dropdown.Toggle>\n <Dropdown.Menu className={props.floating ? 'w-100' : ''} align='end'>\n <Dropdown.Item as='div' className={styles.dropdownDescription}>\n <Text namespace={namespace} phrase='jumpTo' />...\n </Dropdown.Item>\n {options.map(option => (\n <Dropdown.Item\n key={option.name}\n onClick={() => onSelect(option)}\n >\n {option.name}\n </Dropdown.Item>\n ))}\n </Dropdown.Menu>\n </Dropdown>\n );\n}","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { CurrentUser, DateRange } from 'libs/shared/interfaces';\n\nimport { StudentFeedDateFilter } from 'apps/student-feed/components/student-feed-date-filter/StudentFeedDateFilter';\n\nconst namespace = 'studentFeed.studentFeedHeader';\n\ninterface StudentFeedHeaderProps {\n currentUser: CurrentUser;\n dateRange: DateRange;\n scrollToCurrent: () => void;\n}\n\nexport function StudentFeedHeader(props: StudentFeedHeaderProps): JSX.Element {\n return (\n <div className='d-flex justify-content-between align-items-center'>\n <h1 className='h2'>\n <Text namespace={namespace} phrase='hello' options={{ name: props.currentUser.givenName }} />\n </h1>\n\n <StudentFeedDateFilter\n dateRange={props.dateRange}\n scrollToCurrent={props.scrollToCurrent}\n />\n </div>\n );\n}","import { Xhr } from 'libs/common/backbone/interfaces';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { SharedWithMeCollection } from 'libs/shared/apps/share/interfaces/responses/SharedWithMeResponse';\nimport { CacheDurations } from 'libs/shared/constants/CacheDurations';\nimport { SharedWithStatements } from 'libs/shared/constants/WithStatements';\nimport { RecentActivity } from 'libs/shared/interfaces';\n\nexport enum ShareFeedSortType {\n DateAscending = 0,\n DateDescending = 1\n}\n\nexport const StudentFeedRequests = {\n getFeed(options: {\n ownerId?: string;\n from?: Date;\n to?: Date;\n cursor?: string;\n limit?: number;\n sort?: ShareFeedSortType;\n success?: (feed: SharedWithMeCollection) => void;\n error?: (xhr: Xhr) => void;\n }): Flight.Request {\n const { ownerId, from, to, cursor, limit, sort, success, error } = options;\n\n const queryParams: HashObject = {};\n\n const convertDateToUTCString = (date: Date) => {\n const utc = DateHelper.convertDateToUTC(date);\n return DateHelper.format(utc, 'YYYY-MM-DDTHH:mm:ss');\n };\n\n if (cursor) queryParams.cursor = cursor;\n if (ownerId) queryParams.ownerId = ownerId;\n if (from) queryParams.from = convertDateToUTCString(from);\n if (to) queryParams.to = convertDateToUTCString(to);\n if (limit) queryParams.limit = limit;\n if (sort !== undefined) queryParams.sort = sort;\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/users/me/feed', queryParams),\n key: `feed:${queryParams.ownerId}:${queryParams.from}:${queryParams.to}:${queryParams.cursor}:${queryParams.sort}:${queryParams.limit}`,\n cacheDuration: CacheDurations.SHORT,\n success,\n error,\n formatData: (data: SharedWithMeCollection) => {\n if (queryParams.sort === ShareFeedSortType.DateAscending)\n data.data.reverse();\n return data;\n }\n };\n },\n\n getRecentActivities(): Flight.Request {\n const url = UrlHelper.urlBuilder('{gateway}/v1/users/me/recent-activities', {\n 'query.video': SharedWithStatements.VIDEO_COLLECTION,\n 'query.interactive': SharedWithStatements.INTERACTIVE_COLLECTION,\n 'query.clip': SharedWithStatements.CLIP_COLLECTION\n });\n\n return {\n url,\n key: 'recent:share:activities',\n cacheDuration: CacheDurations.SHORT,\n formatData: (res: RecentActivity[]) => {\n return res.map(activity => {\n // To normalize this in the flight store, we need to attach some form of ID\n activity.id = `${activity.shareId}:${activity.object.id}`;\n\n if (!activity.share)\n return activity;\n\n /**\n * Add the activity status to the actual share object, as this\n * object gets updated in the flight store when the activity status is modified\n */\n activity.share.activityStatus = activity.activityStatus;\n\n return activity;\n });\n }\n };\n }\n};","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { DateRange } from 'libs/shared/interfaces';\n\nimport { StudentFeedHelper } from 'apps/student-feed/utils/StudentFeedHelper';\n\nexport const useGetStudentFeedDateRange = (): DateRange => {\n const [ dateRange, setDateRange ] = React.useState<DateRange>(null);\n\n const appLink = Core.AppLinkHelper.getCurrentAppLink();\n const queryParams = (appLink.params || {}) as HashObject;\n\n const presetDateRanges = StudentFeedHelper.getPresetDateRanges();\n\n React.useEffect(() => {\n // No date range params is valid. This will default to \"All time\"\n if (!queryParams.from && !queryParams.to) {\n setDateRange(presetDateRanges.find(r => r.default));\n return;\n }\n\n let hasDateMatch = false;\n\n // Find a preset date range that matches the current params. If none is found, the range is invalid.\n presetDateRanges.forEach(range => {\n if (hasDateMatch)\n return;\n\n const presetFrom = range.startDate && DateHelper.format(range.startDate, 'YYYY-MM-DD');\n const presetTo = range.endDate && DateHelper.format(range.endDate, 'YYYY-MM-DD');\n\n if (presetFrom && presetFrom !== queryParams.from)\n return;\n\n if (presetTo && presetTo !== queryParams.to)\n return;\n\n if (!presetTo && !presetFrom)\n return;\n\n hasDateMatch = true;\n setDateRange(range);\n });\n\n if (hasDateMatch)\n return;\n\n Core.AppLinkHelper.trigger({\n ...appLink,\n params: ObjectHelper.omit(queryParams, [ 'from', 'to' ])\n }, { replace: true });\n }, [ queryParams.from, queryParams.to ]);\n\n return dateRange;\n};","// extracted by mini-css-extract-plugin\nexport default {\"image\":\"ohAxN\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport styles from './student-feed-empty-state.scss';\n\nconst namespace = 'studentFeed.emptyState';\n\nconst cta = {\n application: AppChannels.DASHBOARD,\n action: Actions.Dashboard.HOME\n};\n\nexport function StudentFeedEmptyState(): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState className='pt-3'>\n <EmptyState.Image src={ImageUrls.EmptyStates.STUDENT_FEED} className={styles.image} size='small'/>\n\n <EmptyState.Heading className='h3 d-flex align-items-center justify-content-center'>\n <Text phrase='emptyStateHeading' />\n </EmptyState.Heading>\n\n <EmptyState.Info><Text phrase='emptyStateInfo' /></EmptyState.Info>\n\n <EmptyState.Cta appLink={cta} text={LanguageService.getPhrase(namespace, 'cta')} />\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"avatar\":\"QEQhk\"};","import React from 'react';\nimport { format } from 'timeago.js';\n\nimport { SharedWithMeResponse } from 'libs/shared/apps/share/interfaces/responses/SharedWithMeResponse';\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { Config } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport styles from './feed-card-header.scss';\n\ninterface FeedCardHeaderProps {\n config: Config;\n shareData: SharedWithMeResponse;\n}\n\nexport function FeedCardHeader(props: FeedCardHeaderProps): JSX.Element {\n return (\n <>\n <div className='d-flex align-items-center'>\n <div className={`${styles.avatar} me-2`}>\n <Avatar\n imageCdnUrl={props.config.imageCdnUrl}\n initials={UserHelper.getInitials(props.shareData.owner.name, props.shareData.owner.surname)}\n imageUrl={props.shareData.owner.avatar?.url}\n />\n </div>\n <div className='d-flex flex-column'>\n <h2 className='h6 mb-0'>{UserHelper.getDisplayName(props.shareData.owner)}</h2>\n <div>{format(props.shareData.dateShared)}</div>\n </div>\n </div>\n\n {!!props.shareData.message && (\n <p className='mt-1 mb-0 fw-semibold'>{props.shareData.message}</p>\n )}\n </>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"imageClass\":\"Qig1U\",\"fallbackText\":\"Bt4GN\"};","import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { SharedWithMeResponse } from 'libs/shared/apps/share/interfaces/responses/SharedWithMeResponse';\nimport { ShareHelper } from 'libs/shared/apps/share/utils/ShareHelper';\nimport { CheckMarkStatus } from 'libs/shared/components/check-mark-button/CheckMarkButton';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoThumbnail } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { ImageSize, ImageType } from 'libs/shared/enums/Images';\nimport { ThumbnailTextPosition } from 'libs/shared/enums/ThumbnailTextPosition';\nimport { CanFavouriteFunc, FavouriteFunc, SetActivityStatusFunc, VideoTypes } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nimport styles from './feed-video-thumbnail.scss';\n\nconst namespace = 'studentFeed.feedVideoThumbnail';\n\ninterface FeedVideoThumbnailProps {\n video: VideoTypes;\n appLink: Core.AppLink;\n shareData: SharedWithMeResponse<VideoTypes>;\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n setActivityStatus: SetActivityStatusFunc;\n}\n\nexport function FeedVideoThumbnail(props: FeedVideoThumbnailProps): JSX.Element {\n const { canConsume } = VideoHelper.getCanBeConsumed(props.video);\n\n if (!canConsume) {\n const reasonText = VideoHelper.getPrivacyReasoning(props.video);\n\n return (\n <BaseImage\n data={ImageUrls.Fallbacks.VIDEO_UNAVAILABLE_STUDENT_FEED}\n className='border rounded'\n imageType={ImageType.Thumbnails}\n imageClassName={`${styles.imageClass} w-25 h-25`}\n >\n <div className={styles.fallbackText}>\n <h3 className='h4'>{reasonText}</h3>\n <p><Text namespace={namespace} phrase='unavailableDescription' /></p>\n </div>\n </BaseImage>\n );\n }\n\n return (\n <VideoThumbnail\n video={props.video}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n setCheckMarkStatus={status => {\n return props.setActivityStatus(\n props.shareData.id,\n props.video,\n ShareHelper.mapCheckMarkStatusToActivityStatus(status)\n );\n }}\n // Disabling activity status for performance reasons (28/2/24) - Sha\n // checkMarkStatus={ShareHelper.mapActivityStatusToCheckMarkStatus(props.shareData.activityStatus)}\n checkMarkStatus={CheckMarkStatus.None}\n type='static'\n textPosition={ThumbnailTextPosition.Independent}\n imageOptions={{ size: ImageSize.Large }}\n analyticsOptions={{\n location: LocationContext.StudentFeed\n }}\n appLink={props.appLink}\n preload\n />\n );\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AssocDescriptor, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { FavouriteHelper } from 'libs/shared/utils/FavouriteHelpers';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { useLiteFavourites } from 'shared/hooks/useLiteFavourites';\n\nconst namespace = 'studentFeed.hooks';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function useStudentFeedActions() {\n const { setFavourite } = useLiteFavourites(LocationContext.StudentFeed);\n\n return (video: VideoTypes): ActionOptions[] => {\n const { canConsume } = VideoHelper.getCanBeConsumed(video);\n const isArchived = VideoHelper.isVideoTypeArchived(video);\n\n if (!canConsume || isArchived)\n return [];\n \n const isFavourited = FavouriteHelper.isFavouritedByCurrentUser(video);\n\n\n return [{\n svgName: isFavourited ? cvSvgLibrary.Heart : cvSvgLibrary.HeartOutline,\n order: 0,\n tooltip: getPhrase('favourite'),\n onClick: () => setFavourite(video, !isFavourited),\n button: true,\n className: 'btn btn-link ' + (isFavourited ? 'text-danger' : 'text-link')\n }, {\n order: 10,\n svgName: cvSvgLibrary.AddToPlaylists,\n tooltip: getPhrase('addToPlaylist'),\n className: 'btn btn-link text-link',\n button: true,\n appLink: {\n application: AppChannels.PLAYLISTS,\n action: Actions.Playlists.ADD_TO_PLAYLIST,\n args: [video.id]\n },\n analyticsOptions: {\n entity: VideoHelper.getAnalyticsEntity(video),\n location: LocationContext.StudentFeed,\n actionType: UserAction.Associate,\n descriptor: AssocDescriptor.Playlist,\n workflowPhase: WorkflowPhase.Start\n },\n analyticsData: VideoHelper.getAnalyticsData(video)\n }];\n };\n}","import React from 'react';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { SharedWithMeResponse } from 'libs/shared/apps/share/interfaces/responses/SharedWithMeResponse';\nimport { Actions as ActionsComponent } from 'libs/shared/components/actions/Actions';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { VideoSubText } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { CanFavouriteFunc, Config, FavouriteFunc, SetActivityStatusFunc, VideoTypes } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { SeriesAppLinkHelper } from 'apps/series/SeriesAppLinkHelper';\nimport { FeedCardHeader } from 'apps/student-feed/components/feed-card-header/FeedCardHeader';\nimport { FeedVideoThumbnail } from 'apps/student-feed/components/feed-video-thumbnail/FeedVideoThumbnail';\nimport { useStudentFeedActions } from 'apps/student-feed/hooks/useStudentFeedActions';\n\nconst getAppLink = (shareId: string) => ({\n application: AppChannels.SHARE,\n action: Actions.Share.VIEW_SHARE_LINK,\n args: [shareId]\n});\n\ninterface FeedVideoProps {\n data: SharedWithMeResponse<VideoTypes>;\n config: Config;\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n setActivityStatus: SetActivityStatusFunc;\n}\n\nexport function FeedVideo(props: FeedVideoProps): JSX.Element {\n const { object } = props.data;\n\n const getVideoActions = useStudentFeedActions();\n\n const { canConsume } = VideoHelper.getCanBeConsumed(object);\n\n return (\n <div className='pb-4'>\n <div className='pb-2'>\n <FeedCardHeader config={props.config} shareData={props.data} />\n </div>\n\n <FeedVideoThumbnail\n video={props.data.object}\n appLink={getAppLink(props.data.id)}\n shareData={props.data}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n setActivityStatus={props.setActivityStatus}\n />\n\n <ActionsComponent actions={canConsume ? getVideoActions(object) : []} />\n\n {VideoHelper.isVideo(object) && (\n <VideoSubText\n type='series'\n video={object}\n appLink={SeriesAppLinkHelper.getSeriesAppLink(object.series)}\n analyticsOptions={{\n location: LocationContext.StudentFeed\n }}\n className={canConsume ? '' : 'mt-2'}\n />\n )}\n\n <div>\n <AppLink className='d-inline-block' appLink={canConsume ? getAppLink(props.data.id) : null}>\n <h3 className='h4 mb-0'>{object.name}</h3>\n </AppLink>\n </div>\n\n {!!object.description && (\n <p className='clamp-2 mb-0 mt-1'>{object.description}</p>\n )}\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"circle\":\"BJPA7\",\"active\":\"YuQnu\",\"sm\":\"wI7Zf\",\"xs\":\"KkKSG\"};","import React from 'react';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\n\nimport { Indicator } from './FeedVideoCollectionIndicators';\n\nimport styles from './feed-video-collection-indicators.scss';\n\ninterface FeedVideoIndicatorProps {\n indicator: Indicator;\n onClick: () => void;\n}\n\nexport function FeedVideoIndicator({ indicator, onClick }: FeedVideoIndicatorProps): JSX.Element {\n let className = styles.circle;\n\n if (indicator.active) className += ' ' + styles.active;\n\n if (indicator.size === 'sm') className += ' ' + styles.sm;\n if (indicator.size === 'xs') className += ' ' + styles.xs;\n if (indicator.size === 'invisible') className += ' d-none';\n\n return <DivButton className={className} onClick={onClick} />;\n}","import React from 'react';\n\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { Video } from 'libs/shared/interfaces';\n\nimport { FeedVideoIndicator } from './FeedVideoIndicator';\n\ntype IndicatorSize = 'std' | 'sm' | 'xs' | 'invisible';\n\nexport interface Indicator {\n size: IndicatorSize;\n active: boolean;\n}\n\nfunction getInitialIndicatorState(props: FeedVideoCollectionIndicatorsProps): Indicator[] {\n const currentVideoIndex = props.videos.findIndex(v => v.id === props.currentVideo.id);\n\n const getSize = (index: number): IndicatorSize => {\n if (index < 5)\n return 'std';\n\n if (index === 5)\n return 'sm';\n\n if (index === 6)\n return 'xs';\n\n return 'invisible';\n };\n\n return props.videos.map((v, index) => {\n return {\n active: currentVideoIndex === index,\n size: getSize(index)\n };\n });\n}\n\ninterface FeedVideoCollectionIndicatorsProps {\n videos: Video[];\n currentVideo: Video;\n onSelectIndex: (index: number) => void;\n}\n\nexport function FeedVideoCollectionIndicators(props: FeedVideoCollectionIndicatorsProps): JSX.Element {\n const getVideoIndex = (video: Video) => props.videos.findIndex(v => v.id === video.id);\n\n const [ currentVideoIndex, setCurrentVideoIndex ] = React.useState(getVideoIndex(props.currentVideo));\n const [ indicators, setIndicators ] = React.useState<Indicator[]>(getInitialIndicatorState(props));\n\n React.useEffect(onChangeCurrentVideo, [props.currentVideo?.id]);\n \n const activeIndicatorIndex = indicators.findIndex(d => d.active);\n\n function onChangeCurrentVideo(): void {\n const oldIndex = currentVideoIndex;\n const newIndex = getVideoIndex(props.currentVideo);\n\n // Will be true on first load\n if (oldIndex === newIndex)\n return;\n\n const difference = newIndex - oldIndex;\n const newActiveIndicatorIndex = activeIndicatorIndex + difference;\n\n setCurrentVideoIndex(newIndex);\n\n const newIndicatorState = indicators.map((indicator, index) => {\n return {\n active: index === newActiveIndicatorIndex,\n size: indicator.size\n };\n });\n\n // Update the active indicators\n setIndicators(newIndicatorState);\n\n /**\n * If the new active indicator is not a \"std\" size (meaning it's one of the smaller looking indicators),\n * we need to \"shift\" the sizes of each indicator.\n */\n if (indicators[newActiveIndicatorIndex].size !== 'std') {\n const shiftedIndicators = getShiftedIndicators(newIndicatorState, newIndex < oldIndex ? 'left' : 'right');\n setIndicators(shiftedIndicators);\n }\n }\n\n function getShiftedIndicators(indicatorState: Indicator[], direction: 'left' | 'right'): Indicator[] {\n let indexOfFirstStdIndicator: number;\n let indexOfLastStdIndicator: number;\n\n // Find the index of the first and last \"std\" size indicators in the indicator list\n indicatorState.forEach((indicator, index) => {\n if (indicator.size === 'std' && indexOfFirstStdIndicator === undefined)\n indexOfFirstStdIndicator = index;\n\n if (indicator.size === 'std')\n indexOfLastStdIndicator = index;\n });\n\n const shiftedIndicatorState = ObjectHelper.deepClone(indicatorState);\n\n if (direction === 'left') {\n shiftedIndicatorState[indexOfFirstStdIndicator - 1] = { active: true, size: 'std' };\n shiftedIndicatorState[indexOfFirstStdIndicator - 2] = { active: false, size: 'sm' };\n shiftedIndicatorState[indexOfFirstStdIndicator - 3] = { active: false, size: 'xs' };\n shiftedIndicatorState[indexOfLastStdIndicator + 2] = { active: false, size: 'invisible' };\n shiftedIndicatorState[indexOfLastStdIndicator + 1] = { active: false, size: 'xs' };\n shiftedIndicatorState[indexOfLastStdIndicator] = { active: false, size: 'sm' };\n } else {\n shiftedIndicatorState[indexOfLastStdIndicator + 1] = { active: true, size: 'std' };\n\n if (shiftedIndicatorState[indexOfLastStdIndicator + 2])\n shiftedIndicatorState[indexOfLastStdIndicator + 2] = { active: false, size: 'sm' };\n\n if (shiftedIndicatorState[indexOfLastStdIndicator + 3])\n shiftedIndicatorState[indexOfLastStdIndicator + 3] = { active: false, size: 'xs' };\n\n shiftedIndicatorState[indexOfFirstStdIndicator - 2] = { active: false, size: 'invisible' };\n shiftedIndicatorState[indexOfFirstStdIndicator - 1] = { active: false, size: 'xs' };\n shiftedIndicatorState[indexOfFirstStdIndicator] = { active: false, size: 'sm' };\n }\n\n return shiftedIndicatorState;\n }\n\n return (\n <div className='d-flex align-items-center'>\n {indicators.map((indicator, index) => (\n <FeedVideoIndicator key={index} indicator={indicator} onClick={() => props.onSelectIndex(index)} />\n ))}\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { SharedWithMeResponse } from 'libs/shared/apps/share/interfaces/responses/SharedWithMeResponse';\nimport { FixedWidgetItemProps } from 'libs/shared/components/widgets/items/FixedWidgetItemProps';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { RelatedVideosContext } from 'libs/shared/enums/RelatedVideosContext';\nimport { CanFavouriteFunc, FavouriteFunc, Series, SetActivityStatusFunc, VideoTypes } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { ShareLinkQueryParams } from 'apps/share/interfaces/ShareLinkViewProps';\nimport { FeedPlaylist } from 'apps/student-feed/interfaces/FeedPlaylist';\n\nimport { FeedVideoThumbnail } from '../feed-video-thumbnail/FeedVideoThumbnail';\n\nconst getAppLink = (shareId: string, params?: ShareLinkQueryParams) => {\n const appLink: Core.AppLink = {\n application: AppChannels.SHARE,\n action: Actions.Share.VIEW_SHARE_LINK,\n args: [shareId]\n };\n\n if (params)\n appLink.params = params;\n\n return appLink;\n};\n\nconst getExtraParams = (obj: VideoTypes) => {\n let extraParams: HashObject = {};\n\n if (VideoHelper.isClip(obj))\n extraParams = { clipId: obj.id };\n else if (VideoHelper.isInteractive(obj))\n extraParams = { interactiveId: obj.id };\n else\n extraParams = { videoId: obj.id };\n\n return extraParams;\n};\n\nexport interface FeedVideoCollectionItemProps extends FixedWidgetItemProps<VideoTypes> {\n setFavourite?: FavouriteFunc;\n canFavourite?: CanFavouriteFunc;\n shareData?: SharedWithMeResponse<FeedPlaylist | Series>;\n setActivityStatus?: SetActivityStatusFunc;\n}\n\nexport function FeedVideoCollectionItem(props: FeedVideoCollectionItemProps): JSX.Element {\n return (\n <div className='flex-shrink-0 position-relative w-100'>\n <FeedVideoThumbnail\n video={props.data}\n appLink={getAppLink(props.shareData.id, {\n ...getExtraParams(props.data),\n contextId: props.shareData.object.id,\n context: props.shareData.object.typeId === MasterType.Playlist\n ? RelatedVideosContext.Playlist\n : RelatedVideosContext.Series\n })}\n shareData={props.shareData}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n setActivityStatus={props.setActivityStatus}\n />\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { SharedWithMeResponse } from 'libs/shared/apps/share/interfaces/responses/SharedWithMeResponse';\nimport { VideoThumbnail } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { FixedWidgetItemProps } from 'libs/shared/components/widgets/items/FixedWidgetItemProps';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { RelatedVideosContext } from 'libs/shared/enums/RelatedVideosContext';\nimport { ThumbnailTextPosition } from 'libs/shared/enums/ThumbnailTextPosition';\nimport { CanFavouriteFunc, FavouriteFunc, Series, VideoTypes } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { ShareLinkQueryParams } from 'apps/share/interfaces/ShareLinkViewProps';\nimport { FeedPlaylist } from 'apps/student-feed/interfaces/FeedPlaylist';\n\nconst getAppLink = (shareId: string, params?: ShareLinkQueryParams) => {\n const appLink: Core.AppLink = {\n application: AppChannels.SHARE,\n action: Actions.Share.VIEW_SHARE_LINK,\n args: [shareId]\n };\n\n if (params)\n appLink.params = params;\n\n return appLink;\n};\n\nconst getExtraParams = (obj: VideoTypes) => {\n let extraParams: HashObject = {};\n\n if (VideoHelper.isClip(obj))\n extraParams = { clipId: obj.id };\n else if (VideoHelper.isInteractive(obj))\n extraParams = { interactiveId: obj.id };\n else\n extraParams = { videoId: obj.id };\n\n return extraParams;\n};\n\nexport interface SmallFeedVideoCollectionItemProps extends FixedWidgetItemProps<VideoTypes> {\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n shareData: SharedWithMeResponse<FeedPlaylist | Series>;\n}\n\nexport function SmallFeedVideoCollectionItem(props: SmallFeedVideoCollectionItemProps): JSX.Element {\n return (\n <div className={`p-1 flex-shrink-0 position-relative col-6 col-sm-4 col-md-3`}>\n <VideoThumbnail\n video={props.data}\n type='static'\n appLink={getAppLink(props.shareData.id, {\n ...getExtraParams(props.data),\n contextId: props.shareData.object.id,\n context: props.shareData.object.typeId === MasterType.Playlist\n ? RelatedVideosContext.Playlist\n : RelatedVideosContext.Series\n })}\n textPosition={ThumbnailTextPosition.Overlay}\n imageOptions={{ size: ImageSize.Medium }}\n preload={props.preloadImage}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n />\n </div>\n );\n}","import React from 'react';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { Playlist, Series } from 'libs/shared/interfaces';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nconst namespace = 'studentFeed.feedVideoCollectionEmptyState';\n\ninterface FeedVideoCollectionEmptyStateProps {\n data: Playlist | Series;\n}\n\nexport function FeedVideoCollectionEmptyState(props: FeedVideoCollectionEmptyStateProps): JSX.Element {\n return (\n <EmptyState className='border rounded-3 pt-5 pb-3'>\n <EmptyState.Image src={ImageUrls.EmptyStates.Playlists.PLAYLIST_VIDEOS} />\n\n <EmptyState.Heading>\n <Text namespace={namespace} phrase='heading' options={{ name: props.data.name }} />\n </EmptyState.Heading>\n\n {props.data.typeId === MasterType.Playlist && (\n <EmptyState.Info>\n <Text namespace={namespace} phrase='playlistInfo' />\n </EmptyState.Info>\n )}\n </EmptyState>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"leftWidgetButton\":\"bux3R\",\"rightWidgetButton\":\"QTLk7\"};","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { SharedWithMeResponse } from 'libs/shared/apps/share/interfaces/responses/SharedWithMeResponse';\nimport { Actions as ActionsComponent } from 'libs/shared/components/actions/Actions';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { FixedWidget } from 'libs/shared/components/widgets/fixed-widget';\nimport { FixedWidgetControls } from 'libs/shared/components/widgets/fixed-widget/FixedWidgetUtils';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { WidgetContents } from 'libs/shared/enums/WidgetContents';\nimport { CanFavouriteFunc, Config, FavouriteFunc, Series, SetActivityStatusFunc, WidgetType } from 'libs/shared/interfaces';\nimport { MasterTypeHelper } from 'libs/shared/utils/MasterTypeHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { ShareLinkQueryParams } from 'apps/share/interfaces/ShareLinkViewProps';\nimport { FeedCardHeader } from 'apps/student-feed/components/feed-card-header/FeedCardHeader';\nimport { FeedVideoCollectionIndicators } from 'apps/student-feed/components/feed-video-collection-indicators/FeedVideoCollectionIndicators';\nimport { FeedVideoCollectionItem, FeedVideoCollectionItemProps } from 'apps/student-feed/components/feed-video-collection-item/FeedVideoCollectionItem';\nimport { SmallFeedVideoCollectionItem, SmallFeedVideoCollectionItemProps } from 'apps/student-feed/components/small-feed-video-collection-item/SmallFeedVideoCollectionItem';\nimport { useStudentFeedActions } from 'apps/student-feed/hooks/useStudentFeedActions';\nimport { FeedPlaylist } from 'apps/student-feed/interfaces/FeedPlaylist';\n\nimport { FeedVideoCollectionEmptyState } from './empty-state/FeedVideoCollectionEmptyState';\n\nimport styles from './feed-video-collection.scss';\n\nconst getAppLink = (shareId: string, params?: ShareLinkQueryParams) => {\n const appLink: Core.AppLink = {\n application: AppChannels.SHARE,\n action: Actions.Share.VIEW_SHARE_LINK,\n args: [shareId]\n };\n\n if (params)\n appLink.params = params;\n\n return appLink;\n};\n\nconst getCollectionItems = (obj: FeedPlaylist | Series) => {\n if (MasterTypeHelper.isType<FeedPlaylist>(obj, MasterType.Playlist))\n return obj.union.data;\n \n return obj.videos.data;\n};\n\ninterface FeedVideoCollectionProps {\n data: SharedWithMeResponse<FeedPlaylist | Series>;\n config: Config;\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n setActivityStatus: SetActivityStatusFunc;\n}\n\nexport function FeedVideoCollection(props: FeedVideoCollectionProps): JSX.Element {\n const { object } = props.data;\n\n const items = getCollectionItems(props.data.object);\n\n const [ currentVideo, setCurrentVideo ] = React.useState(ArrayHelper.first(items));\n const [ showExpandedVideoList, setShowExpandedVideoList ] = React.useState(false);\n\n const fixedWidgetControls = React.useRef<FixedWidgetControls>(null);\n\n const getVideoActions = useStudentFeedActions();\n\n const currentVideoIndex = items.findIndex(v => v.id === currentVideo.id);\n\n function onPrevious(): void {\n setCurrentVideo(items[currentVideoIndex - 1]);\n }\n\n function onNext(): void {\n setCurrentVideo(items[currentVideoIndex + 1]);\n }\n\n function onSelectIndex(index: number): void {\n if (!fixedWidgetControls.current)\n return;\n\n setCurrentVideo(items[index]);\n fixedWidgetControls.current.jumpToIndex(index);\n }\n\n return (\n <div className='pb-4'>\n <div className='pb-2'>\n <FeedCardHeader config={props.config} shareData={props.data} />\n </div>\n\n {currentVideo ? (\n <>\n <div className='position-relative'>\n <FixedWidget<FeedVideoCollectionItemProps>\n controlsRef={fixedWidgetControls}\n type={WidgetType.Row}\n contents={WidgetContents.FeedVideos}\n childComponent={FeedVideoCollectionItem}\n extraChildComponentProps={{\n setFavourite: props.setFavourite,\n canFavourite: props.canFavourite,\n setActivityStatus: props.setActivityStatus,\n shareData: props.data\n }}\n collection={items}\n onNext={onNext}\n onPrevious={onPrevious}\n leftWidgetButtonClassName={styles.leftWidgetButton}\n rightWidgetButtonClassName={styles.rightWidgetButton}\n hideBleedingContent\n hideName\n hideExtendedClickableArea\n prefetched\n lazyLoad={false}\n touchBehavior='drag'\n />\n </div>\n\n <div className='position-relative'>\n <Row className='g-0'>\n <Col xs={2} className='d-flex align-items-center justify-content-start'>\n <ActionsComponent actions={getVideoActions(currentVideo)} />\n </Col>\n <Col xs={8} className='d-flex align-items-center justify-content-center'>\n <FeedVideoCollectionIndicators\n videos={items}\n currentVideo={currentVideo}\n onSelectIndex={onSelectIndex}\n />\n </Col>\n <Col xs={2} className='d-flex align-items-center justify-content-end'>\n <DivButton onClick={() => setShowExpandedVideoList(val => !val)}>\n <SvgContainer svgName={showExpandedVideoList ? cvSvgLibrary.ChevronUp : cvSvgLibrary.ChevronDown} />\n </DivButton>\n </Col>\n </Row>\n </div>\n\n <div>\n <AppLink className='d-inline-block' appLink={getAppLink(props.data.id)}>\n <h3 className='h4 mb-0'>{object.name}</h3>\n </AppLink>\n </div>\n {showExpandedVideoList ? (\n <div className='pt-1'>\n <FixedWidget<SmallFeedVideoCollectionItemProps>\n type={WidgetType.Row}\n contents={WidgetContents.Videos}\n childComponent={SmallFeedVideoCollectionItem}\n extraChildComponentProps={{\n setFavourite: props.setFavourite,\n canFavourite: props.canFavourite,\n shareData: props.data\n }}\n collection={items}\n appLink={getAppLink(props.data.id)}\n touchBehavior='drag'\n limitTotalItems\n hideName\n prefetched\n />\n </div>\n ) : (\n !!object.description && <p className='clamp-2 mb-0 mt-1'>{object.description}</p>\n )}\n </>\n ) : (\n <FeedVideoCollectionEmptyState data={props.data.object} />\n )}\n </div>\n );\n}","import React from 'react';\n\nimport { SharedWithMeResponse } from 'libs/shared/apps/share/interfaces/responses/SharedWithMeResponse';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { CanFavouriteFunc, Config, FavouriteFunc, Series, SetActivityStatusFunc, VideoTypes } from 'libs/shared/interfaces';\n\nimport { FeedVideo } from 'apps/student-feed/components/feed-video/FeedVideo';\nimport { FeedVideoCollection } from 'apps/student-feed/components/feed-video-collection/FeedVideoCollection';\nimport { FeedPlaylist } from 'apps/student-feed/interfaces/FeedPlaylist';\n\ninterface StudentFeedProps {\n feed: SharedWithMeResponse[];\n config: Config;\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n setActivityStatus: SetActivityStatusFunc;\n}\n\nexport function StudentFeed(props: StudentFeedProps): JSX.Element {\n return (\n <>\n {props.feed.map((sharedObject, index) => {\n switch (sharedObject.object?.typeId) {\n case MasterType.Video:\n case MasterType.Clip:\n case MasterType.Interactive:\n return (\n <FeedVideo\n key={`${sharedObject.id}:${index}`}\n data={sharedObject as SharedWithMeResponse<VideoTypes>}\n config={props.config}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n setActivityStatus={props.setActivityStatus}\n />\n );\n\n case MasterType.Playlist:\n case MasterType.Series:\n return (\n <FeedVideoCollection\n key={`${sharedObject.id}:${index}`}\n data={sharedObject as SharedWithMeResponse<FeedPlaylist | Series>}\n config={props.config}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n setActivityStatus={props.setActivityStatus}\n />\n );\n\n case MasterType.Subject:\n default:\n return <React.Fragment key={index}></React.Fragment>;\n }\n })}\n </>\n );\n}","import * as React from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { SharedWithMeCollection } from 'libs/shared/apps/share/interfaces/responses/SharedWithMeResponse';\nimport { useLazyLoad } from 'libs/shared/hooks/UseLazyLoad';\nimport { CanFavouriteFunc, Config, FavouriteFunc, SetActivityStatusFunc } from 'libs/shared/interfaces';\n\nimport { PartialStudentFeed } from 'apps/student-feed/components/student-feed/partial-loading/PartialStudentFeed';\nimport { StudentFeed } from 'apps/student-feed/components/student-feed/StudentFeed';\n\nconst JUMP_ERROR_MARGIN = 15;\n\n/**\n * This item is actually the height of one of our partial loading items.\n * See <PartialStudentFeed />\n */\nconst SINGLE_ITEM_SIZE = 635;\n\ninterface LazyFeedProps {\n request: Flight.Request;\n reversed?: boolean;\n config: Config;\n limit: number;\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n setActivityStatus: SetActivityStatusFunc;\n scrollTo: boolean;\n}\n\nexport function LazyFeed(props: LazyFeedProps): React.ReactElement {\n const { request, reversed, scrollTo } = props;\n\n const scrollToRef = React.useRef<HTMLDivElement>();\n\n // We use a margin of about 1 item.\n const { ref, inView } = useLazyLoad({ triggerOnce: false, rootMargin: SINGLE_ITEM_SIZE + 'px' });\n\n /**\n * This request is being provided by useGetFeedRequests, when this is fetched if there is paging\n * it's possible for another request to be added inside of useGetFeedRequests\n */\n const feed = Flight.useBasicFetch<SharedWithMeCollection>(inView ? request : null);\n\n const items = feed.data?.data;\n\n const scrollY = window.scrollY;\n const [ lastHeight, setLastHeight ] = React.useState<number>(SINGLE_ITEM_SIZE * props.limit);\n\n /**\n * Store initial height of element on first insertion\n * Also scroll the page if we know we're inserting this element above\n */\n React.useLayoutEffect(() => {\n const boundingRect = scrollToRef.current.getBoundingClientRect();\n\n if (reversed) {\n window.scrollTo(0, scrollY + boundingRect.height);\n } else if (scrollTo) {\n /**\n * Minus 100 is an arbitrary distanced picked to have the item appear \n * beneath the header with some buffer\n * \n * This fixes the scroll to sometimes not working, after some googling it looks like the scrollTo is interfered with by focus.\n * The moment a user clicks on the the button to go to a certain time, the button still has focus. One animation frame later\n * the element will have been removed and the focus is gone. - Sha\n *\n */\n window.requestAnimationFrame(() => {\n window.scrollTo(0, scrollY + boundingRect.top - 100);\n });\n }\n }, [scrollTo]);\n\n /**\n * If our height changes (Within a margin of error)\n * we scroll by the amount the element has changed in\n * order to prevent a visual jump\n */\n React.useLayoutEffect(() => {\n if (!lastHeight)\n return;\n \n const height = scrollToRef.current.getBoundingClientRect().height;\n setLastHeight(height);\n\n if (lastHeight < height + JUMP_ERROR_MARGIN && lastHeight > height - JUMP_ERROR_MARGIN)\n return;\n\n if (scrollToRef.current.offsetTop > scrollY)\n return;\n\n const delta = lastHeight - height;\n window.scrollTo(0, scrollY - delta);\n });\n\n return (\n <div ref={ref}>\n <div ref={scrollToRef}>\n {items?.length ?\n <StudentFeed\n feed={items}\n config={props.config}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n setActivityStatus={props.setActivityStatus}\n /> :\n // Once we have a calulated height, we use it to prevent any further\n // need to fix the scroll as the Student feed is swapped in and out\n <div style={{ height: lastHeight, overflow: 'hidden' }}>\n <PartialStudentFeed items={props.limit} />\n </div>\n }\n </div>\n </div>\n );\n}","import * as React from 'react';\nimport { useStore } from 'react-redux';\n\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { ApplicationState } from 'libs/common/react/interfaces';\n\nimport { SharedWithMeCollection } from 'libs/shared/apps/share/interfaces/responses/SharedWithMeResponse';\nimport { handleHttpError } from 'libs/shared/errors/handlers/HttpErrorHandlers';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\n\nimport { ShareFeedSortType, StudentFeedRequests } from 'apps/student-feed/flight-requests/StudentFeedRequests';\n\nconst getPhrase = LanguageService.encloseNamespace('studentFeed.studentFeed');\n\ninterface GetRequestOptions {\n from?: Date;\n to?: Date;\n cursor?: string;\n reverse?: boolean;\n}\n\ninterface RequestWrapper {\n request: Flight.Request;\n reversed?: boolean;\n current?: boolean;\n}\n\nexport const useGetFeedRequests = (limit: number, date?: string) => {\n const store = useStore<ApplicationState>();\n const alerts = useAlerts();\n const [ requests, setRequest ] = React.useState<RequestWrapper[]>([]);\n const [ isEmpty, setIsEmpty ] = React.useState(false);\n\n function onError(cursor: string, xhr: Xhr): void {\n /**\n * If there's no cursor it was an initial request that errored\n * so we go to an error page, otherwise we show an alert\n */\n if (!cursor)\n return handleHttpError(xhr.status);\n\n alerts.error(getPhrase('error'));\n }\n\n function getRequest(options: GetRequestOptions = {}): Flight.Request {\n const { from, to, cursor, reverse } = options;\n\n /**\n * This callback will continue to build out our array of requests in both directions.\n */\n let onSuccess = (feed: SharedWithMeCollection) => {\n /**\n * This ensures that the next request is only added to our array once,\n * this will prevent our request list growing larger than we want it to when items\n * expire\n */\n onSuccess = null;\n\n /**\n * If our request has no items, remove it from the request list\n * This allows up to render an empty state if there are no requests left\n */\n if (!feed.data.length) {\n setRequest(r => {\n const index = r.findIndex(r => r.request.key === request.key);\n const updated = [ ...r.slice(0, index), ...r.slice(index + 1) ];\n\n if (!updated.length)\n setIsEmpty(true);\n\n return updated;\n });\n return;\n }\n\n // If our request has no more items, do nothing we've hit the end\n if (!feed.pagination?.cursors?.next)\n return;\n\n if (!reverse) {\n const wrapper = {\n request: getRequest({ ...options, cursor: feed.pagination.cursors.next })\n };\n setRequest(r => [ ...r, wrapper ]);\n return;\n }\n\n const wrapper = {\n request: getRequest({ ...options, cursor: feed.pagination.cursors.next }),\n reversed: true\n };\n setRequest(r => [ wrapper, ...r ]);\n };\n \n const request = StudentFeedRequests.getFeed({\n from,\n to,\n cursor,\n sort: reverse ? ShareFeedSortType.DateAscending : ShareFeedSortType.DateDescending,\n limit,\n success: feed => {\n /**\n * We do a page re-paint and compensate with a scroll when data returns\n * We don't also want to add another request in immediately, which also will do\n * a re-paint and compensation scroll. So we delay adding our request in by \n * one animation frame, which allows the browser to properly handle where we want\n * out scroll position to be\n */\n window.requestAnimationFrame(() => {\n onSuccess && onSuccess(feed);\n });\n },\n error: (xhr: Xhr) => onError(cursor, xhr)\n });\n\n /**\n * We pull the request out of the store, if it already exists this means our user\n * has already accessed the feed, so we immediately build out the next request\n * and then unset the callback so it doesn't fetch when it's expired\n */\n const response = Flight.getResponse<SharedWithMeCollection>(store.getState(), request.key);\n\n if (response.data) {\n /**\n * This has to happen after the useEffect below sets the initial requests,\n * otherwise the callback will set requests, and they will immediately be overwritten\n * afterwards\n */\n window.setTimeout(() => {\n onSuccess(response.data);\n }, 0);\n }\n \n return request;\n }\n\n /**\n * On first load we either only show the top request, and fundamentally have infinite scrolling\n * OR\n * We gave a request in either direction from the point in time, and then set the request to scroll\n * to being the second request.\n */\n React.useEffect(() => {\n let parsedDate: Date = null;\n if (!isNaN(Date.parse(date)))\n parsedDate = new Date(date);\n\n if (!parsedDate) {\n setRequest([{ request: getRequest(), current: true }]);\n return;\n }\n\n const fromRequest: RequestWrapper = {\n request: getRequest({ from: parsedDate, reverse: true }),\n reversed: true\n };\n const toRequest: RequestWrapper = { request: getRequest({ to: parsedDate }), current: true };\n \n /**\n * Similar to our request animation frame in our callback, we return \n * the request the user is jumping to, then set the request above afterwards\n */\n setRequest([toRequest]);\n window.requestAnimationFrame(() => {\n setRequest(r => [ fromRequest, ...r ]);\n });\n }, []);\n\n return { requests, isEmpty };\n};","import React from 'react';\nimport { CSSTransition } from 'react-transition-group';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { PartialFixedWidget } from 'libs/shared/components/widgets/fixed-widget';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useActivityStatus } from 'libs/shared/hooks/UseActivityStatus';\nimport { useLazyLoad } from 'libs/shared/hooks/UseLazyLoad';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Config, CurrentUser } from 'libs/shared/interfaces';\nimport { RecentActivity } from 'libs/shared/interfaces';\nimport { ContextService } from 'libs/shared/services/ContextService';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { useLiteFavourites } from 'shared/hooks/useLiteFavourites';\n\nimport { RecentActivities } from 'apps/student-feed/components/recent-activities/RecentActivities';\nimport { PartialStudentFeed } from 'apps/student-feed/components/student-feed/partial-loading/PartialStudentFeed';\nimport { StudentFeedDateFilter } from 'apps/student-feed/components/student-feed-date-filter/StudentFeedDateFilter';\nimport { StudentFeedHeader } from 'apps/student-feed/components/student-feed-header/StudentFeedHeader';\nimport { StudentFeedRequests } from 'apps/student-feed/flight-requests/StudentFeedRequests';\nimport { useGetStudentFeedDateRange } from 'apps/student-feed/hooks/useGetStudentFeedDateRange';\n\nimport { StudentFeedEmptyState } from './empty-state/StudentFeedEmptyState';\nimport { LazyFeed } from './LazyFeed';\nimport { useGetFeedRequests } from './useGetFeedRequests';\n\nimport './student-feed.scss';\n\nconst namespace = 'studentFeed.studentFeed';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst LIMIT = 10;\n\ninterface StudentFeedViewProps {\n date: string;\n}\n\nexport function StudentFeedView(props: StudentFeedViewProps): JSX.Element {\n const { date } = props;\n\n const { setFavourite, canFavourite } = useLiteFavourites(LocationContext.StudentFeed);\n const setActivityStatus = useActivityStatus(LocationContext.StudentFeed);\n\n const dateRange = useGetStudentFeedDateRange();\n\n useSetPageMetadata({ title: getPhrase('pageTitle') });\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const recentActivities = Flight.useBasicFetch<RecentActivity[]>(StudentFeedRequests.getRecentActivities());\n\n const { requests, isEmpty } = useGetFeedRequests(LIMIT, date);\n\n const [ redirected, setRedirected ] = React.useState(false);\n const { ref, inView, initialized } = useLazyLoad({ triggerOnce: false, rootMargin: '300px' });\n const showFloatingJumpTo = initialized && !inView;\n\n /**\n * This functionality allows us to scroll to the same timepoint we've already loaded into.\n * i.e. a user clicks \"This week\" scrolls away, and then clicks \"This week\" again.\n * Re-rendering the appLink won't work because our application ends up re-rendering the existing\n * component with it's existing state. - Sha\n */\n const [ scrollTo, setScrollTo ] = React.useState<string>(null);\n function scrollToCurrent(): void {\n const current = requests.find(r => r.current);\n\n if (current) {\n setScrollTo(current.request.key);\n return;\n }\n\n /**\n * If we don't have a current, it's because the user has selected a date\n * that's beyond their oldest feed item, so we just scroll to the bottom of the page\n */\n window.scrollTo(0, document.body.scrollHeight);\n }\n\n /**\n * We reset scrollTo after a render so that clicking on the same timepoint\n * yet again will still scroll to the right place\n */\n React.useLayoutEffect(() => {\n setScrollTo(null);\n });\n\n /**\n * Prevents a flicker when the logic below redirects to dashboard.\n */\n if (redirected)\n return <></>;\n\n /**\n * Redirecting students to discover if they have no videos on their feed and they've\n * page loaded into this page.\n */\n if (isEmpty && ContextService.fromPageLoad()) {\n setRedirected(true);\n Core.AppLinkHelper.trigger({\n application: AppChannels.DASHBOARD,\n action: Actions.Dashboard.HOME\n }, { replace: true });\n return <></>;\n }\n\n return (\n <div className='px-4 container-compact'>\n <div className='pb-2 border-bottom mb-3' ref={ref}>\n <StudentFeedHeader currentUser={currentUser.data} dateRange={dateRange} scrollToCurrent={scrollToCurrent} />\n </div>\n \n <div className='d-flex justify-content-center'>\n <div className='floating-jump-to'>\n <CSSTransition\n timeout={showFloatingJumpTo ? 500 : 0}\n in={showFloatingJumpTo}\n className='floating-jump-to'\n classNames={'floating-jump-to'}\n mountOnEnter\n unmountOnExit\n >\n <StudentFeedDateFilter dateRange={dateRange} floating scrollToCurrent={scrollToCurrent} />\n </CSSTransition>\n </div>\n </div>\n \n {recentActivities.data\n ? (\n <RecentActivities\n recentActivities={recentActivities.data}\n config={config.data}\n setFavourite={setFavourite}\n canFavourite={canFavourite}\n setActivityStatus={setActivityStatus}\n />\n ) : <div className='pb-3'><PartialFixedWidget hideDescription /></div>\n }\n {(!currentUser.data || !config.data) && <PartialStudentFeed items={LIMIT} />}\n {isEmpty && <StudentFeedEmptyState />}\n {requests?.map(r => (\n <LazyFeed\n key={r.request.key}\n limit={LIMIT}\n request={r.request}\n reversed={r.reversed}\n config={config.data}\n setFavourite={setFavourite}\n canFavourite={canFavourite}\n setActivityStatus={setActivityStatus}\n scrollTo={r.request.key === scrollTo}\n />\n ))}\n </div>\n );\n}","\"use client\";\n\nimport classNames from 'classnames';\nimport * as React from 'react';\nimport { useBootstrapPrefix, useBootstrapBreakpoints, useBootstrapMinBreakpoint } from './ThemeProvider';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst Row = /*#__PURE__*/React.forwardRef(({\n bsPrefix,\n className,\n // Need to define the default \"as\" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595\n as: Component = 'div',\n ...props\n}, ref) => {\n const decoratedBsPrefix = useBootstrapPrefix(bsPrefix, 'row');\n const breakpoints = useBootstrapBreakpoints();\n const minBreakpoint = useBootstrapMinBreakpoint();\n const sizePrefix = `${decoratedBsPrefix}-cols`;\n const classes = [];\n breakpoints.forEach(brkPoint => {\n const propValue = props[brkPoint];\n delete props[brkPoint];\n let cols;\n if (propValue != null && typeof propValue === 'object') {\n ({\n cols\n } = propValue);\n } else {\n cols = propValue;\n }\n const infix = brkPoint !== minBreakpoint ? `-${brkPoint}` : '';\n if (cols != null) classes.push(`${sizePrefix}${infix}-${cols}`);\n });\n return /*#__PURE__*/_jsx(Component, {\n ref: ref,\n ...props,\n className: classNames(className, decoratedBsPrefix, ...classes)\n });\n});\nRow.displayName = 'Row';\nexport default Row;","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":["ShareHelper","groupByDateShared","data","dateToObjectMapping","Object","keys","sort","reverse","reduce","acc","date","heading","concat","mapActivityStatusToCheckMarkStatus","activityStatus","mapCheckMarkStatusToActivityStatus","checkMarkStatus","Actions","props","orderedActions","actions","a","b","order","buttonActions","moreActions","forEach","button","push","className","length","map","idx","key","label","appLink","href","onClick","svgName","tooltip","showSpinner","analyticsData","analyticsOptions","openInNewTab","disabled","iconButton","title","spanHack","sortComponent","dropdownToggleClassName","actionsDropdownClassName","dropdownToggleSvgSize","fetchMore","LazyDropdownItems","style","padding","height","width","getDropdownItemClassName","actionClassName","ActionsDropdownItem","FunctionHelper","action","AppLink","SvgContainer","e","preventDefault","AnalyticsHelper","role","tabIndex","onKeyDown","ActionsDropdown","isLazy","some","lazyPlaceholder","currentGroup","dropdownToggleId","RandomHelper","type","id","size","showDivider","undefined","group","Tooltip","defaultProps","S","defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","handleHttpError","info","customErrorMap","ignoreMap","statusCode","status","errorMap","namespace","getAppLink","shareId","application","args","object","typeId","MasterType","TextHelper","name","WidgetItem","VideoThumbnail","video","textPosition","ThumbnailTextPosition","imageOptions","preload","preloadImage","setFavourite","canFavourite","setCheckMarkStatus","setActivityStatus","share","owner","Avatar","imageCdnUrl","config","initials","UserHelper","surname","imageUrl","avatar","url","dateShared","recipient","RecentActivities","recentActivities","hasRecentActivityWithOwner","find","LanguageService","contents","WidgetContents","childComponent","extraChildComponentProps","collection","leftWidgetButtonClassName","rightWidgetButtonClassName","prefetched","PartialFeedCard","PartialStudentFeed","Array","items","fill","l","i","getPhrase","normalizeEndDate","setHours","setMinutes","setSeconds","StudentFeedHelper","getPresetDateRanges","default","endDate","Date","setDate","getDate","getDay","getFullYear","getMonth","StudentFeedDateFilter","dateRange","options","Dropdown","variant","floating","Text","phrase","align","as","option","selection","currentAppLink","currentParams","params","DateHelper","ObjectHelper","replace","scrollToCurrent","onSelect","StudentFeedHeader","currentUser","givenName","ShareFeedSortType","StudentFeedRequests","getFeed","ownerId","from","to","cursor","limit","success","error","queryParams","convertDateToUTCString","utc","UrlHelper","cacheDuration","CacheDurations","formatData","DateAscending","getRecentActivities","res","activity","useGetStudentFeedDateRange","setDateRange","presetDateRanges","hasDateMatch","range","presetFrom","startDate","presetTo","r","cta","StudentFeedEmptyState","value","EmptyState","src","ImageUrls","text","FeedCardHeader","shareData","message","FeedVideoThumbnail","VideoHelper","canConsume","reasonText","BaseImage","imageType","imageClassName","location","useStudentFeedActions","useLiteFavourites","u","isArchived","isFavourited","entity","actionType","descriptor","workflowPhase","FeedVideo","getVideoActions","VideoSubText","SeriesAppLinkHelper","series","description","FeedVideoIndicator","indicator","active","DivButton","FeedVideoCollectionIndicators","getVideoIndex","videos","findIndex","v","currentVideo","currentVideoIndex","setCurrentVideoIndex","getSize","index","getInitialIndicatorState","indicators","setIndicators","oldIndex","newIndex","newActiveIndicatorIndex","activeIndicatorIndex","newIndicatorState","shiftedIndicators","indicatorState","direction","indexOfFirstStdIndicator","indexOfLastStdIndicator","shiftedIndicatorState","getShiftedIndicators","d","onSelectIndex","getExtraParams","obj","clipId","interactiveId","videoId","FeedVideoCollectionItem","contextId","context","RelatedVideosContext","SmallFeedVideoCollectionItem","FeedVideoCollectionEmptyState","getCollectionItems","MasterTypeHelper","union","FeedVideoCollection","ArrayHelper","setCurrentVideo","showExpandedVideoList","setShowExpandedVideoList","fixedWidgetControls","controlsRef","onNext","onPrevious","hideBleedingContent","hideName","hideExtendedClickableArea","lazyLoad","touchBehavior","Row","Col","xs","current","jumpToIndex","val","limitTotalItems","StudentFeed","feed","sharedObject","JUMP_ERROR_MARGIN","SINGLE_ITEM_SIZE","LazyFeed","request","reversed","scrollTo","scrollToRef","triggerOnce","rootMargin","ref","inView","scrollY","window","lastHeight","setLastHeight","boundingRect","getBoundingClientRect","requestAnimationFrame","top","offsetTop","delta","overflow","useGetFeedRequests","store","alerts","requests","setRequest","isEmpty","setIsEmpty","getRequest","pagination","cursors","next","wrapper","updated","slice","DateDescending","xhr","onError","response","getState","setTimeout","parsedDate","isNaN","parse","fromRequest","toRequest","LIMIT","StudentFeedView","useSetPageMetadata","UserRequests","ConfigRequests","redirected","setRedirected","showFloatingJumpTo","initialized","setScrollTo","document","body","scrollHeight","ContextService","CSSTransition","timeout","in","classNames","mountOnEnter","unmountOnExit","hideDescription","bsPrefix","Component","decoratedBsPrefix","breakpoints","minBreakpoint","sizePrefix","classes","brkPoint","propValue","cols","infix","displayName","EN_US","ZH_CN","Locales","register","locale","func","SEC_ARRAY","toDate","input","test","parseInt","trim","format","opts","sec","relativeDate","diff","localeFunc","agoIn","totalSec","Math","abs","floor","toString","unit"],"sourceRoot":""}
1
+ {"version":3,"file":"scripts/2469-46411b862e-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/share/utils/ShareHelper.ts","file:///app/packages/libs/shared/src/components/actions/Actions.tsx","file:///app/packages/libs/shared/src/components/actions/actions.scss","file:///app/packages/libs/shared/src/components/actions/ActionsDropdown.tsx","file:///app/packages/libs/shared/src/errors/handlers/HttpErrorHandlers.ts","file:///app/packages/projects/lite/src/apps/student-feed/components/recent-activities/recent-activities.scss","file:///app/packages/projects/lite/src/apps/student-feed/components/recent-activities/RecentActivities.tsx","file:///app/packages/projects/lite/src/apps/student-feed/components/student-feed/partial-loading/partial-student-feed.scss","file:///app/packages/projects/lite/src/apps/student-feed/components/student-feed/partial-loading/PartialStudentFeed.tsx","file:///app/packages/projects/lite/src/apps/student-feed/utils/StudentFeedHelper.ts","file:///app/packages/projects/lite/src/apps/student-feed/components/student-feed-date-filter/student-feed-date-filter.scss","file:///app/packages/projects/lite/src/apps/student-feed/components/student-feed-date-filter/StudentFeedDateFilter.tsx","file:///app/packages/projects/lite/src/apps/student-feed/components/student-feed-header/StudentFeedHeader.tsx","file:///app/packages/projects/lite/src/apps/student-feed/flight-requests/StudentFeedRequests.ts","file:///app/packages/projects/lite/src/apps/student-feed/hooks/useGetStudentFeedDateRange.ts","file:///app/packages/projects/lite/src/apps/student-feed/views/student-feed/empty-state/student-feed-empty-state.scss","file:///app/packages/projects/lite/src/apps/student-feed/views/student-feed/empty-state/StudentFeedEmptyState.tsx","file:///app/packages/projects/lite/src/apps/student-feed/components/feed-card-header/feed-card-header.scss","file:///app/packages/projects/lite/src/apps/student-feed/components/feed-card-header/FeedCardHeader.tsx","file:///app/packages/projects/lite/src/apps/student-feed/components/feed-video-thumbnail/feed-video-thumbnail.scss","file:///app/packages/projects/lite/src/apps/student-feed/components/feed-video-thumbnail/FeedVideoThumbnail.tsx","file:///app/packages/projects/lite/src/apps/student-feed/hooks/useStudentFeedActions.ts","file:///app/packages/projects/lite/src/apps/student-feed/components/feed-video/FeedVideo.tsx","file:///app/packages/projects/lite/src/apps/student-feed/components/feed-video-collection-indicators/feed-video-collection-indicators.scss","file:///app/packages/projects/lite/src/apps/student-feed/components/feed-video-collection-indicators/FeedVideoIndicator.tsx","file:///app/packages/projects/lite/src/apps/student-feed/components/feed-video-collection-indicators/FeedVideoCollectionIndicators.tsx","file:///app/packages/projects/lite/src/apps/student-feed/components/feed-video-collection-item/FeedVideoCollectionItem.tsx","file:///app/packages/projects/lite/src/apps/student-feed/components/small-feed-video-collection-item/SmallFeedVideoCollectionItem.tsx","file:///app/packages/projects/lite/src/apps/student-feed/components/feed-video-collection/empty-state/FeedVideoCollectionEmptyState.tsx","file:///app/packages/projects/lite/src/apps/student-feed/components/feed-video-collection/feed-video-collection.scss","file:///app/packages/projects/lite/src/apps/student-feed/components/feed-video-collection/FeedVideoCollection.tsx","file:///app/packages/projects/lite/src/apps/student-feed/components/student-feed/StudentFeed.tsx","file:///app/packages/projects/lite/src/apps/student-feed/views/student-feed/LazyFeed.tsx","file:///app/packages/projects/lite/src/apps/student-feed/views/student-feed/useGetFeedRequests.ts","file:///app/packages/projects/lite/src/apps/student-feed/views/student-feed/StudentFeedView.tsx","file:///app/node_modules/react-bootstrap/esm/Row.js","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 { format } from 'timeago.js';\n\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { CheckMarkStatus } from 'libs/shared/components/check-mark-button/CheckMarkButton';\nimport { ShareActivityStatus } from 'libs/shared/enums/ShareActivityStatus';\n\ninterface ObjectWithDateShared {\n dateShared: string;\n}\n\ntype GroupedByDate<T extends ObjectWithDateShared> = { [date: string]: T[] };\n\nexport const ShareHelper = {\n groupByDateShared<T extends ObjectWithDateShared>(data: T[]): GroupedByDate<T> {\n const dateToObjectMapping: GroupedByDate<T> = ArrayHelper.groupBy(data, 'dateShared');\n\n const sortedDates = Object.keys(dateToObjectMapping).sort().reverse();\n\n // Create a sorted mapping between dates and the \"ObjectWithDateShared\" objects\n return sortedDates.reduce((acc: GroupedByDate<T>, date) => {\n const heading = format(date);\n\n if (!acc[heading])\n acc[heading] = [];\n\n acc[heading] = acc[heading].concat(dateToObjectMapping[date]);\n return acc;\n }, {});\n },\n\n mapActivityStatusToCheckMarkStatus(activityStatus: ShareActivityStatus): CheckMarkStatus {\n switch (activityStatus) {\n case ShareActivityStatus.Complete:\n return CheckMarkStatus.Complete;\n case ShareActivityStatus.Incomplete:\n return CheckMarkStatus.Incomplete;\n case ShareActivityStatus.None:\n return CheckMarkStatus.None;\n }\n },\n\n mapCheckMarkStatusToActivityStatus(checkMarkStatus: CheckMarkStatus): ShareActivityStatus {\n switch (checkMarkStatus) {\n case CheckMarkStatus.Complete:\n return ShareActivityStatus.Complete;\n case CheckMarkStatus.Incomplete:\n return ShareActivityStatus.Incomplete;\n case CheckMarkStatus.None:\n return ShareActivityStatus.None;\n }\n }\n};","import * as React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { BaseObject } from 'libs/shared/interfaces';\n\nimport { ActionButton } from './ActionButton';\nimport { ActionsDropdown } from './ActionsDropdown';\n\nexport interface ActionOptions {\n order?: number;\n label?: string | (() => JSX.Element);\n appLink?: Core.AppLink;\n href?: string;\n onClick?: () => void;\n svgName?: string;\n className?: string;\n button?: boolean; // If true, a button will be rendered. Otherwise the action will be rendered in the dropdown.\n tooltip?: string;\n showSpinner?: boolean;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n disabled?: boolean;\n openInNewTab?: boolean; // Only used if appLink or href is provided\n group?: string;\n lazyPlaceholder?: boolean;\n}\n\nexport type ActionGenerator = (obj: BaseObject) => ActionOptions[];\n\ninterface ActionsProps {\n actions: ActionOptions[];\n className?: string;\n actionsDropdownClassName?: string;\n dropdownToggleSvgSize?: SvgContainerSize;\n sortComponent?: JSX.Element;\n fetchMore?: () => void;\n}\n\nexport function Actions(props: ActionsProps): JSX.Element {\n const orderedActions = React.useMemo(() => props.actions.sort((a, b) => a.order - b.order), [props.actions]);\n\n const buttonActions: ActionOptions[] = [];\n const moreActions: ActionOptions[] = [];\n\n orderedActions.forEach(a => {\n if (a.button)\n buttonActions.push(a);\n else\n moreActions.push(a);\n });\n\n let className = 'd-flex';\n\n if (props.className)\n className += ` ${props.className}`;\n\n if (!buttonActions.length && !moreActions.length)\n return <></>;\n\n return (\n <div className={className}>\n <>\n <span className='d-flex align-items-center'>\n {buttonActions.length ? buttonActions.map((a, idx) => (\n <React.Fragment key={idx}>\n {(() => {\n if (a.label) {\n const label = FunctionHelper.isFunction(a.label)\n ? a.label\n : () => <>{a.label}</>;\n \n return (\n <ActionButton\n appLink={a.appLink}\n href={a.href}\n onClick={a.onClick}\n svgName={a.svgName}\n className={a.className}\n tooltip={a.tooltip}\n showSpinner={a.showSpinner}\n analyticsData={a.analyticsData}\n analyticsOptions={a.analyticsOptions}\n openInNewTab={a.openInNewTab}\n disabled={a.disabled}\n >\n {label()}\n </ActionButton>\n );\n }\n\n const iconButton = (\n <IconButton\n appLink={a.appLink}\n href={a.href}\n onClick={a.onClick}\n svgName={a.svgName}\n className={a.className}\n analyticsData={a.analyticsData}\n analyticsOptions={a.analyticsOptions}\n openInNewTab={a.openInNewTab}\n disabled={a.disabled}\n />\n );\n\n return a.tooltip\n ? <Tooltip title={a.tooltip} spanHack>{iconButton}</Tooltip>\n : iconButton;\n })()}\n </React.Fragment>\n )) : <></>}\n {props.sortComponent && props.sortComponent}\n {moreActions.length ? (\n <ActionsDropdown\n actions={moreActions}\n dropdownToggleClassName={props.actionsDropdownClassName}\n dropdownToggleSvgSize={props.dropdownToggleSvgSize}\n fetchMore={props.fetchMore}\n />\n ) : <></>}\n </span>\n </>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"dropdownToggle\":\"UCAnJ\"};","import * as React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Core } from 'libs/common/core';\nimport { RandomHelper } from 'libs/common/react/utils/RandomHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { ActionOptions } from './Actions';\n\nimport styles from './actions.scss';\n\nfunction LazyDropdownItems(): JSX.Element {\n return (\n <>\n <div style={{ padding: '0.53125rem 1rem' }}>\n <div className='partial-loading-background' style={{ height: '1.0625rem', width: '8rem' }}></div>\n </div>\n <div style={{ padding: '0.53125rem 1rem' }}>\n <div className='partial-loading-background' style={{ height: '1.0625rem', width: '12rem' }}></div>\n </div>\n <div style={{ padding: '0.53125rem 1rem' }}>\n <div className='partial-loading-background' style={{ height: '1.0625rem', width: '11rem' }}></div>\n </div>\n <div style={{ padding: '0.53125rem 1rem' }}>\n <div className='partial-loading-background' style={{ height: '1.0625rem', width: '9rem' }}></div>\n </div>\n </>\n );\n}\n\nfunction getDropdownItemClassName(actionClassName?: string): string {\n let className = 'dropdown-item';\n\n if (actionClassName)\n className += ` ${actionClassName}`;\n\n return className;\n}\n\nexport type DropdownActionOptions = Omit<ActionOptions, 'button'>;\n\ninterface ActionsDropdownItemProps {\n action: DropdownActionOptions;\n}\n\nfunction ActionsDropdownItem(props: ActionsDropdownItemProps): React.ReactElement {\n const label = FunctionHelper.isFunction(props.action.label)\n ? props.action.label\n : () => <>{props.action.label}</>;\n\n if (props.action.appLink)\n return (\n <AppLink\n appLink={props.action.appLink}\n onClick={props.action.onClick}\n className={getDropdownItemClassName(props.action.className)}\n analyticsData={props.action.analyticsData}\n analyticsOptions={props.action.analyticsOptions}\n openInNewTab={props.action.openInNewTab}\n disabled={props.action.disabled}\n >\n {props.action.svgName && <SvgContainer svgName={props.action.svgName} className='d-inline-block svg-container me-2 align-middle' />}\n <span className='align-middle'>{label()}</span>\n </AppLink>\n );\n\n function onClick(e: React.MouseEvent | React.KeyboardEvent): void {\n e.preventDefault();\n\n if (props.action.analyticsData && props.action.analyticsOptions)\n AnalyticsHelper.logUserAction(props.action.analyticsData, props.action.analyticsOptions);\n\n if (FunctionHelper.isFunction(props.action.onClick))\n props.action.onClick();\n\n if (props.action.href)\n Core.LocationUtils.PageLoad(props.action.href, props.action.openInNewTab);\n }\n\n if (props.action.href) {\n return (\n <a\n className={getDropdownItemClassName(props.action.className)}\n onClick={onClick}\n href={props.action.href}\n >\n {props.action.svgName && <SvgContainer svgName={props.action.svgName} className='d-inline-block svg-container me-2 align-middle' />}\n <span className='align-middle'>{label()}</span>\n </a>\n );\n }\n\n return (\n <span\n className={`cursor-pointer ${getDropdownItemClassName(props.action.className)}`}\n onClick={onClick}\n role='button'\n tabIndex={0}\n onKeyDown={(e: React.KeyboardEvent) => e.key === 'Enter' && onClick(e)}\n >\n {props.action.svgName && <SvgContainer svgName={props.action.svgName} className='d-inline-block svg-container me-2' />}\n {label()}\n </span>\n );\n}\n\ninterface ActionsDropdownProps {\n actions: DropdownActionOptions[];\n className?: string;\n dropdownToggleClassName?: string;\n dropdownToggleSvgSize?: SvgContainerSize;\n fetchMore?: () => void;\n}\n\nActionsDropdown.defaultProps = {\n dropdownToggleClassName: 'btn btn-light',\n dropdownToggleSvgSize: SvgContainerSize.Small\n};\n\nexport function ActionsDropdown(props: ActionsDropdownProps): React.ReactElement {\n if (!props.actions || !props.actions.length)\n return <></>;\n\n const isLazy = props.actions.some(a => a.lazyPlaceholder);\n\n let className = 'dropdown';\n\n if (props.className)\n className += ` ${props.className}`;\n\n // Generate unique id to avoid collisions.\n const dropdownToggleId = `actions-dropdown-${RandomHelper.getRandomInt()}`;\n\n let dropdownToggleClassName = `dropdown-toggle px-0 ${styles.dropdownToggle}`;\n\n if (props.dropdownToggleClassName)\n dropdownToggleClassName += ` ${props.dropdownToggleClassName}`;\n\n let currentGroup: string;\n\n return (\n <div className={className}>\n <button\n className={dropdownToggleClassName}\n type='button'\n id={dropdownToggleId}\n data-bs-toggle='dropdown'\n data-toggle='dropdown'\n aria-haspopup='true'\n aria-expanded='false'\n onClick={isLazy ? props.fetchMore : null}\n >\n <SvgContainer svgName={cvSvgLibrary.More} size={props.dropdownToggleSvgSize} />\n </button>\n <div className='dropdown-menu dropdown-menu-end dropdown-menu-right' aria-labelledby={dropdownToggleId}>\n {isLazy ?\n <LazyDropdownItems /> :\n props.actions.map((a, idx) => {\n const showDivider = currentGroup !== undefined && currentGroup !== a.group;\n currentGroup = a.group;\n \n if (a.tooltip) {\n return (\n <React.Fragment key={idx}>\n {showDivider && <hr className='dropdown-divider' role='separator'></hr>}\n <Tooltip title={a.tooltip} spanHack>\n <ActionsDropdownItem action={a} />\n </Tooltip>\n \n </React.Fragment>\n );\n }\n \n return (\n <React.Fragment key={idx}>\n {showDivider && <hr className='dropdown-divider' role='separator'></hr>}\n <ActionsDropdownItem action={a} />\n </React.Fragment>\n );\n })\n }\n </div>\n </div>\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}\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};\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.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}","// extracted by mini-css-extract-plugin\nexport default {\"avatar\":\"y1nvt\",\"higherWidgetBtn\":\"EQjTN\"};","import React from 'react';\nimport { format } from 'timeago.js';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { ShareHelper } from 'libs/shared/apps/share/utils/ShareHelper';\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { CheckMarkStatus } from 'libs/shared/components/check-mark-button/CheckMarkButton';\nimport { VideoThumbnail } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { FixedWidget } from 'libs/shared/components/widgets/fixed-widget';\nimport { FixedWidgetItemProps } from 'libs/shared/components/widgets/items/FixedWidgetItemProps';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ThumbnailTextPosition } from 'libs/shared/enums/ThumbnailTextPosition';\nimport { WidgetContents } from 'libs/shared/enums/WidgetContents';\nimport { CanFavouriteFunc, Config, FavouriteFunc, SetActivityStatusFunc, VideoTypes, WidgetType } from 'libs/shared/interfaces';\nimport { RecentActivity } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport styles from './recent-activities.scss';\n\nconst namespace = 'studentFeed.recentActivities';\n\nconst getAppLink = (data: RecentActivity<VideoTypes>) => {\n if (data.shareId) {\n return {\n application: AppChannels.SHARE,\n action: Actions.Share.VIEW_SHARE_LINK,\n args: [data.shareId]\n };\n }\n\n switch (data.object?.typeId) {\n case MasterType.Video: {\n return {\n application: AppChannels.VIDEOS,\n action: Actions.Videos.PLAY_VIDEO,\n args: [ data.object.id, TextHelper.slugify(data.object.name) ]\n };\n }\n\n case MasterType.Clip: {\n return {\n application: AppChannels.CLIPS,\n action: Actions.Clips.PLAY_CLIP,\n args: [ data.object.id, TextHelper.slugify(data.object.name) ]\n };\n }\n\n case MasterType.Interactive: {\n return {\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.VIEW_INTERACTIVE,\n args: [ data.object.id, TextHelper.slugify(data.object.name) ]\n };\n }\n\n default:\n return null;\n }\n};\n\ntype WidgetItemProps = FixedWidgetItemProps<RecentActivity<VideoTypes>> & {\n config: Config;\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n setActivityStatus: SetActivityStatusFunc;\n};\n\nfunction WidgetItem(props: WidgetItemProps): JSX.Element {\n return (\n <div className={`p-1 flex-shrink-0 position-relative col-6 col-sm-4 col-md-3`}>\n <VideoThumbnail\n video={props.data.object}\n type='static'\n appLink={getAppLink(props.data)}\n textPosition={ThumbnailTextPosition.Overlay}\n imageOptions={{ size: ImageSize.Medium }}\n preload={props.preloadImage}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n // Disabling activity status for performance reasons (28/2/24) - Sha\n // checkMarkStatus={ShareHelper.mapActivityStatusToCheckMarkStatus(props.data.share?.activityStatus)}\n checkMarkStatus={CheckMarkStatus.None}\n setCheckMarkStatus={status => {\n return props.setActivityStatus(\n props.data.shareId,\n props.data.object,\n ShareHelper.mapCheckMarkStatusToActivityStatus(status)\n );\n }}\n />\n\n {!!props.data.share?.owner?.id && (\n <div className='d-flex align-items-center mt-1'>\n <div className={`${styles.avatar} me-1 flex-shrink-0`}>\n <Avatar\n imageCdnUrl={props.config.imageCdnUrl}\n initials={UserHelper.getInitials(props.data.share.owner.name, props.data.share.owner.surname)}\n imageUrl={props.data.share.owner.avatar?.url}\n />\n </div>\n <div className='d-flex flex-column'>\n <h3 className='font-size-normal mb-0'>{UserHelper.getDisplayName(props.data.share.owner)}</h3>\n <small>\n {format(props.data.share.dateShared)}\n {!!props.data.share.recipient && props.data.share.recipient?.typeId !== MasterType.User && (\n <> &bull; {props.data.share.recipient.name}</>\n )}\n </small>\n </div>\n </div>\n )}\n </div>\n );\n}\n\ninterface RecentActivitiesProps {\n recentActivities: RecentActivity<VideoTypes>[];\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n setActivityStatus: SetActivityStatusFunc;\n config: Config;\n}\n\nexport function RecentActivities(props: RecentActivitiesProps): JSX.Element {\n if (!props.recentActivities)\n return <></>;\n\n const hasRecentActivityWithOwner = !!props.recentActivities.find(a => !!a.share?.owner?.id);\n\n return (\n <div className='pb-3'>\n <FixedWidget<FixedWidgetItemProps<RecentActivity<VideoTypes>>>\n name={LanguageService.getPhrase(namespace, 'continueActivity')}\n type={WidgetType.Row}\n contents={WidgetContents.RecentActivities}\n childComponent={WidgetItem}\n extraChildComponentProps={{\n config: props.config,\n setFavourite: props.setFavourite,\n canFavourite: props.canFavourite,\n setActivityStatus: props.setActivityStatus\n }}\n collection={props.recentActivities}\n leftWidgetButtonClassName={hasRecentActivityWithOwner ? styles.higherWidgetBtn : ''}\n rightWidgetButtonClassName={hasRecentActivityWithOwner ? styles.higherWidgetBtn : ''}\n prefetched\n />\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"partialAvatar\":\"kgqoG\",\"partialName\":\"yctHY\",\"partialDateShared\":\"Vno44\",\"partialThumbnail\":\"OIIaa\",\"partialAction\":\"acv6h\",\"partialSeries\":\"S2Srj\",\"partialTitle\":\"fkwl5\",\"partialDescription\":\"Nim0N\"};","import React from 'react';\n\nimport styles from './partial-student-feed.scss';\n\n/**\n * If you change this component in a way that changes it height,\n * please also update the SINGLE_ITEM_SIZE in <LazyFeed />\n */\nfunction PartialFeedCard(): JSX.Element {\n return (\n <div className='pb-4'>\n <div className='mb-2'>\n <div className='d-flex align-items-center'>\n <div className={`${styles.partialAvatar} me-2 rounded-circle partial-loading-background`} />\n <div className='d-flex flex-column'>\n <div className={`partial-loading-background mb-1 ${styles.partialName}`} />\n <div className={`partial-loading-background ${styles.partialDateShared}`} />\n </div>\n </div>\n </div>\n\n <div className={`partial-loading-background rounded ${styles.partialThumbnail}`} />\n\n <div className='d-flex align-items-center my-1'>\n <div className={`partial-loading-background me-1 ${styles.partialAction}`} />\n <div className={`partial-loading-background ms-1 ${styles.partialAction}`} />\n </div>\n\n <div className={`partial-loading-background mb-1 ${styles.partialSeries}`} />\n\n <div className={`partial-loading-background mb-1 ${styles.partialTitle}`} />\n\n <div className={`partial-loading-background mt-1 ${styles.partialDescription}`} />\n </div>\n );\n}\n\ninterface PartialStudentFeedProps {\n items: number;\n}\n\nexport function PartialStudentFeed(props: PartialStudentFeedProps): JSX.Element {\n return (\n <>\n {new Array(props.items).fill(null).map((l, i) => <PartialFeedCard key={i} />)}\n </>\n );\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { DateRange } from 'libs/shared/interfaces';\n\nconst namespace = 'studentFeed.utils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\n// Sets the end date hours, minutes, and seconds to the very last second of that date\nfunction normalizeEndDate(date: Date): Date {\n date.setHours(23);\n date.setMinutes(59);\n date.setSeconds(59);\n\n return date;\n}\n\nfunction getLastWeekEndDate(): Date {\n const date = new Date();\n\n // Converts today's date to the friday of last week\n date.setDate(date.getDate() + 5 - 7 - (date.getDay() || 7));\n\n return normalizeEndDate(date);\n}\n\nfunction getLastMonthEndDate(): Date {\n const localDate = new Date(new Date().getFullYear(), new Date().getMonth(), 0);\n return normalizeEndDate(localDate);\n}\n\nexport const StudentFeedHelper = {\n getPresetDateRanges(): DateRange[] {\n return [\n {\n name: getPhrase('mostRecent'),\n default: true\n },\n {\n name: getPhrase('lastWeek'),\n endDate: getLastWeekEndDate()\n },\n {\n name: getPhrase('lastMonth'),\n endDate: getLastMonthEndDate()\n }\n ];\n }\n};","// extracted by mini-css-extract-plugin\nexport default {\"dropdownDescription\":\"wmk99\"};","import React from 'react';\nimport { Dropdown } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { DateRange } from 'libs/shared/interfaces';\n\nimport { StudentFeedHelper } from 'apps/student-feed/utils/StudentFeedHelper';\n\nimport styles from './student-feed-date-filter.scss';\n\nconst namespace = 'studentFeed.studentFeedDateFilter';\n\ninterface StudentFeedDateFilterProps {\n dateRange: DateRange;\n floating?: boolean;\n scrollToCurrent: () => void;\n}\n\nexport function StudentFeedDateFilter(props: StudentFeedDateFilterProps): JSX.Element {\n if (!props.dateRange)\n return <></>;\n\n const options = StudentFeedHelper.getPresetDateRanges();\n\n function onSelect(selection: DateRange): void {\n const currentAppLink = Core.AppLinkHelper.getCurrentAppLink();\n\n const currentParams = (currentAppLink.params || {}) as HashObject;\n\n const date = DateHelper.format(selection.endDate, 'YYYY-MM-DD');\n\n if (currentParams.date === date) {\n props.scrollToCurrent();\n return;\n }\n\n const params = ObjectHelper.omit(currentParams, ['date']);\n\n if (selection.endDate) params.date = DateHelper.format(selection.endDate, 'YYYY-MM-DD');\n\n Core.AppLinkHelper.trigger({\n ...currentAppLink,\n params\n }, { replace: true });\n }\n\n return (\n <Dropdown>\n <Dropdown.Toggle\n id='student-feed-date-filter'\n variant='outline-dark'\n className={props.floating ? 'rounded-pill px-3' : ''}\n size={props.floating ? 'lg' : undefined}\n >\n <Text namespace={namespace} phrase='jumpTo' />\n </Dropdown.Toggle>\n <Dropdown.Menu className={props.floating ? 'w-100' : ''} align='end'>\n <Dropdown.Item as='div' className={styles.dropdownDescription}>\n <Text namespace={namespace} phrase='jumpTo' />...\n </Dropdown.Item>\n {options.map(option => (\n <Dropdown.Item\n key={option.name}\n onClick={() => onSelect(option)}\n >\n {option.name}\n </Dropdown.Item>\n ))}\n </Dropdown.Menu>\n </Dropdown>\n );\n}","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { CurrentUser, DateRange } from 'libs/shared/interfaces';\n\nimport { StudentFeedDateFilter } from 'apps/student-feed/components/student-feed-date-filter/StudentFeedDateFilter';\n\nconst namespace = 'studentFeed.studentFeedHeader';\n\ninterface StudentFeedHeaderProps {\n currentUser: CurrentUser;\n dateRange: DateRange;\n scrollToCurrent: () => void;\n}\n\nexport function StudentFeedHeader(props: StudentFeedHeaderProps): JSX.Element {\n return (\n <div className='d-flex justify-content-between align-items-center'>\n <h1 className='h2'>\n <Text namespace={namespace} phrase='hello' options={{ name: props.currentUser.givenName }} />\n </h1>\n\n <StudentFeedDateFilter\n dateRange={props.dateRange}\n scrollToCurrent={props.scrollToCurrent}\n />\n </div>\n );\n}","import { Xhr } from 'libs/common/backbone/interfaces';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { SharedWithMeCollection } from 'libs/shared/apps/share/interfaces/responses/SharedWithMeResponse';\nimport { CacheDurations } from 'libs/shared/constants/CacheDurations';\nimport { SharedWithStatements } from 'libs/shared/constants/WithStatements';\nimport { RecentActivity } from 'libs/shared/interfaces';\n\nexport enum ShareFeedSortType {\n DateAscending = 0,\n DateDescending = 1\n}\n\nexport const StudentFeedRequests = {\n getFeed(options: {\n ownerId?: string;\n from?: Date;\n to?: Date;\n cursor?: string;\n limit?: number;\n sort?: ShareFeedSortType;\n success?: (feed: SharedWithMeCollection) => void;\n error?: (xhr: Xhr) => void;\n }): Flight.Request {\n const { ownerId, from, to, cursor, limit, sort, success, error } = options;\n\n const queryParams: HashObject = {};\n\n const convertDateToUTCString = (date: Date) => {\n const utc = DateHelper.convertDateToUTC(date);\n return DateHelper.format(utc, 'YYYY-MM-DDTHH:mm:ss');\n };\n\n if (cursor) queryParams.cursor = cursor;\n if (ownerId) queryParams.ownerId = ownerId;\n if (from) queryParams.from = convertDateToUTCString(from);\n if (to) queryParams.to = convertDateToUTCString(to);\n if (limit) queryParams.limit = limit;\n if (sort !== undefined) queryParams.sort = sort;\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/users/me/feed', queryParams),\n key: `feed:${queryParams.ownerId}:${queryParams.from}:${queryParams.to}:${queryParams.cursor}:${queryParams.sort}:${queryParams.limit}`,\n cacheDuration: CacheDurations.SHORT,\n success,\n error,\n formatData: (data: SharedWithMeCollection) => {\n if (queryParams.sort === ShareFeedSortType.DateAscending)\n data.data.reverse();\n return data;\n }\n };\n },\n\n getRecentActivities(): Flight.Request {\n const url = UrlHelper.urlBuilder('{gateway}/v1/users/me/recent-activities', {\n 'query.video': SharedWithStatements.VIDEO_COLLECTION,\n 'query.interactive': SharedWithStatements.INTERACTIVE_COLLECTION,\n 'query.clip': SharedWithStatements.CLIP_COLLECTION\n });\n\n return {\n url,\n key: 'recent:share:activities',\n cacheDuration: CacheDurations.SHORT,\n formatData: (res: RecentActivity[]) => {\n return res.map(activity => {\n // To normalize this in the flight store, we need to attach some form of ID\n activity.id = `${activity.shareId}:${activity.object.id}`;\n\n if (!activity.share)\n return activity;\n\n /**\n * Add the activity status to the actual share object, as this\n * object gets updated in the flight store when the activity status is modified\n */\n activity.share.activityStatus = activity.activityStatus;\n\n return activity;\n });\n }\n };\n }\n};","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { DateRange } from 'libs/shared/interfaces';\n\nimport { StudentFeedHelper } from 'apps/student-feed/utils/StudentFeedHelper';\n\nexport const useGetStudentFeedDateRange = (): DateRange => {\n const [ dateRange, setDateRange ] = React.useState<DateRange>(null);\n\n const appLink = Core.AppLinkHelper.getCurrentAppLink();\n const queryParams = (appLink.params || {}) as HashObject;\n\n const presetDateRanges = StudentFeedHelper.getPresetDateRanges();\n\n React.useEffect(() => {\n // No date range params is valid. This will default to \"All time\"\n if (!queryParams.from && !queryParams.to) {\n setDateRange(presetDateRanges.find(r => r.default));\n return;\n }\n\n let hasDateMatch = false;\n\n // Find a preset date range that matches the current params. If none is found, the range is invalid.\n presetDateRanges.forEach(range => {\n if (hasDateMatch)\n return;\n\n const presetFrom = range.startDate && DateHelper.format(range.startDate, 'YYYY-MM-DD');\n const presetTo = range.endDate && DateHelper.format(range.endDate, 'YYYY-MM-DD');\n\n if (presetFrom && presetFrom !== queryParams.from)\n return;\n\n if (presetTo && presetTo !== queryParams.to)\n return;\n\n if (!presetTo && !presetFrom)\n return;\n\n hasDateMatch = true;\n setDateRange(range);\n });\n\n if (hasDateMatch)\n return;\n\n Core.AppLinkHelper.trigger({\n ...appLink,\n params: ObjectHelper.omit(queryParams, [ 'from', 'to' ])\n }, { replace: true });\n }, [ queryParams.from, queryParams.to ]);\n\n return dateRange;\n};","// extracted by mini-css-extract-plugin\nexport default {\"image\":\"ohAxN\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport styles from './student-feed-empty-state.scss';\n\nconst namespace = 'studentFeed.emptyState';\n\nconst cta = {\n application: AppChannels.DASHBOARD,\n action: Actions.Dashboard.HOME\n};\n\nexport function StudentFeedEmptyState(): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState className='pt-3'>\n <EmptyState.Image src={ImageUrls.EmptyStates.STUDENT_FEED} className={styles.image} size='small'/>\n\n <EmptyState.Heading className='h3 d-flex align-items-center justify-content-center'>\n <Text phrase='emptyStateHeading' />\n </EmptyState.Heading>\n\n <EmptyState.Info><Text phrase='emptyStateInfo' /></EmptyState.Info>\n\n <EmptyState.Cta appLink={cta} text={LanguageService.getPhrase(namespace, 'cta')} />\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"avatar\":\"QEQhk\"};","import React from 'react';\nimport { format } from 'timeago.js';\n\nimport { SharedWithMeResponse } from 'libs/shared/apps/share/interfaces/responses/SharedWithMeResponse';\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { Config } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport styles from './feed-card-header.scss';\n\ninterface FeedCardHeaderProps {\n config: Config;\n shareData: SharedWithMeResponse;\n}\n\nexport function FeedCardHeader(props: FeedCardHeaderProps): JSX.Element {\n return (\n <>\n <div className='d-flex align-items-center'>\n <div className={`${styles.avatar} me-2`}>\n <Avatar\n imageCdnUrl={props.config.imageCdnUrl}\n initials={UserHelper.getInitials(props.shareData.owner.name, props.shareData.owner.surname)}\n imageUrl={props.shareData.owner.avatar?.url}\n />\n </div>\n <div className='d-flex flex-column'>\n <h2 className='h6 mb-0'>{UserHelper.getDisplayName(props.shareData.owner)}</h2>\n <div>{format(props.shareData.dateShared)}</div>\n </div>\n </div>\n\n {!!props.shareData.message && (\n <p className='mt-1 mb-0 fw-semibold'>{props.shareData.message}</p>\n )}\n </>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"imageClass\":\"Qig1U\",\"fallbackText\":\"Bt4GN\"};","import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { SharedWithMeResponse } from 'libs/shared/apps/share/interfaces/responses/SharedWithMeResponse';\nimport { ShareHelper } from 'libs/shared/apps/share/utils/ShareHelper';\nimport { CheckMarkStatus } from 'libs/shared/components/check-mark-button/CheckMarkButton';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoThumbnail } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { ImageSize, ImageType } from 'libs/shared/enums/Images';\nimport { ThumbnailTextPosition } from 'libs/shared/enums/ThumbnailTextPosition';\nimport { CanFavouriteFunc, FavouriteFunc, SetActivityStatusFunc, VideoTypes } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nimport styles from './feed-video-thumbnail.scss';\n\nconst namespace = 'studentFeed.feedVideoThumbnail';\n\ninterface FeedVideoThumbnailProps {\n video: VideoTypes;\n appLink: Core.AppLink;\n shareData: SharedWithMeResponse<VideoTypes>;\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n setActivityStatus: SetActivityStatusFunc;\n}\n\nexport function FeedVideoThumbnail(props: FeedVideoThumbnailProps): JSX.Element {\n const { canConsume } = VideoHelper.getCanBeConsumed(props.video);\n\n if (!canConsume) {\n const reasonText = VideoHelper.getPrivacyReasoning(props.video);\n\n return (\n <BaseImage\n data={ImageUrls.Fallbacks.VIDEO_UNAVAILABLE_STUDENT_FEED}\n className='border rounded'\n imageType={ImageType.Thumbnails}\n imageClassName={`${styles.imageClass} w-25 h-25`}\n >\n <div className={styles.fallbackText}>\n <h3 className='h4'>{reasonText}</h3>\n <p><Text namespace={namespace} phrase='unavailableDescription' /></p>\n </div>\n </BaseImage>\n );\n }\n\n return (\n <VideoThumbnail\n video={props.video}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n setCheckMarkStatus={status => {\n return props.setActivityStatus(\n props.shareData.id,\n props.video,\n ShareHelper.mapCheckMarkStatusToActivityStatus(status)\n );\n }}\n // Disabling activity status for performance reasons (28/2/24) - Sha\n // checkMarkStatus={ShareHelper.mapActivityStatusToCheckMarkStatus(props.shareData.activityStatus)}\n checkMarkStatus={CheckMarkStatus.None}\n type='static'\n textPosition={ThumbnailTextPosition.Independent}\n imageOptions={{ size: ImageSize.Large }}\n analyticsOptions={{\n location: LocationContext.StudentFeed\n }}\n appLink={props.appLink}\n preload\n />\n );\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AssocDescriptor, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { FavouriteHelper } from 'libs/shared/utils/FavouriteHelpers';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { useLiteFavourites } from 'shared/hooks/useLiteFavourites';\n\nconst namespace = 'studentFeed.hooks';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function useStudentFeedActions() {\n const { setFavourite } = useLiteFavourites(LocationContext.StudentFeed);\n\n return (video: VideoTypes): ActionOptions[] => {\n const { canConsume } = VideoHelper.getCanBeConsumed(video);\n const isArchived = VideoHelper.isVideoTypeArchived(video);\n\n if (!canConsume || isArchived)\n return [];\n \n const isFavourited = FavouriteHelper.isFavouritedByCurrentUser(video);\n\n\n return [{\n svgName: isFavourited ? cvSvgLibrary.Heart : cvSvgLibrary.HeartOutline,\n order: 0,\n tooltip: getPhrase('favourite'),\n onClick: () => setFavourite(video, !isFavourited),\n button: true,\n className: 'btn btn-link ' + (isFavourited ? 'text-danger' : 'text-link')\n }, {\n order: 10,\n svgName: cvSvgLibrary.AddToPlaylists,\n tooltip: getPhrase('addToPlaylist'),\n className: 'btn btn-link text-link',\n button: true,\n appLink: {\n application: AppChannels.PLAYLISTS,\n action: Actions.Playlists.ADD_TO_PLAYLIST,\n args: [video.id]\n },\n analyticsOptions: {\n entity: VideoHelper.getAnalyticsEntity(video),\n location: LocationContext.StudentFeed,\n actionType: UserAction.Associate,\n descriptor: AssocDescriptor.Playlist,\n workflowPhase: WorkflowPhase.Start\n },\n analyticsData: VideoHelper.getAnalyticsData(video)\n }];\n };\n}","import React from 'react';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { SharedWithMeResponse } from 'libs/shared/apps/share/interfaces/responses/SharedWithMeResponse';\nimport { Actions as ActionsComponent } from 'libs/shared/components/actions/Actions';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { VideoSubText } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { CanFavouriteFunc, Config, FavouriteFunc, SetActivityStatusFunc, VideoTypes } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { SeriesAppLinkHelper } from 'apps/series/SeriesAppLinkHelper';\nimport { FeedCardHeader } from 'apps/student-feed/components/feed-card-header/FeedCardHeader';\nimport { FeedVideoThumbnail } from 'apps/student-feed/components/feed-video-thumbnail/FeedVideoThumbnail';\nimport { useStudentFeedActions } from 'apps/student-feed/hooks/useStudentFeedActions';\n\nconst getAppLink = (shareId: string) => ({\n application: AppChannels.SHARE,\n action: Actions.Share.VIEW_SHARE_LINK,\n args: [shareId]\n});\n\ninterface FeedVideoProps {\n data: SharedWithMeResponse<VideoTypes>;\n config: Config;\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n setActivityStatus: SetActivityStatusFunc;\n}\n\nexport function FeedVideo(props: FeedVideoProps): JSX.Element {\n const { object } = props.data;\n\n const getVideoActions = useStudentFeedActions();\n\n const { canConsume } = VideoHelper.getCanBeConsumed(object);\n\n return (\n <div className='pb-4'>\n <div className='pb-2'>\n <FeedCardHeader config={props.config} shareData={props.data} />\n </div>\n\n <FeedVideoThumbnail\n video={props.data.object}\n appLink={getAppLink(props.data.id)}\n shareData={props.data}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n setActivityStatus={props.setActivityStatus}\n />\n\n <ActionsComponent actions={canConsume ? getVideoActions(object) : []} />\n\n {VideoHelper.isVideo(object) && (\n <VideoSubText\n type='series'\n video={object}\n appLink={SeriesAppLinkHelper.getSeriesAppLink(object.series)}\n analyticsOptions={{\n location: LocationContext.StudentFeed\n }}\n className={canConsume ? '' : 'mt-2'}\n />\n )}\n\n <div>\n <AppLink className='d-inline-block' appLink={canConsume ? getAppLink(props.data.id) : null}>\n <h3 className='h4 mb-0'>{object.name}</h3>\n </AppLink>\n </div>\n\n {!!object.description && (\n <p className='clamp-2 mb-0 mt-1'>{object.description}</p>\n )}\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"circle\":\"BJPA7\",\"active\":\"YuQnu\",\"sm\":\"wI7Zf\",\"xs\":\"KkKSG\"};","import React from 'react';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\n\nimport { Indicator } from './FeedVideoCollectionIndicators';\n\nimport styles from './feed-video-collection-indicators.scss';\n\ninterface FeedVideoIndicatorProps {\n indicator: Indicator;\n onClick: () => void;\n}\n\nexport function FeedVideoIndicator({ indicator, onClick }: FeedVideoIndicatorProps): JSX.Element {\n let className = styles.circle;\n\n if (indicator.active) className += ' ' + styles.active;\n\n if (indicator.size === 'sm') className += ' ' + styles.sm;\n if (indicator.size === 'xs') className += ' ' + styles.xs;\n if (indicator.size === 'invisible') className += ' d-none';\n\n return <DivButton className={className} onClick={onClick} />;\n}","import React from 'react';\n\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { Video } from 'libs/shared/interfaces';\n\nimport { FeedVideoIndicator } from './FeedVideoIndicator';\n\ntype IndicatorSize = 'std' | 'sm' | 'xs' | 'invisible';\n\nexport interface Indicator {\n size: IndicatorSize;\n active: boolean;\n}\n\nfunction getInitialIndicatorState(props: FeedVideoCollectionIndicatorsProps): Indicator[] {\n const currentVideoIndex = props.videos.findIndex(v => v.id === props.currentVideo.id);\n\n const getSize = (index: number): IndicatorSize => {\n if (index < 5)\n return 'std';\n\n if (index === 5)\n return 'sm';\n\n if (index === 6)\n return 'xs';\n\n return 'invisible';\n };\n\n return props.videos.map((v, index) => {\n return {\n active: currentVideoIndex === index,\n size: getSize(index)\n };\n });\n}\n\ninterface FeedVideoCollectionIndicatorsProps {\n videos: Video[];\n currentVideo: Video;\n onSelectIndex: (index: number) => void;\n}\n\nexport function FeedVideoCollectionIndicators(props: FeedVideoCollectionIndicatorsProps): JSX.Element {\n const getVideoIndex = (video: Video) => props.videos.findIndex(v => v.id === video.id);\n\n const [ currentVideoIndex, setCurrentVideoIndex ] = React.useState(getVideoIndex(props.currentVideo));\n const [ indicators, setIndicators ] = React.useState<Indicator[]>(getInitialIndicatorState(props));\n\n React.useEffect(onChangeCurrentVideo, [props.currentVideo?.id]);\n \n const activeIndicatorIndex = indicators.findIndex(d => d.active);\n\n function onChangeCurrentVideo(): void {\n const oldIndex = currentVideoIndex;\n const newIndex = getVideoIndex(props.currentVideo);\n\n // Will be true on first load\n if (oldIndex === newIndex)\n return;\n\n const difference = newIndex - oldIndex;\n const newActiveIndicatorIndex = activeIndicatorIndex + difference;\n\n setCurrentVideoIndex(newIndex);\n\n const newIndicatorState = indicators.map((indicator, index) => {\n return {\n active: index === newActiveIndicatorIndex,\n size: indicator.size\n };\n });\n\n // Update the active indicators\n setIndicators(newIndicatorState);\n\n /**\n * If the new active indicator is not a \"std\" size (meaning it's one of the smaller looking indicators),\n * we need to \"shift\" the sizes of each indicator.\n */\n if (indicators[newActiveIndicatorIndex].size !== 'std') {\n const shiftedIndicators = getShiftedIndicators(newIndicatorState, newIndex < oldIndex ? 'left' : 'right');\n setIndicators(shiftedIndicators);\n }\n }\n\n function getShiftedIndicators(indicatorState: Indicator[], direction: 'left' | 'right'): Indicator[] {\n let indexOfFirstStdIndicator: number;\n let indexOfLastStdIndicator: number;\n\n // Find the index of the first and last \"std\" size indicators in the indicator list\n indicatorState.forEach((indicator, index) => {\n if (indicator.size === 'std' && indexOfFirstStdIndicator === undefined)\n indexOfFirstStdIndicator = index;\n\n if (indicator.size === 'std')\n indexOfLastStdIndicator = index;\n });\n\n const shiftedIndicatorState = ObjectHelper.deepClone(indicatorState);\n\n if (direction === 'left') {\n shiftedIndicatorState[indexOfFirstStdIndicator - 1] = { active: true, size: 'std' };\n shiftedIndicatorState[indexOfFirstStdIndicator - 2] = { active: false, size: 'sm' };\n shiftedIndicatorState[indexOfFirstStdIndicator - 3] = { active: false, size: 'xs' };\n shiftedIndicatorState[indexOfLastStdIndicator + 2] = { active: false, size: 'invisible' };\n shiftedIndicatorState[indexOfLastStdIndicator + 1] = { active: false, size: 'xs' };\n shiftedIndicatorState[indexOfLastStdIndicator] = { active: false, size: 'sm' };\n } else {\n shiftedIndicatorState[indexOfLastStdIndicator + 1] = { active: true, size: 'std' };\n\n if (shiftedIndicatorState[indexOfLastStdIndicator + 2])\n shiftedIndicatorState[indexOfLastStdIndicator + 2] = { active: false, size: 'sm' };\n\n if (shiftedIndicatorState[indexOfLastStdIndicator + 3])\n shiftedIndicatorState[indexOfLastStdIndicator + 3] = { active: false, size: 'xs' };\n\n shiftedIndicatorState[indexOfFirstStdIndicator - 2] = { active: false, size: 'invisible' };\n shiftedIndicatorState[indexOfFirstStdIndicator - 1] = { active: false, size: 'xs' };\n shiftedIndicatorState[indexOfFirstStdIndicator] = { active: false, size: 'sm' };\n }\n\n return shiftedIndicatorState;\n }\n\n return (\n <div className='d-flex align-items-center'>\n {indicators.map((indicator, index) => (\n <FeedVideoIndicator key={index} indicator={indicator} onClick={() => props.onSelectIndex(index)} />\n ))}\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { SharedWithMeResponse } from 'libs/shared/apps/share/interfaces/responses/SharedWithMeResponse';\nimport { FixedWidgetItemProps } from 'libs/shared/components/widgets/items/FixedWidgetItemProps';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { RelatedVideosContext } from 'libs/shared/enums/RelatedVideosContext';\nimport { CanFavouriteFunc, FavouriteFunc, Series, SetActivityStatusFunc, VideoTypes } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { ShareLinkQueryParams } from 'apps/share/interfaces/ShareLinkViewProps';\nimport { FeedPlaylist } from 'apps/student-feed/interfaces/FeedPlaylist';\n\nimport { FeedVideoThumbnail } from '../feed-video-thumbnail/FeedVideoThumbnail';\n\nconst getAppLink = (shareId: string, params?: ShareLinkQueryParams) => {\n const appLink: Core.AppLink = {\n application: AppChannels.SHARE,\n action: Actions.Share.VIEW_SHARE_LINK,\n args: [shareId]\n };\n\n if (params)\n appLink.params = params;\n\n return appLink;\n};\n\nconst getExtraParams = (obj: VideoTypes) => {\n let extraParams: HashObject = {};\n\n if (VideoHelper.isClip(obj))\n extraParams = { clipId: obj.id };\n else if (VideoHelper.isInteractive(obj))\n extraParams = { interactiveId: obj.id };\n else\n extraParams = { videoId: obj.id };\n\n return extraParams;\n};\n\nexport interface FeedVideoCollectionItemProps extends FixedWidgetItemProps<VideoTypes> {\n setFavourite?: FavouriteFunc;\n canFavourite?: CanFavouriteFunc;\n shareData?: SharedWithMeResponse<FeedPlaylist | Series>;\n setActivityStatus?: SetActivityStatusFunc;\n}\n\nexport function FeedVideoCollectionItem(props: FeedVideoCollectionItemProps): JSX.Element {\n return (\n <div className='flex-shrink-0 position-relative w-100'>\n <FeedVideoThumbnail\n video={props.data}\n appLink={getAppLink(props.shareData.id, {\n ...getExtraParams(props.data),\n contextId: props.shareData.object.id,\n context: props.shareData.object.typeId === MasterType.Playlist\n ? RelatedVideosContext.Playlist\n : RelatedVideosContext.Series\n })}\n shareData={props.shareData}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n setActivityStatus={props.setActivityStatus}\n />\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { SharedWithMeResponse } from 'libs/shared/apps/share/interfaces/responses/SharedWithMeResponse';\nimport { VideoThumbnail } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { FixedWidgetItemProps } from 'libs/shared/components/widgets/items/FixedWidgetItemProps';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { RelatedVideosContext } from 'libs/shared/enums/RelatedVideosContext';\nimport { ThumbnailTextPosition } from 'libs/shared/enums/ThumbnailTextPosition';\nimport { CanFavouriteFunc, FavouriteFunc, Series, VideoTypes } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { ShareLinkQueryParams } from 'apps/share/interfaces/ShareLinkViewProps';\nimport { FeedPlaylist } from 'apps/student-feed/interfaces/FeedPlaylist';\n\nconst getAppLink = (shareId: string, params?: ShareLinkQueryParams) => {\n const appLink: Core.AppLink = {\n application: AppChannels.SHARE,\n action: Actions.Share.VIEW_SHARE_LINK,\n args: [shareId]\n };\n\n if (params)\n appLink.params = params;\n\n return appLink;\n};\n\nconst getExtraParams = (obj: VideoTypes) => {\n let extraParams: HashObject = {};\n\n if (VideoHelper.isClip(obj))\n extraParams = { clipId: obj.id };\n else if (VideoHelper.isInteractive(obj))\n extraParams = { interactiveId: obj.id };\n else\n extraParams = { videoId: obj.id };\n\n return extraParams;\n};\n\nexport interface SmallFeedVideoCollectionItemProps extends FixedWidgetItemProps<VideoTypes> {\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n shareData: SharedWithMeResponse<FeedPlaylist | Series>;\n}\n\nexport function SmallFeedVideoCollectionItem(props: SmallFeedVideoCollectionItemProps): JSX.Element {\n return (\n <div className={`p-1 flex-shrink-0 position-relative col-6 col-sm-4 col-md-3`}>\n <VideoThumbnail\n video={props.data}\n type='static'\n appLink={getAppLink(props.shareData.id, {\n ...getExtraParams(props.data),\n contextId: props.shareData.object.id,\n context: props.shareData.object.typeId === MasterType.Playlist\n ? RelatedVideosContext.Playlist\n : RelatedVideosContext.Series\n })}\n textPosition={ThumbnailTextPosition.Overlay}\n imageOptions={{ size: ImageSize.Medium }}\n preload={props.preloadImage}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n />\n </div>\n );\n}","import React from 'react';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { Playlist, Series } from 'libs/shared/interfaces';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nconst namespace = 'studentFeed.feedVideoCollectionEmptyState';\n\ninterface FeedVideoCollectionEmptyStateProps {\n data: Playlist | Series;\n}\n\nexport function FeedVideoCollectionEmptyState(props: FeedVideoCollectionEmptyStateProps): JSX.Element {\n return (\n <EmptyState className='border rounded-3 pt-5 pb-3'>\n <EmptyState.Image src={ImageUrls.EmptyStates.Playlists.PLAYLIST_VIDEOS} />\n\n <EmptyState.Heading>\n <Text namespace={namespace} phrase='heading' options={{ name: props.data.name }} />\n </EmptyState.Heading>\n\n {props.data.typeId === MasterType.Playlist && (\n <EmptyState.Info>\n <Text namespace={namespace} phrase='playlistInfo' />\n </EmptyState.Info>\n )}\n </EmptyState>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"leftWidgetButton\":\"bux3R\",\"rightWidgetButton\":\"QTLk7\"};","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { SharedWithMeResponse } from 'libs/shared/apps/share/interfaces/responses/SharedWithMeResponse';\nimport { Actions as ActionsComponent } from 'libs/shared/components/actions/Actions';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { FixedWidget } from 'libs/shared/components/widgets/fixed-widget';\nimport { FixedWidgetControls } from 'libs/shared/components/widgets/fixed-widget/FixedWidgetUtils';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { WidgetContents } from 'libs/shared/enums/WidgetContents';\nimport { CanFavouriteFunc, Config, FavouriteFunc, Series, SetActivityStatusFunc, WidgetType } from 'libs/shared/interfaces';\nimport { MasterTypeHelper } from 'libs/shared/utils/MasterTypeHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { ShareLinkQueryParams } from 'apps/share/interfaces/ShareLinkViewProps';\nimport { FeedCardHeader } from 'apps/student-feed/components/feed-card-header/FeedCardHeader';\nimport { FeedVideoCollectionIndicators } from 'apps/student-feed/components/feed-video-collection-indicators/FeedVideoCollectionIndicators';\nimport { FeedVideoCollectionItem, FeedVideoCollectionItemProps } from 'apps/student-feed/components/feed-video-collection-item/FeedVideoCollectionItem';\nimport { SmallFeedVideoCollectionItem, SmallFeedVideoCollectionItemProps } from 'apps/student-feed/components/small-feed-video-collection-item/SmallFeedVideoCollectionItem';\nimport { useStudentFeedActions } from 'apps/student-feed/hooks/useStudentFeedActions';\nimport { FeedPlaylist } from 'apps/student-feed/interfaces/FeedPlaylist';\n\nimport { FeedVideoCollectionEmptyState } from './empty-state/FeedVideoCollectionEmptyState';\n\nimport styles from './feed-video-collection.scss';\n\nconst getAppLink = (shareId: string, params?: ShareLinkQueryParams) => {\n const appLink: Core.AppLink = {\n application: AppChannels.SHARE,\n action: Actions.Share.VIEW_SHARE_LINK,\n args: [shareId]\n };\n\n if (params)\n appLink.params = params;\n\n return appLink;\n};\n\nconst getCollectionItems = (obj: FeedPlaylist | Series) => {\n if (MasterTypeHelper.isType<FeedPlaylist>(obj, MasterType.Playlist))\n return obj.union.data;\n \n return obj.videos.data;\n};\n\ninterface FeedVideoCollectionProps {\n data: SharedWithMeResponse<FeedPlaylist | Series>;\n config: Config;\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n setActivityStatus: SetActivityStatusFunc;\n}\n\nexport function FeedVideoCollection(props: FeedVideoCollectionProps): JSX.Element {\n const { object } = props.data;\n\n const items = getCollectionItems(props.data.object);\n\n const [ currentVideo, setCurrentVideo ] = React.useState(ArrayHelper.first(items));\n const [ showExpandedVideoList, setShowExpandedVideoList ] = React.useState(false);\n\n const fixedWidgetControls = React.useRef<FixedWidgetControls>(null);\n\n const getVideoActions = useStudentFeedActions();\n\n const currentVideoIndex = items.findIndex(v => v.id === currentVideo.id);\n\n function onPrevious(): void {\n setCurrentVideo(items[currentVideoIndex - 1]);\n }\n\n function onNext(): void {\n setCurrentVideo(items[currentVideoIndex + 1]);\n }\n\n function onSelectIndex(index: number): void {\n if (!fixedWidgetControls.current)\n return;\n\n setCurrentVideo(items[index]);\n fixedWidgetControls.current.jumpToIndex(index);\n }\n\n return (\n <div className='pb-4'>\n <div className='pb-2'>\n <FeedCardHeader config={props.config} shareData={props.data} />\n </div>\n\n {currentVideo ? (\n <>\n <div className='position-relative'>\n <FixedWidget<FeedVideoCollectionItemProps>\n controlsRef={fixedWidgetControls}\n type={WidgetType.Row}\n contents={WidgetContents.FeedVideos}\n childComponent={FeedVideoCollectionItem}\n extraChildComponentProps={{\n setFavourite: props.setFavourite,\n canFavourite: props.canFavourite,\n setActivityStatus: props.setActivityStatus,\n shareData: props.data\n }}\n collection={items}\n onNext={onNext}\n onPrevious={onPrevious}\n leftWidgetButtonClassName={styles.leftWidgetButton}\n rightWidgetButtonClassName={styles.rightWidgetButton}\n hideBleedingContent\n hideName\n hideExtendedClickableArea\n prefetched\n lazyLoad={false}\n touchBehavior='drag'\n />\n </div>\n\n <div className='position-relative'>\n <Row className='g-0'>\n <Col xs={2} className='d-flex align-items-center justify-content-start'>\n <ActionsComponent actions={getVideoActions(currentVideo)} />\n </Col>\n <Col xs={8} className='d-flex align-items-center justify-content-center'>\n <FeedVideoCollectionIndicators\n videos={items}\n currentVideo={currentVideo}\n onSelectIndex={onSelectIndex}\n />\n </Col>\n <Col xs={2} className='d-flex align-items-center justify-content-end'>\n <DivButton onClick={() => setShowExpandedVideoList(val => !val)}>\n <SvgContainer svgName={showExpandedVideoList ? cvSvgLibrary.ChevronUp : cvSvgLibrary.ChevronDown} />\n </DivButton>\n </Col>\n </Row>\n </div>\n\n <div>\n <AppLink className='d-inline-block' appLink={getAppLink(props.data.id)}>\n <h3 className='h4 mb-0'>{object.name}</h3>\n </AppLink>\n </div>\n {showExpandedVideoList ? (\n <div className='pt-1'>\n <FixedWidget<SmallFeedVideoCollectionItemProps>\n type={WidgetType.Row}\n contents={WidgetContents.Videos}\n childComponent={SmallFeedVideoCollectionItem}\n extraChildComponentProps={{\n setFavourite: props.setFavourite,\n canFavourite: props.canFavourite,\n shareData: props.data\n }}\n collection={items}\n appLink={getAppLink(props.data.id)}\n touchBehavior='drag'\n limitTotalItems\n hideName\n prefetched\n />\n </div>\n ) : (\n !!object.description && <p className='clamp-2 mb-0 mt-1'>{object.description}</p>\n )}\n </>\n ) : (\n <FeedVideoCollectionEmptyState data={props.data.object} />\n )}\n </div>\n );\n}","import React from 'react';\n\nimport { SharedWithMeResponse } from 'libs/shared/apps/share/interfaces/responses/SharedWithMeResponse';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { CanFavouriteFunc, Config, FavouriteFunc, Series, SetActivityStatusFunc, VideoTypes } from 'libs/shared/interfaces';\n\nimport { FeedVideo } from 'apps/student-feed/components/feed-video/FeedVideo';\nimport { FeedVideoCollection } from 'apps/student-feed/components/feed-video-collection/FeedVideoCollection';\nimport { FeedPlaylist } from 'apps/student-feed/interfaces/FeedPlaylist';\n\ninterface StudentFeedProps {\n feed: SharedWithMeResponse[];\n config: Config;\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n setActivityStatus: SetActivityStatusFunc;\n}\n\nexport function StudentFeed(props: StudentFeedProps): JSX.Element {\n return (\n <>\n {props.feed.map((sharedObject, index) => {\n switch (sharedObject.object?.typeId) {\n case MasterType.Video:\n case MasterType.Clip:\n case MasterType.Interactive:\n return (\n <FeedVideo\n key={`${sharedObject.id}:${index}`}\n data={sharedObject as SharedWithMeResponse<VideoTypes>}\n config={props.config}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n setActivityStatus={props.setActivityStatus}\n />\n );\n\n case MasterType.Playlist:\n case MasterType.Series:\n return (\n <FeedVideoCollection\n key={`${sharedObject.id}:${index}`}\n data={sharedObject as SharedWithMeResponse<FeedPlaylist | Series>}\n config={props.config}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n setActivityStatus={props.setActivityStatus}\n />\n );\n\n case MasterType.Subject:\n default:\n return <React.Fragment key={index}></React.Fragment>;\n }\n })}\n </>\n );\n}","import * as React from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { SharedWithMeCollection } from 'libs/shared/apps/share/interfaces/responses/SharedWithMeResponse';\nimport { useLazyLoad } from 'libs/shared/hooks/UseLazyLoad';\nimport { CanFavouriteFunc, Config, FavouriteFunc, SetActivityStatusFunc } from 'libs/shared/interfaces';\n\nimport { PartialStudentFeed } from 'apps/student-feed/components/student-feed/partial-loading/PartialStudentFeed';\nimport { StudentFeed } from 'apps/student-feed/components/student-feed/StudentFeed';\n\nconst JUMP_ERROR_MARGIN = 15;\n\n/**\n * This item is actually the height of one of our partial loading items.\n * See <PartialStudentFeed />\n */\nconst SINGLE_ITEM_SIZE = 635;\n\ninterface LazyFeedProps {\n request: Flight.Request;\n reversed?: boolean;\n config: Config;\n limit: number;\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n setActivityStatus: SetActivityStatusFunc;\n scrollTo: boolean;\n}\n\nexport function LazyFeed(props: LazyFeedProps): React.ReactElement {\n const { request, reversed, scrollTo } = props;\n\n const scrollToRef = React.useRef<HTMLDivElement>();\n\n // We use a margin of about 1 item.\n const { ref, inView } = useLazyLoad({ triggerOnce: false, rootMargin: SINGLE_ITEM_SIZE + 'px' });\n\n /**\n * This request is being provided by useGetFeedRequests, when this is fetched if there is paging\n * it's possible for another request to be added inside of useGetFeedRequests\n */\n const feed = Flight.useBasicFetch<SharedWithMeCollection>(inView ? request : null);\n\n const items = feed.data?.data;\n\n const scrollY = window.scrollY;\n const [ lastHeight, setLastHeight ] = React.useState<number>(SINGLE_ITEM_SIZE * props.limit);\n\n /**\n * Store initial height of element on first insertion\n * Also scroll the page if we know we're inserting this element above\n */\n React.useLayoutEffect(() => {\n const boundingRect = scrollToRef.current.getBoundingClientRect();\n\n if (reversed) {\n window.scrollTo(0, scrollY + boundingRect.height);\n } else if (scrollTo) {\n /**\n * Minus 100 is an arbitrary distanced picked to have the item appear \n * beneath the header with some buffer\n * \n * This fixes the scroll to sometimes not working, after some googling it looks like the scrollTo is interfered with by focus.\n * The moment a user clicks on the the button to go to a certain time, the button still has focus. One animation frame later\n * the element will have been removed and the focus is gone. - Sha\n *\n */\n window.requestAnimationFrame(() => {\n window.scrollTo(0, scrollY + boundingRect.top - 100);\n });\n }\n }, [scrollTo]);\n\n /**\n * If our height changes (Within a margin of error)\n * we scroll by the amount the element has changed in\n * order to prevent a visual jump\n */\n React.useLayoutEffect(() => {\n if (!lastHeight)\n return;\n \n const height = scrollToRef.current.getBoundingClientRect().height;\n setLastHeight(height);\n\n if (lastHeight < height + JUMP_ERROR_MARGIN && lastHeight > height - JUMP_ERROR_MARGIN)\n return;\n\n if (scrollToRef.current.offsetTop > scrollY)\n return;\n\n const delta = lastHeight - height;\n window.scrollTo(0, scrollY - delta);\n });\n\n return (\n <div ref={ref}>\n <div ref={scrollToRef}>\n {items?.length ?\n <StudentFeed\n feed={items}\n config={props.config}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n setActivityStatus={props.setActivityStatus}\n /> :\n // Once we have a calulated height, we use it to prevent any further\n // need to fix the scroll as the Student feed is swapped in and out\n <div style={{ height: lastHeight, overflow: 'hidden' }}>\n <PartialStudentFeed items={props.limit} />\n </div>\n }\n </div>\n </div>\n );\n}","import * as React from 'react';\nimport { useStore } from 'react-redux';\n\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { ApplicationState } from 'libs/common/react/interfaces';\n\nimport { SharedWithMeCollection } from 'libs/shared/apps/share/interfaces/responses/SharedWithMeResponse';\nimport { handleHttpError } from 'libs/shared/errors/handlers/HttpErrorHandlers';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\n\nimport { ShareFeedSortType, StudentFeedRequests } from 'apps/student-feed/flight-requests/StudentFeedRequests';\n\nconst getPhrase = LanguageService.encloseNamespace('studentFeed.studentFeed');\n\ninterface GetRequestOptions {\n from?: Date;\n to?: Date;\n cursor?: string;\n reverse?: boolean;\n}\n\ninterface RequestWrapper {\n request: Flight.Request;\n reversed?: boolean;\n current?: boolean;\n}\n\nexport const useGetFeedRequests = (limit: number, date?: string) => {\n const store = useStore<ApplicationState>();\n const alerts = useAlerts();\n const [ requests, setRequest ] = React.useState<RequestWrapper[]>([]);\n const [ isEmpty, setIsEmpty ] = React.useState(false);\n\n function onError(cursor: string, xhr: Xhr): void {\n /**\n * If there's no cursor it was an initial request that errored\n * so we go to an error page, otherwise we show an alert\n */\n if (!cursor)\n return handleHttpError(xhr.status);\n\n alerts.error(getPhrase('error'));\n }\n\n function getRequest(options: GetRequestOptions = {}): Flight.Request {\n const { from, to, cursor, reverse } = options;\n\n /**\n * This callback will continue to build out our array of requests in both directions.\n */\n let onSuccess = (feed: SharedWithMeCollection) => {\n /**\n * This ensures that the next request is only added to our array once,\n * this will prevent our request list growing larger than we want it to when items\n * expire\n */\n onSuccess = null;\n\n /**\n * If our request has no items, remove it from the request list\n * This allows up to render an empty state if there are no requests left\n */\n if (!feed.data.length) {\n setRequest(r => {\n const index = r.findIndex(r => r.request.key === request.key);\n const updated = [ ...r.slice(0, index), ...r.slice(index + 1) ];\n\n if (!updated.length)\n setIsEmpty(true);\n\n return updated;\n });\n return;\n }\n\n // If our request has no more items, do nothing we've hit the end\n if (!feed.pagination?.cursors?.next)\n return;\n\n if (!reverse) {\n const wrapper = {\n request: getRequest({ ...options, cursor: feed.pagination.cursors.next })\n };\n setRequest(r => [ ...r, wrapper ]);\n return;\n }\n\n const wrapper = {\n request: getRequest({ ...options, cursor: feed.pagination.cursors.next }),\n reversed: true\n };\n setRequest(r => [ wrapper, ...r ]);\n };\n \n const request = StudentFeedRequests.getFeed({\n from,\n to,\n cursor,\n sort: reverse ? ShareFeedSortType.DateAscending : ShareFeedSortType.DateDescending,\n limit,\n success: feed => {\n /**\n * We do a page re-paint and compensate with a scroll when data returns\n * We don't also want to add another request in immediately, which also will do\n * a re-paint and compensation scroll. So we delay adding our request in by \n * one animation frame, which allows the browser to properly handle where we want\n * out scroll position to be\n */\n window.requestAnimationFrame(() => {\n onSuccess && onSuccess(feed);\n });\n },\n error: (xhr: Xhr) => onError(cursor, xhr)\n });\n\n /**\n * We pull the request out of the store, if it already exists this means our user\n * has already accessed the feed, so we immediately build out the next request\n * and then unset the callback so it doesn't fetch when it's expired\n */\n const response = Flight.getResponse<SharedWithMeCollection>(store.getState(), request.key);\n\n if (response.data) {\n /**\n * This has to happen after the useEffect below sets the initial requests,\n * otherwise the callback will set requests, and they will immediately be overwritten\n * afterwards\n */\n window.setTimeout(() => {\n onSuccess(response.data);\n }, 0);\n }\n \n return request;\n }\n\n /**\n * On first load we either only show the top request, and fundamentally have infinite scrolling\n * OR\n * We gave a request in either direction from the point in time, and then set the request to scroll\n * to being the second request.\n */\n React.useEffect(() => {\n let parsedDate: Date = null;\n if (!isNaN(Date.parse(date)))\n parsedDate = new Date(date);\n\n if (!parsedDate) {\n setRequest([{ request: getRequest(), current: true }]);\n return;\n }\n\n const fromRequest: RequestWrapper = {\n request: getRequest({ from: parsedDate, reverse: true }),\n reversed: true\n };\n const toRequest: RequestWrapper = { request: getRequest({ to: parsedDate }), current: true };\n \n /**\n * Similar to our request animation frame in our callback, we return \n * the request the user is jumping to, then set the request above afterwards\n */\n setRequest([toRequest]);\n window.requestAnimationFrame(() => {\n setRequest(r => [ fromRequest, ...r ]);\n });\n }, []);\n\n return { requests, isEmpty };\n};","import React from 'react';\nimport { CSSTransition } from 'react-transition-group';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { PartialFixedWidget } from 'libs/shared/components/widgets/fixed-widget';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useActivityStatus } from 'libs/shared/hooks/UseActivityStatus';\nimport { useLazyLoad } from 'libs/shared/hooks/UseLazyLoad';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Config, CurrentUser } from 'libs/shared/interfaces';\nimport { RecentActivity } from 'libs/shared/interfaces';\nimport { ContextService } from 'libs/shared/services/ContextService';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { useLiteFavourites } from 'shared/hooks/useLiteFavourites';\n\nimport { RecentActivities } from 'apps/student-feed/components/recent-activities/RecentActivities';\nimport { PartialStudentFeed } from 'apps/student-feed/components/student-feed/partial-loading/PartialStudentFeed';\nimport { StudentFeedDateFilter } from 'apps/student-feed/components/student-feed-date-filter/StudentFeedDateFilter';\nimport { StudentFeedHeader } from 'apps/student-feed/components/student-feed-header/StudentFeedHeader';\nimport { StudentFeedRequests } from 'apps/student-feed/flight-requests/StudentFeedRequests';\nimport { useGetStudentFeedDateRange } from 'apps/student-feed/hooks/useGetStudentFeedDateRange';\n\nimport { StudentFeedEmptyState } from './empty-state/StudentFeedEmptyState';\nimport { LazyFeed } from './LazyFeed';\nimport { useGetFeedRequests } from './useGetFeedRequests';\n\nimport './student-feed.scss';\n\nconst namespace = 'studentFeed.studentFeed';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst LIMIT = 10;\n\ninterface StudentFeedViewProps {\n date: string;\n}\n\nexport function StudentFeedView(props: StudentFeedViewProps): JSX.Element {\n const { date } = props;\n\n const { setFavourite, canFavourite } = useLiteFavourites(LocationContext.StudentFeed);\n const setActivityStatus = useActivityStatus(LocationContext.StudentFeed);\n\n const dateRange = useGetStudentFeedDateRange();\n\n useSetPageMetadata({ title: getPhrase('pageTitle') });\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const recentActivities = Flight.useBasicFetch<RecentActivity[]>(StudentFeedRequests.getRecentActivities());\n\n const { requests, isEmpty } = useGetFeedRequests(LIMIT, date);\n\n const [ redirected, setRedirected ] = React.useState(false);\n const { ref, inView, initialized } = useLazyLoad({ triggerOnce: false, rootMargin: '300px' });\n const showFloatingJumpTo = initialized && !inView;\n\n /**\n * This functionality allows us to scroll to the same timepoint we've already loaded into.\n * i.e. a user clicks \"This week\" scrolls away, and then clicks \"This week\" again.\n * Re-rendering the appLink won't work because our application ends up re-rendering the existing\n * component with it's existing state. - Sha\n */\n const [ scrollTo, setScrollTo ] = React.useState<string>(null);\n function scrollToCurrent(): void {\n const current = requests.find(r => r.current);\n\n if (current) {\n setScrollTo(current.request.key);\n return;\n }\n\n /**\n * If we don't have a current, it's because the user has selected a date\n * that's beyond their oldest feed item, so we just scroll to the bottom of the page\n */\n window.scrollTo(0, document.body.scrollHeight);\n }\n\n /**\n * We reset scrollTo after a render so that clicking on the same timepoint\n * yet again will still scroll to the right place\n */\n React.useLayoutEffect(() => {\n setScrollTo(null);\n });\n\n /**\n * Prevents a flicker when the logic below redirects to dashboard.\n */\n if (redirected)\n return <></>;\n\n /**\n * Redirecting students to discover if they have no videos on their feed and they've\n * page loaded into this page.\n */\n if (isEmpty && ContextService.fromPageLoad()) {\n setRedirected(true);\n Core.AppLinkHelper.trigger({\n application: AppChannels.DASHBOARD,\n action: Actions.Dashboard.HOME\n }, { replace: true });\n return <></>;\n }\n\n return (\n <div className='px-4 container-compact'>\n <div className='pb-2 border-bottom mb-3' ref={ref}>\n <StudentFeedHeader currentUser={currentUser.data} dateRange={dateRange} scrollToCurrent={scrollToCurrent} />\n </div>\n \n <div className='d-flex justify-content-center'>\n <div className='floating-jump-to'>\n <CSSTransition\n timeout={showFloatingJumpTo ? 500 : 0}\n in={showFloatingJumpTo}\n className='floating-jump-to'\n classNames={'floating-jump-to'}\n mountOnEnter\n unmountOnExit\n >\n <StudentFeedDateFilter dateRange={dateRange} floating scrollToCurrent={scrollToCurrent} />\n </CSSTransition>\n </div>\n </div>\n \n {recentActivities.data\n ? (\n <RecentActivities\n recentActivities={recentActivities.data}\n config={config.data}\n setFavourite={setFavourite}\n canFavourite={canFavourite}\n setActivityStatus={setActivityStatus}\n />\n ) : <div className='pb-3'><PartialFixedWidget hideDescription /></div>\n }\n {(!currentUser.data || !config.data) && <PartialStudentFeed items={LIMIT} />}\n {isEmpty && <StudentFeedEmptyState />}\n {requests?.map(r => (\n <LazyFeed\n key={r.request.key}\n limit={LIMIT}\n request={r.request}\n reversed={r.reversed}\n config={config.data}\n setFavourite={setFavourite}\n canFavourite={canFavourite}\n setActivityStatus={setActivityStatus}\n scrollTo={r.request.key === scrollTo}\n />\n ))}\n </div>\n );\n}","\"use client\";\n\nimport classNames from 'classnames';\nimport * as React from 'react';\nimport { useBootstrapPrefix, useBootstrapBreakpoints, useBootstrapMinBreakpoint } from './ThemeProvider';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst Row = /*#__PURE__*/React.forwardRef(({\n bsPrefix,\n className,\n // Need to define the default \"as\" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595\n as: Component = 'div',\n ...props\n}, ref) => {\n const decoratedBsPrefix = useBootstrapPrefix(bsPrefix, 'row');\n const breakpoints = useBootstrapBreakpoints();\n const minBreakpoint = useBootstrapMinBreakpoint();\n const sizePrefix = `${decoratedBsPrefix}-cols`;\n const classes = [];\n breakpoints.forEach(brkPoint => {\n const propValue = props[brkPoint];\n delete props[brkPoint];\n let cols;\n if (propValue != null && typeof propValue === 'object') {\n ({\n cols\n } = propValue);\n } else {\n cols = propValue;\n }\n const infix = brkPoint !== minBreakpoint ? `-${brkPoint}` : '';\n if (cols != null) classes.push(`${sizePrefix}${infix}-${cols}`);\n });\n return /*#__PURE__*/_jsx(Component, {\n ref: ref,\n ...props,\n className: classNames(className, decoratedBsPrefix, ...classes)\n });\n});\nRow.displayName = 'Row';\nexport default Row;","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":["ShareHelper","groupByDateShared","data","dateToObjectMapping","Object","keys","sort","reverse","reduce","acc","date","heading","concat","mapActivityStatusToCheckMarkStatus","activityStatus","mapCheckMarkStatusToActivityStatus","checkMarkStatus","Actions","props","orderedActions","actions","a","b","order","buttonActions","moreActions","forEach","button","push","className","length","map","idx","key","label","appLink","href","onClick","svgName","tooltip","showSpinner","analyticsData","analyticsOptions","openInNewTab","disabled","iconButton","title","spanHack","sortComponent","dropdownToggleClassName","actionsDropdownClassName","dropdownToggleSvgSize","fetchMore","LazyDropdownItems","style","padding","height","width","getDropdownItemClassName","actionClassName","ActionsDropdownItem","FunctionHelper","action","AppLink","SvgContainer","e","preventDefault","AnalyticsHelper","role","tabIndex","onKeyDown","ActionsDropdown","isLazy","some","lazyPlaceholder","currentGroup","dropdownToggleId","RandomHelper","type","id","size","showDivider","undefined","group","Tooltip","defaultProps","S","defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","handleHttpError","info","customErrorMap","ignoreMap","statusCode","status","errorMap","namespace","getAppLink","shareId","application","args","object","typeId","MasterType","TextHelper","name","WidgetItem","VideoThumbnail","video","textPosition","ThumbnailTextPosition","imageOptions","preload","preloadImage","setFavourite","canFavourite","setCheckMarkStatus","setActivityStatus","share","owner","Avatar","imageCdnUrl","config","initials","UserHelper","surname","imageUrl","avatar","url","dateShared","recipient","RecentActivities","recentActivities","hasRecentActivityWithOwner","find","LanguageService","contents","WidgetContents","childComponent","extraChildComponentProps","collection","leftWidgetButtonClassName","rightWidgetButtonClassName","prefetched","PartialFeedCard","PartialStudentFeed","Array","items","fill","l","i","getPhrase","normalizeEndDate","setHours","setMinutes","setSeconds","StudentFeedHelper","getPresetDateRanges","default","endDate","Date","setDate","getDate","getDay","getFullYear","getMonth","StudentFeedDateFilter","dateRange","options","Dropdown","variant","floating","Text","phrase","align","as","option","selection","currentAppLink","currentParams","params","DateHelper","ObjectHelper","replace","scrollToCurrent","onSelect","StudentFeedHeader","currentUser","givenName","ShareFeedSortType","StudentFeedRequests","getFeed","ownerId","from","to","cursor","limit","success","error","queryParams","convertDateToUTCString","utc","UrlHelper","cacheDuration","CacheDurations","formatData","DateAscending","getRecentActivities","res","activity","useGetStudentFeedDateRange","setDateRange","presetDateRanges","hasDateMatch","range","presetFrom","startDate","presetTo","r","cta","StudentFeedEmptyState","value","EmptyState","src","ImageUrls","text","FeedCardHeader","shareData","message","FeedVideoThumbnail","VideoHelper","canConsume","reasonText","BaseImage","imageType","imageClassName","location","useStudentFeedActions","useLiteFavourites","u","isArchived","isFavourited","entity","actionType","descriptor","workflowPhase","FeedVideo","getVideoActions","VideoSubText","SeriesAppLinkHelper","series","description","FeedVideoIndicator","indicator","active","DivButton","FeedVideoCollectionIndicators","getVideoIndex","videos","findIndex","v","currentVideo","currentVideoIndex","setCurrentVideoIndex","getSize","index","getInitialIndicatorState","indicators","setIndicators","oldIndex","newIndex","newActiveIndicatorIndex","activeIndicatorIndex","newIndicatorState","shiftedIndicators","indicatorState","direction","indexOfFirstStdIndicator","indexOfLastStdIndicator","shiftedIndicatorState","getShiftedIndicators","d","onSelectIndex","getExtraParams","obj","clipId","interactiveId","videoId","FeedVideoCollectionItem","contextId","context","RelatedVideosContext","SmallFeedVideoCollectionItem","FeedVideoCollectionEmptyState","getCollectionItems","MasterTypeHelper","union","FeedVideoCollection","ArrayHelper","setCurrentVideo","showExpandedVideoList","setShowExpandedVideoList","fixedWidgetControls","controlsRef","onNext","onPrevious","hideBleedingContent","hideName","hideExtendedClickableArea","lazyLoad","touchBehavior","Row","Col","xs","current","jumpToIndex","val","limitTotalItems","StudentFeed","feed","sharedObject","JUMP_ERROR_MARGIN","SINGLE_ITEM_SIZE","LazyFeed","request","reversed","scrollTo","scrollToRef","triggerOnce","rootMargin","ref","inView","scrollY","window","lastHeight","setLastHeight","boundingRect","getBoundingClientRect","requestAnimationFrame","top","offsetTop","delta","overflow","useGetFeedRequests","store","alerts","requests","setRequest","isEmpty","setIsEmpty","getRequest","pagination","cursors","next","wrapper","updated","slice","DateDescending","xhr","onError","response","getState","setTimeout","parsedDate","isNaN","parse","fromRequest","toRequest","LIMIT","StudentFeedView","useSetPageMetadata","UserRequests","ConfigRequests","redirected","setRedirected","showFloatingJumpTo","initialized","setScrollTo","document","body","scrollHeight","ContextService","CSSTransition","timeout","in","classNames","mountOnEnter","unmountOnExit","hideDescription","bsPrefix","Component","decoratedBsPrefix","breakpoints","minBreakpoint","sizePrefix","classes","brkPoint","propValue","cols","infix","displayName","EN_US","ZH_CN","Locales","register","locale","func","SEC_ARRAY","toDate","input","test","parseInt","trim","format","opts","sec","relativeDate","diff","localeFunc","agoIn","totalSec","Math","abs","floor","toString","unit"],"sourceRoot":""}