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,41 +0,0 @@
1
- import { Box, type BoxProps } from "@mui/material"
2
- import { type FC } from "react"
3
-
4
- import { openInNewTab } from "../utils/general"
5
-
6
- export interface ImageProps extends Omit<BoxProps, "component"> {
7
- alt: string
8
- src: string
9
- href?: string
10
- hrefInNewTab?: boolean
11
- }
12
-
13
- const Image: FC<ImageProps> = ({ href, hrefInNewTab = false, ...props }) => {
14
- let {
15
- onClick,
16
- style = {},
17
- ...otherProps // eslint-disable-line prefer-const
18
- } = props
19
-
20
- if (style.width === undefined) {
21
- style.width = "100%"
22
- }
23
-
24
- // Override onClick if href provided.
25
- if (href !== undefined) {
26
- style = { ...style, cursor: "pointer" }
27
- if (hrefInNewTab) {
28
- onClick = () => {
29
- openInNewTab(href)
30
- }
31
- } else {
32
- onClick = () => {
33
- window.location.replace(href)
34
- }
35
- }
36
- }
37
-
38
- return <Box component="img" onClick={onClick} style={style} {...otherProps} />
39
- }
40
-
41
- export default Image
@@ -1,27 +0,0 @@
1
- import { Button, type ButtonProps } from "@mui/material"
2
- import {
3
- type DetailedHTMLProps,
4
- type FC,
5
- type InputHTMLAttributes,
6
- } from "react"
7
-
8
- export interface InputFileButtonProps
9
- extends Omit<ButtonProps<"label">, "component"> {
10
- inputProps?: Omit<
11
- DetailedHTMLProps<InputHTMLAttributes<HTMLInputElement>, HTMLInputElement>,
12
- "type" | "hidden"
13
- >
14
- }
15
-
16
- const InputFileButton: FC<InputFileButtonProps> = ({
17
- children,
18
- inputProps,
19
- ...otherButtonProps
20
- }) => (
21
- <Button component="label" {...otherButtonProps}>
22
- {children}
23
- <input type="file" hidden {...inputProps} />
24
- </Button>
25
- )
26
-
27
- export default InputFileButton
@@ -1,61 +0,0 @@
1
- import { type FC, type ReactElement } from "react"
2
- import {
3
- List,
4
- type ListItem,
5
- type ListItemText,
6
- type ListProps,
7
- } from "@mui/material"
8
-
9
- type ListItemElement = ReactElement<typeof ListItem | typeof ListItemText>
10
-
11
- export interface ItemizedListProps {
12
- styleType:
13
- | "unset"
14
- | "initial"
15
- | "inherit"
16
- | "upper-roman"
17
- | "upper-latin"
18
- | "upper-alpha"
19
- | "square"
20
- | "none"
21
- | "lower-roman"
22
- | "lower-latin"
23
- | "lower-greek"
24
- | "lower-alpha"
25
- | "georgian"
26
- | "disc"
27
- | "decimal-leading-zero"
28
- | "decimal"
29
- | "armenian"
30
- | "circle"
31
- listProps?: ListProps
32
- pl?: number
33
- children: ListItemElement | ListItemElement[]
34
- }
35
-
36
- const ItemizedList: FC<ItemizedListProps> = ({
37
- styleType,
38
- listProps = {},
39
- pl = 4,
40
- children,
41
- }) => {
42
- const { sx, ...otherProps } = listProps
43
- const listItemProps = { display: "list-item" }
44
-
45
- return (
46
- <List
47
- sx={{
48
- listStyleType: styleType,
49
- pl,
50
- ".MuiListItem-root": listItemProps,
51
- ".MuiListItemText-root": listItemProps,
52
- ...sx,
53
- }}
54
- {...otherProps}
55
- >
56
- {children}
57
- </List>
58
- )
59
- }
60
-
61
- export default ItemizedList
@@ -1,92 +0,0 @@
1
- import { type FC, type ReactElement } from "react"
2
- import { Unstable_Grid2 as Grid, type Grid2Props } from "@mui/material"
3
-
4
- interface ItemProps
5
- extends Omit<
6
- Grid2Props,
7
- | "key"
8
- | "order"
9
- | "xs"
10
- | "sm"
11
- | "md"
12
- | "lg"
13
- | "xl"
14
- | "xsOffset"
15
- | "smOffset"
16
- | "mdOffset"
17
- | "lgOffset"
18
- | "xlOffset"
19
- > {}
20
-
21
- interface GlobalItemProps extends ItemProps {
22
- xs: number
23
- sm: number
24
- md: number
25
- lg: number
26
- xl: number
27
- }
28
-
29
- export interface OrderedGridProps {
30
- rows: Array<
31
- Array<{
32
- element: ReactElement
33
- itemProps?: ItemProps
34
- }>
35
- >
36
- containerProps?: Omit<Grid2Props, "container">
37
- globalItemProps: GlobalItemProps
38
- }
39
-
40
- const OrderedGrid: FC<OrderedGridProps> = ({
41
- rows,
42
- containerProps = {},
43
- globalItemProps,
44
- }) => {
45
- const columns = Number(containerProps.columns ?? 12)
46
-
47
- const getItemsPerRow = (size: number): number => Math.floor(columns / size)
48
-
49
- const getOrder = (
50
- rowIndex: number,
51
- itemIndex: number,
52
- size: number,
53
- ): number =>
54
- Math.floor(itemIndex / getItemsPerRow(size)) * rows.length + rowIndex
55
-
56
- const getOffset = (itemIndex: number, size: number): number => {
57
- const itemsOnLastRow = rows[0].length % getItemsPerRow(size)
58
- return itemsOnLastRow !== 0 && itemIndex === rows[0].length - 1
59
- ? (columns - itemsOnLastRow * size) / 2
60
- : 0
61
- }
62
-
63
- return (
64
- <Grid container {...containerProps}>
65
- {rows.map((row, rowIndex) =>
66
- row.map(({ element, itemProps = {} }, itemIndex) => (
67
- <Grid
68
- key={`${rowIndex}-${itemIndex}`}
69
- order={{
70
- xs: getOrder(rowIndex, itemIndex, globalItemProps.xs),
71
- sm: getOrder(rowIndex, itemIndex, globalItemProps.sm),
72
- md: getOrder(rowIndex, itemIndex, globalItemProps.md),
73
- lg: getOrder(rowIndex, itemIndex, globalItemProps.lg),
74
- xl: getOrder(rowIndex, itemIndex, globalItemProps.xl),
75
- }}
76
- xsOffset={getOffset(itemIndex, globalItemProps.xs)}
77
- smOffset={getOffset(itemIndex, globalItemProps.sm)}
78
- mdOffset={getOffset(itemIndex, globalItemProps.md)}
79
- lgOffset={getOffset(itemIndex, globalItemProps.lg)}
80
- xlOffset={getOffset(itemIndex, globalItemProps.xl)}
81
- {...globalItemProps}
82
- {...itemProps}
83
- >
84
- {element}
85
- </Grid>
86
- )),
87
- )}
88
- </Grid>
89
- )
90
- }
91
-
92
- export default OrderedGrid
@@ -1,22 +0,0 @@
1
- import { Link, type LinkProps } from "@mui/material"
2
- import { type FC } from "react"
3
- export interface ScrollIntoViewLinkProps extends Omit<LinkProps, "onClick"> {
4
- elementId: string
5
- options?: ScrollIntoViewOptions
6
- }
7
-
8
- const ScrollIntoViewLink: FC<ScrollIntoViewLinkProps> = ({
9
- elementId,
10
- options,
11
- ...linkProps
12
- }) => (
13
- <Link
14
- {...linkProps}
15
- onClick={() => {
16
- const element = document.getElementById(elementId)
17
- element?.scrollIntoView(options)
18
- }}
19
- />
20
- )
21
-
22
- export default ScrollIntoViewLink
@@ -1,14 +0,0 @@
1
- import { Stack, Typography } from "@mui/material"
2
- import { type FC } from "react"
3
- import { SyncProblem as SyncProblemIcon } from "@mui/icons-material"
4
-
5
- export interface SyncErrorProps {}
6
-
7
- const SyncError: FC<SyncErrorProps> = () => (
8
- <Stack alignItems="center" alignContent="center">
9
- <SyncProblemIcon color="error" />
10
- <Typography color="error.main">Failed to sync data</Typography>
11
- </Stack>
12
- )
13
-
14
- export default SyncError
@@ -1,142 +0,0 @@
1
- import {
2
- type ElementType,
3
- type JSX,
4
- type JSXElementConstructor,
5
- type ReactNode,
6
- useEffect,
7
- } from "react"
8
- import {
9
- TablePagination as MuiTablePagination,
10
- type TablePaginationProps as MuiTablePaginationProps,
11
- Stack,
12
- type StackProps,
13
- type TablePaginationBaseProps,
14
- } from "@mui/material"
15
- import type { TypedUseLazyQuery } from "@reduxjs/toolkit/query/react"
16
-
17
- import { type ListArg, type ListResult, handleResultState } from "../utils/api"
18
- import { type Pagination, usePagination } from "../hooks/api"
19
-
20
- export type TablePaginationProps<
21
- QueryArg extends ListArg,
22
- ResultType extends ListResult<any>,
23
- RootComponent extends
24
- ElementType = JSXElementConstructor<TablePaginationBaseProps>,
25
- AdditionalProps = {},
26
- > = Omit<
27
- MuiTablePaginationProps<RootComponent, AdditionalProps>,
28
- | "component"
29
- | "count"
30
- | "rowsPerPage"
31
- | "onRowsPerPageChange"
32
- | "rowsPerPageOptions"
33
- | "page"
34
- | "onPageChange"
35
- > &
36
- Partial<
37
- Pick<
38
- MuiTablePaginationProps<RootComponent, AdditionalProps>,
39
- "onRowsPerPageChange" | "onPageChange"
40
- >
41
- > & {
42
- children: (
43
- data: ResultType["data"],
44
- pagination: Pagination & { count?: number; maxLimit?: number },
45
- ) => ReactNode
46
- useLazyListQuery: TypedUseLazyQuery<ResultType, QueryArg, any>
47
- preferCacheValue?: boolean
48
- filters?: Omit<QueryArg, "limit" | "offset">
49
- rowsPerPageOptions?: number[]
50
- stackProps?: StackProps
51
- page?: number
52
- rowsPerPage?: number
53
- }
54
-
55
- const TablePagination = <
56
- QueryArg extends ListArg,
57
- ResultType extends ListResult<any>,
58
- RootComponent extends
59
- ElementType = JSXElementConstructor<TablePaginationBaseProps>,
60
- AdditionalProps = {},
61
- >({
62
- children,
63
- useLazyListQuery,
64
- preferCacheValue,
65
- filters,
66
- page: initialPage = 0,
67
- rowsPerPage: initialLimit = 50,
68
- rowsPerPageOptions = [50, 100, 150],
69
- stackProps,
70
- onRowsPerPageChange,
71
- onPageChange,
72
- ...tablePaginationProps
73
- }: TablePaginationProps<
74
- QueryArg,
75
- ResultType,
76
- RootComponent,
77
- AdditionalProps
78
- >): JSX.Element => {
79
- const [trigger, result] = useLazyListQuery()
80
- const [{ limit, page, offset }, setPagination] = usePagination({
81
- page: initialPage,
82
- limit: initialLimit,
83
- })
84
-
85
- useEffect(
86
- () => {
87
- void trigger({ limit, offset, ...filters } as QueryArg, preferCacheValue)
88
- },
89
- // eslint-disable-next-line react-hooks/exhaustive-deps
90
- [
91
- trigger,
92
- limit,
93
- offset,
94
- // eslint-disable-next-line react-hooks/exhaustive-deps,@typescript-eslint/no-unsafe-assignment
95
- ...Object.values(filters || {}),
96
- preferCacheValue,
97
- ],
98
- )
99
-
100
- const { count, max_limit } = result.data || {}
101
-
102
- if (max_limit) {
103
- rowsPerPageOptions = rowsPerPageOptions.filter(
104
- option => option <= max_limit,
105
- )
106
- }
107
-
108
- return (
109
- <Stack {...stackProps}>
110
- {handleResultState(result, ({ data }) =>
111
- children(data, {
112
- limit,
113
- page,
114
- offset,
115
- count,
116
- maxLimit: max_limit,
117
- }),
118
- )}
119
- <MuiTablePagination
120
- component="div"
121
- count={count ?? 0}
122
- rowsPerPage={limit}
123
- onRowsPerPageChange={event => {
124
- setPagination({ limit: parseInt(event.target.value), page: 0 })
125
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call
126
- if (onRowsPerPageChange) onRowsPerPageChange(event)
127
- }}
128
- page={page}
129
- onPageChange={(event, page) => {
130
- setPagination(({ limit }) => ({ limit, page }))
131
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call
132
- if (onPageChange) onPageChange(event, page)
133
- }}
134
- // ascending order
135
- rowsPerPageOptions={rowsPerPageOptions.sort((a, b) => a - b)}
136
- {...tablePaginationProps}
137
- />
138
- </Stack>
139
- )
140
- }
141
-
142
- export default TablePagination
@@ -1,26 +0,0 @@
1
- import { Box, type BoxProps } from "@mui/material"
2
- import { type FC } from "react"
3
-
4
- export interface YouTubeVideoProps extends Omit<BoxProps, "component"> {
5
- src: string
6
- }
7
-
8
- const YouTubeVideo: FC<YouTubeVideoProps> = ({
9
- src,
10
- style = {},
11
- ...otherProps
12
- }) => {
13
- return (
14
- <Box
15
- component="iframe"
16
- width="100%"
17
- src={src}
18
- title="YouTube video player"
19
- allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen"
20
- style={{ border: "0px", aspectRatio: "16 / 9", ...style }}
21
- {...otherProps}
22
- />
23
- )
24
- }
25
-
26
- export default YouTubeVideo
@@ -1,187 +0,0 @@
1
- import { Button, type ChipTypeMap, CircularProgress } from "@mui/material"
2
- import {
3
- Children,
4
- type ElementType,
5
- type ForwardRefRenderFunction,
6
- type HTMLAttributes,
7
- type JSX,
8
- forwardRef,
9
- useEffect,
10
- useState,
11
- } from "react"
12
- import type { TypedUseLazyQuery } from "@reduxjs/toolkit/query/react"
13
-
14
- import {
15
- AutocompleteField,
16
- type AutocompleteFieldProps,
17
- } from "../../components/form"
18
- import type { ListArg, ListResult, ModelId } from "../../utils/api"
19
- import SyncError from "../SyncError"
20
- import { usePagination } from "../../hooks/api"
21
-
22
- export interface ApiAutocompleteFieldProps<
23
- SearchKey extends keyof Omit<QueryArg, "limit" | "offset">,
24
- // api type args
25
- QueryArg extends ListArg,
26
- ResultType extends ListResult<any>,
27
- // autocomplete type args
28
- Multiple extends boolean | undefined = false,
29
- DisableClearable extends boolean | undefined = false,
30
- FreeSolo extends boolean | undefined = false,
31
- ChipComponent extends ElementType = ChipTypeMap["defaultComponent"],
32
- > extends Omit<
33
- AutocompleteFieldProps<
34
- ModelId,
35
- Multiple,
36
- DisableClearable,
37
- FreeSolo,
38
- ChipComponent
39
- >,
40
- | "options"
41
- | "ListboxComponent"
42
- | "filterOptions"
43
- | "getOptionLabel"
44
- | "getOptionKey"
45
- | "onInputChange"
46
- > {
47
- useLazyListQuery: TypedUseLazyQuery<ResultType, QueryArg, any>
48
- filterOptions?: Omit<QueryArg, "limit" | "offset" | SearchKey>
49
- getOptionLabel: (result: ResultType["data"][number]) => string
50
- getOptionKey?: (result: ResultType["data"][number]) => ModelId
51
- searchKey: SearchKey
52
- }
53
-
54
- const ApiAutocompleteField = <
55
- SearchKey extends keyof Omit<QueryArg, "limit" | "offset">,
56
- // api type args
57
- QueryArg extends ListArg,
58
- ResultType extends ListResult<any>,
59
- // autocomplete type args
60
- Multiple extends boolean | undefined = false,
61
- DisableClearable extends boolean | undefined = false,
62
- FreeSolo extends boolean | undefined = false,
63
- ChipComponent extends ElementType = ChipTypeMap["defaultComponent"],
64
- >({
65
- useLazyListQuery,
66
- filterOptions,
67
- getOptionLabel,
68
- getOptionKey = result => result.id as ModelId,
69
- searchKey,
70
- ...otherAutocompleteFieldProps
71
- }: ApiAutocompleteFieldProps<
72
- SearchKey,
73
- // api type args
74
- QueryArg,
75
- ResultType,
76
- // autocomplete type args
77
- Multiple,
78
- DisableClearable,
79
- FreeSolo,
80
- ChipComponent
81
- >): JSX.Element => {
82
- const [search, setSearch] = useState("")
83
- const [trigger, { isLoading, isError }] = useLazyListQuery()
84
- const [{ limit, offset }, setPagination] = usePagination()
85
- const [{ options, hasMore }, setState] = useState<{
86
- options: Record<ModelId, ResultType["data"][number]>
87
- hasMore: boolean
88
- }>({ options: {}, hasMore: true })
89
-
90
- // Call api
91
- useEffect(
92
- () => {
93
- const arg = { limit, offset, ...filterOptions } as QueryArg
94
- // @ts-expect-error search key can index arg
95
- if (search) arg[searchKey] = search
96
-
97
- trigger(arg, true)
98
- .unwrap()
99
- .then(({ data, offset, limit, count }) => {
100
- setState(({ options: previousOptions }) => {
101
- const options = { ...previousOptions }
102
- data.forEach(result => {
103
- options[getOptionKey(result)] = result
104
- })
105
- return { options, hasMore: offset + limit < count }
106
- })
107
- })
108
- .catch(error => {
109
- if (error) console.error(error)
110
- // TODO: gracefully handle error
111
- })
112
- },
113
- // eslint-disable-next-line react-hooks/exhaustive-deps
114
- [
115
- trigger,
116
- limit,
117
- offset,
118
- searchKey,
119
- search,
120
- // eslint-disable-next-line react-hooks/exhaustive-deps
121
- ...Object.values(filterOptions || {}),
122
- ],
123
- )
124
-
125
- // Get options keys
126
- let optionKeys: ModelId[] = Object.keys(options)
127
- if (!optionKeys.length) return <></>
128
- if (typeof getOptionKey(Object.values(options)[0]) === "number") {
129
- optionKeys = optionKeys.map(Number)
130
- }
131
-
132
- function loadNextPage() {
133
- setPagination(({ page, limit }) => ({ page: page + 1, limit }))
134
- }
135
-
136
- const ListboxComponent: ForwardRefRenderFunction<
137
- unknown,
138
- HTMLAttributes<HTMLElement>
139
- > = ({ children, ...props }, ref) => {
140
- const listItems = Children.toArray(children)
141
- if (isLoading) listItems.push(<CircularProgress key="is-loading" />)
142
- else {
143
- if (isError) listItems.push(<SyncError key="is-error" />)
144
- if (hasMore) {
145
- listItems.push(
146
- <Button key="load-more" onClick={loadNextPage}>
147
- Load more
148
- </Button>,
149
- )
150
- }
151
- }
152
-
153
- return (
154
- <ul
155
- {...props}
156
- // @ts-expect-error ref is assignable
157
- ref={ref}
158
- onScroll={event => {
159
- // If not already loading and scrolled to bottom
160
- if (
161
- !isLoading &&
162
- event.currentTarget.clientHeight + event.currentTarget.scrollTop >=
163
- event.currentTarget.scrollHeight
164
- ) {
165
- loadNextPage()
166
- }
167
- }}
168
- >
169
- {listItems}
170
- </ul>
171
- )
172
- }
173
-
174
- return (
175
- <AutocompleteField
176
- options={optionKeys}
177
- getOptionLabel={id => getOptionLabel(options[id])}
178
- onInputChange={(_, value, reason) => {
179
- setSearch(reason === "input" ? value : "")
180
- }}
181
- ListboxComponent={forwardRef(ListboxComponent)}
182
- {...otherAutocompleteFieldProps}
183
- />
184
- )
185
- }
186
-
187
- export default ApiAutocompleteField