@clickview/exchange 0.60.0 → 0.61.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 (192) hide show
  1. package/dist/bundles.json +1 -1
  2. package/dist/en.json +1 -1
  3. package/dist/scripts/{DQWSGmPO.chunk.js → 2GC-PPDy.chunk.js} +2 -2
  4. package/dist/scripts/{DQWSGmPO.chunk.js.map → 2GC-PPDy.chunk.js.map} +1 -1
  5. package/dist/scripts/{C_vLRfti.chunk.js → 5yUbuX8U.chunk.js} +2 -2
  6. package/dist/scripts/{C_vLRfti.chunk.js.map → 5yUbuX8U.chunk.js.map} +1 -1
  7. package/dist/scripts/{DfR8N6KN.chunk.js → B1cVJr0t.chunk.js} +2 -2
  8. package/dist/scripts/{DfR8N6KN.chunk.js.map → B1cVJr0t.chunk.js.map} +1 -1
  9. package/dist/scripts/B4AGq_K6.chunk.js +2 -0
  10. package/dist/scripts/{u96pPes-.chunk.js.map → B4AGq_K6.chunk.js.map} +1 -1
  11. package/dist/scripts/{Ej7a07_u.chunk.js → B57luw20.chunk.js} +2 -2
  12. package/dist/scripts/{Ej7a07_u.chunk.js.map → B57luw20.chunk.js.map} +1 -1
  13. package/dist/scripts/{Csq5lSfL.chunk.js → B5VX0-05.chunk.js} +2 -2
  14. package/dist/scripts/{Csq5lSfL.chunk.js.map → B5VX0-05.chunk.js.map} +1 -1
  15. package/dist/scripts/{B1FXQpYQ.chunk.js → B5yQ-o2c.chunk.js} +2 -2
  16. package/dist/scripts/{B1FXQpYQ.chunk.js.map → B5yQ-o2c.chunk.js.map} +1 -1
  17. package/dist/scripts/{CfHe4kqG.chunk.js → BAaMmtA5.chunk.js} +2 -2
  18. package/dist/scripts/{CfHe4kqG.chunk.js.map → BAaMmtA5.chunk.js.map} +1 -1
  19. package/dist/scripts/{Ien9POMb.chunk.js → BJB2pvo-.chunk.js} +2 -2
  20. package/dist/scripts/{Ien9POMb.chunk.js.map → BJB2pvo-.chunk.js.map} +1 -1
  21. package/dist/scripts/{CXQ4Otim.chunk.js → BJmQsLgH.chunk.js} +2 -2
  22. package/dist/scripts/{CXQ4Otim.chunk.js.map → BJmQsLgH.chunk.js.map} +1 -1
  23. package/dist/scripts/{zD1LoHGd.chunk.js → BKtt7r9I.chunk.js} +2 -2
  24. package/dist/scripts/{zD1LoHGd.chunk.js.map → BKtt7r9I.chunk.js.map} +1 -1
  25. package/dist/scripts/{CLS2QNAc.chunk.js → BQ7D2X0o.chunk.js} +2 -2
  26. package/dist/scripts/{CLS2QNAc.chunk.js.map → BQ7D2X0o.chunk.js.map} +1 -1
  27. package/dist/scripts/{Bv-rZ1ws.chunk.js → BQTdalXA.chunk.js} +2 -2
  28. package/dist/scripts/{Bv-rZ1ws.chunk.js.map → BQTdalXA.chunk.js.map} +1 -1
  29. package/dist/scripts/{C52tRwVm.chunk.js → BR_C7b5M.chunk.js} +2 -2
  30. package/dist/scripts/{C52tRwVm.chunk.js.map → BR_C7b5M.chunk.js.map} +1 -1
  31. package/dist/scripts/{DxRcVeDA.chunk.js → BVViiWF8.chunk.js} +2 -2
  32. package/dist/scripts/{DxRcVeDA.chunk.js.map → BVViiWF8.chunk.js.map} +1 -1
  33. package/dist/scripts/{BwA4-wPQ.chunk.js → BWoESSLv.chunk.js} +2 -2
  34. package/dist/scripts/{BwA4-wPQ.chunk.js.map → BWoESSLv.chunk.js.map} +1 -1
  35. package/dist/scripts/{DhSjZ3FD.chunk.js → BZXmaOzt.chunk.js} +2 -2
  36. package/dist/scripts/{DhSjZ3FD.chunk.js.map → BZXmaOzt.chunk.js.map} +1 -1
  37. package/dist/scripts/{CkxEvxLE.chunk.js → Bcaq2QKq.chunk.js} +2 -2
  38. package/dist/scripts/{CkxEvxLE.chunk.js.map → Bcaq2QKq.chunk.js.map} +1 -1
  39. package/dist/scripts/{BuwaCenI.chunk.js → BdMXRcT3.chunk.js} +2 -2
  40. package/dist/scripts/{BuwaCenI.chunk.js.map → BdMXRcT3.chunk.js.map} +1 -1
  41. package/dist/scripts/{C0I1ovgn.chunk.js → BlabCH8N.chunk.js} +2 -2
  42. package/dist/scripts/{C0I1ovgn.chunk.js.map → BlabCH8N.chunk.js.map} +1 -1
  43. package/dist/scripts/{2NsO29qP.chunk.js → Bo-iDjSh.chunk.js} +2 -2
  44. package/dist/scripts/{2NsO29qP.chunk.js.map → Bo-iDjSh.chunk.js.map} +1 -1
  45. package/dist/scripts/{Cjy2K1zH.chunk.js → BqRzwJ-J.chunk.js} +2 -2
  46. package/dist/scripts/{Cjy2K1zH.chunk.js.map → BqRzwJ-J.chunk.js.map} +1 -1
  47. package/dist/scripts/BrdU6Hc2.chunk.js +2 -0
  48. package/dist/scripts/{WarFtyTw.chunk.js.map → BrdU6Hc2.chunk.js.map} +1 -1
  49. package/dist/scripts/{Cca7nDsG.chunk.js → Bt07VepM.chunk.js} +2 -2
  50. package/dist/scripts/{Cca7nDsG.chunk.js.map → Bt07VepM.chunk.js.map} +1 -1
  51. package/dist/scripts/{3hd9Wq4c.chunk.js → BtbirQej.chunk.js} +2 -2
  52. package/dist/scripts/{3hd9Wq4c.chunk.js.map → BtbirQej.chunk.js.map} +1 -1
  53. package/dist/scripts/{DCLePavE.chunk.js → Byh4RoGO.chunk.js} +2 -2
  54. package/dist/scripts/{DCLePavE.chunk.js.map → Byh4RoGO.chunk.js.map} +1 -1
  55. package/dist/scripts/{DTHb9InD.chunk.js → Bz3eAWKb.chunk.js} +2 -2
  56. package/dist/scripts/{DTHb9InD.chunk.js.map → Bz3eAWKb.chunk.js.map} +1 -1
  57. package/dist/scripts/{Cu0qnVi5.chunk.js → BzzIpmJj.chunk.js} +2 -2
  58. package/dist/scripts/{Cu0qnVi5.chunk.js.map → BzzIpmJj.chunk.js.map} +1 -1
  59. package/dist/scripts/{C7un82WP.chunk.js → C3LmB7vs.chunk.js} +2 -2
  60. package/dist/scripts/{C7un82WP.chunk.js.map → C3LmB7vs.chunk.js.map} +1 -1
  61. package/dist/scripts/C42aTLRq.chunk.js +2 -0
  62. package/dist/scripts/{C2TRBWPd.chunk.js.map → C42aTLRq.chunk.js.map} +1 -1
  63. package/dist/scripts/C4BzCmwg.chunk.js +2 -0
  64. package/dist/scripts/{BwdSbre5.chunk.js.map → C4BzCmwg.chunk.js.map} +1 -1
  65. package/dist/scripts/{B5mlcFJg.chunk.js → CFRAo5Sd.chunk.js} +2 -2
  66. package/dist/scripts/{B5mlcFJg.chunk.js.map → CFRAo5Sd.chunk.js.map} +1 -1
  67. package/dist/scripts/{C-Dd1wEr.chunk.js → CKGW3m2X.chunk.js} +3 -3
  68. package/dist/scripts/{C-Dd1wEr.chunk.js.map → CKGW3m2X.chunk.js.map} +1 -1
  69. package/dist/scripts/{D0Tp9Z65.chunk.js → CL6ZWANl.chunk.js} +2 -2
  70. package/dist/scripts/{D0Tp9Z65.chunk.js.map → CL6ZWANl.chunk.js.map} +1 -1
  71. package/dist/scripts/CLgSNdF3.chunk.js +2 -0
  72. package/dist/scripts/{BxcHYWuR.chunk.js.map → CLgSNdF3.chunk.js.map} +1 -1
  73. package/dist/scripts/{XOHWRN-E.chunk.js → CMfzHyZ-.chunk.js} +2 -2
  74. package/dist/scripts/{XOHWRN-E.chunk.js.map → CMfzHyZ-.chunk.js.map} +1 -1
  75. package/dist/scripts/{Vk3DDGeP.chunk.js → CPvN_Soe.chunk.js} +2 -2
  76. package/dist/scripts/{Vk3DDGeP.chunk.js.map → CPvN_Soe.chunk.js.map} +1 -1
  77. package/dist/scripts/{LLCJ2-mR.chunk.js → CYISpSfn.chunk.js} +2 -2
  78. package/dist/scripts/{LLCJ2-mR.chunk.js.map → CYISpSfn.chunk.js.map} +1 -1
  79. package/dist/scripts/{DfcdtoXp.chunk.js → CZQS_NPT.chunk.js} +2 -2
  80. package/dist/scripts/{DfcdtoXp.chunk.js.map → CZQS_NPT.chunk.js.map} +1 -1
  81. package/dist/scripts/{DeW1mjFb.chunk.js → CcHhPXQX.chunk.js} +2 -2
  82. package/dist/scripts/{DeW1mjFb.chunk.js.map → CcHhPXQX.chunk.js.map} +1 -1
  83. package/dist/scripts/{DLsA7vPe.chunk.js → CjgcuP3Q.chunk.js} +2 -2
  84. package/dist/scripts/{DLsA7vPe.chunk.js.map → CjgcuP3Q.chunk.js.map} +1 -1
  85. package/dist/scripts/{itWDNVl_.chunk.js → CmVJO7VI.chunk.js} +2 -2
  86. package/dist/scripts/{itWDNVl_.chunk.js.map → CmVJO7VI.chunk.js.map} +1 -1
  87. package/dist/scripts/{DBtiEa66.chunk.js → CpMkRd2a.chunk.js} +2 -2
  88. package/dist/scripts/{DBtiEa66.chunk.js.map → CpMkRd2a.chunk.js.map} +1 -1
  89. package/dist/scripts/{Y2rXSgTV.chunk.js → CqWvHKP5.chunk.js} +2 -2
  90. package/dist/scripts/{Y2rXSgTV.chunk.js.map → CqWvHKP5.chunk.js.map} +1 -1
  91. package/dist/scripts/{zO2QdKtt.chunk.js → CvgQRmjv.chunk.js} +2 -2
  92. package/dist/scripts/{zO2QdKtt.chunk.js.map → CvgQRmjv.chunk.js.map} +1 -1
  93. package/dist/scripts/{B9W1QLWn.chunk.js → CwexEXsi.chunk.js} +2 -2
  94. package/dist/scripts/{B9W1QLWn.chunk.js.map → CwexEXsi.chunk.js.map} +1 -1
  95. package/dist/scripts/{BpwHr0J0.chunk.js → CyQDGNI3.chunk.js} +2 -2
  96. package/dist/scripts/{BpwHr0J0.chunk.js.map → CyQDGNI3.chunk.js.map} +1 -1
  97. package/dist/scripts/{CHAwVVRw.chunk.js → D21QHirZ.chunk.js} +2 -2
  98. package/dist/scripts/{CHAwVVRw.chunk.js.map → D21QHirZ.chunk.js.map} +1 -1
  99. package/dist/scripts/{DxJfmOeq.chunk.js → D30qaGvM.chunk.js} +2 -2
  100. package/dist/scripts/{DxJfmOeq.chunk.js.map → D30qaGvM.chunk.js.map} +1 -1
  101. package/dist/scripts/{CJIYSOTb.chunk.js → D3juPk5Y.chunk.js} +2 -2
  102. package/dist/scripts/{CJIYSOTb.chunk.js.map → D3juPk5Y.chunk.js.map} +1 -1
  103. package/dist/scripts/{B-IgnxzS.chunk.js → D5FAzio3.chunk.js} +2 -2
  104. package/dist/scripts/{B-IgnxzS.chunk.js.map → D5FAzio3.chunk.js.map} +1 -1
  105. package/dist/scripts/{DIBfWWih.chunk.js → D7NOMVC8.chunk.js} +2 -2
  106. package/dist/scripts/{DIBfWWih.chunk.js.map → D7NOMVC8.chunk.js.map} +1 -1
  107. package/dist/scripts/{bogFjz2G.chunk.js → D7QRJrh2.chunk.js} +2 -2
  108. package/dist/scripts/{bogFjz2G.chunk.js.map → D7QRJrh2.chunk.js.map} +1 -1
  109. package/dist/scripts/{BZb44_Lh.chunk.js → D9df4Id7.chunk.js} +2 -2
  110. package/dist/scripts/{BZb44_Lh.chunk.js.map → D9df4Id7.chunk.js.map} +1 -1
  111. package/dist/scripts/{BYLKD39d.chunk.js → DFEBv1_O.chunk.js} +2 -2
  112. package/dist/scripts/{BYLKD39d.chunk.js.map → DFEBv1_O.chunk.js.map} +1 -1
  113. package/dist/scripts/{ChXJhYla.chunk.js → DGvEmnsP.chunk.js} +2 -2
  114. package/dist/scripts/{ChXJhYla.chunk.js.map → DGvEmnsP.chunk.js.map} +1 -1
  115. package/dist/scripts/DIkrkJAo.chunk.js +2 -0
  116. package/dist/scripts/{CD1TqwcB.chunk.js.map → DIkrkJAo.chunk.js.map} +1 -1
  117. package/dist/scripts/{BrjepIq5.chunk.js → DMAci3S_.chunk.js} +2 -2
  118. package/dist/scripts/{BrjepIq5.chunk.js.map → DMAci3S_.chunk.js.map} +1 -1
  119. package/dist/scripts/{COBKg5HM.chunk.js → DOsWx99L.chunk.js} +2 -2
  120. package/dist/scripts/{COBKg5HM.chunk.js.map → DOsWx99L.chunk.js.map} +1 -1
  121. package/dist/scripts/{Bh_0dfl8.chunk.js → DYRoLttd.chunk.js} +2 -2
  122. package/dist/scripts/{Bh_0dfl8.chunk.js.map → DYRoLttd.chunk.js.map} +1 -1
  123. package/dist/scripts/{DiR8Ds2K.chunk.js → DbNPwlCF.chunk.js} +2 -2
  124. package/dist/scripts/{DiR8Ds2K.chunk.js.map → DbNPwlCF.chunk.js.map} +1 -1
  125. package/dist/scripts/{BCd9ozXx.chunk.js → DeSk2YFH.chunk.js} +2 -2
  126. package/dist/scripts/{BCd9ozXx.chunk.js.map → DeSk2YFH.chunk.js.map} +1 -1
  127. package/dist/scripts/{CgplGqf6.chunk.js → DgYE66Vs.chunk.js} +2 -2
  128. package/dist/scripts/{CgplGqf6.chunk.js.map → DgYE66Vs.chunk.js.map} +1 -1
  129. package/dist/scripts/{DsPW-ne8.chunk.js → DigjAeMR.chunk.js} +2 -2
  130. package/dist/scripts/{DsPW-ne8.chunk.js.map → DigjAeMR.chunk.js.map} +1 -1
  131. package/dist/scripts/{Bu06fyx_.chunk.js → Dj7sCTJQ.chunk.js} +2 -2
  132. package/dist/scripts/{Bu06fyx_.chunk.js.map → Dj7sCTJQ.chunk.js.map} +1 -1
  133. package/dist/scripts/{B2OzXphM.chunk.js → Dk7tKls8.chunk.js} +2 -2
  134. package/dist/scripts/{B2OzXphM.chunk.js.map → Dk7tKls8.chunk.js.map} +1 -1
  135. package/dist/scripts/{CJ1ig2Kx.chunk.js → DmTetbor.chunk.js} +2 -2
  136. package/dist/scripts/{CJ1ig2Kx.chunk.js.map → DmTetbor.chunk.js.map} +1 -1
  137. package/dist/scripts/{USTuMLcb.chunk.js → Ds3SQeo1.chunk.js} +2 -2
  138. package/dist/scripts/{USTuMLcb.chunk.js.map → Ds3SQeo1.chunk.js.map} +1 -1
  139. package/dist/scripts/{B696AbD2.chunk.js → Dw-3sJ6z.chunk.js} +2 -2
  140. package/dist/scripts/{B696AbD2.chunk.js.map → Dw-3sJ6z.chunk.js.map} +1 -1
  141. package/dist/scripts/{DjT7A1F0.chunk.js → DzUywVIn.chunk.js} +2 -2
  142. package/dist/scripts/{DjT7A1F0.chunk.js.map → DzUywVIn.chunk.js.map} +1 -1
  143. package/dist/scripts/{BX_8MApq.chunk.js → FqMxoz-g.chunk.js} +2 -2
  144. package/dist/scripts/{BX_8MApq.chunk.js.map → FqMxoz-g.chunk.js.map} +1 -1
  145. package/dist/scripts/{CtovEsFz.chunk.js → M8-7wL03.chunk.js} +2 -2
  146. package/dist/scripts/{CtovEsFz.chunk.js.map → M8-7wL03.chunk.js.map} +1 -1
  147. package/dist/scripts/{BF2PCV8G.chunk.js → O3KYJlt8.chunk.js} +2 -2
  148. package/dist/scripts/{BF2PCV8G.chunk.js.map → O3KYJlt8.chunk.js.map} +1 -1
  149. package/dist/scripts/{-wh0Q1Mk.chunk.js → P1w98jqc.chunk.js} +2 -2
  150. package/dist/scripts/{-wh0Q1Mk.chunk.js.map → P1w98jqc.chunk.js.map} +1 -1
  151. package/dist/scripts/{Q3oue8AK.chunk.js → PLxejfSI.chunk.js} +2 -2
  152. package/dist/scripts/{Q3oue8AK.chunk.js.map → PLxejfSI.chunk.js.map} +1 -1
  153. package/dist/scripts/{D_O3OU5_.chunk.js → Q9FeiQkl.chunk.js} +2 -2
  154. package/dist/scripts/{D_O3OU5_.chunk.js.map → Q9FeiQkl.chunk.js.map} +1 -1
  155. package/dist/scripts/{dn7SonjL.chunk.js → TYfK47yR.chunk.js} +2 -2
  156. package/dist/scripts/{dn7SonjL.chunk.js.map → TYfK47yR.chunk.js.map} +1 -1
  157. package/dist/scripts/{CuGgxXq6.chunk.js → X5emuMm3.chunk.js} +2 -2
  158. package/dist/scripts/{CuGgxXq6.chunk.js.map → X5emuMm3.chunk.js.map} +1 -1
  159. package/dist/scripts/{CQoqpuSN.chunk.js → YuqHkk0a.chunk.js} +2 -2
  160. package/dist/scripts/{CQoqpuSN.chunk.js.map → YuqHkk0a.chunk.js.map} +1 -1
  161. package/dist/scripts/{BM3jzDzF.chunk.js → ZFLNGNny.chunk.js} +2 -2
  162. package/dist/scripts/{BM3jzDzF.chunk.js.map → ZFLNGNny.chunk.js.map} +1 -1
  163. package/dist/scripts/{DcWRg8v3.chunk.js → aou-5sJI.chunk.js} +2 -2
  164. package/dist/scripts/{DcWRg8v3.chunk.js.map → aou-5sJI.chunk.js.map} +1 -1
  165. package/dist/scripts/{app-7svuou3-.js → app-CShb1Dgt.js} +3 -3
  166. package/dist/scripts/{app-7svuou3-.js.map → app-CShb1Dgt.js.map} +1 -1
  167. package/dist/scripts/baur_fn0.chunk.js +2 -0
  168. package/dist/scripts/{zDrAtVBw.chunk.js.map → baur_fn0.chunk.js.map} +1 -1
  169. package/dist/scripts/{BrdxuhDZ.chunk.js → cDgsKsmM.chunk.js} +2 -2
  170. package/dist/scripts/{BrdxuhDZ.chunk.js.map → cDgsKsmM.chunk.js.map} +1 -1
  171. package/dist/scripts/{Di0ieRgB.chunk.js → d6bZeQ7u.chunk.js} +2 -2
  172. package/dist/scripts/{Di0ieRgB.chunk.js.map → d6bZeQ7u.chunk.js.map} +1 -1
  173. package/dist/scripts/{BqAavbCw.chunk.js → dP41rDFl.chunk.js} +2 -2
  174. package/dist/scripts/{BqAavbCw.chunk.js.map → dP41rDFl.chunk.js.map} +1 -1
  175. package/dist/scripts/{BcDguH17.chunk.js → jH3hqwI2.chunk.js} +2 -2
  176. package/dist/scripts/{BcDguH17.chunk.js.map → jH3hqwI2.chunk.js.map} +1 -1
  177. package/dist/scripts/{DL-oEZtF.chunk.js → kUTnu8Iq.chunk.js} +2 -2
  178. package/dist/scripts/{DL-oEZtF.chunk.js.map → kUTnu8Iq.chunk.js.map} +1 -1
  179. package/dist/scripts/{cyDp1kQU.chunk.js → nbVa2u9N.chunk.js} +2 -2
  180. package/dist/scripts/{cyDp1kQU.chunk.js.map → nbVa2u9N.chunk.js.map} +1 -1
  181. package/dist/scripts/{CtTd6EE8.chunk.js → vbpGTzKU.chunk.js} +2 -2
  182. package/dist/scripts/{CtTd6EE8.chunk.js.map → vbpGTzKU.chunk.js.map} +1 -1
  183. package/dist/scripts/{Co_YIZXn.chunk.js → zr54fY9l.chunk.js} +2 -2
  184. package/dist/scripts/{Co_YIZXn.chunk.js.map → zr54fY9l.chunk.js.map} +1 -1
  185. package/package.json +1 -1
  186. package/dist/scripts/BwdSbre5.chunk.js +0 -2
  187. package/dist/scripts/BxcHYWuR.chunk.js +0 -2
  188. package/dist/scripts/C2TRBWPd.chunk.js +0 -2
  189. package/dist/scripts/CD1TqwcB.chunk.js +0 -2
  190. package/dist/scripts/WarFtyTw.chunk.js +0 -2
  191. package/dist/scripts/u96pPes-.chunk.js +0 -2
  192. package/dist/scripts/zDrAtVBw.chunk.js +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"Vk3DDGeP.chunk.js","sources":["../../../../libs/shared/src/components/widgets/items/subject-widget-item/CoverPill.tsx","../../../../libs/shared/src/components/widgets/items/subject-widget-item/CompanyWidgetItem.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/CompanyResult.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/exchange-video-group/ExchangeVideoGroup.tsx","../../../../libs/shared/src/apps/subjects/components/hero-video/HeroVideo.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/FeaturedVideoResult.tsx","../../../../../node_modules/timeago.js/esm/lang/en_US.js","../../../../../node_modules/timeago.js/esm/lang/zh_CN.js","../../../../../node_modules/timeago.js/esm/register.js","../../../../../node_modules/timeago.js/esm/utils/date.js","../../../../../node_modules/timeago.js/esm/format.js","../../../../../node_modules/timeago.js/esm/index.js","../../../../libs/shared/src/apps/playlists/components/playlist-count/PlaylistCount.tsx","../../../../libs/shared/src/components/clickview-avatar/ClickViewAvatar.tsx","../../../../libs/shared/src/apps/playlists/components/playlist-list/PlaylistOwnerAvatar.tsx","../../../../libs/shared/src/apps/playlists/components/playlist-list/PlaylistItem.tsx","../../../../libs/shared/src/apps/playlists/components/playlist-list/PlaylistList.tsx","../../../../libs/shared/src/apps/search/components/playlist-with-videos/PlaylistWithVideos.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/LargePlaylistResults.tsx","../../../../libs/shared/src/components/series-tall-poster/SeriesTallPoster.tsx","../../../../libs/shared/src/apps/search/components/series-with-videos/SeriesWithVideos.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/LargeSeriesResult.tsx","../../../../libs/shared/src/apps/search/components/collection-video-list/CollectionVideoList.tsx","../../../../libs/shared/src/apps/search/components/collection-thumbnail/CollectionThumbnail.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/SmallPlaylistResult.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/SmallSeriesResults.tsx","../../../../libs/shared/src/enums/ClassificationStatus.ts","../../../../libs/shared/src/components/widgets/items/subject-widget-item/SubjectWidgetItem.tsx","../../../../libs/shared/src/components/widgets/items/subject-widget-item/EditSubjectsWidgetLink.tsx","../../../../libs/shared/src/components/widgets/items/subject-widget-item/AllSubjectsWidgetLink.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/SubjectResult.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/VideoResult.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/MixedSearchResults.tsx","../../../../libs/shared/src/apps/search/components/search-substitute/SearchSubstitute.tsx","../../../../libs/shared/src/apps/search/components/search-suggestions/SearchSuggestions.tsx","../../src/apps/exchange/views/exchange-search-results/ExchangeSearchUtils.ts","../../src/apps/exchange/views/exchange-search-results/empty-state/ExchangeSearchEmptyState.tsx","../../src/apps/exchange/views/exchange-search-results/useFetchSearchData.ts","../../src/apps/exchange/views/exchange-search-results/useGetSearchResults.ts","../../../../libs/shared/src/apps/search/constants/SearchOGQL.ts","../../../../libs/shared/src/apps/search/flight-requests/SharedSearchRequests.ts","../../src/apps/exchange/views/exchange-search-results/useGetTagsAndClassifications.ts","../../src/apps/exchange/views/exchange-search-results/ExchangeSearchResultsView.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\nimport { RandomHelper } from 'libs/common/react/utils/RandomHelper';\n\nimport { AnalyticsOptions, HashObject } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { IconCircle } from 'libs/shared/components/icon-circle/IconCircle';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { BG_COLOUR_CLASS_NAMES } from 'libs/shared/constants/ColourClassNames';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { CheckSvg } from 'libs/shared/images/svg/status/CheckSvg';\nimport { BaseObject, Classification, Presentation } from 'libs/shared/interfaces';\nimport { getBgColorClass } from 'libs/shared/utils/getBgColorClass';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\nimport { MasterTypeHelper } from 'libs/shared/utils/MasterTypeHelper';\n\nimport styles from './cover-pill.module.scss';\n\nconst namespace = 'shared.subjectWidgetItem';\n\ninterface NamePanelProps {\n name: string;\n multiline?: boolean;\n subtitle?: string;\n noUnderLine?: boolean;\n newVideosCount?: number;\n}\n\nconst ComingSoonNamePanel = ({ name, multiline, noUnderLine }: NamePanelProps) => {\n let wrapperClassName = `${styles.comingSoonPanel} \n d-flex flex-column align-items-center justify-content-center px-3 text-center`;\n\n let textClassName = '';\n\n if (!multiline) {\n wrapperClassName += ' text-nowrap';\n textClassName += ' text-truncate';\n } else {\n textClassName += ` ${styles.clamped} clamp-2`;\n }\n\n return (\n <div className={wrapperClassName}>\n <small className='text-secondary'><Text namespace={namespace} phrase='comingSoon' /></small>\n <p className={`${noUnderLine ? '' : styles.name} h6`}><span className={textClassName}>{name}</span></p>\n </div>\n );\n};\n\nconst NormalNamePanel = ({ name, multiline, subtitle, noUnderLine, newVideosCount }: NamePanelProps) => {\n let wrapperClassName = 'px-3 d-flex flex-column justify-content-center';\n let textClassName = `${noUnderLine ? '' : styles.name} h6`;\n\n if (!multiline) {\n wrapperClassName += ' text-nowrap text-truncate';\n textClassName += ' text-truncate mb-0';\n } else {\n textClassName += ` ${newVideosCount ? 'clamp-2' : 'clamp-3'} text-start`;\n }\n\n return (\n <div className={wrapperClassName}>\n {subtitle && <div className={`text-secondary clamp-1 ${styles.text}`}>{subtitle}</div>}\n <div className={textClassName} title={name}>{name}</div>\n {!!newVideosCount && (\n <div className={`fw-semibold d-inline-block rounded-pill px-2 mt-1 bg-light-green w-fit h-fit text-green ${styles.newVideos}`}>\n <Text namespace={namespace} phrase='newVideos' options={{ smartCount: newVideosCount }} />\n </div>\n )}\n </div>\n );\n};\n\nexport interface CoverPillWidgetItemProps<T extends BaseObject> {\n data: T;\n getChildAppLink?: (data: T) => Core.AppLink;\n getChildAppLinkOptions?: () => Core.AppLinkOptions;\n isLarge?: boolean;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n availablePresentations?: Presentation[];\n getSubtitle?: (data: T) => string;\n multiline?: boolean;\n // set to true it will highlight on hover and also remove the hover text underline\n highlightOnHover?: boolean;\n showNewVideosCount?: boolean;\n shouldHighlight?: (data: T) => boolean;\n showFallbackBackgroundColour?: boolean;\n onClick?: () => void;\n}\n\nCoverPillWidgetContent.defaultProps = {\n showFallbackBackgroundColour: true\n};\n\ninterface CoverPillWidgetContentProps<T> extends CoverPillWidgetItemProps<T> {\n coverUrl?: string;\n coverBgColor?: string;\n subtitle?: string;\n isComingSoon?: boolean;\n className?: string;\n imageClassName?: string;\n isSelected?: boolean;\n hideFallback?: boolean;\n hideCheckmark?: boolean;\n themeColor?: string;\n}\n\nexport function CoverPillWidgetContent(props: CoverPillWidgetContentProps<BaseObject>): JSX.Element {\n const coverUrl = ImageHelper.createUrl(props.coverUrl, { size: props.isLarge ? ImageSize.Medium : ImageSize.Small });\n\n let classification: Classification | undefined = undefined;\n if (MasterTypeHelper.isClassification(props.data)) {\n classification = props.data;\n }\n\n const childProps = {\n name: props.data.name,\n multiline: props.isLarge || props.multiline,\n subtitle: props.subtitle,\n noUnderLine: props.highlightOnHover,\n newVideosCount: props.showNewVideosCount ? classification?.externalMetadata?.childDashboardNewVideoCount : 0\n };\n\n const coverStyle: React.CSSProperties = {\n backgroundImage: coverUrl ? `url('${coverUrl}')` : null,\n backgroundColor: props.coverBgColor\n };\n\n const fallbackCoverBgClassName = getBgColorClass(props.data.name, BG_COLOUR_CLASS_NAMES);\n\n return (\n <div\n className={classNames(\n props.themeColor ? styles.hasThemeColor : 'border',\n 'd-flex position-relative',\n props.className,\n styles.widgetItem,\n props.isSelected ? 'border-success border-2' : '',\n props.highlightOnHover && !props.themeColor ? 'bg-light-blue-hover' : ''\n )}\n style={props.themeColor ? { '--themeColor': props.themeColor } as unknown as React.CSSProperties : {}}\n id={`${props.data.id}-${RandomHelper.getRandomInt()}`}\n onClick={props.onClick}\n >\n {props.isSelected && (\n <div className={`${styles.selectedMask} border-2`} />\n )}\n\n <div className={`${styles.imagePanel} ${props.isLarge ? styles.large : ''}`}>\n {props.isSelected && !props.hideCheckmark && (\n <div className={styles.selected}>\n <IconCircle svg={CheckSvg} svgSize={SvgContainerSize.Large} textVariant='white' variant='green' />\n </div>\n )}\n\n {coverUrl &&\n <div\n className={classNames(\n styles.image,\n props.imageClassName,\n !props.coverBgColor && props.showFallbackBackgroundColour && fallbackCoverBgClassName\n )}\n style={coverStyle}\n />\n }\n {!props.hideFallback && (\n <ImageFallback\n type={ImageFallbackType.Subject}\n extraClasses={props.isLarge ? styles.large : ''}\n />\n )}\n </div>\n\n {props.isComingSoon\n ? <ComingSoonNamePanel {...childProps} />\n : <NormalNamePanel {...childProps} />\n }\n </div>\n );\n}\n\nexport function CoverPillWidgetContentWrapper(props: CoverPillWidgetContentProps<BaseObject>) {\n const appLink = props.getChildAppLink ? props.getChildAppLink(props.data) : null;\n\n return (\n <>\n {appLink ? (\n <AppLink\n className={styles.appLink}\n appLink={appLink}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n appLinkOptions={props.getChildAppLinkOptions?.()}\n >\n <CoverPillWidgetContent {...props} />\n </AppLink>\n ) : (<CoverPillWidgetContent {...props} />)\n }\n </>\n );\n}","import * as React from 'react';\n\nimport { ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { CoverPillWidgetContentWrapper, CoverPillWidgetItemProps } from 'libs/shared/components/widgets/items/subject-widget-item/CoverPill';\nimport { Company } from 'libs/shared/interfaces';\n\nexport function CompanyWidgetItem(props: CoverPillWidgetItemProps<Company>): JSX.Element {\n const analyticsData = {\n ...props.analyticsData,\n id: props.data?.id,\n name: props.data?.name\n };\n\n const analyticsOptions = {\n location: LocationContext.ClassificationListItem,\n ...props.analyticsOptions,\n actionType: UserAction.Click,\n entity: EntityType.Company,\n descriptor: ClickDescriptor.Cover\n };\n\n return (\n <CoverPillWidgetContentWrapper\n {...props}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n coverUrl={props.data.logo?.url}\n coverBgColor={props.data.metadata?.colour}\n />\n );\n}","import React from 'react';\nimport { Col } from 'react-bootstrap';\n\nimport { CompanyWidgetItem } from 'libs/shared/components/widgets/items/subject-widget-item/CompanyWidgetItem';\nimport { Company } from 'libs/shared/interfaces';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function CompanyResult(props: MixedSearchResultItemProps<Company>): JSX.Element {\n return (\n <Col as='li' sm={6} md={props.useLargeStyle ? 6 : 4} lg={props.useLargeStyle ? 4 : 3}>\n <div className={`position-relative px-1 mb-2`}>\n <CompanyWidgetItem\n data={props.item}\n getChildAppLink={props.appLinks.getCompanyAppLink}\n getChildAppLinkOptions={() => props.appLinks.getCompanyAppLinkOptions?.(props.item)}\n analyticsData={{\n itemIndex: props.itemIndex,\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: 0\n }}\n isLarge={props.useLargeStyle}\n />\n </div>\n </Col>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { ClickDescriptor, EntityType, HashObject, LocationContext, SearchSourceDescriptor, UserAction } from 'libs/analytics/interfaces';\n\nimport { SourceFilterOptions } from 'libs/shared/apps/search/interfaces';\nimport { type ExchangeVideoGroup as ExchangeVideoGroupData } from 'libs/shared/apps/search/interfaces/SearchResults';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoItem } from 'libs/shared/components/video-list/video-item/VideoItem';\n\nimport { MixedSearchResultItemProps } from './../MixedSearchResultItemProps';\n\nimport styles from '../../mixed-search-results.module.scss';\n\nconst namespace = 'search.exchangeVideoGroup';\n\nconst EXCHANGE_RESULT_DISPLAY_LIMIT = 3;\n\nexport function ExchangeVideoGroup(props: MixedSearchResultItemProps<ExchangeVideoGroupData>): JSX.Element {\n const limit = props.item.showCount >= EXCHANGE_RESULT_DISPLAY_LIMIT\n ? EXCHANGE_RESULT_DISPLAY_LIMIT\n : props.item.showCount;\n\n function getContainerClassName(): string {\n if (props.pagePositionIndex === 0)\n return 'border-bottom pb-1 mb-3';\n\n return 'border-top border-bottom pt-3 mt-2 pb-1 mb-3';\n }\n\n const currentAppLink = Core.AppLinkHelper.getCurrentAppLink();\n const currentParams = (currentAppLink.params as HashObject) ?? {};\n let currentSource = currentParams?.source ?? [];\n\n if (currentSource && !Array.isArray(currentSource))\n currentSource = [currentSource];\n\n const searchAppLink = {\n ...currentAppLink,\n params: {\n ...currentParams,\n source: [ ...(currentSource), SourceFilterOptions.ExchangeArchive ]\n }\n };\n\n const analyticsData = {\n query: props.queryParams.query,\n itemIndex: props.itemIndex,\n pagePositionIndex: props.pagePositionIndex\n };\n const analyticsOptions = {\n entity: EntityType.SearchResults,\n location: LocationContext.ExchangeSearchGroupItem,\n actionType: UserAction.Click,\n descriptor: SearchSourceDescriptor.ExchangeArchive\n };\n\n return (\n <div className={getContainerClassName()}>\n <AppLink\n appLink={searchAppLink}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n >\n <h2 className='h4'>\n <Text namespace={namespace} phrase='heading' />\n </h2>\n </AppLink>\n <p>\n <Text namespace={namespace} phrase='message' />\n &nbsp;\n <AppLink\n appLink={props.appLinks.searchSettings}\n className='text-info'\n analyticsData={analyticsData}\n analyticsOptions={{\n ...analyticsOptions,\n descriptor: ClickDescriptor.Settings\n }}\n >\n <Text namespace={namespace} phrase='searchSettings' />\n </AppLink>\n .\n </p>\n\n <div className={`position-relative ${styles.videoList}`}>\n {props.item.videos.slice(0, limit).map((v, i) => {\n return (\n <VideoItem\n key={i}\n video={v}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n presentationAudiences={props.audiences}\n analyticsData= {{\n search: {\n query: props.queryParams.query,\n score: v._score,\n maxScore: v._maxScore,\n featured: v._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n hasPermissions={props.hasPermissions}\n commonVideoProps={props.commonVideoProps}\n />\n );\n })}\n </div>\n <div className='text-center py-2'>\n <AppLink\n className='text-secondary'\n appLink={searchAppLink}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n >\n <Text namespace={namespace} phrase='seeMore' />\n </AppLink>\n </div>\n </div>\n );\n}","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions, LocationContext } from 'libs/analytics/interfaces';\n\nimport { AudienceLabel } from 'libs/shared/components/audience-label/AudienceLabel';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { BadgeListContainer } from 'libs/shared/components/badges/BadgeListContainer';\nimport { VideoThumbnail } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { VideoItemGuidance } from 'libs/shared/components/video-list/components/video-guidance/VideoItemGuidance';\nimport { VideoItemActions } from 'libs/shared/components/video-list/components/video-item-actions/VideoItemActions';\nimport { VideoItemTitle } from 'libs/shared/components/video-list/components/video-item-title/VideoItemTitle';\nimport { VideoSubText } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { ThumbnailTextPosition } from 'libs/shared/enums/ThumbnailTextPosition';\nimport { useMergeAudiences } from 'libs/shared/hooks/UseMergeAudiences';\nimport { PresentationAudience, Video } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport styles from './hero-video.module.scss';\n\ninterface HeroVideoProps {\n video: Video;\n presentationAudiences: PresentationAudience[];\n showVideoGuidance: boolean;\n getVideoAppLink: (video: Video, opts: GetVideoAppLinkOptions) => Core.AppLink;\n hideInteractiveBadge?: boolean;\n badgePosition?: 'thumbnail' | 'info-panel';\n titleClassName?: string;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n commonVideoProps: CommonVideoProps;\n showNewVideoIndicator?: boolean;\n}\n\nHeroVideo.defaultProps = {\n newDurationStyle: true,\n badgePosition: 'thumbnail'\n};\n\nexport function HeroVideo(props: HeroVideoProps): JSX.Element {\n const videoAudiences = props.video?.subjectPresentationAudiences?.data;\n const mergedAudience = useMergeAudiences(videoAudiences, props.presentationAudiences);\n\n const analyticsOptions = AnalyticsHelper.mergeOptions(props.analyticsOptions, {\n location: LocationContext.ClassificationHero,\n entity: VideoHelper.getAnalyticsEntity(props.video)\n });\n\n const containerRef = React.useRef(null);\n \n if (!props.video)\n return <></>;\n\n return (\n <Row>\n <Col xs={12} md={6}>\n <div ref={containerRef} >\n <VideoThumbnail\n analyticsOptions={analyticsOptions}\n video={props.video}\n appLink={props.getVideoAppLink?.(props.video, {})}\n imageOptions={{ size: ImageSize.Medium }}\n textPosition={ThumbnailTextPosition.Independent}\n type='static'\n audience={props.badgePosition === 'thumbnail' ? mergedAudience : null}\n hideRating={props.badgePosition === 'thumbnail' ? !!mergedAudience : true}\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n </Col>\n <Col xs={12} md={6} className={`${styles.details} position-relative`}>\n <div className='d-flex justify-content-between'>\n <div className='overflow-hidden'>\n <VideoSubText\n type={props.commonVideoProps.subTextType}\n appLink={props.commonVideoProps.getSubTextAppLink?.(props.video)}\n analyticsData={props.analyticsData}\n analyticsOptions={analyticsOptions}\n video={props.video}\n className='text-reset clamp-1'\n />\n <VideoItemTitle\n yearGroups={props.commonVideoProps.yearGroups}\n video={props.video}\n analyticsData={props.analyticsData}\n analyticsOptions={analyticsOptions}\n appLink={props.getVideoAppLink?.(props.video, {})}\n titleSize='h4'\n showNewVideoIndicator={props.showNewVideoIndicator}\n showPadlock={!props.commonVideoProps.hasStudentExperience && !props.commonVideoProps.hasGuestExperience}\n titleClassName={props.titleClassName}\n clampLevel={2}\n />\n </div>\n <VideoItemActions\n analyticsData={props.analyticsData}\n analyticsOptions={analyticsOptions}\n video={props.video}\n />\n </div>\n\n {props.badgePosition === 'info-panel' && (\n <BadgeListContainer className='pb-1'>\n {!props.hideInteractiveBadge && <Badge type={ BadgeType.Interactive } data={props.video.interactives} />}\n <Badge type={ BadgeType.Rating } data={VideoHelper.getRating(props.video)} />\n <Badge type={ BadgeType.ProductionYear } data={props.video.productionYear} />\n </BadgeListContainer>\n )}\n\n <p className='mb-1'><span className={styles.description}>{props.video.description}</span></p>\n \n {props.badgePosition === 'info-panel' && (\n <AudienceLabel\n audience={mergedAudience}\n className='mt-1'\n border='dark'\n />\n )}\n\n {props.showVideoGuidance && (\n <VideoItemGuidance\n video={props.video}\n analyticsData={props.analyticsData}\n analyticsOptions={analyticsOptions}\n containerClassName={`d-flex ${styles.guidance}`}\n responsiveClassName={styles.responsiveGuidance}\n commonVideoProps={props.commonVideoProps}\n />\n )}\n </Col>\n </Row>\n );\n}\n\nexport function PartialHeroVideo(): JSX.Element {\n return (\n <>\n <div className={`partial-loading-background mb-2 ${styles.partialHeading}`} />\n <div className='row pb-3'>\n <div className='col-6 p1'>\n <div className={`${styles.partialHeroThumbnail} partial-loading-background rounded-3`}></div>\n </div>\n <div className='col-6 p1'>\n <div className={`partial-loading-background mb-1 ${styles.partialSeriesText}`}></div>\n <div className={`partial-loading-background my-1 ${styles.partialVideoTitleText}`}></div>\n <div className='d-flex'>\n <div className={`partial-loading-background my-1 me-1 ${styles.partialBadge}`}></div>\n <div className={`partial-loading-background my-1 ms-1 ${styles.partialBadge}`}></div>\n </div>\n <div className={`partial-loading-background my-1 ${styles.partialDescription}`}></div>\n <div className={`partial-loading-background mt-2 ${styles.partialSubject}`}></div>\n </div>\n </div>\n </>\n );\n}\n","import React from 'react';\n\nimport { HeroVideo } from 'libs/shared/apps/subjects/components/hero-video/HeroVideo';\nimport { Video } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function FeaturedVideoResult(props: MixedSearchResultItemProps<Video>): JSX.Element {\n return (\n <div className='pb-3'>\n <HeroVideo\n video={props.item}\n presentationAudiences={props.audiences}\n getVideoAppLink={(v, opts) => props.appLinks.getVideoAppLink(v, opts)}\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n hideInteractiveBadge\n showVideoGuidance={VideoHelper.showVideoGuidance(props.hasPermissions)}\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n}","var EN_US = ['second', 'minute', 'hour', 'day', 'week', 'month', 'year'];\nexport default function (diff, idx) {\n if (idx === 0)\n return ['just now', 'right now'];\n var unit = EN_US[Math.floor(idx / 2)];\n if (diff > 1)\n unit += 's';\n return [diff + \" \" + unit + \" ago\", \"in \" + diff + \" \" + unit];\n}\n//# sourceMappingURL=en_US.js.map","var ZH_CN = ['秒', '分钟', '小时', '天', '周', '个月', '年'];\nexport default function (diff, idx) {\n if (idx === 0)\n return ['刚刚', '片刻后'];\n var unit = ZH_CN[~~(idx / 2)];\n return [diff + \" \" + unit + \"\\u524D\", diff + \" \" + unit + \"\\u540E\"];\n}\n//# sourceMappingURL=zh_CN.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\n/**\n * All supported locales\n */\nvar Locales = {};\n/**\n * register a locale\n * @param locale\n * @param func\n */\nexport var register = function (locale, func) {\n Locales[locale] = func;\n};\n/**\n * get a locale, default is en_US\n * @param locale\n * @returns {*}\n */\nexport var getLocale = function (locale) {\n return Locales[locale] || Locales['en_US'];\n};\n//# sourceMappingURL=register.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\nvar SEC_ARRAY = [\n 60,\n 60,\n 24,\n 7,\n 365 / 7 / 12,\n 12,\n];\n/**\n * format Date / string / timestamp to timestamp\n * @param input\n * @returns {*}\n */\nexport function toDate(input) {\n if (input instanceof Date)\n return input;\n // @ts-ignore\n if (!isNaN(input) || /^\\d+$/.test(input))\n return new Date(parseInt(input));\n input = (input || '')\n // @ts-ignore\n .trim()\n .replace(/\\.\\d+/, '') // remove milliseconds\n .replace(/-/, '/')\n .replace(/-/, '/')\n .replace(/(\\d)T(\\d)/, '$1 $2')\n .replace(/Z/, ' UTC') // 2017-2-5T3:57:52Z -> 2017-2-5 3:57:52UTC\n .replace(/([+-]\\d\\d):?(\\d\\d)/, ' $1$2'); // -04:00 -> -0400\n return new Date(input);\n}\n/**\n * format the diff second to *** time ago, with setting locale\n * @param diff\n * @param localeFunc\n * @returns\n */\nexport function formatDiff(diff, localeFunc) {\n /**\n * if locale is not exist, use defaultLocale.\n * if defaultLocale is not exist, use build-in `en`.\n * be sure of no error when locale is not exist.\n *\n * If `time in`, then 1\n * If `time ago`, then 0\n */\n var agoIn = diff < 0 ? 1 : 0;\n /**\n * Get absolute value of number (|diff| is non-negative) value of x\n * |diff| = diff if diff is positive\n * |diff| = -diff if diff is negative\n * |0| = 0\n */\n diff = Math.abs(diff);\n /**\n * Time in seconds\n */\n var totalSec = diff;\n /**\n * Unit of time\n */\n var idx = 0;\n for (; diff >= SEC_ARRAY[idx] && idx < SEC_ARRAY.length; idx++) {\n diff /= SEC_ARRAY[idx];\n }\n /**\n * Math.floor() is alternative of ~~\n *\n * The differences and bugs:\n * Math.floor(3.7) -> 4 but ~~3.7 -> 3\n * Math.floor(1559125440000.6) -> 1559125440000 but ~~1559125440000.6 -> 52311552\n *\n * More information about the performance of algebraic:\n * https://www.youtube.com/watch?v=65-RbBwZQdU\n */\n diff = Math.floor(diff);\n idx *= 2;\n if (diff > (idx === 0 ? 9 : 1))\n idx += 1;\n return localeFunc(diff, idx, totalSec)[agoIn].replace('%s', diff.toString());\n}\n/**\n * calculate the diff second between date to be formatted an now date.\n * @param date\n * @param relativeDate\n * @returns {number}\n */\nexport function diffSec(date, relativeDate) {\n var relDate = relativeDate ? toDate(relativeDate) : new Date();\n return (+relDate - +toDate(date)) / 1000;\n}\n/**\n * nextInterval: calculate the next interval time.\n * - diff: the diff sec between now and date to be formatted.\n *\n * What's the meaning?\n * diff = 61 then return 59\n * diff = 3601 (an hour + 1 second), then return 3599\n * make the interval with high performance.\n **/\nexport function nextInterval(diff) {\n var rst = 1, i = 0, d = Math.abs(diff);\n for (; diff >= SEC_ARRAY[i] && i < SEC_ARRAY.length; i++) {\n diff /= SEC_ARRAY[i];\n rst *= SEC_ARRAY[i];\n }\n d = d % rst;\n d = d ? rst - d : rst;\n return Math.ceil(d);\n}\n//# sourceMappingURL=date.js.map","import { formatDiff, diffSec } from './utils/date';\nimport { getLocale } from './register';\n/**\n * format a TDate into string\n * @param date\n * @param locale\n * @param opts\n */\nexport var format = function (date, locale, opts) {\n // diff seconds\n var sec = diffSec(date, opts && opts.relativeDate);\n // format it with locale\n return formatDiff(sec, getLocale(locale));\n};\n//# sourceMappingURL=format.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\nimport en_US from './lang/en_US';\nimport zh_CN from './lang/zh_CN';\nimport { register } from './register';\nregister('en_US', en_US);\nregister('zh_CN', zh_CN);\nexport { format } from './format';\nexport { render, cancel } from './realtime';\nexport { register };\n//# sourceMappingURL=index.js.map","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Playlist } from 'libs/shared/interfaces';\n\nconst namespace = 'playlists.playlistCount';\n\nfunction getCount(playlist: Playlist): number | false {\n if (!playlist)\n return false;\n\n const videos = playlist.videos?.count ?? 0;\n const interactives = playlist.interactives?.count ?? 0;\n const clips = playlist.clips?.count ?? 0;\n\n return videos + interactives + clips;\n}\n\ninterface PlaylistCountProps {\n playlist: Playlist;\n}\n\nexport function PlaylistCount(props: PlaylistCountProps): JSX.Element {\n const count = getCount(props.playlist);\n\n if (count === false || Number.isNaN(count))\n return <></>;\n\n return (\n <span className='text-shadow font-size-sm'>\n <Text namespace={namespace} phrase='count' options={{ smartCount: count }} />\n </span>\n );\n}","import * as React from 'react';\n\nimport { ClickViewLogoMark } from 'libs/shared/components/svgs/clickview-logo/ClickViewLogo';\n\nimport styles from './clickview-avatar.module.scss';\n\nexport function ClickViewAvatar(): JSX.Element {\n return (\n <div className={styles.avatar}>\n <ClickViewLogoMark />\n </div>\n );\n}\n","import * as React from 'react';\n\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { ClickViewAvatar } from 'libs/shared/components/clickview-avatar/ClickViewAvatar';\nimport { CurrentUser, Playlist } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\ninterface PlaylistOwnerAvatarProps {\n playlist: Playlist;\n imageCdnUrl: string;\n currentUser?: CurrentUser;\n}\n\nexport function PlaylistOwnerAvatar(props: PlaylistOwnerAvatarProps): JSX.Element {\n const { _liteOwner } = props.playlist;\n\n if (props.playlist._isClickViewCurated?.value)\n return (\n <ClickViewAvatar />\n );\n\n if (!_liteOwner?.id || !props.currentUser?.id)\n return <></>;\n\n const currentUserIsOwner = _liteOwner.id.toString() === props.currentUser.id.toString();\n\n if (currentUserIsOwner)\n return <></>;\n\n const url = typeof _liteOwner.avatar === 'string' ? _liteOwner.avatar : _liteOwner.avatar?.url;\n\n return (\n <Avatar\n imageUrl={url}\n imageCdnUrl={props.imageCdnUrl}\n initials={UserHelper.getInitials(_liteOwner.name, _liteOwner.surname)}\n />\n );\n}","import * as React from 'react';\nimport { format } from 'timeago.js';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { AnalyticsOptions, EntityType, HashObject } from 'libs/analytics/interfaces';\n\nimport { PlaylistCount } from 'libs/shared/apps/playlists/components/playlist-count/PlaylistCount';\nimport { PlaylistOwnerAvatar } from 'libs/shared/apps/playlists/components/playlist-list/PlaylistOwnerAvatar';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { AudienceLabel } from 'libs/shared/components/audience-label/AudienceLabel';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { ImageSize, ResizeType } from 'libs/shared/enums/Images';\nimport { useMergeAudiences } from 'libs/shared/hooks/UseMergeAudiences';\nimport { CurrentUser, Playlist, PresentationAudience } from 'libs/shared/interfaces';\nimport { getBgColorClass } from 'libs/shared/utils/getBgColorClass';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\n\nimport styles from './playlist.module.scss';\n\nconst namespace = 'playlists.playlistList';\n\nexport type PlaylistItemStyle = 'square' | 'round' | 'round-left';\n\nexport interface PlaylistItemProps {\n data: Playlist;\n appLink: Core.AppLink;\n currentUser?: CurrentUser;\n presentationAudiences?: PresentationAudience[];\n bgColourClassNames?: string[];\n titleClassName?: string;\n imageCdnUrl?: string;\n itemStyle?: PlaylistItemStyle;\n showCount?: boolean;\n showOwner?: boolean;\n showFallbackImage?: boolean;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n audienceLabelClass?: string;\n}\n\nPlaylistItem.defaultProps = {\n itemStyle: 'square'\n};\n\nexport function PlaylistItem(props: PlaylistItemProps): JSX.Element {\n const imageUrl = ImageHelper.createUrl(props.data.cover && props.data.cover.url, {\n size: ImageSize.Medium,\n resizeType: ResizeType.Cover\n });\n\n const audiences = props.data.subjectPresentationAudiences &&\n props.data.subjectPresentationAudiences.data;\n\n const mergedAudience = useMergeAudiences(audiences, props.presentationAudiences);\n\n let className = styles.playlistItem;\n\n const showImage = !!imageUrl || !!props.showFallbackImage;\n\n if (showImage)\n className += ` ${styles.playlistItemGradient}`;\n\n if (!showImage && props.bgColourClassNames)\n className += ` ${styles.playlistItem} ${getBgColorClass(props.data.name, props.bgColourClassNames)}`;\n\n if (props.itemStyle === 'round')\n className += ` rounded-3 overflow-hidden`;\n\n if (props.itemStyle === 'round-left')\n className += ` rounded-start-lg overflow-hidden`;\n\n const analyticsData = { ...props.analyticsData,\n id: props.data?.id,\n name: props.data?.name\n };\n\n const analyticsOptions = {\n ...props.analyticsOptions,\n entity: EntityType.Playlist\n };\n\n const getTitle = () => {\n if (!props.data.contentModifiedDate || props.data._isClickViewCurated?.value)\n return '';\n\n return LanguageService.getPhrase(namespace, 'lastUpdated', {\n timeago: format(DateHelper.convertUTCToLocal(props.data.contentModifiedDate))\n });\n };\n\n return (\n <AppLink\n appLink={props.appLink}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n title={getTitle()}\n >\n <BaseImage data={imageUrl} alt={props.data.name} className={className}>\n {!!props.showFallbackImage && <ImageFallback type={ImageFallbackType.Playlist} />}\n <div className={`text-white ${styles.playlistMetadata}`}>\n {!!props.showCount && (\n <PlaylistCount playlist={props.data} />\n )}\n <h5 className={`mb-0 ${props.titleClassName || ''}`}><span className='text-shadow clamp-2'>{props.data.name}</span></h5>\n {!!audiences && !!audiences.length && !!mergedAudience &&\n <AudienceLabel\n className={`${props.audienceLabelClass ? props.audienceLabelClass : ''} mt-1`}\n audience={mergedAudience}\n border='white'\n />\n }\n </div>\n {!!props.showOwner && !!props.imageCdnUrl &&\n <div className={styles.ownerAvatarContainer}>\n <PlaylistOwnerAvatar\n playlist={props.data}\n currentUser={props.currentUser}\n imageCdnUrl={props.imageCdnUrl}\n />\n </div>\n }\n </BaseImage>\n </AppLink>\n );\n}","import * as React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, HashObject, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { CurrentUser, Playlist, PresentationAudience } from 'libs/shared/interfaces';\n\nimport { PlaylistItem, PlaylistItemStyle } from './PlaylistItem';\n\ninterface PlaylistListProps {\n playlists: Playlist[];\n getPlaylistAppLink: (playlist: Playlist) => Core.AppLink;\n currentUser?: CurrentUser;\n presentationAudiences?: PresentationAudience[];\n itemContainerClassName?: string;\n itemTitleClassName?: string;\n bgColourClassNames?: string[];\n itemStyle?: PlaylistItemStyle;\n imageCdnUrl?: string;\n showCount?: boolean;\n showOwner?: boolean;\n showFallbackImage?: boolean;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n extraPlaylistItem?: JSX.Element;\n}\n\nconst analyticsOptions: AnalyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.Playlist,\n location: LocationContext.PlaylistListItem,\n descriptor: ClickDescriptor.Cover\n};\n\nexport function PlaylistList(props: PlaylistListProps): JSX.Element {\n return (\n <Row as='ul' className='list-unstyled mx-n1'>\n {props.extraPlaylistItem && (\n <Col as='li' key='extra-playlist-item' xs={6} sm={4} lg={3} className={`mb-2 px-1 ${props.itemContainerClassName ? props.itemContainerClassName : ''}`}>\n {props.extraPlaylistItem}\n </Col>\n )}\n\n {props.playlists.map(p => (\n <Col as='li' key={p.id} xs={6} sm={4} lg={3} className={`mb-2 px-1 ${props.itemContainerClassName ? props.itemContainerClassName : ''}`}>\n <PlaylistItem\n data={p}\n appLink={props.getPlaylistAppLink(p)}\n imageCdnUrl={props.imageCdnUrl}\n currentUser={props.currentUser}\n presentationAudiences={props.presentationAudiences}\n bgColourClassNames={props.bgColourClassNames}\n showCount={props.showCount}\n showOwner={props.showOwner}\n showFallbackImage={props.showFallbackImage}\n titleClassName={props.itemTitleClassName}\n itemStyle={props.itemStyle}\n analyticsData={props.analyticsData}\n analyticsOptions={{ ...props.analyticsOptions, ...analyticsOptions }}\n />\n </Col>\n ))}\n </Row>\n );\n}","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { PlaylistItem } from 'libs/shared/apps/playlists/components/playlist-list';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoItem } from 'libs/shared/components/video-list/video-item/VideoItem';\nimport { BG_COLOUR_CLASS_NAMES } from 'libs/shared/constants/ColourClassNames';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { CurrentUser, Playlist, PresentationAudience, Video } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\n\nimport styles from './playlist-with-videos.module.scss';\n\nconst namespace = 'search.playlistWithVideos';\n\nfunction useGetMaxVideos(): number {\n const breakpoints = useBreakpoints();\n\n if (breakpoints.xl || breakpoints.xxl)\n return 3;\n \n return 2;\n}\n\ninterface PlaylistWithVideoProps {\n playlist: Playlist;\n playlistAppLink: Core.AppLink;\n presentationAudiences: PresentationAudience[];\n preloadImage: boolean;\n analyticsData: HashObject;\n currentUser: CurrentUser;\n getVideoAppLink: (video: Video, opts: GetVideoAppLinkOptions) => Core.AppLink;\n hasPermissions: HasPermissionsFunc;\n commonVideoProps: CommonVideoProps;\n}\n\nexport function PlaylistWithVideos(props: PlaylistWithVideoProps): JSX.Element {\n const maxVideos = useGetMaxVideos();\n\n const videos = props.playlist.videos.data.slice(0, maxVideos);\n\n const playlistAnalyticsOption: AnalyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.Playlist,\n location: LocationContext.PlaylistWithVideos\n };\n\n const playlistAnalyticsData: HashObject = {\n ...props.analyticsData,\n id: props.playlist.id,\n name: props.playlist.name\n };\n\n return (\n <div className='ps-2 py-2'>\n <Row className='g-0 border rounded-3'>\n <Col xs={4} lg={3} className='pe-3'>\n <PlaylistItem\n appLink={props.playlistAppLink}\n analyticsData={props.analyticsData}\n analyticsOptions={{\n ...playlistAnalyticsOption,\n descriptor: ClickDescriptor.Cover\n }}\n data={props.playlist}\n presentationAudiences={props.presentationAudiences}\n bgColourClassNames={BG_COLOUR_CLASS_NAMES}\n itemStyle='round-left'\n imageCdnUrl={props.commonVideoProps.imageCdnUrl}\n currentUser={props.currentUser}\n showCount={false}\n showOwner\n />\n </Col>\n <Col xs={8} lg={9}>\n <div className='d-flex justify-content-between'>\n <div className={`pt-3 mb-n2 ${styles.videoList}`}>\n {videos?.map(video => {\n const videoAnalyticsData: HashObject = {\n ...playlistAnalyticsData,\n videoId: video.id,\n videoName: video.name\n };\n\n return (\n <div key={video.id} className='mb-2'>\n <VideoItem\n video={video}\n getVideoAppLink={props.getVideoAppLink}\n analyticsData={videoAnalyticsData}\n analyticsOptions={{\n entity: EntityType.Video,\n location: LocationContext.PlaylistWithVideos\n }}\n size='sm'\n hasPermissions={props.hasPermissions}\n hideVideoGuidance\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n })}\n </div>\n <div className='text-end pt-3 pe-3'>\n <AppLink\n className='info-link fw-semibold'\n appLink={props.playlistAppLink}\n analyticsData={playlistAnalyticsData}\n analyticsOptions={{\n ...playlistAnalyticsOption,\n descriptor: ClickDescriptor.Link\n }}\n >\n <Text namespace={namespace} phrase='seeAllVideos' />\n </AppLink>\n </div>\n </div>\n </Col>\n </Row>\n </div>\n );\n}","import React from 'react';\n\nimport { Playlist } from 'libs/shared/interfaces';\n\nimport { PlaylistWithVideos } from '../../playlist-with-videos/PlaylistWithVideos';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function LargePlaylistResult(props: MixedSearchResultItemProps<Playlist>): JSX.Element {\n return (\n <div className='mx-n2'>\n <PlaylistWithVideos\n playlist={props.item}\n playlistAppLink={props.appLinks.getPlaylistAppLink(props.item)}\n presentationAudiences={props.audiences}\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n currentUser={props.currentUser}\n preloadImage\n getVideoAppLink={props.appLinks.getVideoAppLink}\n hasPermissions={props.hasPermissions}\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n}","import React from 'react';\n\nimport { AudienceLabel } from 'libs/shared/components/audience-label/AudienceLabel';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { ImageSize, ImageType } from 'libs/shared/enums/Images';\nimport { useHoverIntent } from 'libs/shared/hooks/UseHover';\nimport { useMergeAudiences } from 'libs/shared/hooks/UseMergeAudiences';\nimport { PresentationAudience, Series } from 'libs/shared/interfaces';\nimport { SeriesHelper } from 'libs/shared/utils/SeriesHelper';\n\nimport styles from './series-tall-poster.module.scss';\n\ninterface SeriesTallPosterHoverOverlay {\n series: Series;\n mergedAudience: PresentationAudience;\n isSmall?: boolean;\n hasTableOfContents?: boolean;\n}\n\nfunction SeriesTallPosterHoverOverlay(props: SeriesTallPosterHoverOverlay): JSX.Element {\n return (\n <div className={`py-3 mx-2 px-2 rounded bg-white text-center ${styles.mask} d-flex flex-column align-items-center`}>\n <h3 className={`fw-semibold mb-0 ${styles.hoverTitle} ${props.isSmall ? styles.smallHoverTitle : styles.largeHoverTitle}`}>\n <span className='clamp-3'>\n {props.series.name}\n </span>\n </h3>\n\n {!!props.series.description && (\n <p className={`${props.hasTableOfContents ? styles.hasTableOfContents : ''} ${styles.hoverDescription} ${props.isSmall ? styles.smallHoverDescription : styles.largeHoverDescription} mb-0`}>{props.series.description}</p>\n )}\n <div className={`${styles.labelContainerOverlay}`}>\n {props.mergedAudience\n ? <AudienceLabel audience={props.mergedAudience} border='dark' className='mt-2 w-fit'/>\n : <Badge type={BadgeType.Rating} data={SeriesHelper.getRating(props.series)} className='mt-2' />\n }\n </div>\n </div>\n );\n}\n\ninterface SeriesTallPosterMaskProps {\n series: Series;\n presentationAudiences: PresentationAudience[];\n preloadImage: boolean;\n imageClass?: string;\n isSmall?: boolean;\n hasTableOfContents?: boolean;\n}\n\nexport function SeriesTallPoster(props: SeriesTallPosterMaskProps): JSX.Element {\n const [ hoverRef, isHovering ] = useHoverIntent<HTMLDivElement>({ className: styles.hoverActive });\n \n const audiences = props.series && props.series.subjectPresentationAudiences &&\n props.series.subjectPresentationAudiences.data || [];\n\n const mergedAudience = useMergeAudiences(audiences, props.presentationAudiences);\n const displayAudience = !!(audiences && audiences.length && mergedAudience);\n\n return (\n <div ref={hoverRef}>\n <BaseImage\n data={props.series.tallPoster}\n alt={props.series.name}\n imageType={ImageType.TallPosters}\n preload={props.preloadImage}\n imageOptions={{ size: ImageSize.Large }}\n imageClassName={props.imageClass ? props.imageClass : 'rounded-3'}\n >\n {isHovering && (\n <SeriesTallPosterHoverOverlay\n isSmall={props.isSmall}\n series={props.series}\n mergedAudience={audiences && audiences.length ? mergedAudience : null}\n hasTableOfContents={props.hasTableOfContents}\n />\n )}\n \n <ImageFallback type={ImageFallbackType.Series} />\n <div className={`position-absolute text-white ${styles.labelContainer}`}>\n {displayAudience\n ? <AudienceLabel audience={mergedAudience} className='bg-white text-dark' border='dark' />\n : <Badge className='text-shadow' type={BadgeType.Rating} data={SeriesHelper.getRating(props.series)} />\n }\n </div>\n </BaseImage>\n </div>\n );\n}\n","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SeriesTallPoster } from 'libs/shared/components/series-tall-poster/SeriesTallPoster';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoItem } from 'libs/shared/components/video-list/video-item/VideoItem';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { PresentationAudience, Series, Video } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\n\nimport styles from './series-with-videos.module.scss';\n\nconst namespace = 'search.seriesWithVideos';\n\nfunction useGetMaxVideos(): number {\n const breakpoints = useBreakpoints();\n\n if (breakpoints.xl || breakpoints.xxl)\n return 5;\n \n if (breakpoints.lg || breakpoints.md)\n return 4;\n\n return 3;\n}\n\ninterface SeriesWithVideoProps {\n series: Series;\n seriesAppLink: Core.AppLink;\n presentationAudiences: PresentationAudience[];\n preloadImage: boolean;\n analyticsData: HashObject;\n getVideoAppLink: (video: Video, opts: GetVideoAppLinkOptions) => Core.AppLink;\n hasPermissions: HasPermissionsFunc;\n commonVideoProps: CommonVideoProps;\n}\n\nexport function SeriesWithVideos(props: SeriesWithVideoProps): JSX.Element {\n const maxVideos = useGetMaxVideos();\n\n const videos = props.series.videos.data.slice(0, maxVideos);\n\n const seriesAnalyticsOption: AnalyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.Series,\n location: LocationContext.SeriesWithVideos\n };\n\n const seriesAnalyticsData: HashObject = {\n ...props.analyticsData,\n id: props.series.id,\n name: props.series.name\n };\n\n return (\n <div className='ps-2 py-2'>\n <Row className='g-0 border rounded-3'>\n <Col xs={4} lg={3} className='pe-3'>\n <AppLink\n appLink={props.seriesAppLink}\n className='position-relative'\n analyticsData={seriesAnalyticsData}\n analyticsOptions={{\n ...seriesAnalyticsOption,\n descriptor: ClickDescriptor.TallPoster\n }}\n >\n <SeriesTallPoster\n series={props.series}\n presentationAudiences={props.presentationAudiences}\n preloadImage={props.preloadImage}\n imageClass='rounded-start-lg'\n />\n </AppLink>\n </Col>\n <Col xs={8} lg={9}>\n <div className='d-flex justify-content-between'>\n <div className={`pt-3 mb-n2 ${styles.videoList}`}>\n {videos?.map(video => {\n const videoAnalyticsData: HashObject = {\n ...seriesAnalyticsData,\n videoId: video.id,\n videoName: video.name\n };\n\n // insert parent series into video object\n video = {\n ...video,\n series: props.series\n };\n\n return (\n <div key={video.id} className='mb-2'>\n <VideoItem\n video={video}\n getVideoAppLink={props.getVideoAppLink}\n analyticsData={videoAnalyticsData}\n analyticsOptions={{\n entity: EntityType.Video,\n location: LocationContext.SeriesWithVideos\n }}\n size='sm'\n hasPermissions={props.hasPermissions}\n hideVideoGuidance\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n })}\n </div>\n <div className='text-end pt-3 pe-3'>\n <AppLink\n className='info-link fw-semibold'\n appLink={props.seriesAppLink}\n analyticsData={seriesAnalyticsData}\n analyticsOptions={{\n ...seriesAnalyticsOption,\n descriptor: ClickDescriptor.Link\n }}\n >\n <Text namespace={namespace} phrase='seeAllVideos' />\n </AppLink>\n </div>\n </div>\n </Col>\n </Row>\n </div>\n );\n}","import React from 'react';\n\nimport { Series } from 'libs/shared/interfaces';\n\nimport { SeriesWithVideos } from '../../series-with-videos/SeriesWithVideos';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function LargeSeriesResult(props: MixedSearchResultItemProps<Series>): JSX.Element {\n return (\n <div className='mx-n2'>\n <SeriesWithVideos\n presentationAudiences={props.audiences}\n series={props.item}\n seriesAppLink={props.appLinks.getSeriesAppLink(props.item)}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n preloadImage\n hasPermissions={props.hasPermissions}\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { AnalyticsOptions, HashObject } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { SeasonEpisode } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { Video } from 'libs/shared/interfaces';\n\nconst namespace = 'search.collectionVideoList';\n\ninterface CollectionVideoListProps {\n videos: Video[];\n collectionId: string;\n appLink: Core.AppLink;\n analyticsOptions: AnalyticsOptions;\n analyticsData?: HashObject;\n getVideoAppLink: (video: Video) => Core.AppLink;\n}\n\nfunction useGetMaxVideos(): number {\n const breakpoints = useBreakpoints();\n\n if (breakpoints.xs)\n return 2;\n\n if (breakpoints.sm)\n return 1;\n\n return 3;\n}\n\nexport function CollectionVideoList(props: CollectionVideoListProps): JSX.Element {\n const maxVideos = useGetMaxVideos();\n\n const analyticsProps = {\n analyticsData: props.analyticsData,\n analyticsOptions: props.analyticsOptions\n };\n\n return (\n <>\n <ul className='list-unstyled my-1'>\n {props.videos.slice(0, maxVideos).map(v => {\n const hasSeasonEpisode = !!v.episodeNumber && !!v.season?.id;\n\n return (\n <li key={`${props.collectionId}:${v.id}`} className='d-flex align-items-center'>\n <AppLink\n {...analyticsProps}\n className='clamp-1'\n appLink={props.getVideoAppLink(v)}\n >\n {hasSeasonEpisode && <><SeasonEpisode video={v} />&nbsp;</>}\n {v.name}\n </AppLink>\n </li>\n );\n })}\n </ul>\n\n <AppLink\n {...analyticsProps}\n className='info-link'\n appLink={props.appLink}\n >\n <Text namespace={namespace} phrase='seeAll' />\n </AppLink>\n </>\n );\n}","import React from 'react';\nimport { Col } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, ClickDescriptor } from 'libs/analytics/interfaces';\n\nimport { CollectionVideoList } from 'libs/shared/apps/search/components/collection-video-list/CollectionVideoList';\nimport { ActionOptions, Actions as ActionsComponent } from 'libs/shared/components/actions/Actions';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { BadgeListContainer } from 'libs/shared/components/badges/BadgeListContainer';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { Mask, MaskType } from 'libs/shared/components/mask/Mask';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoListHelper } from 'libs/shared/components/video-list/VideoListHelper';\nimport { ImageType } from 'libs/shared/enums/Images';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { Playlist, Series, Video } from 'libs/shared/interfaces';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\nimport { SeriesHelper } from 'libs/shared/utils/SeriesHelper';\n\nimport styles from './collection-thumbnail.module.scss';\n\nconst namespace = 'search.collectionThumbnail';\n\n\nexport type GetCollectionActions = (\n collection: Collection,\n showActions: boolean,\n collectionType: CollectionType,\n baseAnalyticsOptions: AnalyticsOptions\n) => ActionOptions[]\n\ntype Collection = Series | Playlist;\ntype CollectionType = 'series' | 'playlist';\n\ninterface CollectionThumbnailProps {\n collection: Collection;\n collectionType: CollectionType;\n appLink: Core.AppLink;\n showActions: boolean;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n maskType?: MaskType;\n imageFallbackType?: ImageFallbackType;\n hideBadges?: boolean;\n isPlugin: boolean;\n getCollectionActions: GetCollectionActions;\n getVideoAppLink: (video: Video, opts?: GetVideoAppLinkOptions) => Core.AppLink;\n}\n\nexport function CollectionThumbnail(props: CollectionThumbnailProps): JSX.Element {\n const breakpoints = useBreakpoints();\n const size = VideoListHelper.getSize(breakpoints, 'md');\n const isSmall = size === 'sm';\n\n const hasVideos = !!props.collection.videos?.data?.length;\n\n const firstVideoWithThumbnail = hasVideos && props.collection.videos.data.find(v => !!v.thumbnail?.url);\n\n function getAnalyticsData(): HashObject {\n const data: HashObject = {\n ...props.analyticsData,\n id: props.collection.id,\n name: props.collection.name\n };\n\n if (firstVideoWithThumbnail) {\n data.videoId = firstVideoWithThumbnail.id;\n data.videoName = firstVideoWithThumbnail.name;\n }\n\n return data;\n }\n\n const analyticsData = getAnalyticsData();\n const isSeries = props.collectionType === 'series';\n\n return (\n <div className={`row g-0 ${isSmall ? '' : 'py-2'}`}>\n <Col {...VideoListHelper.getThumbnailColumns()} className={`flex-column align-items-flex-start ${isSmall ? `pb-2 pe-2` : 'mb-1 px-2'}`}>\n <div className={`position-relative overflow-hidden ${isSmall ? 'rounded' : 'rounded-3'}`}>\n <BaseImage\n data={firstVideoWithThumbnail?.thumbnail}\n appLink={props.appLink}\n imageType={ImageType.Thumbnails}\n analyticsData={analyticsData}\n analyticsOptions={{\n ...props.analyticsOptions,\n descriptor: ClickDescriptor.Thumbnail\n }}\n >\n <Mask type={props.maskType} />\n <ImageFallback type={props.imageFallbackType} />\n \n <div className={`d-flex flex-column align-items-center justify-content-center text-white h-100 ${styles.overlay}`}>\n <Text namespace={namespace} phrase='seeAll' />\n </div>\n </BaseImage>\n </div>\n </Col>\n\n <Col {...VideoListHelper.getDetailsColumns()} className={isSmall ? 'pb-2' : 'px-2'}>\n {!props.isPlugin &&\n <ActionsComponent\n actions={props.getCollectionActions(\n props.collection,\n props.showActions,\n props.collectionType,\n props.analyticsOptions\n )}\n className='float-end mt-n1'\n actionsDropdownClassName='btn btn-link ms-1'\n />\n }\n\n <AppLink\n appLink={props.appLink}\n analyticsData={analyticsData}\n analyticsOptions={{\n ...props.analyticsOptions,\n descriptor: ClickDescriptor.Title\n }}\n >\n <h5 className='m-0 mb-1'><span className='clamp-1'>{props.collection.name}</span></h5>\n </AppLink>\n\n {isSeries && !props.hideBadges && (\n <BadgeListContainer>\n <Badge type={BadgeType.Rating} data={SeriesHelper.getRating((props.collection as Series))} />\n <Badge type={BadgeType.ProductionYear} data={(props.collection as Series).metadata?.year} />\n </BadgeListContainer>\n )}\n \n {hasVideos && (\n <CollectionVideoList\n collectionId={props.collection.id}\n videos={props.collection.videos.data}\n appLink={props.appLink}\n analyticsData={analyticsData}\n analyticsOptions={{\n ...props.analyticsOptions,\n descriptor: ClickDescriptor.Link\n }}\n getVideoAppLink={props.getVideoAppLink}\n />\n )}\n </Col>\n </div>\n );\n}","import React from 'react';\n\nimport { EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { MaskType } from 'libs/shared/components/mask/Mask';\nimport { Playlist } from 'libs/shared/interfaces';\n\nimport { CollectionThumbnail } from '../../collection-thumbnail/CollectionThumbnail';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nimport styles from '../mixed-search-results.module.scss';\n\nexport function SmallPlaylistResult(props: MixedSearchResultItemProps<Playlist>): JSX.Element {\n return (\n <div className={`position-relative ${styles.videoList}`}>\n <CollectionThumbnail\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n analyticsOptions={{\n entity: EntityType.Playlist,\n actionType: UserAction.Click,\n location: LocationContext.PlaylistListItem\n }}\n appLink={props.appLinks.getPlaylistAppLink(props.item)}\n showActions={props.showActions}\n collection={props.item}\n collectionType='playlist'\n maskType={MaskType.Playlist}\n imageFallbackType={ImageFallbackType.PlaylistThumbnail}\n isPlugin={props.commonVideoProps.isPlugin}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n getCollectionActions={props.appLinks.getCollectionActions}\n />\n </div>\n );\n}","import React from 'react';\n\nimport { EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { MaskType } from 'libs/shared/components/mask/Mask';\nimport { Series } from 'libs/shared/interfaces';\n\nimport { CollectionThumbnail } from '../../collection-thumbnail/CollectionThumbnail';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nimport styles from '../mixed-search-results.module.scss';\n\nexport function SmallSeriesResult(props: MixedSearchResultItemProps<Series>): JSX.Element {\n return (\n <div className={`position-relative ${styles.videoList}`}>\n <CollectionThumbnail\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n analyticsOptions={{\n entity: EntityType.Series,\n actionType: UserAction.Click,\n location: LocationContext.SeriesListItem\n }}\n appLink={props.appLinks.getSeriesAppLink(props.item)}\n collectionType='series'\n collection={props.item}\n showActions={props.showActions}\n maskType={MaskType.Series}\n imageFallbackType={ImageFallbackType.SeriesThumbnail}\n hideBadges\n isPlugin={props.commonVideoProps.isPlugin}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n getCollectionActions={props.appLinks.getCollectionActions}\n />\n </div>\n );\n}","// Maps to enum in SubjectApi but uses the\n// key rather than the value as SubjectsApi returns the key.\nexport enum ClassificationStatus {\n Draft = 'Draft',\n ComingSoon = 'ComingSoon',\n Published = 'Published'\n}","import * as React from 'react';\n\nimport { ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { CoverPillWidgetContentWrapper, CoverPillWidgetItemProps } from 'libs/shared/components/widgets/items/subject-widget-item/CoverPill';\nimport { TopicsConstants } from 'libs/shared/constants/TopicsConstants';\nimport { ClassificationStatus } from 'libs/shared/enums/ClassificationStatus';\nimport { Classification, Presentation } from 'libs/shared/interfaces';\n\nfunction usePresentationName(presentationId: string, availablePresentations: Presentation[]): string {\n const showPresentationName = availablePresentations?.length >= TopicsConstants.MULTI_PRESENTATION_THRESHOLD;\n\n if (!showPresentationName) {\n return undefined;\n }\n\n return availablePresentations?.find(p => p.id === presentationId)?.name;\n}\n\nfunction SubjectWidgetItem(props: CoverPillWidgetItemProps<Classification>): JSX.Element {\n const isComingSoon = props.data?.status === ClassificationStatus.ComingSoon;\n const presentationName = usePresentationName(props.data.presentationId, props?.availablePresentations);\n\n const analyticsData = {\n ...props.analyticsData,\n id: props.analyticsData?.id || props.data?.id,\n name: props.data?.name,\n presentationId: props.analyticsData?.presentationId || props.data.presentationId,\n comingSoon: !!isComingSoon\n };\n\n const analyticsOptions = {\n location: LocationContext.ClassificationListItem,\n entity: EntityType.Classification,\n ...props.analyticsOptions,\n actionType: UserAction.Click,\n descriptor: ClickDescriptor.Cover\n };\n\n return (\n <CoverPillWidgetContentWrapper\n {...props}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n coverUrl={props.data.cover?.url}\n coverBgColor={props.data?.metadata?.backgroundColor}\n subtitle={props.getSubtitle?.(props.data) || presentationName}\n isComingSoon={isComingSoon}\n themeColor={props.shouldHighlight?.(props.data) ? props.data?.metadata?.backgroundColor ?? '' : ''}\n />\n );\n}\n\nconst Memoized = React.memo(SubjectWidgetItem);\n\nexport { Memoized as SubjectWidgetItem };","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, HashObject, UserAction } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { EditSvg } from 'libs/shared/images/svg/actions/EditSvg';\n\nimport styles from './cover-pill.module.scss';\n\ninterface EditSubjectsWidgetLinkProps {\n appLink: Core.AppLink;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n}\n\nconst analyticsOptions: AnalyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.UserSetting,\n descriptor: ClickDescriptor.Tile\n};\n\nexport function EditSubjectsWidgetLink(props: EditSubjectsWidgetLinkProps): JSX.Element {\n const className =\n `${styles.editSubjectsItem} d-flex position-relative px-3 justify-content-center align-items-center`;\n\n return (\n <AppLink\n appLink={props.appLink}\n className='text-decoration-none'\n analyticsData={{ ...props.analyticsData, type: 'subject-preference' }}\n analyticsOptions={ { ...props.analyticsOptions, ...analyticsOptions }}\n >\n <div className={className}>\n <SvgContainer svg={EditSvg} className='me-2 align-middle d-inline-block svg-container' />\n <p className='h6 align-middle text-truncate'><Text namespace='shared.subjectWidgetItem' phrase='edit' /></p>\n </div>\n </AppLink>\n );\n}","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, HashObject, UserAction } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { ClickViewLogoInverted } from 'libs/shared/components/svgs/clickview-logo/ClickViewLogo';\nimport { Text } from 'libs/shared/components/text/Text';\n\nimport styles from './cover-pill.module.scss';\n\ninterface AllSubjectsWidgetLinkProps {\n appLink: Core.AppLink;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n}\n\nconst analyticsOptions: AnalyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.Url,\n descriptor: ClickDescriptor.Tile\n};\n\nexport function AllSubjectsWidgetLink(props: AllSubjectsWidgetLinkProps): JSX.Element {\n const className =\n `${styles.allSubjectsItem}\n d-flex flex-column position-relative px-2\n align-items-center justify-content-center text-nowrap bg-navy`;\n\n return (\n <AppLink\n appLink={props.appLink}\n className='text-decoration-none'\n analyticsData={{ ...props.analyticsData, type: 'subject-all' }}\n analyticsOptions={ { ...props.analyticsOptions, ...analyticsOptions }}\n >\n <div className={className}>\n <div className={styles.logoContainer}>\n <ClickViewLogoInverted />\n </div>\n <p className='h6 pt-2 px-3 mb-0'><Text namespace='shared.subjectWidgetItem' phrase='all' /></p>\n </div>\n </AppLink>\n );\n}\n","import React from 'react';\nimport { Col } from 'react-bootstrap';\n\nimport { SubjectWidgetItem } from 'libs/shared/components/widgets/items/subject-widget-item';\nimport { Classification } from 'libs/shared/interfaces';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function SubjectResult(props: MixedSearchResultItemProps<Classification>): JSX.Element {\n return (\n <Col as='li' sm={6} md={props.useLargeStyle ? 6 : 4} lg={props.useLargeStyle ? 4 : 3}>\n <div className={`position-relative px-1 mb-2`}>\n <SubjectWidgetItem\n data={props.item}\n getChildAppLink={props.appLinks.getClassificationAppLink}\n getChildAppLinkOptions={\n () => props.appLinks.getClassificationAppLinkOptions?.(props.item)\n }\n availablePresentations={props.availablePresentations}\n analyticsData={{\n itemIndex: props.itemIndex,\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: 0\n }}\n isLarge={props.useLargeStyle}\n highlightOnHover={props.commonVideoProps.showNewVideoIndicator}\n />\n </div>\n </Col>\n );\n}","import React from 'react';\n\nimport { ClipItem, ClipItemProps } from 'libs/shared/components/video-list/clip-item/ClipItem';\nimport { InteractiveItem, InteractiveItemProps } from 'libs/shared/components/video-list/interactive-item/InteractiveItem';\nimport { VideoItem, VideoItemProps } from 'libs/shared/components/video-list/video-item/VideoItem';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nimport styles from '../mixed-search-results.module.scss';\n\nexport function VideoResult(props: MixedSearchResultItemProps<VideoTypes>): JSX.Element {\n function getItemComponent(\n video: VideoTypes\n ): (props: ClipItemProps | InteractiveItemProps | VideoItemProps) => JSX.Element {\n if (VideoHelper.isClip(video))\n return ClipItem;\n \n if (VideoHelper.isInteractive(video))\n return InteractiveItem;\n \n return VideoItem;\n }\n\n const Component = getItemComponent(props.item);\n\n return (\n <div className={`position-relative ${styles.videoList}`}>\n <Component\n video={props.item}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n getPreviewQuestionsAppLink={props.appLinks.getPreviewQuestionsAppLink}\n presentationAudiences={props.audiences}\n analyticsData= {{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n hasPermissions={props.hasPermissions}\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n}","import React from 'react';\nimport { Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { Classification, Company, CurrentUser, InteractiveMetadata, Playlist, Presentation, PresentationAudience, Series, Video } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { SearchResultObjectTypes, SearchResults, SearchResultsObject } from '../../interfaces';\nimport { GetCollectionActions } from '../collection-thumbnail/CollectionThumbnail';\n\nimport { CompanyResult } from './components/CompanyResult';\nimport { ExchangeVideoGroup } from './components/exchange-video-group/ExchangeVideoGroup';\nimport { FeaturedVideoResult } from './components/FeaturedVideoResult';\nimport { LargePlaylistResult } from './components/LargePlaylistResults';\nimport { LargeSeriesResult } from './components/LargeSeriesResult';\nimport { BaseMixedSearchResultItemProps } from './components/MixedSearchResultItemProps';\nimport { SmallPlaylistResult } from './components/SmallPlaylistResult';\nimport { SmallSeriesResult } from './components/SmallSeriesResults';\nimport { SubjectResult } from './components/SubjectResult';\nimport { VideoResult } from './components/VideoResult';\n\nconst namespace = 'shared.mixedSearchResults';\n\nconst TOPIC_DISPLAY_LIMIT = 8;\n\nexport interface MixedSearchResultAppLinks {\n getVideoAppLink: (video: Video, opts: GetVideoAppLinkOptions) => Core.AppLink;\n getSeriesAppLink: (series: Series) => Core.AppLink;\n getCompanyAppLink: (company: Company) => Core.AppLink;\n getCompanyAppLinkOptions?: (company: Company) => Core.AppLinkOptions;\n getClassificationAppLink: (classification: Classification) => Core.AppLink;\n getClassificationAppLinkOptions?: (classification: Classification) => Core.AppLinkOptions;\n getPlaylistAppLink: (playlist: Playlist) => Core.AppLink;\n getPreviewQuestionsAppLink: (interactive: InteractiveMetadata) => Core.AppLink;\n getCollectionActions: GetCollectionActions;\n searchSettings?: Core.AppLink;\n}\n\ninterface MixedSearchResultsProps {\n queryParams: HashObject;\n results: SearchResultObjectTypes[];\n topics?: SearchResults;\n companies?: SearchResults;\n audiences: PresentationAudience[];\n currentUser: CurrentUser;\n availablePresentations: Presentation[]\n showActions: boolean;\n hasPermissions: HasPermissionsFunc;\n appLinks: MixedSearchResultAppLinks;\n commonVideoProps: CommonVideoProps;\n}\n\nexport const MixedSearchResults = React.memo(function(props: MixedSearchResultsProps): JSX.Element {\n const breakpoints = useBreakpoints();\n const useSmallComponent = breakpoints.xs || breakpoints.sm;\n\n if (!props.results?.length && !props.topics?.totalResults && !props.companies?.totalResults)\n return <></>;\n\n const companiesAndTopics = [\n ...props.companies?.results ?? [],\n ...props.topics?.results ?? []\n ];\n\n const childProps: BaseMixedSearchResultItemProps = {\n useLargeStyle: companiesAndTopics.length < 4,\n ...props\n };\n\n return (\n <div className='position-relative'>\n <p role='status' className='visually-hidden'><Text namespace={namespace} phrase='ariaSearch' /></p>\n\n {!!companiesAndTopics.length && (\n <Row as='ul' className='list-unstyled g-0 pb-3 mx-n1'>\n {companiesAndTopics.slice(0, TOPIC_DISPLAY_LIMIT).map((c, itemIndex) => {\n switch (c.type.toLowerCase()) {\n case 'company':\n return (\n <CompanyResult\n key={itemIndex}\n item={c as SearchResultsObject<Company>}\n itemIndex={itemIndex}\n {...childProps}\n />\n );\n case 'subject': {\n return (\n <SubjectResult\n key={itemIndex}\n item={c as SearchResultsObject<Classification>}\n itemIndex={itemIndex}\n {...childProps}\n />\n );\n }\n }\n })}\n </Row>\n )}\n\n {props.results?.map((result, index) => {\n const pagePositionIndex = companiesAndTopics.length ? index + 1 : index;\n\n if ('isExchangeVideoGroup' in result && result.isExchangeVideoGroup) {\n return (\n <ExchangeVideoGroup\n key={index}\n item={result}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n \n\n switch (result.type?.toLowerCase()) {\n case 'interactive':\n case 'clip':\n case 'video': {\n if (index === 0 && result._featured && VideoHelper.isVideo(result)) {\n return (\n <FeaturedVideoResult\n key={index}\n item={result as SearchResultsObject<Video>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n return (\n <VideoResult\n key={index}\n item={result as SearchResultsObject<Video>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n case 'playlist': {\n if (useSmallComponent) {\n return (\n <SmallPlaylistResult\n key={index}\n item={result as SearchResultsObject<Playlist>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n return (\n <LargePlaylistResult\n key={index}\n item={result as SearchResultsObject<Playlist>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n case 'series': {\n const series = result as Series;\n\n if (useSmallComponent || !series.tallPoster?.id) {\n return (\n <SmallSeriesResult\n key={index}\n item={result as SearchResultsObject<Series>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n return (\n <LargeSeriesResult\n key={index}\n item={result as SearchResultsObject<Series>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n }\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 { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'search.searchSubstitute';\n\ninterface SearchSubstituteProps {\n substitute: string;\n queryParams: HashObject;\n getAppLink: (query: string, queryParams: HashObject) => Core.AppLink\n}\n\nexport function SearchSubstitute(props: SearchSubstituteProps): JSX.Element {\n if (!props.substitute)\n return <></>;\n\n return (\n <div className='pb-3'>\n <p className='mb-1 h6'>\n <Text namespace={namespace} phrase='showingFor' />&nbsp;\n <AppLink\n className='info-link'\n appLink={props.getAppLink(props.substitute, props.queryParams)}\n appLinkOptions={{ replace: true }}\n >\n {props.substitute}\n </AppLink>\n </p>\n <p className='mb-0 h6 fw-normal'>\n <Text namespace={namespace} phrase='searchInsteadFor' />\n <AppLink\n className='info-link'\n appLink={props.getAppLink(props.queryParams.query, { ...props.queryParams, allowSubstitute: 'false' })}\n >\n {props.queryParams.query}\n </AppLink>\n <Text namespace={namespace} phrase='endOriginal' />\n </p>\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'search.searchSuggestions';\n\ninterface SearchSuggestionsProps {\n suggestions: string[];\n queryParams: HashObject;\n getAppLink: (query: string, queryParams: HashObject) => Core.AppLink\n}\n\nSearchSuggestions.defaultProps = {\n suggestions: [],\n queryParams: {}\n};\n\nexport function SearchSuggestions(props: SearchSuggestionsProps): JSX.Element {\n if (!props.suggestions?.length)\n return <></>;\n\n return (\n <div className='d-flex align-items-center mb-3'>\n <Text namespace={namespace} phrase='didYouMean' />\n &nbsp;\n\n {props.suggestions.map((suggestion, index) => (\n <React.Fragment key={`${suggestion}:${index}`}>\n {index !== 0 && <span className='mx-1'>&bull;</span>}\n\n <AppLink\n className='info-link'\n appLink={props.getAppLink(suggestion, props.queryParams)}\n appLinkOptions={{ replace: true }}\n >\n {suggestion}\n </AppLink>\n </React.Fragment>\n ))}\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { FilterConstants } from 'libs/shared/apps/search/constants/FilterConstants';\nimport { SearchIndices } from 'libs/shared/apps/search/interfaces';\nimport { FilterHelper, Filters } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { Library, MasterNestedObject, Playlist, Rating, Series, Video } from 'libs/shared/interfaces';\n\nimport { Actions } from 'shared/constants/ExchangeActions';\nimport { AppChannels } from 'shared/constants/ExchangeRadioChannels';\n\nexport const ExchangeSearchUtils = {\n useOnFilterChange(fetchResults: (cursor?: string) => void, queryParams: HashObject): void {\n const params = { ...queryParams };\n delete params.query;\n \n const sortedValues = Object.keys(params).map(filterName => params[filterName]).sort((a, b) => a - b);\n \n React.useEffect(() => {\n fetchResults();\n }, [sortedValues.join(':')]);\n },\n\n getCollectionActions(\n collection: Series | Playlist,\n showActions: boolean,\n collectionType: 'series' | 'playlist',\n baseAnalyticsOptions: AnalyticsOptions\n ): ActionOptions[] {\n collection;\n collectionType;\n baseAnalyticsOptions;\n\n if (!showActions)\n return [];\n\n return [];\n },\n\n getSeriesAppLink(series: Series): Core.AppLink {\n if (!series?.id)\n return null;\n\n return {\n application: AppChannels.EXCHANGE,\n action: Actions.Exchange.SERIES,\n args: [ series.id, TextHelper.slugify(series.name) ]\n };\n },\n\n getVideoAppLink(video: Video): Core.AppLink {\n if (!video?.id)\n return null;\n\n return {\n application: AppChannels.EXCHANGE,\n action: Actions.Exchange.PREVIEW,\n args: [ video.id, TextHelper.slugify(video.name) ]\n };\n },\n\n getAppliedIndices(queryParams: HashObject = {}): SearchIndices[] {\n const { type: indices } = queryParams;\n\n if (indices) {\n if (!Array.isArray(indices))\n return [indices];\n\n if (indices.length)\n return indices;\n }\n\n return ['video'];\n },\n\n getNestedCategoryIds(topLevelCategoryIds: string | string[], categories: MasterNestedObject<Library>[]) {\n const searchNestedCategories = (categoryId: string) => {\n const categoryIds: string[] = [];\n const category = categories.find(category => +category.data.id === +categoryId);\n\n if (!category?.children.length)\n return [categoryId];\n \n const searchCategoryIds = (category: MasterNestedObject<Library>) => {\n if (!category) return;\n \n if (category.data) {\n categoryIds.push(category.data.id);\n }\n \n if (category.children.length) {\n category.children.forEach(child => {\n searchCategoryIds(child);\n });\n }\n };\n \n searchCategoryIds(category);\n \n return categoryIds;\n };\n\n if (!Array.isArray(topLevelCategoryIds)) {\n return searchNestedCategories(topLevelCategoryIds);\n }\n \n const nestedCategoryIds = [...topLevelCategoryIds].map(categoryId => searchNestedCategories(categoryId));\n\n return ArrayHelper.flatten(nestedCategoryIds);\n },\n\n buildBackendFilterParams(\n libraryId: string,\n queryParams: HashObject,\n ratings: Rating[] = [],\n categories: MasterNestedObject<Library>[]\n ): HashObject {\n const topLevelCategoryIds = queryParams?.categoryId;\n const nestedCategories = topLevelCategoryIds && this.getNestedCategoryIds(topLevelCategoryIds, categories);\n\n const filters = FilterHelper.buildBackendFilterParams(\n { ...queryParams, categoryId: nestedCategories },\n ratings,\n null,\n false,\n []\n );\n\n // TODO: Filtering the search results means that we can't search for series, clips and interactives\n filters[`${FilterConstants.FILTER_PARAM_PREFIX}library`] = libraryId;\n\n return filters;\n },\n\n getBackendFilters(options: {\n queryParams: HashObject;\n ratings: Flight.Response<Rating[]>;\n exchange: Flight.Response<Library>;\n categories: Flight.Response<MasterNestedObject<Library>[]>;\n hasDataLoaded: boolean;\n }) {\n if (!options.hasDataLoaded)\n return null;\n\n const { queryParams, ratings, exchange, categories } = options;\n \n const backendFilters = ExchangeSearchUtils.buildBackendFilterParams(\n exchange.data.id,\n queryParams,\n ratings.data,\n categories.data\n );\n \n const appliedIndices = ExchangeSearchUtils.getAppliedIndices(queryParams);\n \n return {\n queryParams,\n backendFilters,\n appliedIndices\n };\n },\n\n getFilters(\n options: {\n categories: Flight.Response<MasterNestedObject<Library>[]>;\n ratings: Flight.Response<Rating[]>;\n hasDataLoaded: boolean;\n },\n tagsAndClassifications: Flight.Response<string[]>\n ) {\n if (!options.hasDataLoaded || !tagsAndClassifications.hasCompleted)\n return null;\n\n const { categories, ratings } = options;\n\n const mainFilters = [\n Filters.Categories(categories.data),\n Filters.Rating(ratings.data, null),\n Filters.HasResources(),\n Filters.HasSubtitles(),\n Filters.TagOrClassification(tagsAndClassifications.data)\n ];\n \n const moreFilters = FilterHelper.getMoreFilters([\n Filters.ProductionYear(),\n Filters.IsHD(),\n Filters.Duration()\n ]);\n\n return {\n mainFilters,\n moreFilters\n };\n },\n\n getAppLink(query: string, queryParams: HashObject): Core.AppLink {\n return {\n application: AppChannels.EXCHANGE,\n action: Actions.Exchange.SEARCH,\n params: {\n ...queryParams,\n query\n }\n };\n }\n};","import React from 'react';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nimport { Actions } from 'shared/constants/ExchangeActions';\nimport { AppChannels } from 'shared/constants/ExchangeRadioChannels';\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nconst namespace = 'exchange.searchResultsEmptyState';\n\ninterface ExchangeSearchResultsStateProps {\n query?: string;\n}\n\nexport function ExchangeSearchResultsState(props: ExchangeSearchResultsStateProps): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={ImageUrls.EmptyStates.SEARCH} />\n\n <EmptyState.Heading>\n {props.query\n ? <Text phrase='headingWithQuery' options={{ query: props.query }} />\n : <Text phrase='headingWithoutQuery' />\n }\n </EmptyState.Heading>\n\n <EmptyState.Info>\n <Text phrase='info' />\n <AppLink\n className='info-link'\n appLink={{ application: AppChannels.EXCHANGE, action: Actions.Exchange.INDEX }}\n >\n <Text phrase='topicsAppLink' />\n </AppLink>\n </EmptyState.Info>\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}","import { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { RatingRequests } from 'libs/shared/flight-requests/RatingRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { CurrentUser, Library, MasterNestedObject, Rating } from 'libs/shared/interfaces';\n\nimport { ExchangeRequests } from 'apps/exchange/flight-requests/ExchangeRequests';\n\nexport function useFetchSearchData(queryParams: HashObject) {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const exchange = Flight.useBasicFetch<Library>(ExchangeRequests.exchange());\n const ratings = Flight.useBasicFetch<Rating[]>(RatingRequests.ratings());\n const categories = Flight.useBasicFetch<MasterNestedObject<Library>[]>(ExchangeRequests.categories());\n\n const hasDataLoaded = (\n currentUser.hasCompleted &&\n exchange.hasCompleted &&\n ratings.hasCompleted &&\n categories.hasCompleted\n );\n\n return {\n queryParams,\n currentUser,\n exchange,\n ratings,\n categories,\n hasDataLoaded\n };\n}","import { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { HashObject } from 'libs/analytics/interfaces';\n\nimport { SearchIndices, SearchResultObjectTypes, SearchResults } from 'libs/shared/apps/search/interfaces';\nimport { handleHttpError } from 'libs/shared/errors/handlers/HttpErrorHandlers';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useInfiniteList } from 'libs/shared/hooks/UseInfiniteList';\n\nimport { ExchangeRequests } from 'apps/exchange/flight-requests/ExchangeRequests';\n\nexport const namespace = 'exchange.searchResultsView2';\n\ninterface UseGetSearchResultsOptions {\n queryParams: HashObject;\n appliedIndices: SearchIndices[];\n backendFilters: HashObject;\n hasDataLoaded: boolean;\n}\nexport function useGetSearchResults(options: UseGetSearchResultsOptions) {\n const { queryParams, appliedIndices, backendFilters } = options;\n\n const alerts = useAlerts();\n const fetch = Flight.useGetFetch();\n\n const searchResultsResponse = Flight.useGetResponse<SearchResults>(getSearchRequest()?.key);\n\n function getSearchRequest(cursor?: string) {\n return options.hasDataLoaded &&\n ExchangeRequests.search(queryParams.query, appliedIndices, backendFilters, cursor);\n }\n\n function fetchNext(cursor?: string) {\n fetch(getSearchRequest(cursor));\n }\n\n function onError(pageNumber: number, httpStatus: HttpStatus): void {\n if (pageNumber === 1)\n return handleHttpError(httpStatus);\n\n alerts.error(LanguageService.getPhrase(namespace, 'error'));\n }\n\n const searchResults = useInfiniteList<SearchResultObjectTypes, SearchResults>(\n getSearchRequest,\n fetchNext,\n onError,\n data => data.results\n );\n\n return {\n ...searchResults,\n fetchNext,\n substituteQuery: searchResultsResponse.data?.substituteQuery,\n suggestions: searchResultsResponse.data?.suggestions\n };\n}\n","import { SharedWithStatements } from 'libs/shared/constants/WithStatements';\nimport { TagType } from 'libs/shared/enums/TagType';\n\n/**\n * OGQL used for search V5 endpoint\n */\nexport const SearchOGQL = {\n video: SharedWithStatements.VIDEO_COLLECTION,\n series: 'rating,tallPoster',\n playlist:\n 'videos[count(),thumbnail]{limit:1},interactives[count(),_thumbnail]{limit:1},' +\n 'clips[count(),_thumbnail]{limit:1}',\n classification: `_theme[banner,cover,tallposter,thumbnail,icon],cover,thumbnail,tags{tagtype:${TagType.Curation}}`,\n clip: SharedWithStatements.CLIP_COLLECTION,\n interactive: SharedWithStatements.INTERACTIVE_COLLECTION,\n company: 'logo',\n category: 'libraries[_logo],thumbnail',\n partner_profile: SharedWithStatements.PARTNER_PROFILE\n};\n","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { 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';\n\nimport { FilterConstants } from 'libs/shared/apps/search/constants/FilterConstants';\nimport { SearchOGQL } from 'libs/shared/apps/search/constants/SearchOGQL';\nimport { SearchIndices, SearchResultObjectTypes, SearchResults, SearchResultsObject } from 'libs/shared/apps/search/interfaces';\nimport type { WidgetFilter } from 'libs/shared/apps/search/interfaces/WidgetSearchResults';\nimport { SharedSearchHelper } from 'libs/shared/apps/search/utils/SharedSearchHelper';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport type { Playlist, Series } from 'libs/shared/interfaces';\nimport { ThemeAssetHelper } from 'libs/shared/utils/ThemeAssetHelper';\n\nfunction formatSearchResponse(response: SearchResults<SearchResultObjectTypes>) {\n /**\n * Until playlists and series are regionalised, search will always return every series/playlist that exists\n * even if the current user doesn't have access to the content inside (which will happen for example when playlists/series)\n * contain all UK library content but is being searched for by an AU user.\n *\n * For some search queries, this may result in search showing a bunch of \"empty\" playlists/series, which sucks.\n * This will filter all empty collections out and decrement the `totalResults` to avoid this and make search a better\n * experience.\n *\n * Ideally this will be removed one day when this regionalisation is no longer an issue.\n */\n let totalResults = response.totalResults;\n\n const results = response?.results?.filter(result => {\n if (result._index !== 'series' && result._index !== 'playlist')\n return true;\n\n if (result._index === 'playlist') {\n const playlist = result as SearchResultsObject<Playlist>;\n\n if (playlist.clips?.data?.length ||\n playlist.interactives?.data?.length ||\n playlist.videos?.data?.length)\n return true;\n\n totalResults--;\n return false;\n }\n\n if ((result as SearchResultsObject<Series>).videos?.data?.length === 0) {\n totalResults--;\n return false;\n }\n\n return true;\n }) ?? [];\n\n response.results = results;\n response.totalResults = totalResults;\n\n // The first search result will always have the highest score value.\n // We store it so that we can access it for subsequent results pages\n const resultMaxScore = results[0]?._score;\n\n return {\n ...response,\n results: SharedSearchHelper.mapMaxScoreToSearchResults(results, resultMaxScore)\n };\n}\n\nfunction stringifyObject(obj: HashObject): string {\n return Object.entries(obj).reduce((prev, [ , value ]) => {\n let stringifiedValue = value;\n\n if (typeof value === 'object') {\n stringifiedValue = stringifyObject(value);\n } else if ([ 'number', 'boolean', 'string' ].includes(typeof value)) {\n stringifiedValue = value.toString();\n }\n\n if (!prev.length)\n return stringifiedValue;\n\n return `${prev},${stringifiedValue}`;\n }, '');\n}\n\n/**\n * We want to map the filters to the global filters object but we need to remove the filter prefix\n * and exclude the presentation filter\n */\nfunction getGlobalFilters(filters: HashObject, widgetTypeId: WidgetTypeId | null): Record<string, any> {\n return Object.entries(filters)\n .reduce((prev, [ key, value ]) => {\n const actualKey = key.replace(FilterConstants.FILTER_PARAM_PREFIX, '');\n if (actualKey === 'presentation' &&\n widgetTypeId !== WidgetTypeId.SearchTopResults &&\n widgetTypeId !== WidgetTypeId.SearchRelatedResults &&\n widgetTypeId !== WidgetTypeId.SearchSeries\n ) {\n return prev;\n }\n\n return { ...prev, [actualKey]: value };\n }, {});\n}\n\n\nexport const SharedSearchRequests = {\n searchDashboard(\n query: string,\n filters: HashObject,\n widgets: WidgetFilter[] = []\n ): Flight.PublicRequest {\n const widgetData = widgets.sort((a, b) => a.id.localeCompare(b.id)).map(w => [ w.id, w?.cursor ]);\n const filterData = stringifyObject(filters);\n \n const key = `search:v5:dashboard:${query}:${widgetData}:${filterData}`;\n \n const {\n [`${FilterConstants.FILTER_PARAM_PREFIX}indicesFilters`]: indicesFilter,\n isLearner,\n ...genericFilters\n } = filters;\n\n const data = {\n widgets,\n indices: indicesFilter,\n filters: getGlobalFilters(genericFilters, null),\n query,\n includeAllIndices: false,\n isLearner: !!isLearner\n };\n\n return {\n url: '{gateway}/v5/search/widgets',\n publicUrl: '/api/search/v5/widgets',\n type: HttpVerbs.POST,\n data,\n key\n };\n },\n\n searchDashboardWidget(\n widgetTypeId: WidgetTypeId,\n query: string,\n filters: HashObject,\n widgets: WidgetFilter[] = []\n ): Flight.PublicRequest {\n const widgetData = widgets.sort((a, b) => a.id.localeCompare(b.id)).map(w => [ w.id, w?.cursor ]);\n const filterData = stringifyObject(filters);\n \n const key = `search:v5:dashboard:${widgetTypeId}:widget:${query}:${widgetData}:${filterData}`;\n \n const {\n [`${FilterConstants.FILTER_PARAM_PREFIX}indicesFilters`]: indicesFilter,\n isLearner,\n excludeVideoIds,\n ...genericFilters\n } = filters;\n\n const data = {\n widgets,\n indices: indicesFilter,\n filters: getGlobalFilters(genericFilters, widgetTypeId),\n query,\n includeAllIndices: false,\n isLearner: !!isLearner,\n ogql: SearchOGQL,\n excludeVideoIds\n };\n\n return {\n url: `{gateway}/v5/search/widgets/${widgetTypeId}`,\n publicUrl: `/api/search/v5/widgets/${widgetTypeId}`,\n type: HttpVerbs.POST,\n data,\n key,\n formatData: (data: HashObject) => {\n if (!data)\n return data;\n\n return {\n ...data,\n content: data.content?.data\n ? { ...data.content, data: data.content.data.map(ThemeAssetHelper.applyThemeToClassification) }\n : data.content\n };\n }\n };\n },\n\n searchV5(\n query: string,\n filters: HashObject,\n widgets: WidgetFilter[] = []\n ): Flight.PublicRequest {\n const widgetData = widgets.sort((a, b) => a.id.localeCompare(b.id)).map(w => [ w.id, w?.cursor ]);\n const filterData = stringifyObject(filters);\n \n const key = `search:v5:${query}:${widgetData}:${filterData}`;\n \n const {\n [`${FilterConstants.FILTER_PARAM_PREFIX}indicesFilters`]: indicesFilter,\n isLearner,\n ...genericFilters\n } = filters;\n\n const data = {\n widgets,\n indices: indicesFilter,\n filters: Object.entries(genericFilters)\n .reduce((prev, [ key, value ]) =>\n ({ ...prev, [key.replace('filters.', '')]: value }), {}),\n query,\n includeAllIndices: false,\n isLearner: !!isLearner,\n ogql: SearchOGQL\n };\n\n return {\n url: '{gateway}/v5/search',\n publicUrl: '/api/search/v5',\n type: HttpVerbs.POST,\n data,\n key\n };\n },\n \n searchV4(options: {\n query: string;\n indices: SearchIndices[];\n filters: HashObject;\n sorts?: HashObject;\n allowSubstitute: boolean;\n cursor?: string;\n limit?: number;\n }): Flight.PublicRequest {\n const { query, indices, filters = {}, sorts = {}, allowSubstitute = true, cursor, limit } = options;\n\n let key = `search:v4:${query}:${allowSubstitute}:${indices}:${cursor}`;\n\n key += Object.keys(filters).map(filterName => {\n const filter = filters[filterName];\n return Array.isArray(filter) ? filter.join(';') : filter;\n }).join(';');\n\n const {\n [`${FilterConstants.FILTER_PARAM_PREFIX}excludeLibraryExclusive`]: excludeLibraryExclusive,\n isLearner,\n ...genericFilters\n } = filters;\n\n const indexObjects = indices.map(index => {\n if (index !== 'video' || !excludeLibraryExclusive)\n return { index };\n\n return { index, filters: { excludeLibraryExclusive } };\n });\n\n const data = {\n searchType: 'content',\n indices: indexObjects,\n filters: Object.entries(genericFilters)\n .reduce((prev, [ key, value ]) =>\n ({ ...prev, [key.replace('filters.', '')]: value }), {}),\n sorts,\n query,\n allowSubstitute,\n cursor: cursor ?? undefined,\n isLearner: !!isLearner,\n limit\n };\n\n return {\n url: '{gateway}/v4/search',\n publicUrl: '/api/search/v4',\n type: HttpVerbs.POST,\n data,\n key,\n formatData: formatSearchResponse\n };\n },\n\n search(options: {\n query: string;\n indices: SearchIndices[];\n filters?: HashObject;\n allowSubstitute?: boolean;\n cursor?: string;\n limit?: number;\n success?: (results: SearchResults) => void;\n error?: (xhr: Xhr) => void;\n }): Flight.PublicRequest {\n const { query, indices, filters, allowSubstitute, cursor, limit, success, error } = options;\n\n let key = `search:${query}:${allowSubstitute}:${indices}:${cursor}`;\n\n key += Object.keys(filters).map(filterName => {\n const filter = filters[filterName];\n return Array.isArray(filter) ? filter.join(';') : filter;\n }).join(';');\n\n const params = Object.assign({}, {\n index: indices,\n cursor: cursor ?? undefined,\n query,\n allowSubstitute,\n limit,\n ...filters\n });\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v3/search', params),\n publicUrl: UrlHelper.urlBuilder('/api/search', params),\n key,\n formatData: formatSearchResponse,\n success,\n error\n };\n },\n\n tagsAndClassifications(\n query: string,\n indices: SearchIndices[],\n filters: HashObject = {},\n cursor?: string,\n success?: (results: string[]) => void,\n error?: () => void\n ): Flight.PublicRequest {\n const params = {\n index: indices,\n cursor,\n query,\n ...filters\n };\n\n let key = `filter:options:${query}:${indices.join(':')}:${cursor}`;\n\n key += Object.keys(filters).map(filterName => {\n const filter = filters[filterName];\n return Array.isArray(filter) ? filter.join(';') : filter;\n }).join(';');\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v3/search/tags-and-classifications', params),\n publicUrl: UrlHelper.urlBuilder('/api/search/tags-and-classifications', params),\n key,\n success,\n error,\n normalize: false\n };\n }\n};","import { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { SharedSearchRequests } from 'libs/shared/apps/search/flight-requests/SharedSearchRequests';\nimport { SearchIndices } from 'libs/shared/apps/search/interfaces';\n\nexport interface UseGetTagsAndClassificationsOptions {\n queryParams: HashObject;\n appliedIndices: SearchIndices[];\n backendFilters: HashObject;\n}\n\nexport function useGetTagsAndClassifications(options: UseGetTagsAndClassificationsOptions) {\n return Flight.useBasicFetch<string[]>(options && SharedSearchRequests.tagsAndClassifications(\n options.queryParams.query,\n options.appliedIndices,\n options.backendFilters\n ));\n}\n","import React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { EntityType, LocationContext } from 'libs/analytics/interfaces';\n\nimport { MixedSearchResults } from 'libs/shared/apps/search/components/mixed-search-results/MixedSearchResults';\nimport { SearchFilters } from 'libs/shared/apps/search/components/search-filters/SearchFilters';\nimport { SearchSubstitute } from 'libs/shared/apps/search/components/search-substitute/SearchSubstitute';\nimport { SearchSuggestions } from 'libs/shared/apps/search/components/search-suggestions/SearchSuggestions';\nimport { InfiniteScrollFooter } from 'libs/shared/components/infinite-scroll-footer/InfiniteScrollFooter';\nimport { PartialVideoList } from 'libs/shared/components/video-list/partial-loading/PartialVideoList';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\n\nimport { Actions } from 'shared/constants/ExchangeActions';\nimport { AppChannels } from 'shared/constants/ExchangeRadioChannels';\n\nimport { ExchangeSearchBar } from 'apps/exchange/components/exchange-search-bar/ExchangeSearchBar';\nimport { useCommonVideoProps } from 'apps/exchange/hooks/useCommonVideoProps';\nimport { useGetExchangeActions } from 'apps/exchange/hooks/useGetExchangeActions';\nimport { ExchangeSearchUtils } from 'apps/exchange/views/exchange-search-results/ExchangeSearchUtils';\n\nimport { ExchangeSearchResultsState } from './empty-state/ExchangeSearchEmptyState';\nimport { useFetchSearchData } from './useFetchSearchData';\nimport { useGetSearchResults } from './useGetSearchResults';\nimport { useGetTagsAndClassifications } from './useGetTagsAndClassifications';\n\ninterface ExchangeSearchResultsViewProps {\n queryParams: HashObject;\n}\n\n\nexport function ExchangeSearchResultsView(props: ExchangeSearchResultsViewProps): JSX.Element {\n const { queryParams = {} } = props;\n\n const videoActions = useGetExchangeActions('video-list');\n\n const searchData = useFetchSearchData(queryParams);\n\n const { commonVideoProps } = useCommonVideoProps();\n\n const searchFilters = ExchangeSearchUtils.getBackendFilters(searchData);\n\n const tagsAndClassifications = useGetTagsAndClassifications(searchFilters);\n const searchResults = useGetSearchResults({ ...searchFilters, ...searchData });\n\n const filters = ExchangeSearchUtils.getFilters(searchData, tagsAndClassifications);\n\n /**\n * Custom hooks\n */\n useSetPageMetadata({ title: queryParams.query ?? '' });\n\n\n /**\n * Do we have the data we need for the entire view to render\n */\n const hasLoaded = (\n searchData.hasDataLoaded && filters\n );\n\n /**\n * Do we have the data we need to render our results\n */\n const hasSearchCompleted = (\n searchResults.hasFirstPageCompleted &&\n // Topic and Company requests won't exist if they aren't being fetched\n tagsAndClassifications.hasCompleted &&\n !!filters\n );\n\n /**\n * Do we actually have results\n */\n const hasResults = (\n searchResults.items?.length\n );\n\n if (!hasLoaded)\n return <></>;\n\n return (\n <>\n <ExchangeSearchBar query={queryParams.query} />\n\n <SearchSubstitute\n substitute={searchResults.substituteQuery}\n queryParams={queryParams}\n getAppLink={ExchangeSearchUtils.getAppLink}\n />\n\n {!searchResults.substituteQuery && (\n <SearchSuggestions\n suggestions={searchResults?.suggestions}\n queryParams={queryParams}\n getAppLink={ExchangeSearchUtils.getAppLink}\n />\n )}\n\n <SearchFilters\n queryParams={queryParams}\n mainFilters={filters?.mainFilters}\n moreFilters={filters?.moreFilters}\n analyticsOptions={{\n entity: EntityType.SearchResults,\n location: LocationContext.SearchFilters\n }}\n appLink={{ application: AppChannels.EXCHANGE, action: Actions.Exchange.SEARCH }}\n isFetchingOptions={tagsAndClassifications.isFetching}\n />\n\n {hasSearchCompleted ? (\n <section>\n {hasResults\n ? (\n <VideoActionsContext.Provider value={videoActions}>\n {/* // TODO: Update the prop interfaces for mixed search results to be strongly typed for each use case */}\n <MixedSearchResults\n queryParams={queryParams.query}\n results={searchResults.items}\n audiences={null}\n currentUser={searchData.currentUser.data}\n availablePresentations={null}\n showActions\n companies={null}\n hasPermissions={() => false}\n appLinks={{\n getCollectionActions: ExchangeSearchUtils.getCollectionActions,\n getSeriesAppLink: ExchangeSearchUtils.getSeriesAppLink,\n getVideoAppLink: ExchangeSearchUtils.getVideoAppLink,\n getClassificationAppLink: () => null,\n getClassificationAppLinkOptions: () => null,\n getPlaylistAppLink: () => null,\n getCompanyAppLink: () => null,\n getPreviewQuestionsAppLink: () => null\n }}\n commonVideoProps={commonVideoProps}\n />\n </VideoActionsContext.Provider>\n ) : (\n <ExchangeSearchResultsState query={queryParams.query} />\n )\n }\n {searchResults.hasMore && (\n <InfiniteScrollFooter\n isFetching={searchResults.isFetching}\n fetchNext={searchResults.fetchNext}\n nextCursor={searchResults.nextCursor}\n />\n )}\n </section>\n ) : (\n <div className='mx-n2'>\n <PartialVideoList />\n </div>\n )}\n </>\n );\n}"],"names":["namespace","ComingSoonNamePanel","name","multiline","noUnderLine","wrapperClassName","styles","textClassName","jsxs","jsx","Text","NormalNamePanel","subtitle","newVideosCount","CoverPillWidgetContent","props","coverUrl","ImageHelper","ImageSize","classification","MasterTypeHelper","childProps","_a","coverStyle","fallbackCoverBgClassName","getBgColorClass","BG_COLOUR_CLASS_NAMES","classNames","RandomHelper","IconCircle","CheckSvg","SvgContainerSize","ImageFallback","ImageFallbackType","CoverPillWidgetContentWrapper","appLink","AppLink","CompanyWidgetItem","analyticsData","_b","analyticsOptions","LocationContext","UserAction","EntityType","ClickDescriptor","_c","_d","CompanyResult","Col","EXCHANGE_RESULT_DISPLAY_LIMIT","ExchangeVideoGroup","limit","getContainerClassName","currentAppLink","Core.AppLinkHelper","currentParams","currentSource","searchAppLink","SourceFilterOptions","SearchSourceDescriptor","v","i","VideoItem","HeroVideo","videoAudiences","mergedAudience","useMergeAudiences","AnalyticsHelper","VideoHelper","containerRef","React","Row","VideoThumbnail","ThumbnailTextPosition","VideoSubText","_e","VideoItemTitle","_f","VideoItemActions","BadgeListContainer","Badge","BadgeType","AudienceLabel","VideoItemGuidance","Fragment","FeaturedVideoResult","opts","EN_US","en_US","diff","idx","unit","ZH_CN","zh_CN","Locales","register","locale","func","getLocale","SEC_ARRAY","toDate","input","formatDiff","localeFunc","agoIn","totalSec","diffSec","date","relativeDate","relDate","format","sec","getCount","playlist","videos","interactives","clips","PlaylistCount","count","ClickViewAvatar","ClickViewLogoMark","PlaylistOwnerAvatar","_liteOwner","url","Avatar","UserHelper","PlaylistItem","imageUrl","ResizeType","audiences","className","showImage","getTitle","LanguageService","DateHelper","BaseImage","useGetMaxVideos","breakpoints","useBreakpoints","PlaylistWithVideos","maxVideos","playlistAnalyticsOption","playlistAnalyticsData","video","videoAnalyticsData","LargePlaylistResult","SeriesTallPosterHoverOverlay","SeriesHelper","SeriesTallPoster","hoverRef","isHovering","useHoverIntent","displayAudience","ImageType","SeriesWithVideos","seriesAnalyticsOption","seriesAnalyticsData","LargeSeriesResult","CollectionVideoList","analyticsProps","hasSeasonEpisode","SeasonEpisode","CollectionThumbnail","isSmall","VideoListHelper","hasVideos","firstVideoWithThumbnail","getAnalyticsData","data","isSeries","Mask","ActionsComponent","SmallPlaylistResult","MaskType","SmallSeriesResult","ClassificationStatus","usePresentationName","presentationId","availablePresentations","TopicsConstants","p","SubjectWidgetItem","isComingSoon","presentationName","_h","_g","_i","_j","_l","_k","Memoized","React.memo","SubjectResult","VideoResult","getItemComponent","ClipItem","InteractiveItem","Component","TOPIC_DISPLAY_LIMIT","MixedSearchResults","useSmallComponent","companiesAndTopics","c","itemIndex","result","index","pagePositionIndex","SearchSubstitute","SearchSuggestions","suggestion","ExchangeSearchUtils","fetchResults","queryParams","params","sortedValues","filterName","a","b","collection","showActions","collectionType","baseAnalyticsOptions","series","AppChannels","Actions","TextHelper","indices","topLevelCategoryIds","categories","searchNestedCategories","categoryId","categoryIds","category","searchCategoryIds","child","nestedCategoryIds","ArrayHelper","libraryId","ratings","nestedCategories","filters","FilterHelper","FilterConstants","options","exchange","backendFilters","appliedIndices","tagsAndClassifications","mainFilters","Filters","moreFilters","query","ExchangeSearchResultsState","LanguageNamespaceContext","EmptyState","ImageUrls","useFetchSearchData","currentUser","Flight.useBasicFetch","UserRequests","ExchangeRequests","RatingRequests","hasDataLoaded","useGetSearchResults","alerts","useAlerts","fetch","Flight.useGetFetch","searchResultsResponse","Flight.useGetResponse","getSearchRequest","cursor","fetchNext","onError","pageNumber","httpStatus","handleHttpError","useInfiniteList","SearchOGQL","SharedWithStatements","TagType","formatSearchResponse","response","totalResults","results","resultMaxScore","SharedSearchHelper","stringifyObject","obj","prev","value","stringifiedValue","getGlobalFilters","widgetTypeId","key","actualKey","WidgetTypeId","SharedSearchRequests","widgets","widgetData","w","filterData","indicesFilter","isLearner","genericFilters","HttpVerbs","excludeVideoIds","ThemeAssetHelper","sorts","allowSubstitute","filter","excludeLibraryExclusive","success","error","UrlHelper","useGetTagsAndClassifications","ExchangeSearchResultsView","videoActions","useGetExchangeActions","searchData","commonVideoProps","useCommonVideoProps","searchFilters","searchResults","useSetPageMetadata","hasLoaded","hasSearchCompleted","hasResults","ExchangeSearchBar","SearchFilters","VideoActionsContext","InfiniteScrollFooter","PartialVideoList"],"mappings":"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","x_google_ignoreList":[6,7,8,9,10,11]}
1
+ {"version":3,"file":"CPvN_Soe.chunk.js","sources":["../../../../libs/shared/src/components/widgets/items/subject-widget-item/CoverPill.tsx","../../../../libs/shared/src/components/widgets/items/subject-widget-item/CompanyWidgetItem.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/CompanyResult.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/exchange-video-group/ExchangeVideoGroup.tsx","../../../../libs/shared/src/apps/subjects/components/hero-video/HeroVideo.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/FeaturedVideoResult.tsx","../../../../../node_modules/timeago.js/esm/lang/en_US.js","../../../../../node_modules/timeago.js/esm/lang/zh_CN.js","../../../../../node_modules/timeago.js/esm/register.js","../../../../../node_modules/timeago.js/esm/utils/date.js","../../../../../node_modules/timeago.js/esm/format.js","../../../../../node_modules/timeago.js/esm/index.js","../../../../libs/shared/src/apps/playlists/components/playlist-count/PlaylistCount.tsx","../../../../libs/shared/src/components/clickview-avatar/ClickViewAvatar.tsx","../../../../libs/shared/src/apps/playlists/components/playlist-list/PlaylistOwnerAvatar.tsx","../../../../libs/shared/src/apps/playlists/components/playlist-list/PlaylistItem.tsx","../../../../libs/shared/src/apps/playlists/components/playlist-list/PlaylistList.tsx","../../../../libs/shared/src/apps/search/components/playlist-with-videos/PlaylistWithVideos.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/LargePlaylistResults.tsx","../../../../libs/shared/src/components/series-tall-poster/SeriesTallPoster.tsx","../../../../libs/shared/src/apps/search/components/series-with-videos/SeriesWithVideos.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/LargeSeriesResult.tsx","../../../../libs/shared/src/apps/search/components/collection-video-list/CollectionVideoList.tsx","../../../../libs/shared/src/apps/search/components/collection-thumbnail/CollectionThumbnail.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/SmallPlaylistResult.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/SmallSeriesResults.tsx","../../../../libs/shared/src/enums/ClassificationStatus.ts","../../../../libs/shared/src/components/widgets/items/subject-widget-item/SubjectWidgetItem.tsx","../../../../libs/shared/src/components/widgets/items/subject-widget-item/EditSubjectsWidgetLink.tsx","../../../../libs/shared/src/components/widgets/items/subject-widget-item/AllSubjectsWidgetLink.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/SubjectResult.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/VideoResult.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/MixedSearchResults.tsx","../../../../libs/shared/src/apps/search/components/search-substitute/SearchSubstitute.tsx","../../../../libs/shared/src/apps/search/components/search-suggestions/SearchSuggestions.tsx","../../src/apps/exchange/views/exchange-search-results/ExchangeSearchUtils.ts","../../src/apps/exchange/views/exchange-search-results/empty-state/ExchangeSearchEmptyState.tsx","../../src/apps/exchange/views/exchange-search-results/useFetchSearchData.ts","../../src/apps/exchange/views/exchange-search-results/useGetSearchResults.ts","../../../../libs/shared/src/apps/search/constants/SearchOGQL.ts","../../../../libs/shared/src/apps/search/flight-requests/SharedSearchRequests.ts","../../src/apps/exchange/views/exchange-search-results/useGetTagsAndClassifications.ts","../../src/apps/exchange/views/exchange-search-results/ExchangeSearchResultsView.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\nimport { RandomHelper } from 'libs/common/react/utils/RandomHelper';\n\nimport { AnalyticsOptions, HashObject } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { IconCircle } from 'libs/shared/components/icon-circle/IconCircle';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { BG_COLOUR_CLASS_NAMES } from 'libs/shared/constants/ColourClassNames';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { CheckSvg } from 'libs/shared/images/svg/status/CheckSvg';\nimport { BaseObject, Classification, Presentation } from 'libs/shared/interfaces';\nimport { getBgColorClass } from 'libs/shared/utils/getBgColorClass';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\nimport { MasterTypeHelper } from 'libs/shared/utils/MasterTypeHelper';\n\nimport styles from './cover-pill.module.scss';\n\nconst namespace = 'shared.subjectWidgetItem';\n\ninterface NamePanelProps {\n name: string;\n multiline?: boolean;\n subtitle?: string;\n noUnderLine?: boolean;\n newVideosCount?: number;\n}\n\nconst ComingSoonNamePanel = ({ name, multiline, noUnderLine }: NamePanelProps) => {\n let wrapperClassName = `${styles.comingSoonPanel} \n d-flex flex-column align-items-center justify-content-center px-3 text-center`;\n\n let textClassName = '';\n\n if (!multiline) {\n wrapperClassName += ' text-nowrap';\n textClassName += ' text-truncate';\n } else {\n textClassName += ` ${styles.clamped} clamp-2`;\n }\n\n return (\n <div className={wrapperClassName}>\n <small className='text-secondary'><Text namespace={namespace} phrase='comingSoon' /></small>\n <p className={`${noUnderLine ? '' : styles.name} h6`}><span className={textClassName}>{name}</span></p>\n </div>\n );\n};\n\nconst NormalNamePanel = ({ name, multiline, subtitle, noUnderLine, newVideosCount }: NamePanelProps) => {\n let wrapperClassName = 'px-3 d-flex flex-column justify-content-center';\n let textClassName = `${noUnderLine ? '' : styles.name} h6`;\n\n if (!multiline) {\n wrapperClassName += ' text-nowrap text-truncate';\n textClassName += ' text-truncate mb-0';\n } else {\n textClassName += ` ${newVideosCount ? 'clamp-2' : 'clamp-3'} text-start`;\n }\n\n return (\n <div className={wrapperClassName}>\n {subtitle && <div className={`text-secondary clamp-1 ${styles.text}`}>{subtitle}</div>}\n <div className={textClassName} title={name}>{name}</div>\n {!!newVideosCount && (\n <div className={`fw-semibold d-inline-block rounded-pill px-2 mt-1 bg-light-green w-fit h-fit text-green ${styles.newVideos}`}>\n <Text namespace={namespace} phrase='newVideos' options={{ smartCount: newVideosCount }} />\n </div>\n )}\n </div>\n );\n};\n\nexport interface CoverPillWidgetItemProps<T extends BaseObject> {\n data: T;\n getChildAppLink?: (data: T) => Core.AppLink;\n getChildAppLinkOptions?: () => Core.AppLinkOptions;\n isLarge?: boolean;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n availablePresentations?: Presentation[];\n getSubtitle?: (data: T) => string;\n multiline?: boolean;\n // set to true it will highlight on hover and also remove the hover text underline\n highlightOnHover?: boolean;\n showNewVideosCount?: boolean;\n shouldHighlight?: (data: T) => boolean;\n showFallbackBackgroundColour?: boolean;\n onClick?: () => void;\n}\n\nCoverPillWidgetContent.defaultProps = {\n showFallbackBackgroundColour: true\n};\n\ninterface CoverPillWidgetContentProps<T> extends CoverPillWidgetItemProps<T> {\n coverUrl?: string;\n coverBgColor?: string;\n subtitle?: string;\n isComingSoon?: boolean;\n className?: string;\n imageClassName?: string;\n isSelected?: boolean;\n hideFallback?: boolean;\n hideCheckmark?: boolean;\n themeColor?: string;\n}\n\nexport function CoverPillWidgetContent(props: CoverPillWidgetContentProps<BaseObject>): JSX.Element {\n const coverUrl = ImageHelper.createUrl(props.coverUrl, { size: props.isLarge ? ImageSize.Medium : ImageSize.Small });\n\n let classification: Classification | undefined = undefined;\n if (MasterTypeHelper.isClassification(props.data)) {\n classification = props.data;\n }\n\n const childProps = {\n name: props.data.name,\n multiline: props.isLarge || props.multiline,\n subtitle: props.subtitle,\n noUnderLine: props.highlightOnHover,\n newVideosCount: props.showNewVideosCount ? classification?.externalMetadata?.childDashboardNewVideoCount : 0\n };\n\n const coverStyle: React.CSSProperties = {\n backgroundImage: coverUrl ? `url('${coverUrl}')` : null,\n backgroundColor: props.coverBgColor\n };\n\n const fallbackCoverBgClassName = getBgColorClass(props.data.name, BG_COLOUR_CLASS_NAMES);\n\n return (\n <div\n className={classNames(\n props.themeColor ? styles.hasThemeColor : 'border',\n 'd-flex position-relative',\n props.className,\n styles.widgetItem,\n props.isSelected ? 'border-success border-2' : '',\n props.highlightOnHover && !props.themeColor ? 'bg-light-blue-hover' : ''\n )}\n style={props.themeColor ? { '--themeColor': props.themeColor } as unknown as React.CSSProperties : {}}\n id={`${props.data.id}-${RandomHelper.getRandomInt()}`}\n onClick={props.onClick}\n >\n {props.isSelected && (\n <div className={`${styles.selectedMask} border-2`} />\n )}\n\n <div className={`${styles.imagePanel} ${props.isLarge ? styles.large : ''}`}>\n {props.isSelected && !props.hideCheckmark && (\n <div className={styles.selected}>\n <IconCircle svg={CheckSvg} svgSize={SvgContainerSize.Large} textVariant='white' variant='green' />\n </div>\n )}\n\n {coverUrl &&\n <div\n className={classNames(\n styles.image,\n props.imageClassName,\n !props.coverBgColor && props.showFallbackBackgroundColour && fallbackCoverBgClassName\n )}\n style={coverStyle}\n />\n }\n {!props.hideFallback && (\n <ImageFallback\n type={ImageFallbackType.Subject}\n extraClasses={props.isLarge ? styles.large : ''}\n />\n )}\n </div>\n\n {props.isComingSoon\n ? <ComingSoonNamePanel {...childProps} />\n : <NormalNamePanel {...childProps} />\n }\n </div>\n );\n}\n\nexport function CoverPillWidgetContentWrapper(props: CoverPillWidgetContentProps<BaseObject>) {\n const appLink = props.getChildAppLink ? props.getChildAppLink(props.data) : null;\n\n return (\n <>\n {appLink ? (\n <AppLink\n className={styles.appLink}\n appLink={appLink}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n appLinkOptions={props.getChildAppLinkOptions?.()}\n >\n <CoverPillWidgetContent {...props} />\n </AppLink>\n ) : (<CoverPillWidgetContent {...props} />)\n }\n </>\n );\n}","import * as React from 'react';\n\nimport { ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { CoverPillWidgetContentWrapper, CoverPillWidgetItemProps } from 'libs/shared/components/widgets/items/subject-widget-item/CoverPill';\nimport { Company } from 'libs/shared/interfaces';\n\nexport function CompanyWidgetItem(props: CoverPillWidgetItemProps<Company>): JSX.Element {\n const analyticsData = {\n ...props.analyticsData,\n id: props.data?.id,\n name: props.data?.name\n };\n\n const analyticsOptions = {\n location: LocationContext.ClassificationListItem,\n ...props.analyticsOptions,\n actionType: UserAction.Click,\n entity: EntityType.Company,\n descriptor: ClickDescriptor.Cover\n };\n\n return (\n <CoverPillWidgetContentWrapper\n {...props}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n coverUrl={props.data.logo?.url}\n coverBgColor={props.data.metadata?.colour}\n />\n );\n}","import React from 'react';\nimport { Col } from 'react-bootstrap';\n\nimport { CompanyWidgetItem } from 'libs/shared/components/widgets/items/subject-widget-item/CompanyWidgetItem';\nimport { Company } from 'libs/shared/interfaces';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function CompanyResult(props: MixedSearchResultItemProps<Company>): JSX.Element {\n return (\n <Col as='li' sm={6} md={props.useLargeStyle ? 6 : 4} lg={props.useLargeStyle ? 4 : 3}>\n <div className={`position-relative px-1 mb-2`}>\n <CompanyWidgetItem\n data={props.item}\n getChildAppLink={props.appLinks.getCompanyAppLink}\n getChildAppLinkOptions={() => props.appLinks.getCompanyAppLinkOptions?.(props.item)}\n analyticsData={{\n itemIndex: props.itemIndex,\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: 0\n }}\n isLarge={props.useLargeStyle}\n />\n </div>\n </Col>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { ClickDescriptor, EntityType, HashObject, LocationContext, SearchSourceDescriptor, UserAction } from 'libs/analytics/interfaces';\n\nimport { SourceFilterOptions } from 'libs/shared/apps/search/interfaces';\nimport { type ExchangeVideoGroup as ExchangeVideoGroupData } from 'libs/shared/apps/search/interfaces/SearchResults';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoItem } from 'libs/shared/components/video-list/video-item/VideoItem';\n\nimport { MixedSearchResultItemProps } from './../MixedSearchResultItemProps';\n\nimport styles from '../../mixed-search-results.module.scss';\n\nconst namespace = 'search.exchangeVideoGroup';\n\nconst EXCHANGE_RESULT_DISPLAY_LIMIT = 3;\n\nexport function ExchangeVideoGroup(props: MixedSearchResultItemProps<ExchangeVideoGroupData>): JSX.Element {\n const limit = props.item.showCount >= EXCHANGE_RESULT_DISPLAY_LIMIT\n ? EXCHANGE_RESULT_DISPLAY_LIMIT\n : props.item.showCount;\n\n function getContainerClassName(): string {\n if (props.pagePositionIndex === 0)\n return 'border-bottom pb-1 mb-3';\n\n return 'border-top border-bottom pt-3 mt-2 pb-1 mb-3';\n }\n\n const currentAppLink = Core.AppLinkHelper.getCurrentAppLink();\n const currentParams = (currentAppLink.params as HashObject) ?? {};\n let currentSource = currentParams?.source ?? [];\n\n if (currentSource && !Array.isArray(currentSource))\n currentSource = [currentSource];\n\n const searchAppLink = {\n ...currentAppLink,\n params: {\n ...currentParams,\n source: [ ...(currentSource), SourceFilterOptions.ExchangeArchive ]\n }\n };\n\n const analyticsData = {\n query: props.queryParams.query,\n itemIndex: props.itemIndex,\n pagePositionIndex: props.pagePositionIndex\n };\n const analyticsOptions = {\n entity: EntityType.SearchResults,\n location: LocationContext.ExchangeSearchGroupItem,\n actionType: UserAction.Click,\n descriptor: SearchSourceDescriptor.ExchangeArchive\n };\n\n return (\n <div className={getContainerClassName()}>\n <AppLink\n appLink={searchAppLink}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n >\n <h2 className='h4'>\n <Text namespace={namespace} phrase='heading' />\n </h2>\n </AppLink>\n <p>\n <Text namespace={namespace} phrase='message' />\n &nbsp;\n <AppLink\n appLink={props.appLinks.searchSettings}\n className='text-info'\n analyticsData={analyticsData}\n analyticsOptions={{\n ...analyticsOptions,\n descriptor: ClickDescriptor.Settings\n }}\n >\n <Text namespace={namespace} phrase='searchSettings' />\n </AppLink>\n .\n </p>\n\n <div className={`position-relative ${styles.videoList}`}>\n {props.item.videos.slice(0, limit).map((v, i) => {\n return (\n <VideoItem\n key={i}\n video={v}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n presentationAudiences={props.audiences}\n analyticsData= {{\n search: {\n query: props.queryParams.query,\n score: v._score,\n maxScore: v._maxScore,\n featured: v._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n hasPermissions={props.hasPermissions}\n commonVideoProps={props.commonVideoProps}\n />\n );\n })}\n </div>\n <div className='text-center py-2'>\n <AppLink\n className='text-secondary'\n appLink={searchAppLink}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n >\n <Text namespace={namespace} phrase='seeMore' />\n </AppLink>\n </div>\n </div>\n );\n}","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions, LocationContext } from 'libs/analytics/interfaces';\n\nimport { AudienceLabel } from 'libs/shared/components/audience-label/AudienceLabel';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { BadgeListContainer } from 'libs/shared/components/badges/BadgeListContainer';\nimport { VideoThumbnail } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { VideoItemGuidance } from 'libs/shared/components/video-list/components/video-guidance/VideoItemGuidance';\nimport { VideoItemActions } from 'libs/shared/components/video-list/components/video-item-actions/VideoItemActions';\nimport { VideoItemTitle } from 'libs/shared/components/video-list/components/video-item-title/VideoItemTitle';\nimport { VideoSubText } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { ThumbnailTextPosition } from 'libs/shared/enums/ThumbnailTextPosition';\nimport { useMergeAudiences } from 'libs/shared/hooks/UseMergeAudiences';\nimport { PresentationAudience, Video } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport styles from './hero-video.module.scss';\n\ninterface HeroVideoProps {\n video: Video;\n presentationAudiences: PresentationAudience[];\n showVideoGuidance: boolean;\n getVideoAppLink: (video: Video, opts: GetVideoAppLinkOptions) => Core.AppLink;\n hideInteractiveBadge?: boolean;\n badgePosition?: 'thumbnail' | 'info-panel';\n titleClassName?: string;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n commonVideoProps: CommonVideoProps;\n showNewVideoIndicator?: boolean;\n}\n\nHeroVideo.defaultProps = {\n newDurationStyle: true,\n badgePosition: 'thumbnail'\n};\n\nexport function HeroVideo(props: HeroVideoProps): JSX.Element {\n const videoAudiences = props.video?.subjectPresentationAudiences?.data;\n const mergedAudience = useMergeAudiences(videoAudiences, props.presentationAudiences);\n\n const analyticsOptions = AnalyticsHelper.mergeOptions(props.analyticsOptions, {\n location: LocationContext.ClassificationHero,\n entity: VideoHelper.getAnalyticsEntity(props.video)\n });\n\n const containerRef = React.useRef(null);\n \n if (!props.video)\n return <></>;\n\n return (\n <Row>\n <Col xs={12} md={6}>\n <div ref={containerRef} >\n <VideoThumbnail\n analyticsOptions={analyticsOptions}\n video={props.video}\n appLink={props.getVideoAppLink?.(props.video, {})}\n imageOptions={{ size: ImageSize.Medium }}\n textPosition={ThumbnailTextPosition.Independent}\n type='static'\n audience={props.badgePosition === 'thumbnail' ? mergedAudience : null}\n hideRating={props.badgePosition === 'thumbnail' ? !!mergedAudience : true}\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n </Col>\n <Col xs={12} md={6} className={`${styles.details} position-relative`}>\n <div className='d-flex justify-content-between'>\n <div className='overflow-hidden'>\n <VideoSubText\n type={props.commonVideoProps.subTextType}\n appLink={props.commonVideoProps.getSubTextAppLink?.(props.video)}\n analyticsData={props.analyticsData}\n analyticsOptions={analyticsOptions}\n video={props.video}\n className='text-reset clamp-1'\n />\n <VideoItemTitle\n yearGroups={props.commonVideoProps.yearGroups}\n video={props.video}\n analyticsData={props.analyticsData}\n analyticsOptions={analyticsOptions}\n appLink={props.getVideoAppLink?.(props.video, {})}\n titleSize='h4'\n showNewVideoIndicator={props.showNewVideoIndicator}\n showPadlock={!props.commonVideoProps.hasStudentExperience && !props.commonVideoProps.hasGuestExperience}\n titleClassName={props.titleClassName}\n clampLevel={2}\n />\n </div>\n <VideoItemActions\n analyticsData={props.analyticsData}\n analyticsOptions={analyticsOptions}\n video={props.video}\n />\n </div>\n\n {props.badgePosition === 'info-panel' && (\n <BadgeListContainer className='pb-1'>\n {!props.hideInteractiveBadge && <Badge type={ BadgeType.Interactive } data={props.video.interactives} />}\n <Badge type={ BadgeType.Rating } data={VideoHelper.getRating(props.video)} />\n <Badge type={ BadgeType.ProductionYear } data={props.video.productionYear} />\n </BadgeListContainer>\n )}\n\n <p className='mb-1'><span className={styles.description}>{props.video.description}</span></p>\n \n {props.badgePosition === 'info-panel' && (\n <AudienceLabel\n audience={mergedAudience}\n className='mt-1'\n border='dark'\n />\n )}\n\n {props.showVideoGuidance && (\n <VideoItemGuidance\n video={props.video}\n analyticsData={props.analyticsData}\n analyticsOptions={analyticsOptions}\n containerClassName={`d-flex ${styles.guidance}`}\n responsiveClassName={styles.responsiveGuidance}\n commonVideoProps={props.commonVideoProps}\n />\n )}\n </Col>\n </Row>\n );\n}\n\nexport function PartialHeroVideo(): JSX.Element {\n return (\n <>\n <div className={`partial-loading-background mb-2 ${styles.partialHeading}`} />\n <div className='row pb-3'>\n <div className='col-6 p1'>\n <div className={`${styles.partialHeroThumbnail} partial-loading-background rounded-3`}></div>\n </div>\n <div className='col-6 p1'>\n <div className={`partial-loading-background mb-1 ${styles.partialSeriesText}`}></div>\n <div className={`partial-loading-background my-1 ${styles.partialVideoTitleText}`}></div>\n <div className='d-flex'>\n <div className={`partial-loading-background my-1 me-1 ${styles.partialBadge}`}></div>\n <div className={`partial-loading-background my-1 ms-1 ${styles.partialBadge}`}></div>\n </div>\n <div className={`partial-loading-background my-1 ${styles.partialDescription}`}></div>\n <div className={`partial-loading-background mt-2 ${styles.partialSubject}`}></div>\n </div>\n </div>\n </>\n );\n}\n","import React from 'react';\n\nimport { HeroVideo } from 'libs/shared/apps/subjects/components/hero-video/HeroVideo';\nimport { Video } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function FeaturedVideoResult(props: MixedSearchResultItemProps<Video>): JSX.Element {\n return (\n <div className='pb-3'>\n <HeroVideo\n video={props.item}\n presentationAudiences={props.audiences}\n getVideoAppLink={(v, opts) => props.appLinks.getVideoAppLink(v, opts)}\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n hideInteractiveBadge\n showVideoGuidance={VideoHelper.showVideoGuidance(props.hasPermissions)}\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n}","var EN_US = ['second', 'minute', 'hour', 'day', 'week', 'month', 'year'];\nexport default function (diff, idx) {\n if (idx === 0)\n return ['just now', 'right now'];\n var unit = EN_US[Math.floor(idx / 2)];\n if (diff > 1)\n unit += 's';\n return [diff + \" \" + unit + \" ago\", \"in \" + diff + \" \" + unit];\n}\n//# sourceMappingURL=en_US.js.map","var ZH_CN = ['秒', '分钟', '小时', '天', '周', '个月', '年'];\nexport default function (diff, idx) {\n if (idx === 0)\n return ['刚刚', '片刻后'];\n var unit = ZH_CN[~~(idx / 2)];\n return [diff + \" \" + unit + \"\\u524D\", diff + \" \" + unit + \"\\u540E\"];\n}\n//# sourceMappingURL=zh_CN.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\n/**\n * All supported locales\n */\nvar Locales = {};\n/**\n * register a locale\n * @param locale\n * @param func\n */\nexport var register = function (locale, func) {\n Locales[locale] = func;\n};\n/**\n * get a locale, default is en_US\n * @param locale\n * @returns {*}\n */\nexport var getLocale = function (locale) {\n return Locales[locale] || Locales['en_US'];\n};\n//# sourceMappingURL=register.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\nvar SEC_ARRAY = [\n 60,\n 60,\n 24,\n 7,\n 365 / 7 / 12,\n 12,\n];\n/**\n * format Date / string / timestamp to timestamp\n * @param input\n * @returns {*}\n */\nexport function toDate(input) {\n if (input instanceof Date)\n return input;\n // @ts-ignore\n if (!isNaN(input) || /^\\d+$/.test(input))\n return new Date(parseInt(input));\n input = (input || '')\n // @ts-ignore\n .trim()\n .replace(/\\.\\d+/, '') // remove milliseconds\n .replace(/-/, '/')\n .replace(/-/, '/')\n .replace(/(\\d)T(\\d)/, '$1 $2')\n .replace(/Z/, ' UTC') // 2017-2-5T3:57:52Z -> 2017-2-5 3:57:52UTC\n .replace(/([+-]\\d\\d):?(\\d\\d)/, ' $1$2'); // -04:00 -> -0400\n return new Date(input);\n}\n/**\n * format the diff second to *** time ago, with setting locale\n * @param diff\n * @param localeFunc\n * @returns\n */\nexport function formatDiff(diff, localeFunc) {\n /**\n * if locale is not exist, use defaultLocale.\n * if defaultLocale is not exist, use build-in `en`.\n * be sure of no error when locale is not exist.\n *\n * If `time in`, then 1\n * If `time ago`, then 0\n */\n var agoIn = diff < 0 ? 1 : 0;\n /**\n * Get absolute value of number (|diff| is non-negative) value of x\n * |diff| = diff if diff is positive\n * |diff| = -diff if diff is negative\n * |0| = 0\n */\n diff = Math.abs(diff);\n /**\n * Time in seconds\n */\n var totalSec = diff;\n /**\n * Unit of time\n */\n var idx = 0;\n for (; diff >= SEC_ARRAY[idx] && idx < SEC_ARRAY.length; idx++) {\n diff /= SEC_ARRAY[idx];\n }\n /**\n * Math.floor() is alternative of ~~\n *\n * The differences and bugs:\n * Math.floor(3.7) -> 4 but ~~3.7 -> 3\n * Math.floor(1559125440000.6) -> 1559125440000 but ~~1559125440000.6 -> 52311552\n *\n * More information about the performance of algebraic:\n * https://www.youtube.com/watch?v=65-RbBwZQdU\n */\n diff = Math.floor(diff);\n idx *= 2;\n if (diff > (idx === 0 ? 9 : 1))\n idx += 1;\n return localeFunc(diff, idx, totalSec)[agoIn].replace('%s', diff.toString());\n}\n/**\n * calculate the diff second between date to be formatted an now date.\n * @param date\n * @param relativeDate\n * @returns {number}\n */\nexport function diffSec(date, relativeDate) {\n var relDate = relativeDate ? toDate(relativeDate) : new Date();\n return (+relDate - +toDate(date)) / 1000;\n}\n/**\n * nextInterval: calculate the next interval time.\n * - diff: the diff sec between now and date to be formatted.\n *\n * What's the meaning?\n * diff = 61 then return 59\n * diff = 3601 (an hour + 1 second), then return 3599\n * make the interval with high performance.\n **/\nexport function nextInterval(diff) {\n var rst = 1, i = 0, d = Math.abs(diff);\n for (; diff >= SEC_ARRAY[i] && i < SEC_ARRAY.length; i++) {\n diff /= SEC_ARRAY[i];\n rst *= SEC_ARRAY[i];\n }\n d = d % rst;\n d = d ? rst - d : rst;\n return Math.ceil(d);\n}\n//# sourceMappingURL=date.js.map","import { formatDiff, diffSec } from './utils/date';\nimport { getLocale } from './register';\n/**\n * format a TDate into string\n * @param date\n * @param locale\n * @param opts\n */\nexport var format = function (date, locale, opts) {\n // diff seconds\n var sec = diffSec(date, opts && opts.relativeDate);\n // format it with locale\n return formatDiff(sec, getLocale(locale));\n};\n//# sourceMappingURL=format.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\nimport en_US from './lang/en_US';\nimport zh_CN from './lang/zh_CN';\nimport { register } from './register';\nregister('en_US', en_US);\nregister('zh_CN', zh_CN);\nexport { format } from './format';\nexport { render, cancel } from './realtime';\nexport { register };\n//# sourceMappingURL=index.js.map","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Playlist } from 'libs/shared/interfaces';\n\nconst namespace = 'playlists.playlistCount';\n\nfunction getCount(playlist: Playlist): number | false {\n if (!playlist)\n return false;\n\n const videos = playlist.videos?.count ?? 0;\n const interactives = playlist.interactives?.count ?? 0;\n const clips = playlist.clips?.count ?? 0;\n\n return videos + interactives + clips;\n}\n\ninterface PlaylistCountProps {\n playlist: Playlist;\n}\n\nexport function PlaylistCount(props: PlaylistCountProps): JSX.Element {\n const count = getCount(props.playlist);\n\n if (count === false || Number.isNaN(count))\n return <></>;\n\n return (\n <span className='text-shadow font-size-sm'>\n <Text namespace={namespace} phrase='count' options={{ smartCount: count }} />\n </span>\n );\n}","import * as React from 'react';\n\nimport { ClickViewLogoMark } from 'libs/shared/components/svgs/clickview-logo/ClickViewLogo';\n\nimport styles from './clickview-avatar.module.scss';\n\nexport function ClickViewAvatar(): JSX.Element {\n return (\n <div className={styles.avatar}>\n <ClickViewLogoMark />\n </div>\n );\n}\n","import * as React from 'react';\n\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { ClickViewAvatar } from 'libs/shared/components/clickview-avatar/ClickViewAvatar';\nimport { CurrentUser, Playlist } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\ninterface PlaylistOwnerAvatarProps {\n playlist: Playlist;\n imageCdnUrl: string;\n currentUser?: CurrentUser;\n}\n\nexport function PlaylistOwnerAvatar(props: PlaylistOwnerAvatarProps): JSX.Element {\n const { _liteOwner } = props.playlist;\n\n if (props.playlist._isClickViewCurated?.value)\n return (\n <ClickViewAvatar />\n );\n\n if (!_liteOwner?.id || !props.currentUser?.id)\n return <></>;\n\n const currentUserIsOwner = _liteOwner.id.toString() === props.currentUser.id.toString();\n\n if (currentUserIsOwner)\n return <></>;\n\n const url = typeof _liteOwner.avatar === 'string' ? _liteOwner.avatar : _liteOwner.avatar?.url;\n\n return (\n <Avatar\n imageUrl={url}\n imageCdnUrl={props.imageCdnUrl}\n initials={UserHelper.getInitials(_liteOwner.name, _liteOwner.surname)}\n />\n );\n}","import * as React from 'react';\nimport { format } from 'timeago.js';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { AnalyticsOptions, EntityType, HashObject } from 'libs/analytics/interfaces';\n\nimport { PlaylistCount } from 'libs/shared/apps/playlists/components/playlist-count/PlaylistCount';\nimport { PlaylistOwnerAvatar } from 'libs/shared/apps/playlists/components/playlist-list/PlaylistOwnerAvatar';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { AudienceLabel } from 'libs/shared/components/audience-label/AudienceLabel';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { ImageSize, ResizeType } from 'libs/shared/enums/Images';\nimport { useMergeAudiences } from 'libs/shared/hooks/UseMergeAudiences';\nimport { CurrentUser, Playlist, PresentationAudience } from 'libs/shared/interfaces';\nimport { getBgColorClass } from 'libs/shared/utils/getBgColorClass';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\n\nimport styles from './playlist.module.scss';\n\nconst namespace = 'playlists.playlistList';\n\nexport type PlaylistItemStyle = 'square' | 'round' | 'round-left';\n\nexport interface PlaylistItemProps {\n data: Playlist;\n appLink: Core.AppLink;\n currentUser?: CurrentUser;\n presentationAudiences?: PresentationAudience[];\n bgColourClassNames?: string[];\n titleClassName?: string;\n imageCdnUrl?: string;\n itemStyle?: PlaylistItemStyle;\n showCount?: boolean;\n showOwner?: boolean;\n showFallbackImage?: boolean;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n audienceLabelClass?: string;\n}\n\nPlaylistItem.defaultProps = {\n itemStyle: 'square'\n};\n\nexport function PlaylistItem(props: PlaylistItemProps): JSX.Element {\n const imageUrl = ImageHelper.createUrl(props.data.cover && props.data.cover.url, {\n size: ImageSize.Medium,\n resizeType: ResizeType.Cover\n });\n\n const audiences = props.data.subjectPresentationAudiences &&\n props.data.subjectPresentationAudiences.data;\n\n const mergedAudience = useMergeAudiences(audiences, props.presentationAudiences);\n\n let className = styles.playlistItem;\n\n const showImage = !!imageUrl || !!props.showFallbackImage;\n\n if (showImage)\n className += ` ${styles.playlistItemGradient}`;\n\n if (!showImage && props.bgColourClassNames)\n className += ` ${styles.playlistItem} ${getBgColorClass(props.data.name, props.bgColourClassNames)}`;\n\n if (props.itemStyle === 'round')\n className += ` rounded-3 overflow-hidden`;\n\n if (props.itemStyle === 'round-left')\n className += ` rounded-start-lg overflow-hidden`;\n\n const analyticsData = { ...props.analyticsData,\n id: props.data?.id,\n name: props.data?.name\n };\n\n const analyticsOptions = {\n ...props.analyticsOptions,\n entity: EntityType.Playlist\n };\n\n const getTitle = () => {\n if (!props.data.contentModifiedDate || props.data._isClickViewCurated?.value)\n return '';\n\n return LanguageService.getPhrase(namespace, 'lastUpdated', {\n timeago: format(DateHelper.convertUTCToLocal(props.data.contentModifiedDate))\n });\n };\n\n return (\n <AppLink\n appLink={props.appLink}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n title={getTitle()}\n >\n <BaseImage data={imageUrl} alt={props.data.name} className={className}>\n {!!props.showFallbackImage && <ImageFallback type={ImageFallbackType.Playlist} />}\n <div className={`text-white ${styles.playlistMetadata}`}>\n {!!props.showCount && (\n <PlaylistCount playlist={props.data} />\n )}\n <h5 className={`mb-0 ${props.titleClassName || ''}`}><span className='text-shadow clamp-2'>{props.data.name}</span></h5>\n {!!audiences && !!audiences.length && !!mergedAudience &&\n <AudienceLabel\n className={`${props.audienceLabelClass ? props.audienceLabelClass : ''} mt-1`}\n audience={mergedAudience}\n border='white'\n />\n }\n </div>\n {!!props.showOwner && !!props.imageCdnUrl &&\n <div className={styles.ownerAvatarContainer}>\n <PlaylistOwnerAvatar\n playlist={props.data}\n currentUser={props.currentUser}\n imageCdnUrl={props.imageCdnUrl}\n />\n </div>\n }\n </BaseImage>\n </AppLink>\n );\n}","import * as React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, HashObject, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { CurrentUser, Playlist, PresentationAudience } from 'libs/shared/interfaces';\n\nimport { PlaylistItem, PlaylistItemStyle } from './PlaylistItem';\n\ninterface PlaylistListProps {\n playlists: Playlist[];\n getPlaylistAppLink: (playlist: Playlist) => Core.AppLink;\n currentUser?: CurrentUser;\n presentationAudiences?: PresentationAudience[];\n itemContainerClassName?: string;\n itemTitleClassName?: string;\n bgColourClassNames?: string[];\n itemStyle?: PlaylistItemStyle;\n imageCdnUrl?: string;\n showCount?: boolean;\n showOwner?: boolean;\n showFallbackImage?: boolean;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n extraPlaylistItem?: JSX.Element;\n}\n\nconst analyticsOptions: AnalyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.Playlist,\n location: LocationContext.PlaylistListItem,\n descriptor: ClickDescriptor.Cover\n};\n\nexport function PlaylistList(props: PlaylistListProps): JSX.Element {\n return (\n <Row as='ul' className='list-unstyled mx-n1'>\n {props.extraPlaylistItem && (\n <Col as='li' key='extra-playlist-item' xs={6} sm={4} lg={3} className={`mb-2 px-1 ${props.itemContainerClassName ? props.itemContainerClassName : ''}`}>\n {props.extraPlaylistItem}\n </Col>\n )}\n\n {props.playlists.map(p => (\n <Col as='li' key={p.id} xs={6} sm={4} lg={3} className={`mb-2 px-1 ${props.itemContainerClassName ? props.itemContainerClassName : ''}`}>\n <PlaylistItem\n data={p}\n appLink={props.getPlaylistAppLink(p)}\n imageCdnUrl={props.imageCdnUrl}\n currentUser={props.currentUser}\n presentationAudiences={props.presentationAudiences}\n bgColourClassNames={props.bgColourClassNames}\n showCount={props.showCount}\n showOwner={props.showOwner}\n showFallbackImage={props.showFallbackImage}\n titleClassName={props.itemTitleClassName}\n itemStyle={props.itemStyle}\n analyticsData={props.analyticsData}\n analyticsOptions={{ ...props.analyticsOptions, ...analyticsOptions }}\n />\n </Col>\n ))}\n </Row>\n );\n}","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { PlaylistItem } from 'libs/shared/apps/playlists/components/playlist-list';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoItem } from 'libs/shared/components/video-list/video-item/VideoItem';\nimport { BG_COLOUR_CLASS_NAMES } from 'libs/shared/constants/ColourClassNames';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { CurrentUser, Playlist, PresentationAudience, Video } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\n\nimport styles from './playlist-with-videos.module.scss';\n\nconst namespace = 'search.playlistWithVideos';\n\nfunction useGetMaxVideos(): number {\n const breakpoints = useBreakpoints();\n\n if (breakpoints.xl || breakpoints.xxl)\n return 3;\n \n return 2;\n}\n\ninterface PlaylistWithVideoProps {\n playlist: Playlist;\n playlistAppLink: Core.AppLink;\n presentationAudiences: PresentationAudience[];\n preloadImage: boolean;\n analyticsData: HashObject;\n currentUser: CurrentUser;\n getVideoAppLink: (video: Video, opts: GetVideoAppLinkOptions) => Core.AppLink;\n hasPermissions: HasPermissionsFunc;\n commonVideoProps: CommonVideoProps;\n}\n\nexport function PlaylistWithVideos(props: PlaylistWithVideoProps): JSX.Element {\n const maxVideos = useGetMaxVideos();\n\n const videos = props.playlist.videos.data.slice(0, maxVideos);\n\n const playlistAnalyticsOption: AnalyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.Playlist,\n location: LocationContext.PlaylistWithVideos\n };\n\n const playlistAnalyticsData: HashObject = {\n ...props.analyticsData,\n id: props.playlist.id,\n name: props.playlist.name\n };\n\n return (\n <div className='ps-2 py-2'>\n <Row className='g-0 border rounded-3'>\n <Col xs={4} lg={3} className='pe-3'>\n <PlaylistItem\n appLink={props.playlistAppLink}\n analyticsData={props.analyticsData}\n analyticsOptions={{\n ...playlistAnalyticsOption,\n descriptor: ClickDescriptor.Cover\n }}\n data={props.playlist}\n presentationAudiences={props.presentationAudiences}\n bgColourClassNames={BG_COLOUR_CLASS_NAMES}\n itemStyle='round-left'\n imageCdnUrl={props.commonVideoProps.imageCdnUrl}\n currentUser={props.currentUser}\n showCount={false}\n showOwner\n />\n </Col>\n <Col xs={8} lg={9}>\n <div className='d-flex justify-content-between'>\n <div className={`pt-3 mb-n2 ${styles.videoList}`}>\n {videos?.map(video => {\n const videoAnalyticsData: HashObject = {\n ...playlistAnalyticsData,\n videoId: video.id,\n videoName: video.name\n };\n\n return (\n <div key={video.id} className='mb-2'>\n <VideoItem\n video={video}\n getVideoAppLink={props.getVideoAppLink}\n analyticsData={videoAnalyticsData}\n analyticsOptions={{\n entity: EntityType.Video,\n location: LocationContext.PlaylistWithVideos\n }}\n size='sm'\n hasPermissions={props.hasPermissions}\n hideVideoGuidance\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n })}\n </div>\n <div className='text-end pt-3 pe-3'>\n <AppLink\n className='info-link fw-semibold'\n appLink={props.playlistAppLink}\n analyticsData={playlistAnalyticsData}\n analyticsOptions={{\n ...playlistAnalyticsOption,\n descriptor: ClickDescriptor.Link\n }}\n >\n <Text namespace={namespace} phrase='seeAllVideos' />\n </AppLink>\n </div>\n </div>\n </Col>\n </Row>\n </div>\n );\n}","import React from 'react';\n\nimport { Playlist } from 'libs/shared/interfaces';\n\nimport { PlaylistWithVideos } from '../../playlist-with-videos/PlaylistWithVideos';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function LargePlaylistResult(props: MixedSearchResultItemProps<Playlist>): JSX.Element {\n return (\n <div className='mx-n2'>\n <PlaylistWithVideos\n playlist={props.item}\n playlistAppLink={props.appLinks.getPlaylistAppLink(props.item)}\n presentationAudiences={props.audiences}\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n currentUser={props.currentUser}\n preloadImage\n getVideoAppLink={props.appLinks.getVideoAppLink}\n hasPermissions={props.hasPermissions}\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n}","import React from 'react';\n\nimport { AudienceLabel } from 'libs/shared/components/audience-label/AudienceLabel';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { ImageSize, ImageType } from 'libs/shared/enums/Images';\nimport { useHoverIntent } from 'libs/shared/hooks/UseHover';\nimport { useMergeAudiences } from 'libs/shared/hooks/UseMergeAudiences';\nimport { PresentationAudience, Series } from 'libs/shared/interfaces';\nimport { SeriesHelper } from 'libs/shared/utils/SeriesHelper';\n\nimport styles from './series-tall-poster.module.scss';\n\ninterface SeriesTallPosterHoverOverlay {\n series: Series;\n mergedAudience: PresentationAudience;\n isSmall?: boolean;\n hasTableOfContents?: boolean;\n}\n\nfunction SeriesTallPosterHoverOverlay(props: SeriesTallPosterHoverOverlay): JSX.Element {\n return (\n <div className={`py-3 mx-2 px-2 rounded bg-white text-center ${styles.mask} d-flex flex-column align-items-center`}>\n <h3 className={`fw-semibold mb-0 ${styles.hoverTitle} ${props.isSmall ? styles.smallHoverTitle : styles.largeHoverTitle}`}>\n <span className='clamp-3'>\n {props.series.name}\n </span>\n </h3>\n\n {!!props.series.description && (\n <p className={`${props.hasTableOfContents ? styles.hasTableOfContents : ''} ${styles.hoverDescription} ${props.isSmall ? styles.smallHoverDescription : styles.largeHoverDescription} mb-0`}>{props.series.description}</p>\n )}\n <div className={`${styles.labelContainerOverlay}`}>\n {props.mergedAudience\n ? <AudienceLabel audience={props.mergedAudience} border='dark' className='mt-2 w-fit'/>\n : <Badge type={BadgeType.Rating} data={SeriesHelper.getRating(props.series)} className='mt-2' />\n }\n </div>\n </div>\n );\n}\n\ninterface SeriesTallPosterMaskProps {\n series: Series;\n presentationAudiences: PresentationAudience[];\n preloadImage: boolean;\n imageClass?: string;\n isSmall?: boolean;\n hasTableOfContents?: boolean;\n}\n\nexport function SeriesTallPoster(props: SeriesTallPosterMaskProps): JSX.Element {\n const [ hoverRef, isHovering ] = useHoverIntent<HTMLDivElement>({ className: styles.hoverActive });\n \n const audiences = props.series && props.series.subjectPresentationAudiences &&\n props.series.subjectPresentationAudiences.data || [];\n\n const mergedAudience = useMergeAudiences(audiences, props.presentationAudiences);\n const displayAudience = !!(audiences && audiences.length && mergedAudience);\n\n return (\n <div ref={hoverRef}>\n <BaseImage\n data={props.series.tallPoster}\n alt={props.series.name}\n imageType={ImageType.TallPosters}\n preload={props.preloadImage}\n imageOptions={{ size: ImageSize.Large }}\n imageClassName={props.imageClass ? props.imageClass : 'rounded-3'}\n >\n {isHovering && (\n <SeriesTallPosterHoverOverlay\n isSmall={props.isSmall}\n series={props.series}\n mergedAudience={audiences && audiences.length ? mergedAudience : null}\n hasTableOfContents={props.hasTableOfContents}\n />\n )}\n \n <ImageFallback type={ImageFallbackType.Series} />\n <div className={`position-absolute text-white ${styles.labelContainer}`}>\n {displayAudience\n ? <AudienceLabel audience={mergedAudience} className='bg-white text-dark' border='dark' />\n : <Badge className='text-shadow' type={BadgeType.Rating} data={SeriesHelper.getRating(props.series)} />\n }\n </div>\n </BaseImage>\n </div>\n );\n}\n","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SeriesTallPoster } from 'libs/shared/components/series-tall-poster/SeriesTallPoster';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoItem } from 'libs/shared/components/video-list/video-item/VideoItem';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { PresentationAudience, Series, Video } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\n\nimport styles from './series-with-videos.module.scss';\n\nconst namespace = 'search.seriesWithVideos';\n\nfunction useGetMaxVideos(): number {\n const breakpoints = useBreakpoints();\n\n if (breakpoints.xl || breakpoints.xxl)\n return 5;\n \n if (breakpoints.lg || breakpoints.md)\n return 4;\n\n return 3;\n}\n\ninterface SeriesWithVideoProps {\n series: Series;\n seriesAppLink: Core.AppLink;\n presentationAudiences: PresentationAudience[];\n preloadImage: boolean;\n analyticsData: HashObject;\n getVideoAppLink: (video: Video, opts: GetVideoAppLinkOptions) => Core.AppLink;\n hasPermissions: HasPermissionsFunc;\n commonVideoProps: CommonVideoProps;\n}\n\nexport function SeriesWithVideos(props: SeriesWithVideoProps): JSX.Element {\n const maxVideos = useGetMaxVideos();\n\n const videos = props.series.videos.data.slice(0, maxVideos);\n\n const seriesAnalyticsOption: AnalyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.Series,\n location: LocationContext.SeriesWithVideos\n };\n\n const seriesAnalyticsData: HashObject = {\n ...props.analyticsData,\n id: props.series.id,\n name: props.series.name\n };\n\n return (\n <div className='ps-2 py-2'>\n <Row className='g-0 border rounded-3'>\n <Col xs={4} lg={3} className='pe-3'>\n <AppLink\n appLink={props.seriesAppLink}\n className='position-relative'\n analyticsData={seriesAnalyticsData}\n analyticsOptions={{\n ...seriesAnalyticsOption,\n descriptor: ClickDescriptor.TallPoster\n }}\n >\n <SeriesTallPoster\n series={props.series}\n presentationAudiences={props.presentationAudiences}\n preloadImage={props.preloadImage}\n imageClass='rounded-start-lg'\n />\n </AppLink>\n </Col>\n <Col xs={8} lg={9}>\n <div className='d-flex justify-content-between'>\n <div className={`pt-3 mb-n2 ${styles.videoList}`}>\n {videos?.map(video => {\n const videoAnalyticsData: HashObject = {\n ...seriesAnalyticsData,\n videoId: video.id,\n videoName: video.name\n };\n\n // insert parent series into video object\n video = {\n ...video,\n series: props.series\n };\n\n return (\n <div key={video.id} className='mb-2'>\n <VideoItem\n video={video}\n getVideoAppLink={props.getVideoAppLink}\n analyticsData={videoAnalyticsData}\n analyticsOptions={{\n entity: EntityType.Video,\n location: LocationContext.SeriesWithVideos\n }}\n size='sm'\n hasPermissions={props.hasPermissions}\n hideVideoGuidance\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n })}\n </div>\n <div className='text-end pt-3 pe-3'>\n <AppLink\n className='info-link fw-semibold'\n appLink={props.seriesAppLink}\n analyticsData={seriesAnalyticsData}\n analyticsOptions={{\n ...seriesAnalyticsOption,\n descriptor: ClickDescriptor.Link\n }}\n >\n <Text namespace={namespace} phrase='seeAllVideos' />\n </AppLink>\n </div>\n </div>\n </Col>\n </Row>\n </div>\n );\n}","import React from 'react';\n\nimport { Series } from 'libs/shared/interfaces';\n\nimport { SeriesWithVideos } from '../../series-with-videos/SeriesWithVideos';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function LargeSeriesResult(props: MixedSearchResultItemProps<Series>): JSX.Element {\n return (\n <div className='mx-n2'>\n <SeriesWithVideos\n presentationAudiences={props.audiences}\n series={props.item}\n seriesAppLink={props.appLinks.getSeriesAppLink(props.item)}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n preloadImage\n hasPermissions={props.hasPermissions}\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { AnalyticsOptions, HashObject } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { SeasonEpisode } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { Video } from 'libs/shared/interfaces';\n\nconst namespace = 'search.collectionVideoList';\n\ninterface CollectionVideoListProps {\n videos: Video[];\n collectionId: string;\n appLink: Core.AppLink;\n analyticsOptions: AnalyticsOptions;\n analyticsData?: HashObject;\n getVideoAppLink: (video: Video) => Core.AppLink;\n}\n\nfunction useGetMaxVideos(): number {\n const breakpoints = useBreakpoints();\n\n if (breakpoints.xs)\n return 2;\n\n if (breakpoints.sm)\n return 1;\n\n return 3;\n}\n\nexport function CollectionVideoList(props: CollectionVideoListProps): JSX.Element {\n const maxVideos = useGetMaxVideos();\n\n const analyticsProps = {\n analyticsData: props.analyticsData,\n analyticsOptions: props.analyticsOptions\n };\n\n return (\n <>\n <ul className='list-unstyled my-1'>\n {props.videos.slice(0, maxVideos).map(v => {\n const hasSeasonEpisode = !!v.episodeNumber && !!v.season?.id;\n\n return (\n <li key={`${props.collectionId}:${v.id}`} className='d-flex align-items-center'>\n <AppLink\n {...analyticsProps}\n className='clamp-1'\n appLink={props.getVideoAppLink(v)}\n >\n {hasSeasonEpisode && <><SeasonEpisode video={v} />&nbsp;</>}\n {v.name}\n </AppLink>\n </li>\n );\n })}\n </ul>\n\n <AppLink\n {...analyticsProps}\n className='info-link'\n appLink={props.appLink}\n >\n <Text namespace={namespace} phrase='seeAll' />\n </AppLink>\n </>\n );\n}","import React from 'react';\nimport { Col } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, ClickDescriptor } from 'libs/analytics/interfaces';\n\nimport { CollectionVideoList } from 'libs/shared/apps/search/components/collection-video-list/CollectionVideoList';\nimport { ActionOptions, Actions as ActionsComponent } from 'libs/shared/components/actions/Actions';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { BadgeListContainer } from 'libs/shared/components/badges/BadgeListContainer';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { Mask, MaskType } from 'libs/shared/components/mask/Mask';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoListHelper } from 'libs/shared/components/video-list/VideoListHelper';\nimport { ImageType } from 'libs/shared/enums/Images';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { Playlist, Series, Video } from 'libs/shared/interfaces';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\nimport { SeriesHelper } from 'libs/shared/utils/SeriesHelper';\n\nimport styles from './collection-thumbnail.module.scss';\n\nconst namespace = 'search.collectionThumbnail';\n\n\nexport type GetCollectionActions = (\n collection: Collection,\n showActions: boolean,\n collectionType: CollectionType,\n baseAnalyticsOptions: AnalyticsOptions\n) => ActionOptions[]\n\ntype Collection = Series | Playlist;\ntype CollectionType = 'series' | 'playlist';\n\ninterface CollectionThumbnailProps {\n collection: Collection;\n collectionType: CollectionType;\n appLink: Core.AppLink;\n showActions: boolean;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n maskType?: MaskType;\n imageFallbackType?: ImageFallbackType;\n hideBadges?: boolean;\n isPlugin: boolean;\n getCollectionActions: GetCollectionActions;\n getVideoAppLink: (video: Video, opts?: GetVideoAppLinkOptions) => Core.AppLink;\n}\n\nexport function CollectionThumbnail(props: CollectionThumbnailProps): JSX.Element {\n const breakpoints = useBreakpoints();\n const size = VideoListHelper.getSize(breakpoints, 'md');\n const isSmall = size === 'sm';\n\n const hasVideos = !!props.collection.videos?.data?.length;\n\n const firstVideoWithThumbnail = hasVideos && props.collection.videos.data.find(v => !!v.thumbnail?.url);\n\n function getAnalyticsData(): HashObject {\n const data: HashObject = {\n ...props.analyticsData,\n id: props.collection.id,\n name: props.collection.name\n };\n\n if (firstVideoWithThumbnail) {\n data.videoId = firstVideoWithThumbnail.id;\n data.videoName = firstVideoWithThumbnail.name;\n }\n\n return data;\n }\n\n const analyticsData = getAnalyticsData();\n const isSeries = props.collectionType === 'series';\n\n return (\n <div className={`row g-0 ${isSmall ? '' : 'py-2'}`}>\n <Col {...VideoListHelper.getThumbnailColumns()} className={`flex-column align-items-flex-start ${isSmall ? `pb-2 pe-2` : 'mb-1 px-2'}`}>\n <div className={`position-relative overflow-hidden ${isSmall ? 'rounded' : 'rounded-3'}`}>\n <BaseImage\n data={firstVideoWithThumbnail?.thumbnail}\n appLink={props.appLink}\n imageType={ImageType.Thumbnails}\n analyticsData={analyticsData}\n analyticsOptions={{\n ...props.analyticsOptions,\n descriptor: ClickDescriptor.Thumbnail\n }}\n >\n <Mask type={props.maskType} />\n <ImageFallback type={props.imageFallbackType} />\n \n <div className={`d-flex flex-column align-items-center justify-content-center text-white h-100 ${styles.overlay}`}>\n <Text namespace={namespace} phrase='seeAll' />\n </div>\n </BaseImage>\n </div>\n </Col>\n\n <Col {...VideoListHelper.getDetailsColumns()} className={isSmall ? 'pb-2' : 'px-2'}>\n {!props.isPlugin &&\n <ActionsComponent\n actions={props.getCollectionActions(\n props.collection,\n props.showActions,\n props.collectionType,\n props.analyticsOptions\n )}\n className='float-end mt-n1'\n actionsDropdownClassName='btn btn-link ms-1'\n />\n }\n\n <AppLink\n appLink={props.appLink}\n analyticsData={analyticsData}\n analyticsOptions={{\n ...props.analyticsOptions,\n descriptor: ClickDescriptor.Title\n }}\n >\n <h5 className='m-0 mb-1'><span className='clamp-1'>{props.collection.name}</span></h5>\n </AppLink>\n\n {isSeries && !props.hideBadges && (\n <BadgeListContainer>\n <Badge type={BadgeType.Rating} data={SeriesHelper.getRating((props.collection as Series))} />\n <Badge type={BadgeType.ProductionYear} data={(props.collection as Series).metadata?.year} />\n </BadgeListContainer>\n )}\n \n {hasVideos && (\n <CollectionVideoList\n collectionId={props.collection.id}\n videos={props.collection.videos.data}\n appLink={props.appLink}\n analyticsData={analyticsData}\n analyticsOptions={{\n ...props.analyticsOptions,\n descriptor: ClickDescriptor.Link\n }}\n getVideoAppLink={props.getVideoAppLink}\n />\n )}\n </Col>\n </div>\n );\n}","import React from 'react';\n\nimport { EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { MaskType } from 'libs/shared/components/mask/Mask';\nimport { Playlist } from 'libs/shared/interfaces';\n\nimport { CollectionThumbnail } from '../../collection-thumbnail/CollectionThumbnail';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nimport styles from '../mixed-search-results.module.scss';\n\nexport function SmallPlaylistResult(props: MixedSearchResultItemProps<Playlist>): JSX.Element {\n return (\n <div className={`position-relative ${styles.videoList}`}>\n <CollectionThumbnail\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n analyticsOptions={{\n entity: EntityType.Playlist,\n actionType: UserAction.Click,\n location: LocationContext.PlaylistListItem\n }}\n appLink={props.appLinks.getPlaylistAppLink(props.item)}\n showActions={props.showActions}\n collection={props.item}\n collectionType='playlist'\n maskType={MaskType.Playlist}\n imageFallbackType={ImageFallbackType.PlaylistThumbnail}\n isPlugin={props.commonVideoProps.isPlugin}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n getCollectionActions={props.appLinks.getCollectionActions}\n />\n </div>\n );\n}","import React from 'react';\n\nimport { EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { MaskType } from 'libs/shared/components/mask/Mask';\nimport { Series } from 'libs/shared/interfaces';\n\nimport { CollectionThumbnail } from '../../collection-thumbnail/CollectionThumbnail';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nimport styles from '../mixed-search-results.module.scss';\n\nexport function SmallSeriesResult(props: MixedSearchResultItemProps<Series>): JSX.Element {\n return (\n <div className={`position-relative ${styles.videoList}`}>\n <CollectionThumbnail\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n analyticsOptions={{\n entity: EntityType.Series,\n actionType: UserAction.Click,\n location: LocationContext.SeriesListItem\n }}\n appLink={props.appLinks.getSeriesAppLink(props.item)}\n collectionType='series'\n collection={props.item}\n showActions={props.showActions}\n maskType={MaskType.Series}\n imageFallbackType={ImageFallbackType.SeriesThumbnail}\n hideBadges\n isPlugin={props.commonVideoProps.isPlugin}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n getCollectionActions={props.appLinks.getCollectionActions}\n />\n </div>\n );\n}","// Maps to enum in SubjectApi but uses the\n// key rather than the value as SubjectsApi returns the key.\nexport enum ClassificationStatus {\n Draft = 'Draft',\n ComingSoon = 'ComingSoon',\n Published = 'Published'\n}","import * as React from 'react';\n\nimport { ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { CoverPillWidgetContentWrapper, CoverPillWidgetItemProps } from 'libs/shared/components/widgets/items/subject-widget-item/CoverPill';\nimport { TopicsConstants } from 'libs/shared/constants/TopicsConstants';\nimport { ClassificationStatus } from 'libs/shared/enums/ClassificationStatus';\nimport { Classification, Presentation } from 'libs/shared/interfaces';\n\nfunction usePresentationName(presentationId: string, availablePresentations: Presentation[]): string {\n const showPresentationName = availablePresentations?.length >= TopicsConstants.MULTI_PRESENTATION_THRESHOLD;\n\n if (!showPresentationName) {\n return undefined;\n }\n\n return availablePresentations?.find(p => p.id === presentationId)?.name;\n}\n\nfunction SubjectWidgetItem(props: CoverPillWidgetItemProps<Classification>): JSX.Element {\n const isComingSoon = props.data?.status === ClassificationStatus.ComingSoon;\n const presentationName = usePresentationName(props.data.presentationId, props?.availablePresentations);\n\n const analyticsData = {\n ...props.analyticsData,\n id: props.analyticsData?.id || props.data?.id,\n name: props.data?.name,\n presentationId: props.analyticsData?.presentationId || props.data.presentationId,\n comingSoon: !!isComingSoon\n };\n\n const analyticsOptions = {\n location: LocationContext.ClassificationListItem,\n entity: EntityType.Classification,\n ...props.analyticsOptions,\n actionType: UserAction.Click,\n descriptor: ClickDescriptor.Cover\n };\n\n return (\n <CoverPillWidgetContentWrapper\n {...props}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n coverUrl={props.data.cover?.url}\n coverBgColor={props.data?.metadata?.backgroundColor}\n subtitle={props.getSubtitle?.(props.data) || presentationName}\n isComingSoon={isComingSoon}\n themeColor={props.shouldHighlight?.(props.data) ? props.data?.metadata?.backgroundColor ?? '' : ''}\n />\n );\n}\n\nconst Memoized = React.memo(SubjectWidgetItem);\n\nexport { Memoized as SubjectWidgetItem };","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, HashObject, UserAction } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { EditSvg } from 'libs/shared/images/svg/actions/EditSvg';\n\nimport styles from './cover-pill.module.scss';\n\ninterface EditSubjectsWidgetLinkProps {\n appLink: Core.AppLink;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n}\n\nconst analyticsOptions: AnalyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.UserSetting,\n descriptor: ClickDescriptor.Tile\n};\n\nexport function EditSubjectsWidgetLink(props: EditSubjectsWidgetLinkProps): JSX.Element {\n const className =\n `${styles.editSubjectsItem} d-flex position-relative px-3 justify-content-center align-items-center`;\n\n return (\n <AppLink\n appLink={props.appLink}\n className='text-decoration-none'\n analyticsData={{ ...props.analyticsData, type: 'subject-preference' }}\n analyticsOptions={ { ...props.analyticsOptions, ...analyticsOptions }}\n >\n <div className={className}>\n <SvgContainer svg={EditSvg} className='me-2 align-middle d-inline-block svg-container' />\n <p className='h6 align-middle text-truncate'><Text namespace='shared.subjectWidgetItem' phrase='edit' /></p>\n </div>\n </AppLink>\n );\n}","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, HashObject, UserAction } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { ClickViewLogoInverted } from 'libs/shared/components/svgs/clickview-logo/ClickViewLogo';\nimport { Text } from 'libs/shared/components/text/Text';\n\nimport styles from './cover-pill.module.scss';\n\ninterface AllSubjectsWidgetLinkProps {\n appLink: Core.AppLink;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n}\n\nconst analyticsOptions: AnalyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.Url,\n descriptor: ClickDescriptor.Tile\n};\n\nexport function AllSubjectsWidgetLink(props: AllSubjectsWidgetLinkProps): JSX.Element {\n const className =\n `${styles.allSubjectsItem}\n d-flex flex-column position-relative px-2\n align-items-center justify-content-center text-nowrap bg-navy`;\n\n return (\n <AppLink\n appLink={props.appLink}\n className='text-decoration-none'\n analyticsData={{ ...props.analyticsData, type: 'subject-all' }}\n analyticsOptions={ { ...props.analyticsOptions, ...analyticsOptions }}\n >\n <div className={className}>\n <div className={styles.logoContainer}>\n <ClickViewLogoInverted />\n </div>\n <p className='h6 pt-2 px-3 mb-0'><Text namespace='shared.subjectWidgetItem' phrase='all' /></p>\n </div>\n </AppLink>\n );\n}\n","import React from 'react';\nimport { Col } from 'react-bootstrap';\n\nimport { SubjectWidgetItem } from 'libs/shared/components/widgets/items/subject-widget-item';\nimport { Classification } from 'libs/shared/interfaces';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function SubjectResult(props: MixedSearchResultItemProps<Classification>): JSX.Element {\n return (\n <Col as='li' sm={6} md={props.useLargeStyle ? 6 : 4} lg={props.useLargeStyle ? 4 : 3}>\n <div className={`position-relative px-1 mb-2`}>\n <SubjectWidgetItem\n data={props.item}\n getChildAppLink={props.appLinks.getClassificationAppLink}\n getChildAppLinkOptions={\n () => props.appLinks.getClassificationAppLinkOptions?.(props.item)\n }\n availablePresentations={props.availablePresentations}\n analyticsData={{\n itemIndex: props.itemIndex,\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: 0\n }}\n isLarge={props.useLargeStyle}\n highlightOnHover={props.commonVideoProps.showNewVideoIndicator}\n />\n </div>\n </Col>\n );\n}","import React from 'react';\n\nimport { ClipItem, ClipItemProps } from 'libs/shared/components/video-list/clip-item/ClipItem';\nimport { InteractiveItem, InteractiveItemProps } from 'libs/shared/components/video-list/interactive-item/InteractiveItem';\nimport { VideoItem, VideoItemProps } from 'libs/shared/components/video-list/video-item/VideoItem';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nimport styles from '../mixed-search-results.module.scss';\n\nexport function VideoResult(props: MixedSearchResultItemProps<VideoTypes>): JSX.Element {\n function getItemComponent(\n video: VideoTypes\n ): (props: ClipItemProps | InteractiveItemProps | VideoItemProps) => JSX.Element {\n if (VideoHelper.isClip(video))\n return ClipItem;\n \n if (VideoHelper.isInteractive(video))\n return InteractiveItem;\n \n return VideoItem;\n }\n\n const Component = getItemComponent(props.item);\n\n return (\n <div className={`position-relative ${styles.videoList}`}>\n <Component\n video={props.item}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n getPreviewQuestionsAppLink={props.appLinks.getPreviewQuestionsAppLink}\n presentationAudiences={props.audiences}\n analyticsData= {{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n hasPermissions={props.hasPermissions}\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n}","import React from 'react';\nimport { Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { Classification, Company, CurrentUser, InteractiveMetadata, Playlist, Presentation, PresentationAudience, Series, Video } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { SearchResultObjectTypes, SearchResults, SearchResultsObject } from '../../interfaces';\nimport { GetCollectionActions } from '../collection-thumbnail/CollectionThumbnail';\n\nimport { CompanyResult } from './components/CompanyResult';\nimport { ExchangeVideoGroup } from './components/exchange-video-group/ExchangeVideoGroup';\nimport { FeaturedVideoResult } from './components/FeaturedVideoResult';\nimport { LargePlaylistResult } from './components/LargePlaylistResults';\nimport { LargeSeriesResult } from './components/LargeSeriesResult';\nimport { BaseMixedSearchResultItemProps } from './components/MixedSearchResultItemProps';\nimport { SmallPlaylistResult } from './components/SmallPlaylistResult';\nimport { SmallSeriesResult } from './components/SmallSeriesResults';\nimport { SubjectResult } from './components/SubjectResult';\nimport { VideoResult } from './components/VideoResult';\n\nconst namespace = 'shared.mixedSearchResults';\n\nconst TOPIC_DISPLAY_LIMIT = 8;\n\nexport interface MixedSearchResultAppLinks {\n getVideoAppLink: (video: Video, opts: GetVideoAppLinkOptions) => Core.AppLink;\n getSeriesAppLink: (series: Series) => Core.AppLink;\n getCompanyAppLink: (company: Company) => Core.AppLink;\n getCompanyAppLinkOptions?: (company: Company) => Core.AppLinkOptions;\n getClassificationAppLink: (classification: Classification) => Core.AppLink;\n getClassificationAppLinkOptions?: (classification: Classification) => Core.AppLinkOptions;\n getPlaylistAppLink: (playlist: Playlist) => Core.AppLink;\n getPreviewQuestionsAppLink: (interactive: InteractiveMetadata) => Core.AppLink;\n getCollectionActions: GetCollectionActions;\n searchSettings?: Core.AppLink;\n}\n\ninterface MixedSearchResultsProps {\n queryParams: HashObject;\n results: SearchResultObjectTypes[];\n topics?: SearchResults;\n companies?: SearchResults;\n audiences: PresentationAudience[];\n currentUser: CurrentUser;\n availablePresentations: Presentation[]\n showActions: boolean;\n hasPermissions: HasPermissionsFunc;\n appLinks: MixedSearchResultAppLinks;\n commonVideoProps: CommonVideoProps;\n}\n\nexport const MixedSearchResults = React.memo(function(props: MixedSearchResultsProps): JSX.Element {\n const breakpoints = useBreakpoints();\n const useSmallComponent = breakpoints.xs || breakpoints.sm;\n\n if (!props.results?.length && !props.topics?.totalResults && !props.companies?.totalResults)\n return <></>;\n\n const companiesAndTopics = [\n ...props.companies?.results ?? [],\n ...props.topics?.results ?? []\n ];\n\n const childProps: BaseMixedSearchResultItemProps = {\n useLargeStyle: companiesAndTopics.length < 4,\n ...props\n };\n\n return (\n <div className='position-relative'>\n <p role='status' className='visually-hidden'><Text namespace={namespace} phrase='ariaSearch' /></p>\n\n {!!companiesAndTopics.length && (\n <Row as='ul' className='list-unstyled g-0 pb-3 mx-n1'>\n {companiesAndTopics.slice(0, TOPIC_DISPLAY_LIMIT).map((c, itemIndex) => {\n switch (c.type.toLowerCase()) {\n case 'company':\n return (\n <CompanyResult\n key={itemIndex}\n item={c as SearchResultsObject<Company>}\n itemIndex={itemIndex}\n {...childProps}\n />\n );\n case 'subject': {\n return (\n <SubjectResult\n key={itemIndex}\n item={c as SearchResultsObject<Classification>}\n itemIndex={itemIndex}\n {...childProps}\n />\n );\n }\n }\n })}\n </Row>\n )}\n\n {props.results?.map((result, index) => {\n const pagePositionIndex = companiesAndTopics.length ? index + 1 : index;\n\n if ('isExchangeVideoGroup' in result && result.isExchangeVideoGroup) {\n return (\n <ExchangeVideoGroup\n key={index}\n item={result}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n \n\n switch (result.type?.toLowerCase()) {\n case 'interactive':\n case 'clip':\n case 'video': {\n if (index === 0 && result._featured && VideoHelper.isVideo(result)) {\n return (\n <FeaturedVideoResult\n key={index}\n item={result as SearchResultsObject<Video>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n return (\n <VideoResult\n key={index}\n item={result as SearchResultsObject<Video>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n case 'playlist': {\n if (useSmallComponent) {\n return (\n <SmallPlaylistResult\n key={index}\n item={result as SearchResultsObject<Playlist>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n return (\n <LargePlaylistResult\n key={index}\n item={result as SearchResultsObject<Playlist>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n case 'series': {\n const series = result as Series;\n\n if (useSmallComponent || !series.tallPoster?.id) {\n return (\n <SmallSeriesResult\n key={index}\n item={result as SearchResultsObject<Series>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n return (\n <LargeSeriesResult\n key={index}\n item={result as SearchResultsObject<Series>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n }\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 { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'search.searchSubstitute';\n\ninterface SearchSubstituteProps {\n substitute: string;\n queryParams: HashObject;\n getAppLink: (query: string, queryParams: HashObject) => Core.AppLink\n}\n\nexport function SearchSubstitute(props: SearchSubstituteProps): JSX.Element {\n if (!props.substitute)\n return <></>;\n\n return (\n <div className='pb-3'>\n <p className='mb-1 h6'>\n <Text namespace={namespace} phrase='showingFor' />&nbsp;\n <AppLink\n className='info-link'\n appLink={props.getAppLink(props.substitute, props.queryParams)}\n appLinkOptions={{ replace: true }}\n >\n {props.substitute}\n </AppLink>\n </p>\n <p className='mb-0 h6 fw-normal'>\n <Text namespace={namespace} phrase='searchInsteadFor' />\n <AppLink\n className='info-link'\n appLink={props.getAppLink(props.queryParams.query, { ...props.queryParams, allowSubstitute: 'false' })}\n >\n {props.queryParams.query}\n </AppLink>\n <Text namespace={namespace} phrase='endOriginal' />\n </p>\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'search.searchSuggestions';\n\ninterface SearchSuggestionsProps {\n suggestions: string[];\n queryParams: HashObject;\n getAppLink: (query: string, queryParams: HashObject) => Core.AppLink\n}\n\nSearchSuggestions.defaultProps = {\n suggestions: [],\n queryParams: {}\n};\n\nexport function SearchSuggestions(props: SearchSuggestionsProps): JSX.Element {\n if (!props.suggestions?.length)\n return <></>;\n\n return (\n <div className='d-flex align-items-center mb-3'>\n <Text namespace={namespace} phrase='didYouMean' />\n &nbsp;\n\n {props.suggestions.map((suggestion, index) => (\n <React.Fragment key={`${suggestion}:${index}`}>\n {index !== 0 && <span className='mx-1'>&bull;</span>}\n\n <AppLink\n className='info-link'\n appLink={props.getAppLink(suggestion, props.queryParams)}\n appLinkOptions={{ replace: true }}\n >\n {suggestion}\n </AppLink>\n </React.Fragment>\n ))}\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { FilterConstants } from 'libs/shared/apps/search/constants/FilterConstants';\nimport { SearchIndices } from 'libs/shared/apps/search/interfaces';\nimport { FilterHelper, Filters } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { Library, MasterNestedObject, Playlist, Rating, Series, Video } from 'libs/shared/interfaces';\n\nimport { Actions } from 'shared/constants/ExchangeActions';\nimport { AppChannels } from 'shared/constants/ExchangeRadioChannels';\n\nexport const ExchangeSearchUtils = {\n useOnFilterChange(fetchResults: (cursor?: string) => void, queryParams: HashObject): void {\n const params = { ...queryParams };\n delete params.query;\n \n const sortedValues = Object.keys(params).map(filterName => params[filterName]).sort((a, b) => a - b);\n \n React.useEffect(() => {\n fetchResults();\n }, [sortedValues.join(':')]);\n },\n\n getCollectionActions(\n collection: Series | Playlist,\n showActions: boolean,\n collectionType: 'series' | 'playlist',\n baseAnalyticsOptions: AnalyticsOptions\n ): ActionOptions[] {\n collection;\n collectionType;\n baseAnalyticsOptions;\n\n if (!showActions)\n return [];\n\n return [];\n },\n\n getSeriesAppLink(series: Series): Core.AppLink {\n if (!series?.id)\n return null;\n\n return {\n application: AppChannels.EXCHANGE,\n action: Actions.Exchange.SERIES,\n args: [ series.id, TextHelper.slugify(series.name) ]\n };\n },\n\n getVideoAppLink(video: Video): Core.AppLink {\n if (!video?.id)\n return null;\n\n return {\n application: AppChannels.EXCHANGE,\n action: Actions.Exchange.PREVIEW,\n args: [ video.id, TextHelper.slugify(video.name) ]\n };\n },\n\n getAppliedIndices(queryParams: HashObject = {}): SearchIndices[] {\n const { type: indices } = queryParams;\n\n if (indices) {\n if (!Array.isArray(indices))\n return [indices];\n\n if (indices.length)\n return indices;\n }\n\n return ['video'];\n },\n\n getNestedCategoryIds(topLevelCategoryIds: string | string[], categories: MasterNestedObject<Library>[]) {\n const searchNestedCategories = (categoryId: string) => {\n const categoryIds: string[] = [];\n const category = categories.find(category => +category.data.id === +categoryId);\n\n if (!category?.children.length)\n return [categoryId];\n \n const searchCategoryIds = (category: MasterNestedObject<Library>) => {\n if (!category) return;\n \n if (category.data) {\n categoryIds.push(category.data.id);\n }\n \n if (category.children.length) {\n category.children.forEach(child => {\n searchCategoryIds(child);\n });\n }\n };\n \n searchCategoryIds(category);\n \n return categoryIds;\n };\n\n if (!Array.isArray(topLevelCategoryIds)) {\n return searchNestedCategories(topLevelCategoryIds);\n }\n \n const nestedCategoryIds = [...topLevelCategoryIds].map(categoryId => searchNestedCategories(categoryId));\n\n return ArrayHelper.flatten(nestedCategoryIds);\n },\n\n buildBackendFilterParams(\n libraryId: string,\n queryParams: HashObject,\n ratings: Rating[] = [],\n categories: MasterNestedObject<Library>[]\n ): HashObject {\n const topLevelCategoryIds = queryParams?.categoryId;\n const nestedCategories = topLevelCategoryIds && this.getNestedCategoryIds(topLevelCategoryIds, categories);\n\n const filters = FilterHelper.buildBackendFilterParams(\n { ...queryParams, categoryId: nestedCategories },\n ratings,\n null,\n false,\n []\n );\n\n // TODO: Filtering the search results means that we can't search for series, clips and interactives\n filters[`${FilterConstants.FILTER_PARAM_PREFIX}library`] = libraryId;\n\n return filters;\n },\n\n getBackendFilters(options: {\n queryParams: HashObject;\n ratings: Flight.Response<Rating[]>;\n exchange: Flight.Response<Library>;\n categories: Flight.Response<MasterNestedObject<Library>[]>;\n hasDataLoaded: boolean;\n }) {\n if (!options.hasDataLoaded)\n return null;\n\n const { queryParams, ratings, exchange, categories } = options;\n \n const backendFilters = ExchangeSearchUtils.buildBackendFilterParams(\n exchange.data.id,\n queryParams,\n ratings.data,\n categories.data\n );\n \n const appliedIndices = ExchangeSearchUtils.getAppliedIndices(queryParams);\n \n return {\n queryParams,\n backendFilters,\n appliedIndices\n };\n },\n\n getFilters(\n options: {\n categories: Flight.Response<MasterNestedObject<Library>[]>;\n ratings: Flight.Response<Rating[]>;\n hasDataLoaded: boolean;\n },\n tagsAndClassifications: Flight.Response<string[]>\n ) {\n if (!options.hasDataLoaded || !tagsAndClassifications.hasCompleted)\n return null;\n\n const { categories, ratings } = options;\n\n const mainFilters = [\n Filters.Categories(categories.data),\n Filters.Rating(ratings.data, null),\n Filters.HasResources(),\n Filters.HasSubtitles(),\n Filters.TagOrClassification(tagsAndClassifications.data)\n ];\n \n const moreFilters = FilterHelper.getMoreFilters([\n Filters.ProductionYear(),\n Filters.IsHD(),\n Filters.Duration()\n ]);\n\n return {\n mainFilters,\n moreFilters\n };\n },\n\n getAppLink(query: string, queryParams: HashObject): Core.AppLink {\n return {\n application: AppChannels.EXCHANGE,\n action: Actions.Exchange.SEARCH,\n params: {\n ...queryParams,\n query\n }\n };\n }\n};","import React from 'react';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nimport { Actions } from 'shared/constants/ExchangeActions';\nimport { AppChannels } from 'shared/constants/ExchangeRadioChannels';\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nconst namespace = 'exchange.searchResultsEmptyState';\n\ninterface ExchangeSearchResultsStateProps {\n query?: string;\n}\n\nexport function ExchangeSearchResultsState(props: ExchangeSearchResultsStateProps): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={ImageUrls.EmptyStates.SEARCH} />\n\n <EmptyState.Heading>\n {props.query\n ? <Text phrase='headingWithQuery' options={{ query: props.query }} />\n : <Text phrase='headingWithoutQuery' />\n }\n </EmptyState.Heading>\n\n <EmptyState.Info>\n <Text phrase='info' />\n <AppLink\n className='info-link'\n appLink={{ application: AppChannels.EXCHANGE, action: Actions.Exchange.INDEX }}\n >\n <Text phrase='topicsAppLink' />\n </AppLink>\n </EmptyState.Info>\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}","import { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { RatingRequests } from 'libs/shared/flight-requests/RatingRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { CurrentUser, Library, MasterNestedObject, Rating } from 'libs/shared/interfaces';\n\nimport { ExchangeRequests } from 'apps/exchange/flight-requests/ExchangeRequests';\n\nexport function useFetchSearchData(queryParams: HashObject) {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const exchange = Flight.useBasicFetch<Library>(ExchangeRequests.exchange());\n const ratings = Flight.useBasicFetch<Rating[]>(RatingRequests.ratings());\n const categories = Flight.useBasicFetch<MasterNestedObject<Library>[]>(ExchangeRequests.categories());\n\n const hasDataLoaded = (\n currentUser.hasCompleted &&\n exchange.hasCompleted &&\n ratings.hasCompleted &&\n categories.hasCompleted\n );\n\n return {\n queryParams,\n currentUser,\n exchange,\n ratings,\n categories,\n hasDataLoaded\n };\n}","import { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { HashObject } from 'libs/analytics/interfaces';\n\nimport { SearchIndices, SearchResultObjectTypes, SearchResults } from 'libs/shared/apps/search/interfaces';\nimport { handleHttpError } from 'libs/shared/errors/handlers/HttpErrorHandlers';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useInfiniteList } from 'libs/shared/hooks/UseInfiniteList';\n\nimport { ExchangeRequests } from 'apps/exchange/flight-requests/ExchangeRequests';\n\nexport const namespace = 'exchange.searchResultsView2';\n\ninterface UseGetSearchResultsOptions {\n queryParams: HashObject;\n appliedIndices: SearchIndices[];\n backendFilters: HashObject;\n hasDataLoaded: boolean;\n}\nexport function useGetSearchResults(options: UseGetSearchResultsOptions) {\n const { queryParams, appliedIndices, backendFilters } = options;\n\n const alerts = useAlerts();\n const fetch = Flight.useGetFetch();\n\n const searchResultsResponse = Flight.useGetResponse<SearchResults>(getSearchRequest()?.key);\n\n function getSearchRequest(cursor?: string) {\n return options.hasDataLoaded &&\n ExchangeRequests.search(queryParams.query, appliedIndices, backendFilters, cursor);\n }\n\n function fetchNext(cursor?: string) {\n fetch(getSearchRequest(cursor));\n }\n\n function onError(pageNumber: number, httpStatus: HttpStatus): void {\n if (pageNumber === 1)\n return handleHttpError(httpStatus);\n\n alerts.error(LanguageService.getPhrase(namespace, 'error'));\n }\n\n const searchResults = useInfiniteList<SearchResultObjectTypes, SearchResults>(\n getSearchRequest,\n fetchNext,\n onError,\n data => data.results\n );\n\n return {\n ...searchResults,\n fetchNext,\n substituteQuery: searchResultsResponse.data?.substituteQuery,\n suggestions: searchResultsResponse.data?.suggestions\n };\n}\n","import { SharedWithStatements } from 'libs/shared/constants/WithStatements';\nimport { TagType } from 'libs/shared/enums/TagType';\n\n/**\n * OGQL used for search V5 endpoint\n */\nexport const SearchOGQL = {\n video: SharedWithStatements.VIDEO_COLLECTION,\n series: 'rating,tallPoster',\n playlist:\n 'videos[count(),thumbnail]{limit:1},interactives[count(),_thumbnail]{limit:1},' +\n 'clips[count(),_thumbnail]{limit:1}',\n classification: `_theme[banner,cover,tallposter,thumbnail,icon],cover,thumbnail,tags{tagtype:${TagType.Curation}}`,\n clip: SharedWithStatements.CLIP_COLLECTION,\n interactive: SharedWithStatements.INTERACTIVE_COLLECTION,\n company: 'logo',\n category: 'libraries[_logo],thumbnail',\n partner_profile: SharedWithStatements.PARTNER_PROFILE\n};\n","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { 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';\n\nimport { FilterConstants } from 'libs/shared/apps/search/constants/FilterConstants';\nimport { SearchOGQL } from 'libs/shared/apps/search/constants/SearchOGQL';\nimport { SearchIndices, SearchResultObjectTypes, SearchResults, SearchResultsObject } from 'libs/shared/apps/search/interfaces';\nimport type { WidgetFilter } from 'libs/shared/apps/search/interfaces/WidgetSearchResults';\nimport { SharedSearchHelper } from 'libs/shared/apps/search/utils/SharedSearchHelper';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport type { Playlist, Series } from 'libs/shared/interfaces';\nimport { ThemeAssetHelper } from 'libs/shared/utils/ThemeAssetHelper';\n\nfunction formatSearchResponse(response: SearchResults<SearchResultObjectTypes>) {\n /**\n * Until playlists and series are regionalised, search will always return every series/playlist that exists\n * even if the current user doesn't have access to the content inside (which will happen for example when playlists/series)\n * contain all UK library content but is being searched for by an AU user.\n *\n * For some search queries, this may result in search showing a bunch of \"empty\" playlists/series, which sucks.\n * This will filter all empty collections out and decrement the `totalResults` to avoid this and make search a better\n * experience.\n *\n * Ideally this will be removed one day when this regionalisation is no longer an issue.\n */\n let totalResults = response.totalResults;\n\n const results = response?.results?.filter(result => {\n if (result._index !== 'series' && result._index !== 'playlist')\n return true;\n\n if (result._index === 'playlist') {\n const playlist = result as SearchResultsObject<Playlist>;\n\n if (playlist.clips?.data?.length ||\n playlist.interactives?.data?.length ||\n playlist.videos?.data?.length)\n return true;\n\n totalResults--;\n return false;\n }\n\n if ((result as SearchResultsObject<Series>).videos?.data?.length === 0) {\n totalResults--;\n return false;\n }\n\n return true;\n }) ?? [];\n\n response.results = results;\n response.totalResults = totalResults;\n\n // The first search result will always have the highest score value.\n // We store it so that we can access it for subsequent results pages\n const resultMaxScore = results[0]?._score;\n\n return {\n ...response,\n results: SharedSearchHelper.mapMaxScoreToSearchResults(results, resultMaxScore)\n };\n}\n\nfunction stringifyObject(obj: HashObject): string {\n return Object.entries(obj).reduce((prev, [ , value ]) => {\n let stringifiedValue = value;\n\n if (typeof value === 'object') {\n stringifiedValue = stringifyObject(value);\n } else if ([ 'number', 'boolean', 'string' ].includes(typeof value)) {\n stringifiedValue = value.toString();\n }\n\n if (!prev.length)\n return stringifiedValue;\n\n return `${prev},${stringifiedValue}`;\n }, '');\n}\n\n/**\n * We want to map the filters to the global filters object but we need to remove the filter prefix\n * and exclude the presentation filter\n */\nfunction getGlobalFilters(filters: HashObject, widgetTypeId: WidgetTypeId | null): Record<string, any> {\n return Object.entries(filters)\n .reduce((prev, [ key, value ]) => {\n const actualKey = key.replace(FilterConstants.FILTER_PARAM_PREFIX, '');\n if (actualKey === 'presentation' &&\n widgetTypeId !== WidgetTypeId.SearchTopResults &&\n widgetTypeId !== WidgetTypeId.SearchRelatedResults &&\n widgetTypeId !== WidgetTypeId.SearchSeries\n ) {\n return prev;\n }\n\n return { ...prev, [actualKey]: value };\n }, {});\n}\n\n\nexport const SharedSearchRequests = {\n searchDashboard(\n query: string,\n filters: HashObject,\n widgets: WidgetFilter[] = []\n ): Flight.PublicRequest {\n const widgetData = widgets.sort((a, b) => a.id.localeCompare(b.id)).map(w => [ w.id, w?.cursor ]);\n const filterData = stringifyObject(filters);\n \n const key = `search:v5:dashboard:${query}:${widgetData}:${filterData}`;\n \n const {\n [`${FilterConstants.FILTER_PARAM_PREFIX}indicesFilters`]: indicesFilter,\n isLearner,\n ...genericFilters\n } = filters;\n\n const data = {\n widgets,\n indices: indicesFilter,\n filters: getGlobalFilters(genericFilters, null),\n query,\n includeAllIndices: false,\n isLearner: !!isLearner\n };\n\n return {\n url: '{gateway}/v5/search/widgets',\n publicUrl: '/api/search/v5/widgets',\n type: HttpVerbs.POST,\n data,\n key\n };\n },\n\n searchDashboardWidget(\n widgetTypeId: WidgetTypeId,\n query: string,\n filters: HashObject,\n widgets: WidgetFilter[] = []\n ): Flight.PublicRequest {\n const widgetData = widgets.sort((a, b) => a.id.localeCompare(b.id)).map(w => [ w.id, w?.cursor ]);\n const filterData = stringifyObject(filters);\n \n const key = `search:v5:dashboard:${widgetTypeId}:widget:${query}:${widgetData}:${filterData}`;\n \n const {\n [`${FilterConstants.FILTER_PARAM_PREFIX}indicesFilters`]: indicesFilter,\n isLearner,\n excludeVideoIds,\n ...genericFilters\n } = filters;\n\n const data = {\n widgets,\n indices: indicesFilter,\n filters: getGlobalFilters(genericFilters, widgetTypeId),\n query,\n includeAllIndices: false,\n isLearner: !!isLearner,\n ogql: SearchOGQL,\n excludeVideoIds\n };\n\n return {\n url: `{gateway}/v5/search/widgets/${widgetTypeId}`,\n publicUrl: `/api/search/v5/widgets/${widgetTypeId}`,\n type: HttpVerbs.POST,\n data,\n key,\n formatData: (data: HashObject) => {\n if (!data)\n return data;\n\n return {\n ...data,\n content: data.content?.data\n ? { ...data.content, data: data.content.data.map(ThemeAssetHelper.applyThemeToClassification) }\n : data.content\n };\n }\n };\n },\n\n searchV5(\n query: string,\n filters: HashObject,\n widgets: WidgetFilter[] = []\n ): Flight.PublicRequest {\n const widgetData = widgets.sort((a, b) => a.id.localeCompare(b.id)).map(w => [ w.id, w?.cursor ]);\n const filterData = stringifyObject(filters);\n \n const key = `search:v5:${query}:${widgetData}:${filterData}`;\n \n const {\n [`${FilterConstants.FILTER_PARAM_PREFIX}indicesFilters`]: indicesFilter,\n isLearner,\n ...genericFilters\n } = filters;\n\n const data = {\n widgets,\n indices: indicesFilter,\n filters: Object.entries(genericFilters)\n .reduce((prev, [ key, value ]) =>\n ({ ...prev, [key.replace('filters.', '')]: value }), {}),\n query,\n includeAllIndices: false,\n isLearner: !!isLearner,\n ogql: SearchOGQL\n };\n\n return {\n url: '{gateway}/v5/search',\n publicUrl: '/api/search/v5',\n type: HttpVerbs.POST,\n data,\n key\n };\n },\n \n searchV4(options: {\n query: string;\n indices: SearchIndices[];\n filters: HashObject;\n sorts?: HashObject;\n allowSubstitute: boolean;\n cursor?: string;\n limit?: number;\n }): Flight.PublicRequest {\n const { query, indices, filters = {}, sorts = {}, allowSubstitute = true, cursor, limit } = options;\n\n let key = `search:v4:${query}:${allowSubstitute}:${indices}:${cursor}`;\n\n key += Object.keys(filters).map(filterName => {\n const filter = filters[filterName];\n return Array.isArray(filter) ? filter.join(';') : filter;\n }).join(';');\n\n const {\n [`${FilterConstants.FILTER_PARAM_PREFIX}excludeLibraryExclusive`]: excludeLibraryExclusive,\n isLearner,\n ...genericFilters\n } = filters;\n\n const indexObjects = indices.map(index => {\n if (index !== 'video' || !excludeLibraryExclusive)\n return { index };\n\n return { index, filters: { excludeLibraryExclusive } };\n });\n\n const data = {\n searchType: 'content',\n indices: indexObjects,\n filters: Object.entries(genericFilters)\n .reduce((prev, [ key, value ]) =>\n ({ ...prev, [key.replace('filters.', '')]: value }), {}),\n sorts,\n query,\n allowSubstitute,\n cursor: cursor ?? undefined,\n isLearner: !!isLearner,\n limit\n };\n\n return {\n url: '{gateway}/v4/search',\n publicUrl: '/api/search/v4',\n type: HttpVerbs.POST,\n data,\n key,\n formatData: formatSearchResponse\n };\n },\n\n search(options: {\n query: string;\n indices: SearchIndices[];\n filters?: HashObject;\n allowSubstitute?: boolean;\n cursor?: string;\n limit?: number;\n success?: (results: SearchResults) => void;\n error?: (xhr: Xhr) => void;\n }): Flight.PublicRequest {\n const { query, indices, filters, allowSubstitute, cursor, limit, success, error } = options;\n\n let key = `search:${query}:${allowSubstitute}:${indices}:${cursor}`;\n\n key += Object.keys(filters).map(filterName => {\n const filter = filters[filterName];\n return Array.isArray(filter) ? filter.join(';') : filter;\n }).join(';');\n\n const params = Object.assign({}, {\n index: indices,\n cursor: cursor ?? undefined,\n query,\n allowSubstitute,\n limit,\n ...filters\n });\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v3/search', params),\n publicUrl: UrlHelper.urlBuilder('/api/search', params),\n key,\n formatData: formatSearchResponse,\n success,\n error\n };\n },\n\n tagsAndClassifications(\n query: string,\n indices: SearchIndices[],\n filters: HashObject = {},\n cursor?: string,\n success?: (results: string[]) => void,\n error?: () => void\n ): Flight.PublicRequest {\n const params = {\n index: indices,\n cursor,\n query,\n ...filters\n };\n\n let key = `filter:options:${query}:${indices.join(':')}:${cursor}`;\n\n key += Object.keys(filters).map(filterName => {\n const filter = filters[filterName];\n return Array.isArray(filter) ? filter.join(';') : filter;\n }).join(';');\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v3/search/tags-and-classifications', params),\n publicUrl: UrlHelper.urlBuilder('/api/search/tags-and-classifications', params),\n key,\n success,\n error,\n normalize: false\n };\n }\n};","import { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { SharedSearchRequests } from 'libs/shared/apps/search/flight-requests/SharedSearchRequests';\nimport { SearchIndices } from 'libs/shared/apps/search/interfaces';\n\nexport interface UseGetTagsAndClassificationsOptions {\n queryParams: HashObject;\n appliedIndices: SearchIndices[];\n backendFilters: HashObject;\n}\n\nexport function useGetTagsAndClassifications(options: UseGetTagsAndClassificationsOptions) {\n return Flight.useBasicFetch<string[]>(options && SharedSearchRequests.tagsAndClassifications(\n options.queryParams.query,\n options.appliedIndices,\n options.backendFilters\n ));\n}\n","import React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { EntityType, LocationContext } from 'libs/analytics/interfaces';\n\nimport { MixedSearchResults } from 'libs/shared/apps/search/components/mixed-search-results/MixedSearchResults';\nimport { SearchFilters } from 'libs/shared/apps/search/components/search-filters/SearchFilters';\nimport { SearchSubstitute } from 'libs/shared/apps/search/components/search-substitute/SearchSubstitute';\nimport { SearchSuggestions } from 'libs/shared/apps/search/components/search-suggestions/SearchSuggestions';\nimport { InfiniteScrollFooter } from 'libs/shared/components/infinite-scroll-footer/InfiniteScrollFooter';\nimport { PartialVideoList } from 'libs/shared/components/video-list/partial-loading/PartialVideoList';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\n\nimport { Actions } from 'shared/constants/ExchangeActions';\nimport { AppChannels } from 'shared/constants/ExchangeRadioChannels';\n\nimport { ExchangeSearchBar } from 'apps/exchange/components/exchange-search-bar/ExchangeSearchBar';\nimport { useCommonVideoProps } from 'apps/exchange/hooks/useCommonVideoProps';\nimport { useGetExchangeActions } from 'apps/exchange/hooks/useGetExchangeActions';\nimport { ExchangeSearchUtils } from 'apps/exchange/views/exchange-search-results/ExchangeSearchUtils';\n\nimport { ExchangeSearchResultsState } from './empty-state/ExchangeSearchEmptyState';\nimport { useFetchSearchData } from './useFetchSearchData';\nimport { useGetSearchResults } from './useGetSearchResults';\nimport { useGetTagsAndClassifications } from './useGetTagsAndClassifications';\n\ninterface ExchangeSearchResultsViewProps {\n queryParams: HashObject;\n}\n\n\nexport function ExchangeSearchResultsView(props: ExchangeSearchResultsViewProps): JSX.Element {\n const { queryParams = {} } = props;\n\n const videoActions = useGetExchangeActions('video-list');\n\n const searchData = useFetchSearchData(queryParams);\n\n const { commonVideoProps } = useCommonVideoProps();\n\n const searchFilters = ExchangeSearchUtils.getBackendFilters(searchData);\n\n const tagsAndClassifications = useGetTagsAndClassifications(searchFilters);\n const searchResults = useGetSearchResults({ ...searchFilters, ...searchData });\n\n const filters = ExchangeSearchUtils.getFilters(searchData, tagsAndClassifications);\n\n /**\n * Custom hooks\n */\n useSetPageMetadata({ title: queryParams.query ?? '' });\n\n\n /**\n * Do we have the data we need for the entire view to render\n */\n const hasLoaded = (\n searchData.hasDataLoaded && filters\n );\n\n /**\n * Do we have the data we need to render our results\n */\n const hasSearchCompleted = (\n searchResults.hasFirstPageCompleted &&\n // Topic and Company requests won't exist if they aren't being fetched\n tagsAndClassifications.hasCompleted &&\n !!filters\n );\n\n /**\n * Do we actually have results\n */\n const hasResults = (\n searchResults.items?.length\n );\n\n if (!hasLoaded)\n return <></>;\n\n return (\n <>\n <ExchangeSearchBar query={queryParams.query} />\n\n <SearchSubstitute\n substitute={searchResults.substituteQuery}\n queryParams={queryParams}\n getAppLink={ExchangeSearchUtils.getAppLink}\n />\n\n {!searchResults.substituteQuery && (\n <SearchSuggestions\n suggestions={searchResults?.suggestions}\n queryParams={queryParams}\n getAppLink={ExchangeSearchUtils.getAppLink}\n />\n )}\n\n <SearchFilters\n queryParams={queryParams}\n mainFilters={filters?.mainFilters}\n moreFilters={filters?.moreFilters}\n analyticsOptions={{\n entity: EntityType.SearchResults,\n location: LocationContext.SearchFilters\n }}\n appLink={{ application: AppChannels.EXCHANGE, action: Actions.Exchange.SEARCH }}\n isFetchingOptions={tagsAndClassifications.isFetching}\n />\n\n {hasSearchCompleted ? (\n <section>\n {hasResults\n ? (\n <VideoActionsContext.Provider value={videoActions}>\n {/* // TODO: Update the prop interfaces for mixed search results to be strongly typed for each use case */}\n <MixedSearchResults\n queryParams={queryParams.query}\n results={searchResults.items}\n audiences={null}\n currentUser={searchData.currentUser.data}\n availablePresentations={null}\n showActions\n companies={null}\n hasPermissions={() => false}\n appLinks={{\n getCollectionActions: ExchangeSearchUtils.getCollectionActions,\n getSeriesAppLink: ExchangeSearchUtils.getSeriesAppLink,\n getVideoAppLink: ExchangeSearchUtils.getVideoAppLink,\n getClassificationAppLink: () => null,\n getClassificationAppLinkOptions: () => null,\n getPlaylistAppLink: () => null,\n getCompanyAppLink: () => null,\n getPreviewQuestionsAppLink: () => null\n }}\n commonVideoProps={commonVideoProps}\n />\n </VideoActionsContext.Provider>\n ) : (\n <ExchangeSearchResultsState query={queryParams.query} />\n )\n }\n {searchResults.hasMore && (\n <InfiniteScrollFooter\n isFetching={searchResults.isFetching}\n fetchNext={searchResults.fetchNext}\n nextCursor={searchResults.nextCursor}\n />\n )}\n </section>\n ) : (\n <div className='mx-n2'>\n <PartialVideoList />\n </div>\n )}\n </>\n );\n}"],"names":["namespace","ComingSoonNamePanel","name","multiline","noUnderLine","wrapperClassName","styles","textClassName","jsxs","jsx","Text","NormalNamePanel","subtitle","newVideosCount","CoverPillWidgetContent","props","coverUrl","ImageHelper","ImageSize","classification","MasterTypeHelper","childProps","_a","coverStyle","fallbackCoverBgClassName","getBgColorClass","BG_COLOUR_CLASS_NAMES","classNames","RandomHelper","IconCircle","CheckSvg","SvgContainerSize","ImageFallback","ImageFallbackType","CoverPillWidgetContentWrapper","appLink","AppLink","CompanyWidgetItem","analyticsData","_b","analyticsOptions","LocationContext","UserAction","EntityType","ClickDescriptor","_c","_d","CompanyResult","Col","EXCHANGE_RESULT_DISPLAY_LIMIT","ExchangeVideoGroup","limit","getContainerClassName","currentAppLink","Core.AppLinkHelper","currentParams","currentSource","searchAppLink","SourceFilterOptions","SearchSourceDescriptor","v","i","VideoItem","HeroVideo","videoAudiences","mergedAudience","useMergeAudiences","AnalyticsHelper","VideoHelper","containerRef","React","Row","VideoThumbnail","ThumbnailTextPosition","VideoSubText","_e","VideoItemTitle","_f","VideoItemActions","BadgeListContainer","Badge","BadgeType","AudienceLabel","VideoItemGuidance","Fragment","FeaturedVideoResult","opts","EN_US","en_US","diff","idx","unit","ZH_CN","zh_CN","Locales","register","locale","func","getLocale","SEC_ARRAY","toDate","input","formatDiff","localeFunc","agoIn","totalSec","diffSec","date","relativeDate","relDate","format","sec","getCount","playlist","videos","interactives","clips","PlaylistCount","count","ClickViewAvatar","ClickViewLogoMark","PlaylistOwnerAvatar","_liteOwner","url","Avatar","UserHelper","PlaylistItem","imageUrl","ResizeType","audiences","className","showImage","getTitle","LanguageService","DateHelper","BaseImage","useGetMaxVideos","breakpoints","useBreakpoints","PlaylistWithVideos","maxVideos","playlistAnalyticsOption","playlistAnalyticsData","video","videoAnalyticsData","LargePlaylistResult","SeriesTallPosterHoverOverlay","SeriesHelper","SeriesTallPoster","hoverRef","isHovering","useHoverIntent","displayAudience","ImageType","SeriesWithVideos","seriesAnalyticsOption","seriesAnalyticsData","LargeSeriesResult","CollectionVideoList","analyticsProps","hasSeasonEpisode","SeasonEpisode","CollectionThumbnail","isSmall","VideoListHelper","hasVideos","firstVideoWithThumbnail","getAnalyticsData","data","isSeries","Mask","ActionsComponent","SmallPlaylistResult","MaskType","SmallSeriesResult","ClassificationStatus","usePresentationName","presentationId","availablePresentations","TopicsConstants","p","SubjectWidgetItem","isComingSoon","presentationName","_h","_g","_i","_j","_l","_k","Memoized","React.memo","SubjectResult","VideoResult","getItemComponent","ClipItem","InteractiveItem","Component","TOPIC_DISPLAY_LIMIT","MixedSearchResults","useSmallComponent","companiesAndTopics","c","itemIndex","result","index","pagePositionIndex","SearchSubstitute","SearchSuggestions","suggestion","ExchangeSearchUtils","fetchResults","queryParams","params","sortedValues","filterName","a","b","collection","showActions","collectionType","baseAnalyticsOptions","series","AppChannels","Actions","TextHelper","indices","topLevelCategoryIds","categories","searchNestedCategories","categoryId","categoryIds","category","searchCategoryIds","child","nestedCategoryIds","ArrayHelper","libraryId","ratings","nestedCategories","filters","FilterHelper","FilterConstants","options","exchange","backendFilters","appliedIndices","tagsAndClassifications","mainFilters","Filters","moreFilters","query","ExchangeSearchResultsState","LanguageNamespaceContext","EmptyState","ImageUrls","useFetchSearchData","currentUser","Flight.useBasicFetch","UserRequests","ExchangeRequests","RatingRequests","hasDataLoaded","useGetSearchResults","alerts","useAlerts","fetch","Flight.useGetFetch","searchResultsResponse","Flight.useGetResponse","getSearchRequest","cursor","fetchNext","onError","pageNumber","httpStatus","handleHttpError","useInfiniteList","SearchOGQL","SharedWithStatements","TagType","formatSearchResponse","response","totalResults","results","resultMaxScore","SharedSearchHelper","stringifyObject","obj","prev","value","stringifiedValue","getGlobalFilters","widgetTypeId","key","actualKey","WidgetTypeId","SharedSearchRequests","widgets","widgetData","w","filterData","indicesFilter","isLearner","genericFilters","HttpVerbs","excludeVideoIds","ThemeAssetHelper","sorts","allowSubstitute","filter","excludeLibraryExclusive","success","error","UrlHelper","useGetTagsAndClassifications","ExchangeSearchResultsView","videoActions","useGetExchangeActions","searchData","commonVideoProps","useCommonVideoProps","searchFilters","searchResults","useSetPageMetadata","hasLoaded","hasSearchCompleted","hasResults","ExchangeSearchBar","SearchFilters","VideoActionsContext","InfiniteScrollFooter","PartialVideoList"],"mappings":"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","x_google_ignoreList":[6,7,8,9,10,11]}