codeforlife 2.8.2 → 2.9.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 (364) hide show
  1. package/dist/Countdown-DFI1RljW.js +28 -0
  2. package/dist/Countdown-DFI1RljW.js.map +1 -0
  3. package/dist/Countdown-zY3nMzmi.cjs +2 -0
  4. package/dist/Countdown-zY3nMzmi.cjs.map +1 -0
  5. package/dist/Image-D5jC9UoX.js +21 -0
  6. package/dist/Image-D5jC9UoX.js.map +1 -0
  7. package/dist/Image-mgT45r_B.cjs +2 -0
  8. package/dist/Image-mgT45r_B.cjs.map +1 -0
  9. package/dist/LinkButton-BYFkvL_O.cjs +2 -0
  10. package/dist/LinkButton-BYFkvL_O.cjs.map +1 -0
  11. package/dist/LinkButton-oK0RThqn.js +12 -0
  12. package/dist/LinkButton-oK0RThqn.js.map +1 -0
  13. package/dist/Navigate-Dq47aqC8.js +25 -0
  14. package/dist/Navigate-Dq47aqC8.js.map +1 -0
  15. package/dist/Navigate-dQocLhzN.cjs +2 -0
  16. package/dist/Navigate-dQocLhzN.cjs.map +1 -0
  17. package/dist/api/endpoints/index.cjs.js +2 -0
  18. package/dist/api/endpoints/index.cjs.js.map +1 -0
  19. package/dist/api/endpoints/index.d.ts +81 -0
  20. package/dist/api/endpoints/index.es.js +78 -0
  21. package/dist/api/endpoints/index.es.js.map +1 -0
  22. package/dist/api/index.cjs.js +4 -0
  23. package/dist/api/index.cjs.js.map +1 -0
  24. package/dist/api/index.d.ts +77 -0
  25. package/dist/api/index.es.js +541 -0
  26. package/dist/api/index.es.js.map +1 -0
  27. package/dist/api-Cbyt3rw0.js +92 -0
  28. package/dist/api-Cbyt3rw0.js.map +1 -0
  29. package/dist/api-CnMfjRk3.cjs +2 -0
  30. package/dist/api-CnMfjRk3.cjs.map +1 -0
  31. package/dist/api-Cs4Y-WeI.js +20 -0
  32. package/dist/api-Cs4Y-WeI.js.map +1 -0
  33. package/dist/api-DIgp_6Vr.cjs +2 -0
  34. package/dist/api-DIgp_6Vr.cjs.map +1 -0
  35. package/dist/api.d.ts +123 -0
  36. package/dist/auth-BPfUPjmM.js +237 -0
  37. package/dist/auth-BPfUPjmM.js.map +1 -0
  38. package/dist/auth-Vf1MgMci.cjs +2 -0
  39. package/dist/auth-Vf1MgMci.cjs.map +1 -0
  40. package/dist/auth.d.ts +40 -0
  41. package/dist/components/form/index.cjs.js +2 -0
  42. package/dist/components/form/index.cjs.js.map +1 -0
  43. package/dist/components/form/index.d.ts +86 -0
  44. package/dist/components/form/index.es.js +18 -0
  45. package/dist/components/form/index.es.js.map +1 -0
  46. package/dist/components/index.cjs.js +11 -0
  47. package/dist/components/index.cjs.js.map +1 -0
  48. package/dist/components/index.d.ts +90 -0
  49. package/dist/components/index.es.js +383 -0
  50. package/dist/components/index.es.js.map +1 -0
  51. package/dist/components/page/index.cjs.js +2 -0
  52. package/dist/components/page/index.cjs.js.map +1 -0
  53. package/dist/components/page/index.d.ts +77 -0
  54. package/dist/components/page/index.es.js +9 -0
  55. package/dist/components/page/index.es.js.map +1 -0
  56. package/dist/components/router/index.cjs.js +2 -0
  57. package/dist/components/router/index.cjs.js.map +1 -0
  58. package/dist/components/router/index.d.ts +78 -0
  59. package/dist/components/router/index.es.js +11 -0
  60. package/dist/components/router/index.es.js.map +1 -0
  61. package/dist/components/table/index.cjs.js +2 -0
  62. package/dist/components/table/index.cjs.js.map +1 -0
  63. package/dist/components/table/index.d.ts +75 -0
  64. package/dist/components/table/index.es.js +9 -0
  65. package/dist/components/table/index.es.js.map +1 -0
  66. package/dist/en-gb-B_rK7Jx1.js +20 -0
  67. package/dist/en-gb-B_rK7Jx1.js.map +1 -0
  68. package/dist/en-gb-CpyEkKq3.cjs +2 -0
  69. package/dist/en-gb-CpyEkKq3.cjs.map +1 -0
  70. package/dist/features/index.cjs.js +2 -0
  71. package/dist/features/index.cjs.js.map +1 -0
  72. package/dist/features/index.d.ts +76 -0
  73. package/dist/features/index.es.js +47 -0
  74. package/dist/features/index.es.js.map +1 -0
  75. package/dist/form.d.ts +40 -0
  76. package/dist/general-BPbbmkeX.cjs +2 -0
  77. package/dist/general-BPbbmkeX.cjs.map +1 -0
  78. package/dist/general-CtTJPCJn.js +58 -0
  79. package/dist/general-CtTJPCJn.js.map +1 -0
  80. package/dist/general.d.ts +53 -0
  81. package/dist/hooks/index.cjs.js +2 -0
  82. package/dist/hooks/index.cjs.js.map +1 -0
  83. package/dist/hooks/index.d.ts +77 -0
  84. package/dist/hooks/index.es.js +25 -0
  85. package/dist/hooks/index.es.js.map +1 -0
  86. package/dist/index-2W--_sNE.js +30 -0
  87. package/dist/index-2W--_sNE.js.map +1 -0
  88. package/dist/index-BUMdUVBH.cjs +5 -0
  89. package/dist/index-BUMdUVBH.cjs.map +1 -0
  90. package/dist/index-B_Zy_zwA.cjs +2 -0
  91. package/dist/index-B_Zy_zwA.cjs.map +1 -0
  92. package/dist/index-BgsynEGX.cjs +2 -0
  93. package/dist/index-BgsynEGX.cjs.map +1 -0
  94. package/dist/index-CA-ugBSa.cjs +2 -0
  95. package/dist/index-CA-ugBSa.cjs.map +1 -0
  96. package/dist/index-CNtOlJ49.js +572 -0
  97. package/dist/index-CNtOlJ49.js.map +1 -0
  98. package/dist/index-DkM_cG3a.js +237 -0
  99. package/dist/index-DkM_cG3a.js.map +1 -0
  100. package/dist/index-Dqp7dpn3.js +1111 -0
  101. package/dist/index-Dqp7dpn3.js.map +1 -0
  102. package/dist/index.cjs.js +2 -0
  103. package/dist/index.cjs.js.map +1 -0
  104. package/dist/index.d.ts +78 -0
  105. package/dist/index.es.js +7 -0
  106. package/dist/index.es.js.map +1 -0
  107. package/dist/jsx-runtime-CeSfJrVB.cjs +31 -0
  108. package/dist/jsx-runtime-CeSfJrVB.cjs.map +1 -0
  109. package/dist/jsx-runtime-Dpn_P65e.js +634 -0
  110. package/dist/jsx-runtime-Dpn_P65e.js.map +1 -0
  111. package/dist/middlewares/index.cjs.js +2 -0
  112. package/dist/middlewares/index.cjs.js.map +1 -0
  113. package/dist/middlewares/index.d.ts +73 -0
  114. package/dist/middlewares/index.es.js +10 -0
  115. package/dist/middlewares/index.es.js.map +1 -0
  116. package/dist/palette-CE2mKYse.cjs +2 -0
  117. package/dist/palette-CE2mKYse.cjs.map +1 -0
  118. package/dist/palette-C_L0akN_.js +43 -0
  119. package/dist/palette-C_L0akN_.js.map +1 -0
  120. package/dist/router.d.ts +48 -0
  121. package/dist/rtk-query.modern-CjetfYPg.js +3038 -0
  122. package/dist/rtk-query.modern-CjetfYPg.js.map +1 -0
  123. package/dist/rtk-query.modern-PBCErCqb.cjs +15 -0
  124. package/dist/rtk-query.modern-PBCErCqb.cjs.map +1 -0
  125. package/dist/schema.d.ts +89 -0
  126. package/dist/schemas-BZbJpkD5.cjs +2 -0
  127. package/dist/schemas-BZbJpkD5.cjs.map +1 -0
  128. package/dist/schemas-DlOtf2vf.js +162 -0
  129. package/dist/schemas-DlOtf2vf.js.map +1 -0
  130. package/dist/server.cjs.js +6 -0
  131. package/dist/server.cjs.js.map +1 -0
  132. package/dist/server.d.ts +129 -0
  133. package/dist/server.es.js +127 -0
  134. package/dist/server.es.js.map +1 -0
  135. package/dist/session-CE2U7oL1.cjs +2 -0
  136. package/dist/session-CE2U7oL1.cjs.map +1 -0
  137. package/dist/session-CacrgFSv.cjs +2 -0
  138. package/dist/session-CacrgFSv.cjs.map +1 -0
  139. package/dist/session-D312kYKk.js +32 -0
  140. package/dist/session-D312kYKk.js.map +1 -0
  141. package/dist/session-oI-Ht2C8.js +30 -0
  142. package/dist/session-oI-Ht2C8.js.map +1 -0
  143. package/dist/settings/index.cjs.js +2 -0
  144. package/dist/settings/index.cjs.js.map +1 -0
  145. package/dist/settings/index.d.ts +76 -0
  146. package/dist/settings/index.es.js +17 -0
  147. package/dist/settings/index.es.js.map +1 -0
  148. package/dist/slices/index.cjs.js +2 -0
  149. package/dist/slices/index.cjs.js.map +1 -0
  150. package/dist/slices/index.d.ts +74 -0
  151. package/dist/slices/index.es.js +6 -0
  152. package/dist/slices/index.es.js.map +1 -0
  153. package/dist/store.d.ts +17 -0
  154. package/dist/style.css +1 -0
  155. package/dist/test.d.ts +75 -0
  156. package/dist/theme/components/index.cjs.js +2 -0
  157. package/dist/theme/components/index.cjs.js.map +1 -0
  158. package/dist/theme/components/index.d.ts +75 -0
  159. package/dist/theme/components/index.es.js +6 -0
  160. package/dist/theme/components/index.es.js.map +1 -0
  161. package/dist/theme/index.cjs.js +2 -0
  162. package/dist/theme/index.cjs.js.map +1 -0
  163. package/dist/theme/index.d.ts +79 -0
  164. package/dist/theme/index.es.js +222 -0
  165. package/dist/theme/index.es.js.map +1 -0
  166. package/dist/theme.d.ts +19 -0
  167. package/dist/urls-DtHr1d3H.js +14 -0
  168. package/dist/urls-DtHr1d3H.js.map +1 -0
  169. package/dist/urls-MaVXL_C2.cjs +2 -0
  170. package/dist/urls-MaVXL_C2.cjs.map +1 -0
  171. package/dist/utils/api.cjs.js +2 -0
  172. package/dist/utils/api.cjs.js.map +1 -0
  173. package/dist/utils/api.d.ts +144 -0
  174. package/dist/utils/api.es.js +16 -0
  175. package/dist/utils/api.es.js.map +1 -0
  176. package/dist/utils/auth.cjs.js +2 -0
  177. package/dist/utils/auth.cjs.js.map +1 -0
  178. package/dist/utils/auth.d.ts +100 -0
  179. package/dist/utils/auth.es.js +117 -0
  180. package/dist/utils/auth.es.js.map +1 -0
  181. package/dist/utils/form.cjs.js +2 -0
  182. package/dist/utils/form.cjs.js.map +1 -0
  183. package/dist/utils/form.d.ts +97 -0
  184. package/dist/utils/form.es.js +76 -0
  185. package/dist/utils/form.es.js.map +1 -0
  186. package/dist/utils/general.cjs.js +2 -0
  187. package/dist/utils/general.cjs.js.map +1 -0
  188. package/dist/utils/general.d.ts +102 -0
  189. package/{src/utils/general.ts → dist/utils/general.es.js} +87 -165
  190. package/dist/utils/general.es.js.map +1 -0
  191. package/dist/utils/router.cjs.js +2 -0
  192. package/dist/utils/router.cjs.js.map +1 -0
  193. package/dist/utils/router.d.ts +91 -0
  194. package/dist/utils/router.es.js +33 -0
  195. package/dist/utils/router.es.js.map +1 -0
  196. package/dist/utils/schema.cjs.js +2 -0
  197. package/dist/utils/schema.cjs.js.map +1 -0
  198. package/dist/utils/schema.d.ts +115 -0
  199. package/dist/utils/schema.es.js +123 -0
  200. package/dist/utils/schema.es.js.map +1 -0
  201. package/dist/utils/store.cjs.js +2 -0
  202. package/dist/utils/store.cjs.js.map +1 -0
  203. package/dist/utils/store.d.ts +82 -0
  204. package/dist/utils/store.es.js +20 -0
  205. package/dist/utils/store.es.js.map +1 -0
  206. package/dist/utils/test.cjs.js +2 -0
  207. package/dist/utils/test.cjs.js.map +1 -0
  208. package/dist/utils/test.d.ts +125 -0
  209. package/dist/utils/test.es.js +60 -0
  210. package/dist/utils/test.es.js.map +1 -0
  211. package/dist/utils/theme.cjs.js +2 -0
  212. package/dist/utils/theme.cjs.js.map +1 -0
  213. package/dist/utils/theme.d.ts +83 -0
  214. package/dist/utils/theme.es.js +12 -0
  215. package/dist/utils/theme.es.js.map +1 -0
  216. package/dist/utils/window.cjs.js +2 -0
  217. package/dist/utils/window.cjs.js.map +1 -0
  218. package/dist/utils/window.d.ts +74 -0
  219. package/dist/utils/window.es.js +11 -0
  220. package/dist/utils/window.es.js.map +1 -0
  221. package/dist/window.d.ts +5 -0
  222. package/package.json +142 -37
  223. package/.github/workflows/main.yml +0 -55
  224. package/.prettierignore +0 -1
  225. package/CHANGELOG.md +0 -2020
  226. package/CONTRIBUTING.md +0 -3
  227. package/eslint.config.js +0 -17
  228. package/src/api/createApi.ts +0 -91
  229. package/src/api/endpoints/authFactor.ts +0 -31
  230. package/src/api/endpoints/index.ts +0 -9
  231. package/src/api/endpoints/klass.ts +0 -87
  232. package/src/api/endpoints/school.ts +0 -34
  233. package/src/api/endpoints/session.ts +0 -47
  234. package/src/api/endpoints/user.ts +0 -70
  235. package/src/api/index.ts +0 -5
  236. package/src/api/models.ts +0 -145
  237. package/src/api/schemas.ts +0 -243
  238. package/src/api/tagTypes.ts +0 -12
  239. package/src/api/urls.ts +0 -13
  240. package/src/components/App.css +0 -38
  241. package/src/components/App.tsx +0 -152
  242. package/src/components/ClickableTooltip.tsx +0 -43
  243. package/src/components/CopyIconButton.test.tsx +0 -16
  244. package/src/components/CopyIconButton.tsx +0 -27
  245. package/src/components/Countdown.tsx +0 -42
  246. package/src/components/DownloadFileButton.tsx +0 -55
  247. package/src/components/ElevatedAppBar.tsx +0 -41
  248. package/src/components/Image.tsx +0 -41
  249. package/src/components/InputFileButton.tsx +0 -27
  250. package/src/components/ItemizedList.tsx +0 -61
  251. package/src/components/OrderedGrid.tsx +0 -92
  252. package/src/components/ScrollIntoViewLink.tsx +0 -22
  253. package/src/components/SyncError.tsx +0 -14
  254. package/src/components/TablePagination.tsx +0 -142
  255. package/src/components/YouTubeVideo.tsx +0 -26
  256. package/src/components/form/ApiAutocompleteField.tsx +0 -187
  257. package/src/components/form/AutocompleteField.tsx +0 -135
  258. package/src/components/form/CheckboxField.tsx +0 -86
  259. package/src/components/form/CountryField.tsx +0 -75
  260. package/src/components/form/DatePickerField.tsx +0 -126
  261. package/src/components/form/EmailField.tsx +0 -38
  262. package/src/components/form/FirstNameField.tsx +0 -40
  263. package/src/components/form/Form.tsx +0 -165
  264. package/src/components/form/OtpField.tsx +0 -28
  265. package/src/components/form/PasswordField.tsx +0 -71
  266. package/src/components/form/RepeatField.tsx +0 -123
  267. package/src/components/form/SubmitButton.tsx +0 -57
  268. package/src/components/form/TextField.tsx +0 -150
  269. package/src/components/form/UkCountyField.tsx +0 -68
  270. package/src/components/form/index.tsx +0 -35
  271. package/src/components/index.ts +0 -28
  272. package/src/components/page/Banner.tsx +0 -95
  273. package/src/components/page/Notification.tsx +0 -71
  274. package/src/components/page/Page.tsx +0 -73
  275. package/src/components/page/Section.tsx +0 -21
  276. package/src/components/page/TabBar.tsx +0 -131
  277. package/src/components/page/index.ts +0 -10
  278. package/src/components/router/Link.tsx +0 -23
  279. package/src/components/router/LinkButton.tsx +0 -22
  280. package/src/components/router/LinkIconButton.tsx +0 -22
  281. package/src/components/router/LinkListItem.tsx +0 -22
  282. package/src/components/router/LinkTab.tsx +0 -22
  283. package/src/components/router/Navigate.tsx +0 -33
  284. package/src/components/router/index.tsx +0 -9
  285. package/src/components/table/CellStack.tsx +0 -19
  286. package/src/components/table/Table.tsx +0 -55
  287. package/src/components/table/index.tsx +0 -8
  288. package/src/features/InactiveDialog.tsx +0 -40
  289. package/src/features/ScreenTimeDialog.tsx +0 -30
  290. package/src/features/index.ts +0 -4
  291. package/src/fonts/ttf/Inter-VariableFont_slnt,wght.ttf +0 -0
  292. package/src/fonts/ttf/SpaceGrotesk-VariableFont_wght.ttf +0 -0
  293. package/src/hooks/api.tsx +0 -39
  294. package/src/hooks/auth.tsx +0 -397
  295. package/src/hooks/form.tsx +0 -11
  296. package/src/hooks/general.tsx +0 -110
  297. package/src/hooks/index.ts +0 -5
  298. package/src/hooks/router.tsx +0 -168
  299. package/src/images/svg/brain.svg +0 -1
  300. package/src/index.ts +0 -2
  301. package/src/middlewares/index.ts +0 -1
  302. package/src/middlewares/session.ts +0 -21
  303. package/src/scripts/freshDesk.js +0 -473
  304. package/src/scripts/index.ts +0 -1
  305. package/src/server.js +0 -187
  306. package/src/settings/custom.ts +0 -22
  307. package/src/settings/index.ts +0 -7
  308. package/src/settings/vite.ts +0 -26
  309. package/src/setupTests.ts +0 -2
  310. package/src/slices/createSlice.ts +0 -8
  311. package/src/slices/index.ts +0 -2
  312. package/src/slices/session.ts +0 -32
  313. package/src/theme/ThemedBox.tsx +0 -265
  314. package/src/theme/colors.ts +0 -57
  315. package/src/theme/components/MuiAccordion.tsx +0 -13
  316. package/src/theme/components/MuiAutocomplete.tsx +0 -11
  317. package/src/theme/components/MuiButton.ts +0 -70
  318. package/src/theme/components/MuiCardActions.tsx +0 -12
  319. package/src/theme/components/MuiCheckbox.ts +0 -12
  320. package/src/theme/components/MuiContainer.ts +0 -19
  321. package/src/theme/components/MuiDialog.tsx +0 -16
  322. package/src/theme/components/MuiFormControlLabel.ts +0 -18
  323. package/src/theme/components/MuiFormHelperText.ts +0 -12
  324. package/src/theme/components/MuiGrid2.ts +0 -16
  325. package/src/theme/components/MuiInputBase.ts +0 -14
  326. package/src/theme/components/MuiLink.ts +0 -41
  327. package/src/theme/components/MuiList.ts +0 -12
  328. package/src/theme/components/MuiListItemText.ts +0 -18
  329. package/src/theme/components/MuiMenu.ts +0 -14
  330. package/src/theme/components/MuiMenuItem.ts +0 -15
  331. package/src/theme/components/MuiSelect.ts +0 -16
  332. package/src/theme/components/MuiTab.ts +0 -29
  333. package/src/theme/components/MuiTable.ts +0 -29
  334. package/src/theme/components/MuiTableBody.ts +0 -15
  335. package/src/theme/components/MuiTableHead.ts +0 -26
  336. package/src/theme/components/MuiTabs.ts +0 -26
  337. package/src/theme/components/MuiTextField.ts +0 -86
  338. package/src/theme/components/MuiToolbar.ts +0 -11
  339. package/src/theme/components/MuiTypography.ts +0 -12
  340. package/src/theme/components/_components.ts +0 -95
  341. package/src/theme/components/index.ts +0 -57
  342. package/src/theme/index.ts +0 -25
  343. package/src/theme/palette.ts +0 -98
  344. package/src/theme/spacing.ts +0 -8
  345. package/src/theme/typography.ts +0 -101
  346. package/src/utils/api.test.ts +0 -19
  347. package/src/utils/api.tsx +0 -339
  348. package/src/utils/auth.ts +0 -78
  349. package/src/utils/form.test.ts +0 -50
  350. package/src/utils/form.ts +0 -193
  351. package/src/utils/general.test.ts +0 -55
  352. package/src/utils/router.test.ts +0 -156
  353. package/src/utils/router.ts +0 -67
  354. package/src/utils/schema.ts +0 -290
  355. package/src/utils/store.ts +0 -31
  356. package/src/utils/test.tsx +0 -82
  357. package/src/utils/theme.tsx +0 -83
  358. package/src/utils/window.ts +0 -11
  359. package/src/vite-env.d.ts +0 -1
  360. package/tsconfig.app.json +0 -4
  361. package/tsconfig.json +0 -7
  362. package/tsconfig.node.json +0 -4
  363. package/types/fixes.d.ts +0 -18
  364. package/vite.config.ts +0 -23
@@ -1,73 +0,0 @@
1
- import { Children, type JSX, useEffect } from "react"
2
- import { type Location, useLocation } from "react-router-dom"
3
-
4
- import Notification, { type NotificationProps } from "./Notification"
5
- import {
6
- type SessionMetadata,
7
- type UseSessionChildren,
8
- type UseSessionChildrenFunction,
9
- type UseSessionOptions,
10
- useSession,
11
- } from "../../hooks/auth"
12
-
13
- export type PageState = {
14
- notifications: Array<{
15
- index?: number
16
- props: NotificationProps
17
- }>
18
- scroll: { x: number; y: number }
19
- }
20
-
21
- export interface PageProps<
22
- SessionUserType extends SessionMetadata["user_type"] | undefined,
23
- > {
24
- children: UseSessionChildren<SessionUserType>
25
- session?: UseSessionOptions<SessionUserType>
26
- }
27
-
28
- const Page = <
29
- SessionUserType extends SessionMetadata["user_type"] | undefined = undefined,
30
- >({
31
- children,
32
- session,
33
- }: PageProps<SessionUserType>): JSX.Element => {
34
- const { state } = useLocation() as Location<null | Partial<PageState>>
35
-
36
- let { scroll, notifications } = state || {}
37
- scroll = scroll || { x: 0, y: 0 }
38
- notifications = notifications || []
39
-
40
- useEffect(() => {
41
- window.scroll(scroll.x, scroll.y)
42
- }, [scroll.x, scroll.y])
43
-
44
- return (
45
- <>
46
- {useSession((metadata?: SessionMetadata) => {
47
- if (typeof children === "function") {
48
- children = metadata
49
- ? (children as UseSessionChildrenFunction<true>)(metadata)
50
- : (children as UseSessionChildrenFunction<false>)(metadata)
51
- }
52
-
53
- if (notifications.length) {
54
- const childrenArray = Children.toArray(children)
55
-
56
- notifications.forEach((notification, index) => {
57
- void childrenArray.splice(
58
- notification.index ?? index,
59
- 0,
60
- <Notification {...notification.props} />,
61
- )
62
- })
63
-
64
- return childrenArray
65
- }
66
-
67
- return children
68
- }, session)}
69
- </>
70
- )
71
- }
72
-
73
- export default Page
@@ -1,21 +0,0 @@
1
- import {
2
- Box,
3
- type BoxProps,
4
- Container,
5
- type ContainerProps,
6
- } from "@mui/material"
7
- import type { FC } from "react"
8
-
9
- export interface SectionProps extends ContainerProps {
10
- boxProps?: Omit<BoxProps, "children">
11
- }
12
-
13
- const Section: FC<SectionProps> = ({ boxProps, ...containerProps }) => {
14
- return (
15
- <Box {...boxProps}>
16
- <Container {...containerProps} />
17
- </Box>
18
- )
19
- }
20
-
21
- export default Section
@@ -1,131 +0,0 @@
1
- import {
2
- ChevronLeft as ChevronLeftIcon,
3
- ChevronRight as ChevronRightIcon,
4
- } from "@mui/icons-material"
5
- import { type FC, type ReactNode, useEffect, useState } from "react"
6
- import {
7
- IconButton,
8
- Tab,
9
- type TabScrollButtonProps,
10
- Tabs,
11
- Typography,
12
- } from "@mui/material"
13
- import { object as YupObject, string as YupString } from "yup"
14
- import { generatePath, useNavigate, useParams } from "react-router-dom"
15
-
16
- import Section from "./Section"
17
- import { primary } from "../../theme/colors"
18
- import { tryValidateSync } from "../../utils/schema"
19
-
20
- export interface TabBarProps {
21
- header: string
22
- tabs: Array<{
23
- label: string
24
- children: ReactNode
25
- path: string
26
- }>
27
- originalPath: string
28
- value?: number
29
- }
30
-
31
- const TabBar: FC<TabBarProps> = ({ header, tabs, originalPath, value = 0 }) => {
32
- const params = useParams()
33
- const navigate = useNavigate()
34
- const [_value, _setValue] = useState(
35
- value < 0 ? 0 : value >= tabs.length ? tabs.length - 1 : value,
36
- )
37
-
38
- const labels = tabs.map(tab => tab.label)
39
- const children = tabs.map(tab => tab.children)
40
- const paths = tabs.map(tab => tab.path)
41
-
42
- useEffect(() => {
43
- _setValue(value)
44
- }, [value])
45
-
46
- useEffect(() => {
47
- const tab = tryValidateSync(
48
- params,
49
- YupObject({
50
- tab: YupString().oneOf(paths).required(),
51
- }),
52
- )?.tab
53
-
54
- if (tab !== undefined) {
55
- _setValue(paths.indexOf(tab))
56
- }
57
- }, [params, paths])
58
-
59
- return (
60
- <>
61
- <Section
62
- boxProps={{ bgcolor: primary[500] }}
63
- sx={{ paddingY: "100px" }}
64
- className="flex-center"
65
- >
66
- <Typography
67
- textAlign="center"
68
- variant="h2"
69
- style={{ color: "white" }}
70
- mb={0}
71
- >
72
- {header}
73
- </Typography>
74
- </Section>
75
- <Section
76
- boxProps={{ bgcolor: primary[300] }}
77
- sx={{ paddingY: "6px" }}
78
- className="flex-center"
79
- >
80
- <Tabs
81
- value={_value}
82
- onChange={(_, value: number) => {
83
- navigate(
84
- generatePath(originalPath, {
85
- tab: paths[value],
86
- }),
87
- )
88
- }}
89
- ScrollButtonComponent={({
90
- disabled,
91
- onClick,
92
- direction,
93
- }: TabScrollButtonProps) => {
94
- return (
95
- <>
96
- {disabled === false && (
97
- <IconButton
98
- onClick={onClick}
99
- style={{
100
- padding: 0,
101
- [direction === "left" ? "marginRight" : "marginLeft"]:
102
- "15px",
103
- color: "white",
104
- }}
105
- >
106
- {direction === "left" ? (
107
- <>
108
- <ChevronLeftIcon />
109
- </>
110
- ) : (
111
- <>
112
- <ChevronRightIcon />
113
- </>
114
- )}
115
- </IconButton>
116
- )}
117
- </>
118
- )
119
- }}
120
- >
121
- {labels.map(label => (
122
- <Tab disableRipple key={label} label={label} />
123
- ))}
124
- </Tabs>
125
- </Section>
126
- {children[_value]}
127
- </>
128
- )
129
- }
130
-
131
- export default TabBar
@@ -1,10 +0,0 @@
1
- export * from "./Banner"
2
- export { default as Banner } from "./Banner"
3
- export * from "./Notification"
4
- export { default as Notification } from "./Notification"
5
- export * from "./Page"
6
- export { default as Page } from "./Page"
7
- export * from "./Section"
8
- export { default as Section } from "./Section"
9
- export * from "./TabBar"
10
- export { default as TabBar } from "./TabBar"
@@ -1,23 +0,0 @@
1
- import { Link as MuiLink, type LinkProps as MuiLinkProps } from "@mui/material"
2
- import { type JSX } from "react"
3
- import { Link as RouterLink } from "react-router-dom"
4
-
5
- import { type LinkProps as RouterLinkProps } from "../../utils/router"
6
-
7
- export type LinkProps<
8
- Override extends "delta" | "to",
9
- State extends Record<string, any> = Record<string, any>,
10
- > = Omit<MuiLinkProps, "component"> & RouterLinkProps<Override, State>
11
-
12
- // https://mui.com/material-ui/integrations/routing/#link
13
- const Link: {
14
- (props: LinkProps<"delta">): JSX.Element
15
- <State extends Record<string, any> = Record<string, any>>(
16
- props: LinkProps<"to", State>,
17
- ): JSX.Element
18
- } = (props: LinkProps<"delta"> | LinkProps<"to">) => {
19
- // @ts-expect-error props are assignable
20
- return <MuiLink component={RouterLink} {...props} />
21
- }
22
-
23
- export default Link
@@ -1,22 +0,0 @@
1
- import { Button, type ButtonProps } from "@mui/material"
2
- import { type JSX } from "react"
3
- import { Link } from "react-router-dom"
4
-
5
- import { type LinkProps } from "../../utils/router"
6
-
7
- export type LinkButtonProps<
8
- Override extends "delta" | "to",
9
- State extends Record<string, any> = Record<string, any>,
10
- > = Omit<ButtonProps, "component"> & LinkProps<Override, State>
11
-
12
- // https://mui.com/material-ui/integrations/routing/#button
13
- const LinkButton: {
14
- (props: LinkButtonProps<"delta">): JSX.Element
15
- <State extends Record<string, any> = Record<string, any>>(
16
- props: LinkButtonProps<"to", State>,
17
- ): JSX.Element
18
- } = (props: LinkButtonProps<"delta"> | LinkButtonProps<"to">) => {
19
- return <Button {...{ ...props, component: Link }} />
20
- }
21
-
22
- export default LinkButton
@@ -1,22 +0,0 @@
1
- import { IconButton, type IconButtonProps } from "@mui/material"
2
- import { type JSX } from "react"
3
- import { Link } from "react-router-dom"
4
-
5
- import { type LinkProps } from "../../utils/router"
6
-
7
- export type LinkIconButtonProps<
8
- Override extends "delta" | "to",
9
- State extends Record<string, any> = Record<string, any>,
10
- > = Omit<IconButtonProps, "component"> & LinkProps<Override, State>
11
-
12
- // https://mui.com/material-ui/integrations/routing/#button
13
- const LinkIconButton: {
14
- (props: LinkIconButtonProps<"delta">): JSX.Element
15
- <State extends Record<string, any> = Record<string, any>>(
16
- props: LinkIconButtonProps<"to", State>,
17
- ): JSX.Element
18
- } = (props: LinkIconButtonProps<"delta"> | LinkIconButtonProps<"to">) => {
19
- return <IconButton {...{ ...props, component: Link }} />
20
- }
21
-
22
- export default LinkIconButton
@@ -1,22 +0,0 @@
1
- import { ListItem, type ListItemProps } from "@mui/material"
2
- import { type JSX } from "react"
3
- import { Link } from "react-router-dom"
4
-
5
- import { type LinkProps } from "../../utils/router"
6
-
7
- export type LinkListItemProps<
8
- Override extends "delta" | "to",
9
- State extends Record<string, any> = Record<string, any>,
10
- > = Omit<ListItemProps, "component"> & LinkProps<Override, State>
11
-
12
- // https://mui.com/material-ui/integrations/routing/#list
13
- const LinkListItem: {
14
- (props: LinkListItemProps<"delta">): JSX.Element
15
- <State extends Record<string, any> = Record<string, any>>(
16
- props: LinkListItemProps<"to", State>,
17
- ): JSX.Element
18
- } = (props: LinkListItemProps<"delta"> | LinkListItemProps<"to">) => {
19
- return <ListItem {...{ ...props, component: Link }} />
20
- }
21
-
22
- export default LinkListItem
@@ -1,22 +0,0 @@
1
- import { Tab, type TabProps } from "@mui/material"
2
- import { type JSX } from "react"
3
- import { Link } from "react-router-dom"
4
-
5
- import { type LinkProps } from "../../utils/router"
6
-
7
- export type LinkTabProps<
8
- Override extends "delta" | "to",
9
- State extends Record<string, any> = Record<string, any>,
10
- > = Omit<TabProps, "component"> & LinkProps<Override, State>
11
-
12
- // https://mui.com/material-ui/integrations/routing/#tabs
13
- const LinkTab: {
14
- (props: LinkTabProps<"delta">): JSX.Element
15
- <State extends Record<string, any> = Record<string, any>>(
16
- props: LinkTabProps<"to", State>,
17
- ): JSX.Element
18
- } = (props: LinkTabProps<"delta"> | LinkTabProps<"to">) => {
19
- return <Tab {...{ ...props, component: Link }} />
20
- }
21
-
22
- export default LinkTab
@@ -1,33 +0,0 @@
1
- import { type JSX, useEffect } from "react"
2
- import { type To } from "react-router-dom"
3
-
4
- import { type NavigateOptions, useNavigate } from "../../hooks"
5
-
6
- export type NavigateProps<
7
- Override extends "delta" | "to",
8
- State extends Record<string, any> = Record<string, any>,
9
- > = Override extends "delta"
10
- ? { delta: number; to?: undefined }
11
- : { delta?: undefined; to: To } & NavigateOptions<State>
12
-
13
- const Navigate: {
14
- (props: NavigateProps<"delta">): JSX.Element
15
- <State extends Record<string, any> = Record<string, any>>(
16
- props: NavigateProps<"to", State>,
17
- ): JSX.Element
18
- } = ({
19
- delta,
20
- to,
21
- ...options
22
- }: NavigateProps<"delta"> | NavigateProps<"to">) => {
23
- const navigate = useNavigate()
24
-
25
- useEffect(() => {
26
- if (typeof delta === "number") navigate(delta)
27
- else navigate(to, options)
28
- }, [navigate, delta, to, options])
29
-
30
- return <></>
31
- }
32
-
33
- export default Navigate
@@ -1,9 +0,0 @@
1
- export { default as Link, type LinkProps } from "./Link"
2
- export { default as LinkButton, type LinkButtonProps } from "./LinkButton"
3
- export {
4
- default as LinkIconButton,
5
- type LinkIconButtonProps,
6
- } from "./LinkIconButton"
7
- export { default as LinkListItem, type LinkListItemProps } from "./LinkListItem"
8
- export { default as LinkTab, type LinkTabProps } from "./LinkTab"
9
- export { default as Navigate, type NavigateProps } from "./Navigate"
@@ -1,19 +0,0 @@
1
- import {
2
- Stack,
3
- type StackProps,
4
- TableCell,
5
- type TableCellProps,
6
- } from "@mui/material"
7
- import { type FC } from "react"
8
-
9
- export interface CellStackProps extends StackProps {
10
- cellProps?: TableCellProps
11
- }
12
-
13
- const CellStack: FC<CellStackProps> = ({ cellProps, ...stackProps }) => (
14
- <TableCell {...cellProps}>
15
- <Stack {...stackProps} />
16
- </TableCell>
17
- )
18
-
19
- export default CellStack
@@ -1,55 +0,0 @@
1
- import { type FC, type ReactNode, isValidElement } from "react"
2
- import {
3
- Table as MuiTable,
4
- type TableProps as MuiTableProps,
5
- TableBody,
6
- type TableBodyProps,
7
- TableCell,
8
- type TableCellProps,
9
- TableContainer,
10
- type TableContainerProps,
11
- TableHead,
12
- type TableHeadProps,
13
- TableRow,
14
- type TableRowProps,
15
- } from "@mui/material"
16
-
17
- export interface TableProps extends MuiTableProps {
18
- headers: Array<ReactNode | TableCellProps>
19
- children: ReactNode
20
- containerProps?: TableContainerProps
21
- headProps?: TableHeadProps
22
- headRowProps?: TableRowProps
23
- bodyProps?: TableBodyProps
24
- }
25
-
26
- const Table: FC<TableProps> = ({
27
- headers,
28
- children,
29
- containerProps,
30
- headProps,
31
- headRowProps,
32
- bodyProps,
33
- ...tableProps
34
- }) => (
35
- <TableContainer {...containerProps}>
36
- <MuiTable {...tableProps}>
37
- <TableHead {...headProps}>
38
- <TableRow {...headRowProps}>
39
- {headers.map((header, index) => {
40
- const key = `table-head-cell-${index}`
41
-
42
- return typeof header === "string" || isValidElement(header) ? (
43
- <TableCell key={key}>{header}</TableCell>
44
- ) : (
45
- <TableCell key={key} {...(header as TableCellProps)} />
46
- )
47
- })}
48
- </TableRow>
49
- </TableHead>
50
- <TableBody {...bodyProps}>{children}</TableBody>
51
- </MuiTable>
52
- </TableContainer>
53
- )
54
-
55
- export default Table
@@ -1,8 +0,0 @@
1
- export { default as Table, type TableProps } from "./Table"
2
- export { default as CellStack, type CellStackProps } from "./CellStack"
3
- export {
4
- TableCell as Cell,
5
- type TableCellProps as CellProps,
6
- TableRow as BodyRow,
7
- type TableRowProps as BodyRowProps,
8
- } from "@mui/material"
@@ -1,40 +0,0 @@
1
- import { Button, Dialog, Typography } from "@mui/material"
2
- import { type FC } from "react"
3
-
4
- import { Countdown } from "../components"
5
-
6
- export interface InactiveDialogProps {
7
- open: boolean
8
- onClose: () => void
9
- }
10
-
11
- const InactiveDialog: FC<InactiveDialogProps> = ({ open, onClose }) => {
12
- return (
13
- <Dialog open={open} onClose={onClose}>
14
- <Typography variant="h5" textAlign="center">
15
- Where did you go? 👀
16
- </Typography>
17
- <Typography textAlign="center">
18
- We noticed that you have been inactive for a while. Are you still there?
19
- For your online safety we will log you out in:
20
- </Typography>
21
- <Countdown
22
- textAlign="center"
23
- variant="h5"
24
- seconds={60 * 2}
25
- onEnd={() => {
26
- onClose()
27
- alert("TODO: call logout endpoint")
28
- }}
29
- />
30
- <Typography textAlign="center">
31
- You may lose progress unless you continue or save.
32
- </Typography>
33
- <Button onClick={onClose} autoFocus>
34
- Wait, I&apos;m still here!
35
- </Button>
36
- </Dialog>
37
- )
38
- }
39
-
40
- export default InactiveDialog
@@ -1,30 +0,0 @@
1
- import { Button, Dialog, Typography } from "@mui/material"
2
- import { type FC } from "react"
3
-
4
- import BrainImage from "../images/svg/brain.svg"
5
- import { Image } from "../components"
6
-
7
- export interface ScreenTimeDialogProps {
8
- open: boolean
9
- onClose: () => void
10
- }
11
-
12
- const ScreenTimeDialog: FC<ScreenTimeDialogProps> = ({ open, onClose }) => {
13
- return (
14
- <Dialog open={open} onClose={onClose} maxWidth="sm">
15
- <Image src={BrainImage} alt="brain" maxWidth={100} marginY={3} />
16
- <Typography variant="h5" textAlign="center">
17
- Time for a break?
18
- </Typography>
19
- <Typography textAlign="center">
20
- You have been using the Code for Life website for a while. Remember to
21
- take regular screen breaks to recharge those brain cells!
22
- </Typography>
23
- <Button onClick={onClose} autoFocus>
24
- Continue
25
- </Button>
26
- </Dialog>
27
- )
28
- }
29
-
30
- export default ScreenTimeDialog
@@ -1,4 +0,0 @@
1
- export * from "./InactiveDialog"
2
- export { default as InactiveDialog } from "./InactiveDialog"
3
- export * from "./ScreenTimeDialog"
4
- export { default as ScreenTimeDialog } from "./ScreenTimeDialog"
package/src/hooks/api.tsx DELETED
@@ -1,39 +0,0 @@
1
- import { type Dispatch, type SetStateAction, useState } from "react"
2
-
3
- export type Pagination = { page: number; limit: number; offset: number }
4
- export type SetPagination = Dispatch<
5
- SetStateAction<{ page: number; limit: number }>
6
- >
7
- export type UsePaginationOptions = Partial<{
8
- page: number
9
- limit: number
10
- }>
11
-
12
- export function usePagination(
13
- options?: UsePaginationOptions,
14
- ): [Pagination, SetPagination] {
15
- const { page = 0, limit = 150 } = options || {}
16
-
17
- const [pagination, _setPagination] = useState<Pagination>({
18
- page,
19
- limit,
20
- offset: page * limit,
21
- })
22
-
23
- const setPagination: SetPagination = value => {
24
- _setPagination(({ page: previousPage, limit: previousLimit }) => {
25
- const pagination =
26
- typeof value === "function"
27
- ? value({ page: previousPage, limit: previousLimit })
28
- : value
29
- let page = pagination.page
30
- const limit = pagination.limit
31
-
32
- if (limit !== previousLimit) page = 0
33
-
34
- return { page, limit, offset: page * limit }
35
- })
36
- }
37
-
38
- return [pagination, setPagination]
39
- }