@openedx/frontend-app-learner-dashboard 1.0.0-alpha.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 (351) hide show
  1. package/LICENSE +661 -0
  2. package/README.rst +86 -0
  3. package/package.json +84 -0
  4. package/src/Main.jsx +20 -0
  5. package/src/__mocks__/file.js +1 -0
  6. package/src/__mocks__/svg.js +1 -0
  7. package/src/__snapshots__/App.test.jsx.snap +83 -0
  8. package/src/__snapshots__/index.test.jsx.snap +43 -0
  9. package/src/app.scss +41 -0
  10. package/src/app.ts +23 -0
  11. package/src/assets/empty-course.svg +49 -0
  12. package/src/assets/more-courses-sidewidget.svg +52 -0
  13. package/src/assets/verified-ribbon.png +0 -0
  14. package/src/components/Banner.jsx +26 -0
  15. package/src/components/Banner.test.jsx +27 -0
  16. package/src/components/__snapshots__/Banner.test.jsx.snap +31 -0
  17. package/src/constants.ts +1 -0
  18. package/src/containers/CourseCard/CourseCard.scss +75 -0
  19. package/src/containers/CourseCard/__snapshots__/index.test.jsx.snap +111 -0
  20. package/src/containers/CourseCard/components/CourseCardActions/ActionButton/__snapshots__/index.test.jsx.snap +14 -0
  21. package/src/containers/CourseCard/components/CourseCardActions/ActionButton/hooks.js +8 -0
  22. package/src/containers/CourseCard/components/CourseCardActions/ActionButton/hooks.test.js +21 -0
  23. package/src/containers/CourseCard/components/CourseCardActions/ActionButton/index.jsx +16 -0
  24. package/src/containers/CourseCard/components/CourseCardActions/ActionButton/index.test.jsx +25 -0
  25. package/src/containers/CourseCard/components/CourseCardActions/BeginCourseButton.jsx +38 -0
  26. package/src/containers/CourseCard/components/CourseCardActions/BeginCourseButton.test.jsx +86 -0
  27. package/src/containers/CourseCard/components/CourseCardActions/ResumeButton.jsx +38 -0
  28. package/src/containers/CourseCard/components/CourseCardActions/ResumeButton.test.jsx +84 -0
  29. package/src/containers/CourseCard/components/CourseCardActions/SelectSessionButton.jsx +28 -0
  30. package/src/containers/CourseCard/components/CourseCardActions/SelectSessionButton.test.jsx +34 -0
  31. package/src/containers/CourseCard/components/CourseCardActions/ViewCourseButton.jsx +37 -0
  32. package/src/containers/CourseCard/components/CourseCardActions/ViewCourseButton.test.jsx +45 -0
  33. package/src/containers/CourseCard/components/CourseCardActions/__snapshots__/BeginCourseButton.test.jsx.snap +39 -0
  34. package/src/containers/CourseCard/components/CourseCardActions/__snapshots__/ResumeButton.test.jsx.snap +39 -0
  35. package/src/containers/CourseCard/components/CourseCardActions/__snapshots__/SelectSessionButton.test.jsx.snap +19 -0
  36. package/src/containers/CourseCard/components/CourseCardActions/__snapshots__/ViewCourseButton.test.jsx.snap +39 -0
  37. package/src/containers/CourseCard/components/CourseCardActions/index.jsx +42 -0
  38. package/src/containers/CourseCard/components/CourseCardActions/index.test.jsx +97 -0
  39. package/src/containers/CourseCard/components/CourseCardActions/messages.js +26 -0
  40. package/src/containers/CourseCard/components/CourseCardBanners/CertificateBanner.jsx +95 -0
  41. package/src/containers/CourseCard/components/CourseCardBanners/CertificateBanner.test.jsx +227 -0
  42. package/src/containers/CourseCard/components/CourseCardBanners/CourseBanner.jsx +57 -0
  43. package/src/containers/CourseCard/components/CourseCardBanners/CourseBanner.test.jsx +131 -0
  44. package/src/containers/CourseCard/components/CourseCardBanners/CreditBanner/__snapshots__/index.test.jsx.snap +58 -0
  45. package/src/containers/CourseCard/components/CourseCardBanners/CreditBanner/hooks.js +42 -0
  46. package/src/containers/CourseCard/components/CourseCardBanners/CreditBanner/hooks.test.js +90 -0
  47. package/src/containers/CourseCard/components/CourseCardBanners/CreditBanner/index.jsx +36 -0
  48. package/src/containers/CourseCard/components/CourseCardBanners/CreditBanner/index.test.jsx +95 -0
  49. package/src/containers/CourseCard/components/CourseCardBanners/CreditBanner/messages.js +16 -0
  50. package/src/containers/CourseCard/components/CourseCardBanners/CreditBanner/views/ApprovedContent.jsx +35 -0
  51. package/src/containers/CourseCard/components/CourseCardBanners/CreditBanner/views/ApprovedContent.test.jsx +64 -0
  52. package/src/containers/CourseCard/components/CourseCardBanners/CreditBanner/views/EligibleContent.jsx +34 -0
  53. package/src/containers/CourseCard/components/CourseCardBanners/CreditBanner/views/EligibleContent.test.jsx +82 -0
  54. package/src/containers/CourseCard/components/CourseCardBanners/CreditBanner/views/MustRequestContent.jsx +36 -0
  55. package/src/containers/CourseCard/components/CourseCardBanners/CreditBanner/views/MustRequestContent.test.jsx +74 -0
  56. package/src/containers/CourseCard/components/CourseCardBanners/CreditBanner/views/PendingContent.jsx +30 -0
  57. package/src/containers/CourseCard/components/CourseCardBanners/CreditBanner/views/PendingContent.test.jsx +63 -0
  58. package/src/containers/CourseCard/components/CourseCardBanners/CreditBanner/views/RejectedContent.jsx +27 -0
  59. package/src/containers/CourseCard/components/CourseCardBanners/CreditBanner/views/RejectedContent.test.jsx +54 -0
  60. package/src/containers/CourseCard/components/CourseCardBanners/CreditBanner/views/components/CreditContent.jsx +51 -0
  61. package/src/containers/CourseCard/components/CourseCardBanners/CreditBanner/views/components/CreditContent.test.jsx +60 -0
  62. package/src/containers/CourseCard/components/CourseCardBanners/CreditBanner/views/components/CreditRequestForm/__snapshots__/index.test.jsx.snap +32 -0
  63. package/src/containers/CourseCard/components/CourseCardBanners/CreditBanner/views/components/CreditRequestForm/hooks.js +13 -0
  64. package/src/containers/CourseCard/components/CourseCardBanners/CreditBanner/views/components/CreditRequestForm/hooks.test.js +45 -0
  65. package/src/containers/CourseCard/components/CourseCardBanners/CreditBanner/views/components/CreditRequestForm/index.jsx +43 -0
  66. package/src/containers/CourseCard/components/CourseCardBanners/CreditBanner/views/components/CreditRequestForm/index.test.jsx +65 -0
  67. package/src/containers/CourseCard/components/CourseCardBanners/CreditBanner/views/components/CreditRequestForm/ref.test.jsx +34 -0
  68. package/src/containers/CourseCard/components/CourseCardBanners/CreditBanner/views/components/ProviderLink.jsx +24 -0
  69. package/src/containers/CourseCard/components/CourseCardBanners/CreditBanner/views/components/ProviderLink.test.jsx +42 -0
  70. package/src/containers/CourseCard/components/CourseCardBanners/CreditBanner/views/components/__snapshots__/CreditContent.test.jsx.snap +60 -0
  71. package/src/containers/CourseCard/components/CourseCardBanners/CreditBanner/views/components/__snapshots__/ProviderLink.test.jsx.snap +11 -0
  72. package/src/containers/CourseCard/components/CourseCardBanners/CreditBanner/views/hooks.js +27 -0
  73. package/src/containers/CourseCard/components/CourseCardBanners/CreditBanner/views/hooks.test.js +56 -0
  74. package/src/containers/CourseCard/components/CourseCardBanners/CreditBanner/views/messages.js +61 -0
  75. package/src/containers/CourseCard/components/CourseCardBanners/EntitlementBanner.jsx +66 -0
  76. package/src/containers/CourseCard/components/CourseCardBanners/EntitlementBanner.test.jsx +63 -0
  77. package/src/containers/CourseCard/components/CourseCardBanners/RelatedProgramsBanner/ProgramsList.jsx +23 -0
  78. package/src/containers/CourseCard/components/CourseCardBanners/RelatedProgramsBanner/ProgramsList.test.jsx +23 -0
  79. package/src/containers/CourseCard/components/CourseCardBanners/RelatedProgramsBanner/__snapshots__/ProgramsList.test.jsx.snap +28 -0
  80. package/src/containers/CourseCard/components/CourseCardBanners/RelatedProgramsBanner/__snapshots__/index.test.jsx.snap +29 -0
  81. package/src/containers/CourseCard/components/CourseCardBanners/RelatedProgramsBanner/index.jsx +38 -0
  82. package/src/containers/CourseCard/components/CourseCardBanners/RelatedProgramsBanner/index.test.jsx +42 -0
  83. package/src/containers/CourseCard/components/CourseCardBanners/RelatedProgramsBanner/messages.js +31 -0
  84. package/src/containers/CourseCard/components/CourseCardBanners/__snapshots__/CertificateBanner.test.jsx.snap +205 -0
  85. package/src/containers/CourseCard/components/CourseCardBanners/__snapshots__/CourseBanner.test.jsx.snap +38 -0
  86. package/src/containers/CourseCard/components/CourseCardBanners/__snapshots__/EntitlementBanner.test.jsx.snap +53 -0
  87. package/src/containers/CourseCard/components/CourseCardBanners/__snapshots__/index.test.jsx.snap +41 -0
  88. package/src/containers/CourseCard/components/CourseCardBanners/index.jsx +28 -0
  89. package/src/containers/CourseCard/components/CourseCardBanners/index.test.jsx +32 -0
  90. package/src/containers/CourseCard/components/CourseCardBanners/messages.js +106 -0
  91. package/src/containers/CourseCard/components/CourseCardDetails/__snapshots__/index.test.jsx.snap +56 -0
  92. package/src/containers/CourseCard/components/CourseCardDetails/hooks.js +67 -0
  93. package/src/containers/CourseCard/components/CourseCardDetails/hooks.test.js +186 -0
  94. package/src/containers/CourseCard/components/CourseCardDetails/index.jsx +45 -0
  95. package/src/containers/CourseCard/components/CourseCardDetails/index.scss +7 -0
  96. package/src/containers/CourseCard/components/CourseCardDetails/index.test.jsx +71 -0
  97. package/src/containers/CourseCard/components/CourseCardDetails/messages.js +41 -0
  98. package/src/containers/CourseCard/components/CourseCardImage.jsx +68 -0
  99. package/src/containers/CourseCard/components/CourseCardImage.test.jsx +66 -0
  100. package/src/containers/CourseCard/components/CourseCardMenu/SocialShareMenu.jsx +83 -0
  101. package/src/containers/CourseCard/components/CourseCardMenu/SocialShareMenu.test.jsx +236 -0
  102. package/src/containers/CourseCard/components/CourseCardMenu/__snapshots__/index.test.jsx.snap +81 -0
  103. package/src/containers/CourseCard/components/CourseCardMenu/hooks.js +58 -0
  104. package/src/containers/CourseCard/components/CourseCardMenu/hooks.test.js +153 -0
  105. package/src/containers/CourseCard/components/CourseCardMenu/index.jsx +85 -0
  106. package/src/containers/CourseCard/components/CourseCardMenu/index.test.jsx +214 -0
  107. package/src/containers/CourseCard/components/CourseCardMenu/messages.js +36 -0
  108. package/src/containers/CourseCard/components/CourseCardTitle.jsx +43 -0
  109. package/src/containers/CourseCard/components/CourseCardTitle.test.jsx +67 -0
  110. package/src/containers/CourseCard/components/RelatedProgramsBadge/__snapshots__/index.test.jsx.snap +25 -0
  111. package/src/containers/CourseCard/components/RelatedProgramsBadge/hooks.jsx +35 -0
  112. package/src/containers/CourseCard/components/RelatedProgramsBadge/hooks.test.js +76 -0
  113. package/src/containers/CourseCard/components/RelatedProgramsBadge/index.jsx +39 -0
  114. package/src/containers/CourseCard/components/RelatedProgramsBadge/index.test.jsx +30 -0
  115. package/src/containers/CourseCard/components/RelatedProgramsBadge/messages.js +13 -0
  116. package/src/containers/CourseCard/components/__snapshots__/CourseCardImage.test.jsx.snap +72 -0
  117. package/src/containers/CourseCard/components/__snapshots__/CourseCardTitle.test.jsx.snap +33 -0
  118. package/src/containers/CourseCard/components/hooks.js +33 -0
  119. package/src/containers/CourseCard/components/hooks.test.js +165 -0
  120. package/src/containers/CourseCard/hooks.js +23 -0
  121. package/src/containers/CourseCard/hooks.test.js +48 -0
  122. package/src/containers/CourseCard/index.jsx +50 -0
  123. package/src/containers/CourseCard/index.test.jsx +29 -0
  124. package/src/containers/CourseCard/messages.js +26 -0
  125. package/src/containers/CourseFilterControls/ActiveCourseFilters.jsx +40 -0
  126. package/src/containers/CourseFilterControls/ActiveCourseFilters.test.jsx +17 -0
  127. package/src/containers/CourseFilterControls/CourseFilterControls.jsx +115 -0
  128. package/src/containers/CourseFilterControls/CourseFilterControls.test.jsx +60 -0
  129. package/src/containers/CourseFilterControls/__snapshots__/ActiveCourseFilters.test.jsx.snap +39 -0
  130. package/src/containers/CourseFilterControls/__snapshots__/CourseFilterControls.test.jsx.snap +169 -0
  131. package/src/containers/CourseFilterControls/components/Checkbox.jsx +21 -0
  132. package/src/containers/CourseFilterControls/components/Checkbox.test.jsx +15 -0
  133. package/src/containers/CourseFilterControls/components/FilterForm.jsx +45 -0
  134. package/src/containers/CourseFilterControls/components/FilterForm.test.jsx +29 -0
  135. package/src/containers/CourseFilterControls/components/SortForm.jsx +39 -0
  136. package/src/containers/CourseFilterControls/components/SortForm.test.jsx +19 -0
  137. package/src/containers/CourseFilterControls/components/__snapshots__/Checkbox.test.jsx.snap +46 -0
  138. package/src/containers/CourseFilterControls/components/__snapshots__/FilterForm.test.jsx.snap +41 -0
  139. package/src/containers/CourseFilterControls/components/__snapshots__/SortForm.test.jsx.snap +29 -0
  140. package/src/containers/CourseFilterControls/hooks.js +60 -0
  141. package/src/containers/CourseFilterControls/hooks.test.js +113 -0
  142. package/src/containers/CourseFilterControls/index.jsx +6 -0
  143. package/src/containers/CourseFilterControls/index.scss +29 -0
  144. package/src/containers/CourseFilterControls/messages.js +61 -0
  145. package/src/containers/CoursesPanel/CourseList/__snapshots__/index.test.jsx.snap +70 -0
  146. package/src/containers/CoursesPanel/CourseList/hooks.js +8 -0
  147. package/src/containers/CoursesPanel/CourseList/index.jsx +54 -0
  148. package/src/containers/CoursesPanel/CourseList/index.test.jsx +64 -0
  149. package/src/containers/CoursesPanel/NoCoursesView/__snapshots__/index.test.jsx.snap +29 -0
  150. package/src/containers/CoursesPanel/NoCoursesView/index.jsx +40 -0
  151. package/src/containers/CoursesPanel/NoCoursesView/index.scss +15 -0
  152. package/src/containers/CoursesPanel/NoCoursesView/index.test.jsx +18 -0
  153. package/src/containers/CoursesPanel/NoCoursesView/messages.js +26 -0
  154. package/src/containers/CoursesPanel/__snapshots__/index.test.jsx.snap +55 -0
  155. package/src/containers/CoursesPanel/hooks.js +54 -0
  156. package/src/containers/CoursesPanel/hooks.test.js +115 -0
  157. package/src/containers/CoursesPanel/index.jsx +40 -0
  158. package/src/containers/CoursesPanel/index.scss +42 -0
  159. package/src/containers/CoursesPanel/index.test.jsx +58 -0
  160. package/src/containers/CoursesPanel/messages.js +11 -0
  161. package/src/containers/Dashboard/DashboardLayout.jsx +54 -0
  162. package/src/containers/Dashboard/DashboardLayout.test.jsx +115 -0
  163. package/src/containers/Dashboard/LoadingView.jsx +20 -0
  164. package/src/containers/Dashboard/LoadingView.test.jsx +23 -0
  165. package/src/containers/Dashboard/__snapshots__/DashboardLayout.test.jsx.snap +197 -0
  166. package/src/containers/Dashboard/__snapshots__/LoadingView.test.jsx.snap +13 -0
  167. package/src/containers/Dashboard/__snapshots__/index.test.jsx.snap +69 -0
  168. package/src/containers/Dashboard/hooks.js +34 -0
  169. package/src/containers/Dashboard/hooks.test.js +88 -0
  170. package/src/containers/Dashboard/index.jsx +43 -0
  171. package/src/containers/Dashboard/index.scss +29 -0
  172. package/src/containers/Dashboard/index.test.jsx +122 -0
  173. package/src/containers/EmailSettingsModal/__snapshots__/index.test.jsx.snap +133 -0
  174. package/src/containers/EmailSettingsModal/hooks.js +32 -0
  175. package/src/containers/EmailSettingsModal/hooks.test.js +71 -0
  176. package/src/containers/EmailSettingsModal/index.jsx +58 -0
  177. package/src/containers/EmailSettingsModal/index.test.jsx +57 -0
  178. package/src/containers/EmailSettingsModal/messages.js +37 -0
  179. package/src/containers/RelatedProgramsModal/__snapshots__/index.test.jsx.snap +169 -0
  180. package/src/containers/RelatedProgramsModal/components/ProgramCard.jsx +66 -0
  181. package/src/containers/RelatedProgramsModal/components/ProgramCard.test.jsx +23 -0
  182. package/src/containers/RelatedProgramsModal/components/__snapshots__/ProgramCard.test.jsx.snap +60 -0
  183. package/src/containers/RelatedProgramsModal/components/index.scss +23 -0
  184. package/src/containers/RelatedProgramsModal/components/messages.js +24 -0
  185. package/src/containers/RelatedProgramsModal/hooks.js +10 -0
  186. package/src/containers/RelatedProgramsModal/index.jsx +62 -0
  187. package/src/containers/RelatedProgramsModal/index.scss +5 -0
  188. package/src/containers/RelatedProgramsModal/index.test.jsx +60 -0
  189. package/src/containers/RelatedProgramsModal/messages.js +16 -0
  190. package/src/containers/SelectSessionModal/__snapshots__/index.test.jsx.snap +176 -0
  191. package/src/containers/SelectSessionModal/constants.js +2 -0
  192. package/src/containers/SelectSessionModal/hooks.js +77 -0
  193. package/src/containers/SelectSessionModal/hooks.test.js +194 -0
  194. package/src/containers/SelectSessionModal/index.jsx +75 -0
  195. package/src/containers/SelectSessionModal/index.test.jsx +53 -0
  196. package/src/containers/SelectSessionModal/messages.js +41 -0
  197. package/src/containers/UnenrollConfirmModal/__snapshots__/index.test.jsx.snap +101 -0
  198. package/src/containers/UnenrollConfirmModal/components/ConfirmPane.jsx +36 -0
  199. package/src/containers/UnenrollConfirmModal/components/ConfirmPane.test.jsx +14 -0
  200. package/src/containers/UnenrollConfirmModal/components/FinishedPane.jsx +35 -0
  201. package/src/containers/UnenrollConfirmModal/components/FinishedPane.test.jsx +21 -0
  202. package/src/containers/UnenrollConfirmModal/components/ReasonPane.jsx +65 -0
  203. package/src/containers/UnenrollConfirmModal/components/ReasonPane.test.jsx +26 -0
  204. package/src/containers/UnenrollConfirmModal/components/__snapshots__/ConfirmPane.test.jsx.snap +22 -0
  205. package/src/containers/UnenrollConfirmModal/components/__snapshots__/FinishedPane.test.jsx.snap +38 -0
  206. package/src/containers/UnenrollConfirmModal/components/__snapshots__/ReasonPane.test.jsx.snap +183 -0
  207. package/src/containers/UnenrollConfirmModal/components/messages.js +56 -0
  208. package/src/containers/UnenrollConfirmModal/constants.js +86 -0
  209. package/src/containers/UnenrollConfirmModal/hooks/index.js +55 -0
  210. package/src/containers/UnenrollConfirmModal/hooks/index.test.js +101 -0
  211. package/src/containers/UnenrollConfirmModal/hooks/reasons.js +79 -0
  212. package/src/containers/UnenrollConfirmModal/hooks/reasons.test.js +192 -0
  213. package/src/containers/UnenrollConfirmModal/index.jsx +59 -0
  214. package/src/containers/UnenrollConfirmModal/index.test.jsx +61 -0
  215. package/src/data/constants/app.js +20 -0
  216. package/src/data/constants/app.test.js +24 -0
  217. package/src/data/constants/course.js +17 -0
  218. package/src/data/constants/credit.js +9 -0
  219. package/src/data/constants/files.js +20 -0
  220. package/src/data/constants/htmlKeys.js +21 -0
  221. package/src/data/constants/requests.js +34 -0
  222. package/src/data/contexts/GlobalDataContext.jsx +15 -0
  223. package/src/data/contexts/GlobalDataProvider.jsx +23 -0
  224. package/src/data/contexts/MasqueradeUserContext.jsx +16 -0
  225. package/src/data/contexts/MasqueradeUserProvider.jsx +31 -0
  226. package/src/data/redux/app/index.js +2 -0
  227. package/src/data/redux/app/reducer.js +81 -0
  228. package/src/data/redux/app/reducer.test.js +124 -0
  229. package/src/data/redux/app/selectors/appSelectors.js +23 -0
  230. package/src/data/redux/app/selectors/appSelectors.test.js +28 -0
  231. package/src/data/redux/app/selectors/courseCard.js +155 -0
  232. package/src/data/redux/app/selectors/courseCard.test.js +398 -0
  233. package/src/data/redux/app/selectors/currentList.js +60 -0
  234. package/src/data/redux/app/selectors/currentList.test.js +185 -0
  235. package/src/data/redux/app/selectors/index.js +13 -0
  236. package/src/data/redux/app/selectors/simpleSelectors.js +38 -0
  237. package/src/data/redux/app/selectors/simpleSelectors.test.js +75 -0
  238. package/src/data/redux/hooks/app.js +106 -0
  239. package/src/data/redux/hooks/index.js +2 -0
  240. package/src/data/redux/hooks/requests.js +47 -0
  241. package/src/data/redux/index.js +37 -0
  242. package/src/data/redux/requests/index.js +2 -0
  243. package/src/data/redux/requests/reducer.js +53 -0
  244. package/src/data/redux/requests/reducer.test.js +62 -0
  245. package/src/data/redux/requests/selectors.js +29 -0
  246. package/src/data/redux/requests/selectors.test.js +110 -0
  247. package/src/data/services/lms/api.js +77 -0
  248. package/src/data/services/lms/api.test.js +156 -0
  249. package/src/data/services/lms/constants.js +18 -0
  250. package/src/data/services/lms/fakeData/courses.js +828 -0
  251. package/src/data/services/lms/fakeData/testUtils.js +40 -0
  252. package/src/data/services/lms/index.js +8 -0
  253. package/src/data/services/lms/urls.js +43 -0
  254. package/src/data/services/lms/urls.test.js +51 -0
  255. package/src/data/services/lms/utils.js +60 -0
  256. package/src/data/services/lms/utils.test.js +40 -0
  257. package/src/data/services/segment/utils.js +17 -0
  258. package/src/data/services/segment/utils.test.js +36 -0
  259. package/src/data/store.js +25 -0
  260. package/src/data/store.test.js +47 -0
  261. package/src/data/utils.js +19 -0
  262. package/src/data/utils.test.js +29 -0
  263. package/src/hooks/api.js +123 -0
  264. package/src/hooks/api.test.js +273 -0
  265. package/src/hooks/index.js +7 -0
  266. package/src/hooks/utils.js +17 -0
  267. package/src/hooks/utils.test.js +16 -0
  268. package/src/i18n/index.js +25 -0
  269. package/src/index.ts +3 -0
  270. package/src/messages.js +16 -0
  271. package/src/providers.ts +11 -0
  272. package/src/routes.jsx +14 -0
  273. package/src/segment.js +85 -0
  274. package/src/setupTest.jsx +251 -0
  275. package/src/slots/CourseBannerSlot/README.md +44 -0
  276. package/src/slots/CourseBannerSlot/images/course_banner_slot_default.png +0 -0
  277. package/src/slots/CourseBannerSlot/images/custom_course_banner.png +0 -0
  278. package/src/slots/CourseBannerSlot/index.jsx +18 -0
  279. package/src/slots/CourseCardActionSlot/README.md +53 -0
  280. package/src/slots/CourseCardActionSlot/images/post_course_card_action.png +0 -0
  281. package/src/slots/CourseCardActionSlot/index.jsx +15 -0
  282. package/src/slots/CourseListSlot/README.md +54 -0
  283. package/src/slots/CourseListSlot/images/course_list_slot.png +0 -0
  284. package/src/slots/CourseListSlot/images/readme_custom_course_list.png +0 -0
  285. package/src/slots/CourseListSlot/index.jsx +17 -0
  286. package/src/slots/DashboardModalSlot/README.md +30 -0
  287. package/src/slots/DashboardModalSlot/images/dashboard_modal_slot.png +0 -0
  288. package/src/slots/DashboardModalSlot/index.jsx +7 -0
  289. package/src/slots/NoCoursesViewSlot/README.md +34 -0
  290. package/src/slots/NoCoursesViewSlot/images/no_course_view_slot.png +0 -0
  291. package/src/slots/NoCoursesViewSlot/images/readme_custom_no_courses.png +0 -0
  292. package/src/slots/NoCoursesViewSlot/index.jsx +11 -0
  293. package/src/slots/README.md +8 -0
  294. package/src/slots/WidgetSidebarSlot/README.md +51 -0
  295. package/src/slots/WidgetSidebarSlot/__snapshots__/index.test.jsx.snap +14 -0
  296. package/src/slots/WidgetSidebarSlot/images/readme_custom_sidebar.png +0 -0
  297. package/src/slots/WidgetSidebarSlot/images/widget_sidebar_slot.png +0 -0
  298. package/src/slots/WidgetSidebarSlot/index.jsx +10 -0
  299. package/src/slots/WidgetSidebarSlot/index.test.jsx +18 -0
  300. package/src/slots.tsx +9 -0
  301. package/src/test/app.test.jsx +255 -0
  302. package/src/test/inspector.js +50 -0
  303. package/src/test/messages.js +29 -0
  304. package/src/test/utils.js +3 -0
  305. package/src/testUtils.js +211 -0
  306. package/src/tracking/constants.js +50 -0
  307. package/src/tracking/index.js +17 -0
  308. package/src/tracking/trackers/course.js +44 -0
  309. package/src/tracking/trackers/course.test.js +80 -0
  310. package/src/tracking/trackers/credit.js +20 -0
  311. package/src/tracking/trackers/credit.test.js +38 -0
  312. package/src/tracking/trackers/engagement.js +23 -0
  313. package/src/tracking/trackers/engagement.test.js +31 -0
  314. package/src/tracking/trackers/entitlements.js +34 -0
  315. package/src/tracking/trackers/entitlements.test.js +34 -0
  316. package/src/tracking/trackers/filter.js +21 -0
  317. package/src/tracking/trackers/filter.test.js +45 -0
  318. package/src/tracking/trackers/findCourses.js +16 -0
  319. package/src/tracking/trackers/findCourses.test.js +45 -0
  320. package/src/tracking/trackers/socialShare.js +11 -0
  321. package/src/tracking/trackers/socialShare.test.js +17 -0
  322. package/src/utils/StrictDict.js +19 -0
  323. package/src/utils/StrictDict.test.js +66 -0
  324. package/src/utils/dateFormatter.js +9 -0
  325. package/src/utils/hooks.js +12 -0
  326. package/src/utils/index.js +5 -0
  327. package/src/utils/keyStore.js +10 -0
  328. package/src/widgets/LearnerDashboardHeader/ConfirmEmailBanner/ConfirmEmailBanner.scss +3 -0
  329. package/src/widgets/LearnerDashboardHeader/ConfirmEmailBanner/assets/confirm-email.svg +76 -0
  330. package/src/widgets/LearnerDashboardHeader/ConfirmEmailBanner/hooks.js +45 -0
  331. package/src/widgets/LearnerDashboardHeader/ConfirmEmailBanner/index.jsx +66 -0
  332. package/src/widgets/LearnerDashboardHeader/ConfirmEmailBanner/messages.js +36 -0
  333. package/src/widgets/LearnerDashboardHeader/CoursesLink.jsx +14 -0
  334. package/src/widgets/LearnerDashboardHeader/DiscoverLinkMenuItem.jsx +30 -0
  335. package/src/widgets/LearnerDashboardHeader/MasqueradeBar/hooks.js +69 -0
  336. package/src/widgets/LearnerDashboardHeader/MasqueradeBar/index.jsx +92 -0
  337. package/src/widgets/LearnerDashboardHeader/MasqueradeBar/index.scss +38 -0
  338. package/src/widgets/LearnerDashboardHeader/MasqueradeBar/messages.js +36 -0
  339. package/src/widgets/LearnerDashboardHeader/OrderHistoryLinkMenuItem.jsx +29 -0
  340. package/src/widgets/LearnerDashboardHeader/ProgramsLinkMenuItem.jsx +26 -0
  341. package/src/widgets/LearnerDashboardHeader/SupportLinkMenuItem.jsx +29 -0
  342. package/src/widgets/LearnerDashboardHeader/app.tsx +93 -0
  343. package/src/widgets/LearnerDashboardHeader/hooks.js +20 -0
  344. package/src/widgets/LearnerDashboardHeader/index.ts +1 -0
  345. package/src/widgets/LearnerDashboardHeader/messages.js +91 -0
  346. package/src/widgets/LookingForChallengeWidget/__snapshots__/index.test.jsx.snap +45 -0
  347. package/src/widgets/LookingForChallengeWidget/index.jsx +47 -0
  348. package/src/widgets/LookingForChallengeWidget/index.scss +6 -0
  349. package/src/widgets/LookingForChallengeWidget/index.test.jsx +24 -0
  350. package/src/widgets/LookingForChallengeWidget/messages.js +16 -0
  351. package/src/widgets/LookingForChallengeWidget/track.js +15 -0
@@ -0,0 +1,65 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+
4
+ import { useIntl } from '@openedx/frontend-base';
5
+ import {
6
+ ActionRow,
7
+ Button,
8
+ Form,
9
+ } from '@openedx/paragon';
10
+
11
+ import constants from '../constants';
12
+ import messages from './messages';
13
+
14
+ export const ReasonPane = ({
15
+ reason,
16
+ }) => {
17
+ const { formatMessage } = useIntl();
18
+ const option = (key) => (
19
+ <Form.Radio key={key} value={key}>
20
+ {formatMessage(constants.messages[key])}
21
+ </Form.Radio>
22
+ );
23
+ return (
24
+ <>
25
+ <h4>{formatMessage(messages.reasonHeading)}</h4>
26
+ <Form.RadioSet
27
+ name="unenrollReason"
28
+ onChange={reason.selectOption}
29
+ value={reason.selected}
30
+ >
31
+ {constants.order.map(option)}
32
+ <Form.Radio value={constants.reasonKeys.custom}>
33
+ <Form.Control
34
+ {...reason.customOption}
35
+ placeholder={formatMessage(constants.messages.customPlaceholder)}
36
+ />
37
+ </Form.Radio>
38
+ </Form.RadioSet>
39
+ <ActionRow>
40
+ <Button variant="tertiary" onClick={reason.handleSkip}>
41
+ {formatMessage(messages.reasonSkip)}
42
+ </Button>
43
+ <Button disabled={!reason.hasReason} onClick={reason.handleSubmit}>
44
+ {formatMessage(messages.reasonSubmit)}
45
+ </Button>
46
+ </ActionRow>
47
+ </>
48
+ );
49
+ };
50
+ ReasonPane.propTypes = {
51
+ reason: PropTypes.shape({
52
+ value: PropTypes.string,
53
+ handleSkip: PropTypes.func,
54
+ hasReason: PropTypes.bool,
55
+ selectOption: PropTypes.func,
56
+ customOption: PropTypes.shape({
57
+ value: PropTypes.string,
58
+ onChange: PropTypes.func,
59
+ }),
60
+ selected: PropTypes.string,
61
+ handleSubmit: PropTypes.func.isRequired,
62
+ }).isRequired,
63
+ };
64
+
65
+ export default ReasonPane;
@@ -0,0 +1,26 @@
1
+ import React from 'react';
2
+ import { shallow } from '@edx/react-unit-test-utils';
3
+
4
+ import { ReasonPane } from './ReasonPane';
5
+
6
+ describe('UnenrollConfirmModal ReasonPane', () => {
7
+ const props = {
8
+ reason: {
9
+ handleSkip: jest.fn().mockName('props.reason.handleSkip'),
10
+ selectOption: jest.fn().mockName('props.reason.selectOption'),
11
+ customOption: {
12
+ value: 'props.reason.customOption.value',
13
+ onChange: jest.fn().mockName('props.reason.customOption.onChange'),
14
+ },
15
+ selected: 'props.reason.selected',
16
+ handleSubmit: jest.fn().mockName('props.reason.handleSubmit'),
17
+ hasReason: true,
18
+ },
19
+ };
20
+ test('snapshot', () => {
21
+ expect(shallow(<ReasonPane {...props} />).snapshot).toMatchSnapshot();
22
+ });
23
+ test('snapshot: no reason provided', () => {
24
+ expect(shallow(<ReasonPane {...props} hasReason={false} />).snapshot).toMatchSnapshot();
25
+ });
26
+ });
@@ -0,0 +1,22 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`UnenrollConfirmModal ConfirmPane snapshot 1`] = `
4
+ <Fragment>
5
+ <h4>
6
+ Unenroll from course?
7
+ </h4>
8
+ <ActionRow>
9
+ <Button
10
+ onClick={[MockFunction props.handleClose]}
11
+ variant="tertiary"
12
+ >
13
+ Never mind
14
+ </Button>
15
+ <Button
16
+ onClick={[MockFunction props.handleConfirm]}
17
+ >
18
+ Unenroll
19
+ </Button>
20
+ </ActionRow>
21
+ </Fragment>
22
+ `;
@@ -0,0 +1,38 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`UnenrollConfirmModal FinishedPane snapshot: did not give reason 1`] = `
4
+ <Fragment>
5
+ <h4>
6
+ You are unenrolled
7
+ </h4>
8
+ <p>
9
+ This course will be removed from your dashboard.
10
+ </p>
11
+ <ActionRow>
12
+ <Button
13
+ onClick={[MockFunction props.handleClose]}
14
+ >
15
+ Return to dashboard
16
+ </Button>
17
+ </ActionRow>
18
+ </Fragment>
19
+ `;
20
+
21
+ exports[`UnenrollConfirmModal FinishedPane snapshot: gave reason 1`] = `
22
+ <Fragment>
23
+ <h4>
24
+ You are unenrolled
25
+ </h4>
26
+ <p>
27
+ Thank you for sharing your reason for unenrolling.
28
+ This course will be removed from your dashboard.
29
+ </p>
30
+ <ActionRow>
31
+ <Button
32
+ onClick={[MockFunction props.handleClose]}
33
+ >
34
+ Return to dashboard
35
+ </Button>
36
+ </ActionRow>
37
+ </Fragment>
38
+ `;
@@ -0,0 +1,183 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`UnenrollConfirmModal ReasonPane snapshot 1`] = `
4
+ <Fragment>
5
+ <h4>
6
+ What's your main reason for unenrolling?
7
+ </h4>
8
+ <Form.RadioSet
9
+ name="unenrollReason"
10
+ onChange={[MockFunction props.reason.selectOption]}
11
+ value="props.reason.selected"
12
+ >
13
+ <Form.Radio
14
+ key="prereqs"
15
+ value="prereqs"
16
+ >
17
+ I don't have the academic or language prerequisites
18
+ </Form.Radio>
19
+ <Form.Radio
20
+ key="difficulty"
21
+ value="difficulty"
22
+ >
23
+ The course material was too hard
24
+ </Form.Radio>
25
+ <Form.Radio
26
+ key="goals"
27
+ value="goals"
28
+ >
29
+ This won't help me reach my goals
30
+ </Form.Radio>
31
+ <Form.Radio
32
+ key="broken"
33
+ value="broken"
34
+ >
35
+ Something was broken
36
+ </Form.Radio>
37
+ <Form.Radio
38
+ key="time"
39
+ value="time"
40
+ >
41
+ I don't have the time
42
+ </Form.Radio>
43
+ <Form.Radio
44
+ key="browse"
45
+ value="browse"
46
+ >
47
+ I just wanted to browse the material
48
+ </Form.Radio>
49
+ <Form.Radio
50
+ key="support"
51
+ value="support"
52
+ >
53
+ I don't have enough support
54
+ </Form.Radio>
55
+ <Form.Radio
56
+ key="quality"
57
+ value="quality"
58
+ >
59
+ I am not happy with the quality of the content
60
+ </Form.Radio>
61
+ <Form.Radio
62
+ key="easy"
63
+ value="easy"
64
+ >
65
+ The course material was too easy
66
+ </Form.Radio>
67
+ <Form.Radio
68
+ value="custom"
69
+ >
70
+ <Form.Control
71
+ onChange={[MockFunction props.reason.customOption.onChange]}
72
+ placeholder="Other"
73
+ value="props.reason.customOption.value"
74
+ />
75
+ </Form.Radio>
76
+ </Form.RadioSet>
77
+ <ActionRow>
78
+ <Button
79
+ onClick={[MockFunction props.reason.handleSkip]}
80
+ variant="tertiary"
81
+ >
82
+ Skip survey
83
+ </Button>
84
+ <Button
85
+ disabled={false}
86
+ onClick={[MockFunction props.reason.handleSubmit]}
87
+ >
88
+ Submit reason
89
+ </Button>
90
+ </ActionRow>
91
+ </Fragment>
92
+ `;
93
+
94
+ exports[`UnenrollConfirmModal ReasonPane snapshot: no reason provided 1`] = `
95
+ <Fragment>
96
+ <h4>
97
+ What's your main reason for unenrolling?
98
+ </h4>
99
+ <Form.RadioSet
100
+ name="unenrollReason"
101
+ onChange={[MockFunction props.reason.selectOption]}
102
+ value="props.reason.selected"
103
+ >
104
+ <Form.Radio
105
+ key="prereqs"
106
+ value="prereqs"
107
+ >
108
+ I don't have the academic or language prerequisites
109
+ </Form.Radio>
110
+ <Form.Radio
111
+ key="difficulty"
112
+ value="difficulty"
113
+ >
114
+ The course material was too hard
115
+ </Form.Radio>
116
+ <Form.Radio
117
+ key="goals"
118
+ value="goals"
119
+ >
120
+ This won't help me reach my goals
121
+ </Form.Radio>
122
+ <Form.Radio
123
+ key="broken"
124
+ value="broken"
125
+ >
126
+ Something was broken
127
+ </Form.Radio>
128
+ <Form.Radio
129
+ key="time"
130
+ value="time"
131
+ >
132
+ I don't have the time
133
+ </Form.Radio>
134
+ <Form.Radio
135
+ key="browse"
136
+ value="browse"
137
+ >
138
+ I just wanted to browse the material
139
+ </Form.Radio>
140
+ <Form.Radio
141
+ key="support"
142
+ value="support"
143
+ >
144
+ I don't have enough support
145
+ </Form.Radio>
146
+ <Form.Radio
147
+ key="quality"
148
+ value="quality"
149
+ >
150
+ I am not happy with the quality of the content
151
+ </Form.Radio>
152
+ <Form.Radio
153
+ key="easy"
154
+ value="easy"
155
+ >
156
+ The course material was too easy
157
+ </Form.Radio>
158
+ <Form.Radio
159
+ value="custom"
160
+ >
161
+ <Form.Control
162
+ onChange={[MockFunction props.reason.customOption.onChange]}
163
+ placeholder="Other"
164
+ value="props.reason.customOption.value"
165
+ />
166
+ </Form.Radio>
167
+ </Form.RadioSet>
168
+ <ActionRow>
169
+ <Button
170
+ onClick={[MockFunction props.reason.handleSkip]}
171
+ variant="tertiary"
172
+ >
173
+ Skip survey
174
+ </Button>
175
+ <Button
176
+ disabled={false}
177
+ onClick={[MockFunction props.reason.handleSubmit]}
178
+ >
179
+ Submit reason
180
+ </Button>
181
+ </ActionRow>
182
+ </Fragment>
183
+ `;
@@ -0,0 +1,56 @@
1
+ import { defineMessages } from '@openedx/frontend-base';
2
+
3
+ const messages = defineMessages({
4
+ confirmHeader: {
5
+ id: 'learner-dash.unenrollConfirm.confirm.header',
6
+ description: 'Header for confirm unenroll modal',
7
+ defaultMessage: 'Unenroll from course?',
8
+ },
9
+ confirmCancel: {
10
+ id: 'learner-dash.unenrollConfirm.confirm.cancel',
11
+ description: 'Cancel action for confirm unenroll modal',
12
+ defaultMessage: 'Never mind',
13
+ },
14
+ confirmUnenroll: {
15
+ id: 'learner-dash.unenrollConfirm.confirm.unenroll',
16
+ description: 'Confirm action for confirm unenroll modal',
17
+ defaultMessage: 'Unenroll',
18
+ },
19
+ reasonHeading: {
20
+ id: 'learner-dash.unenrollConfirm.confirm.reason.heading',
21
+ description: 'Heading for unenroll reason modal',
22
+ defaultMessage: `What's your main reason for unenrolling?`,
23
+ },
24
+ reasonSkip: {
25
+ id: 'learner-dash.unenrollConfirm.confirm.reason.skip',
26
+ description: 'Skip action for unenroll reason modal',
27
+ defaultMessage: 'Skip survey',
28
+ },
29
+ reasonSubmit: {
30
+ id: 'learner-dash.unenrollConfirm.confirm.reason.submit',
31
+ description: 'Submit action for unenroll reason modal',
32
+ defaultMessage: 'Submit reason',
33
+ },
34
+ finishHeading: {
35
+ id: 'learner-dash.unenrollConfirm.confirm.finish.heading',
36
+ description: 'Heading for unenroll finish modal',
37
+ defaultMessage: 'You are unenrolled',
38
+ },
39
+ finishThanksText: {
40
+ id: 'learner-dash.unenrollConfirm.confirm.finish.thanks-text',
41
+ description: 'Thank you message on unenroll modal for providing a reason',
42
+ defaultMessage: 'Thank you for sharing your reason for unenrolling. ',
43
+ },
44
+ finishText: {
45
+ id: 'learner-dash.unenrollConfirm.confirm.finish.text',
46
+ description: 'Text for unenroll finish modal',
47
+ defaultMessage: 'This course will be removed from your dashboard.',
48
+ },
49
+ finishReturn: {
50
+ id: 'learner-dash.unenrollConfirm.confirm.finish.return',
51
+ description: 'Return action for unenroll finish modal',
52
+ defaultMessage: 'Return to dashboard',
53
+ },
54
+ });
55
+
56
+ export default messages;
@@ -0,0 +1,86 @@
1
+ import { StrictDict } from '../../utils';
2
+ import { defineMessages } from '@openedx/frontend-base';
3
+
4
+ export const reasonKeys = StrictDict({
5
+ prereqs: 'prereqs',
6
+ difficulty: 'difficulty',
7
+ goals: 'goals',
8
+ broken: 'broken',
9
+ time: 'time',
10
+ browse: 'browse',
11
+ support: 'support',
12
+ quality: 'quality',
13
+ easy: 'easy',
14
+ custom: 'custom',
15
+ });
16
+
17
+ export const order = [
18
+ reasonKeys.prereqs,
19
+ reasonKeys.difficulty,
20
+ reasonKeys.goals,
21
+ reasonKeys.broken,
22
+ reasonKeys.time,
23
+ reasonKeys.browse,
24
+ reasonKeys.support,
25
+ reasonKeys.quality,
26
+ reasonKeys.easy,
27
+ ];
28
+
29
+ const messages = defineMessages({
30
+ [reasonKeys.prereqs]: {
31
+ id: 'learner-dash.unenrollConfirm.reasons.prereqs',
32
+ description: 'Unenroll reason option - missing prerequisites',
33
+ defaultMessage: `I don't have the academic or language prerequisites`,
34
+ },
35
+ [reasonKeys.difficulty]: {
36
+ id: 'learner-dash.unenrollConfirm.reasons.difficulty',
37
+ description: 'Unenroll reason option - material is too hard',
38
+ defaultMessage: 'The course material was too hard',
39
+ },
40
+ [reasonKeys.goals]: {
41
+ id: 'learner-dash.unenrollConfirm.reasons.goals',
42
+ description: 'Unenroll reason option - goals-related',
43
+ defaultMessage: `This won't help me reach my goals`,
44
+ },
45
+ [reasonKeys.broken]: {
46
+ id: 'learner-dash.unenrollConfirm.reasons.broken',
47
+ description: 'Unenroll reason option - something broken',
48
+ defaultMessage: 'Something was broken',
49
+ },
50
+ [reasonKeys.time]: {
51
+ id: 'learner-dash.unenrollConfirm.reasons.time',
52
+ description: 'Unenroll reason option - time-related',
53
+ defaultMessage: `I don't have the time`,
54
+ },
55
+ [reasonKeys.browse]: {
56
+ id: 'learner-dash.unenrollConfirm.reasons.browse',
57
+ description: 'Unenroll reason option - wanted to browse',
58
+ defaultMessage: 'I just wanted to browse the material',
59
+ },
60
+ [reasonKeys.support]: {
61
+ id: 'learner-dash.unenrollConfirm.reasons.support',
62
+ description: 'Unenroll reason option - lacking support',
63
+ defaultMessage: `I don't have enough support`,
64
+ },
65
+ [reasonKeys.quality]: {
66
+ id: 'learner-dash.unenrollConfirm.reasons.quality',
67
+ description: 'Unenroll reason option - quality-related',
68
+ defaultMessage: 'I am not happy with the quality of the content',
69
+ },
70
+ [reasonKeys.easy]: {
71
+ id: 'learner-dash.unenrollConfirm.reasons.easy',
72
+ description: 'Unenroll reason option - too easy',
73
+ defaultMessage: 'The course material was too easy',
74
+ },
75
+ customPlaceholder: {
76
+ id: 'learner-dash.unenrollConfirm.reasons.custom-placeholder',
77
+ description: 'Unenroll custom reason option placeholder text',
78
+ defaultMessage: 'Other',
79
+ },
80
+ });
81
+
82
+ export default {
83
+ messages,
84
+ order,
85
+ reasonKeys,
86
+ };
@@ -0,0 +1,55 @@
1
+ import { useState } from 'react';
2
+ import { useQueryClient } from '@tanstack/react-query';
3
+
4
+ import { RequestKeys } from '../../../data/constants/requests';
5
+ import { StrictDict } from '../../../utils';
6
+
7
+ import { useUnenrollReasons } from './reasons';
8
+ import * as module from '.';
9
+
10
+ export const state = StrictDict({
11
+ confirmed: (val) => useState(val), // eslint-disable-line
12
+ });
13
+
14
+ export const modalStates = StrictDict({
15
+ confirm: 'confirm',
16
+ reason: 'reason',
17
+ finished: 'finished',
18
+ });
19
+
20
+ export const useUnenrollData = ({ closeModal, cardId }) => {
21
+ const [isConfirmed, setIsConfirmed] = module.state.confirmed(false);
22
+ const confirm = () => setIsConfirmed(true);
23
+ const reason = useUnenrollReasons({ cardId });
24
+ const queryClient = useQueryClient();
25
+ const refreshList = () => queryClient.invalidateQueries({ queryKey: [RequestKeys.initialize] });
26
+
27
+ let modalState;
28
+ if (isConfirmed) {
29
+ modalState = (reason.isSubmitted || reason.isSkipped)
30
+ ? modalStates.finished : modalStates.reason;
31
+ } else {
32
+ modalState = modalStates.confirm;
33
+ }
34
+
35
+ const close = () => {
36
+ closeModal();
37
+ setIsConfirmed(false);
38
+ reason.handleClear();
39
+ };
40
+ const closeAndRefresh = () => {
41
+ refreshList();
42
+ close();
43
+ };
44
+
45
+ return {
46
+ isConfirmed,
47
+ confirm,
48
+ reason,
49
+ close,
50
+ closeAndRefresh,
51
+ modalState,
52
+ };
53
+ };
54
+
55
+ export default useUnenrollData;
@@ -0,0 +1,101 @@
1
+ import { apiHooks } from 'hooks';
2
+ import { MockUseState } from 'testUtils';
3
+
4
+ import * as reasons from './reasons';
5
+ import * as hooks from '.';
6
+
7
+ jest.mock('./reasons', () => ({
8
+ useUnenrollReasons: jest.fn(),
9
+ }));
10
+
11
+ jest.mock('hooks', () => ({
12
+ apiHooks: {
13
+ useInitializeApp: jest.fn(),
14
+ },
15
+ }));
16
+
17
+ const state = new MockUseState(hooks);
18
+ const testValue = 'test-value';
19
+ const initializeApp = jest.fn();
20
+ apiHooks.useInitializeApp.mockReturnValue(initializeApp);
21
+ let out;
22
+
23
+ const mockReason = {
24
+ handleClear: jest.fn(),
25
+ isSubmitted: false,
26
+ submittedReason: 'test-submitted-reason',
27
+ };
28
+
29
+ const useUnenrollReasons = jest.fn(() => mockReason);
30
+
31
+ describe('UnenrollConfirmModal hooks', () => {
32
+ beforeEach(() => {
33
+ reasons.useUnenrollReasons.mockImplementation(useUnenrollReasons);
34
+ });
35
+ const closeModal = jest.fn();
36
+ const cardId = 'test-card-id';
37
+
38
+ const createUseUnenrollData = () => hooks.useUnenrollData({ closeModal, cardId });
39
+
40
+ describe('state fields', () => {
41
+ state.testGetter(state.keys.confirmed);
42
+ });
43
+ describe('modalHooks', () => {
44
+ beforeEach(() => {
45
+ state.mock();
46
+ state.mockVal(state.keys.confirmed, testValue);
47
+ out = createUseUnenrollData();
48
+ });
49
+ afterEach(() => {
50
+ state.restore();
51
+ });
52
+ test('isConfirmed is forwarded from state', () => {
53
+ expect(out.isConfirmed).toEqual(testValue);
54
+ });
55
+ test('confirm is callback that sets isConfirmed to true', () => {
56
+ out.confirm();
57
+ expect(state.setState.confirmed).toHaveBeenCalledWith(true);
58
+ });
59
+ test('reason returns useUnenrollReasons output', () => {
60
+ expect(out.reason).toEqual(mockReason);
61
+ });
62
+ describe('close', () => {
63
+ it('calls closeModal, sets isConfirmed to false, and calls reason.handleClear', () => {
64
+ out.close();
65
+ expect(closeModal).toHaveBeenCalled();
66
+ expect(state.setState.confirmed).toHaveBeenCalledWith(false);
67
+ expect(mockReason.handleClear).toHaveBeenCalled();
68
+ });
69
+ });
70
+ describe('closeAndRefresh', () => {
71
+ it('calls closeModal, sets isConfirmed to false, and calls reason.handleClear', () => {
72
+ out.closeAndRefresh();
73
+ expect(closeModal).toHaveBeenCalled();
74
+ expect(state.setState.confirmed).toHaveBeenCalledWith(false);
75
+ expect(mockReason.handleClear).toHaveBeenCalled();
76
+ });
77
+ it('calls initializeApp api method', () => {
78
+ out.closeAndRefresh();
79
+ expect(initializeApp).toHaveBeenCalled();
80
+ });
81
+ });
82
+ describe('modalState', () => {
83
+ it('returns modalStates.finished if confirmed and submitted', () => {
84
+ state.mockVal(state.keys.confirmed, true);
85
+ reasons.useUnenrollReasons.mockReturnValueOnce({ ...mockReason, isSubmitted: true });
86
+ out = createUseUnenrollData();
87
+ expect(out.modalState).toEqual(hooks.modalStates.finished);
88
+ });
89
+ it('returns modalStates.reason if confirmed and not submitted', () => {
90
+ state.mockVal(state.keys.confirmed, true);
91
+ out = createUseUnenrollData();
92
+ expect(out.modalState).toEqual(hooks.modalStates.reason);
93
+ });
94
+ it('returns modalStates.confirm if not confirmed', () => {
95
+ state.mockVal(state.keys.confirmed, false);
96
+ out = createUseUnenrollData();
97
+ expect(out.modalState).toEqual(hooks.modalStates.confirm);
98
+ });
99
+ });
100
+ });
101
+ });