codeforlife 2.9.1 → 2.10.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 (102) hide show
  1. package/dist/Countdown-7-Mzftzr.cjs +2 -0
  2. package/dist/{Countdown-zY3nMzmi.cjs.map → Countdown-7-Mzftzr.cjs.map} +1 -1
  3. package/dist/{Countdown-DFI1RljW.js → Countdown-ZA68a09m.js} +5 -5
  4. package/dist/{Countdown-DFI1RljW.js.map → Countdown-ZA68a09m.js.map} +1 -1
  5. package/dist/{Image-D5jC9UoX.js → Image-KHEjEELP.js} +2 -2
  6. package/dist/{Image-D5jC9UoX.js.map → Image-KHEjEELP.js.map} +1 -1
  7. package/dist/LinkButton-Do07PnhU.js +12 -0
  8. package/dist/LinkButton-Do07PnhU.js.map +1 -0
  9. package/dist/LinkButton-cfljqSBx.cjs +2 -0
  10. package/dist/LinkButton-cfljqSBx.cjs.map +1 -0
  11. package/dist/Navigate-Cu8Ge031.cjs +2 -0
  12. package/dist/Navigate-Cu8Ge031.cjs.map +1 -0
  13. package/dist/{Navigate-Dq47aqC8.js → Navigate-DC6ag0th.js} +5 -5
  14. package/dist/Navigate-DC6ag0th.js.map +1 -0
  15. package/dist/api/endpoints/index.es.js +2 -2
  16. package/dist/api/index.es.js +3 -3
  17. package/dist/{api-Cbyt3rw0.js → api-CYqNqtN9.js} +2 -2
  18. package/dist/{api-Cbyt3rw0.js.map → api-CYqNqtN9.js.map} +1 -1
  19. package/dist/auth-C_aSIrwD.cjs +2 -0
  20. package/dist/auth-C_aSIrwD.cjs.map +1 -0
  21. package/dist/{auth-BPfUPjmM.js → auth-CvJ5Mh6y.js} +18 -18
  22. package/dist/auth-CvJ5Mh6y.js.map +1 -0
  23. package/dist/components/form/index.es.js +1 -1
  24. package/dist/components/index.cjs.js +1 -10
  25. package/dist/components/index.cjs.js.map +1 -1
  26. package/dist/components/index.es.js +179 -256
  27. package/dist/components/index.es.js.map +1 -1
  28. package/dist/components/page/index.cjs.js +1 -1
  29. package/dist/components/page/index.es.js +1 -1
  30. package/dist/components/router/Navigate.d.ts +1 -1
  31. package/dist/components/router/index.cjs.js +1 -1
  32. package/dist/components/router/index.es.js +2 -2
  33. package/dist/components/table/index.es.js +1 -1
  34. package/dist/features/index.cjs.js +1 -1
  35. package/dist/features/index.cjs.js.map +1 -1
  36. package/dist/features/index.es.js +8 -8
  37. package/dist/hooks/index.cjs.js +1 -1
  38. package/dist/hooks/index.es.js +1 -1
  39. package/dist/hooks/router.d.ts +1 -1
  40. package/dist/{index-2W--_sNE.js → index-B3cd2A-G.js} +2 -2
  41. package/dist/{index-2W--_sNE.js.map → index-B3cd2A-G.js.map} +1 -1
  42. package/dist/{index-CNtOlJ49.js → index-Brh3Kbv6.js} +3 -3
  43. package/dist/{index-CNtOlJ49.js.map → index-Brh3Kbv6.js.map} +1 -1
  44. package/dist/{index-B_Zy_zwA.cjs → index-DZ7ETsOg.cjs} +2 -2
  45. package/dist/{index-B_Zy_zwA.cjs.map → index-DZ7ETsOg.cjs.map} +1 -1
  46. package/dist/{index-DkM_cG3a.js → index-DlQc68Q4.js} +7 -7
  47. package/dist/index-DlQc68Q4.js.map +1 -0
  48. package/dist/index-DsVpb45W.cjs +2 -0
  49. package/dist/index-DsVpb45W.cjs.map +1 -0
  50. package/dist/{index-Dqp7dpn3.js → index-DuVBQMst.js} +5 -5
  51. package/dist/{index-Dqp7dpn3.js.map → index-DuVBQMst.js.map} +1 -1
  52. package/dist/index.cjs.js +1 -1
  53. package/dist/index.es.js +6 -4
  54. package/dist/index.es.js.map +1 -1
  55. package/dist/{jsx-runtime-Dpn_P65e.js → jsx-runtime-XvoU0p7t.js} +57 -57
  56. package/dist/{jsx-runtime-Dpn_P65e.js.map → jsx-runtime-XvoU0p7t.js.map} +1 -1
  57. package/dist/palette-BnIdHKDE.cjs +2 -0
  58. package/dist/{palette-CE2mKYse.cjs.map → palette-BnIdHKDE.cjs.map} +1 -1
  59. package/dist/palette-CYwuLBW7.js +77 -0
  60. package/dist/{palette-C_L0akN_.js.map → palette-CYwuLBW7.js.map} +1 -1
  61. package/dist/{schemas-DlOtf2vf.js → schemas-CDXuSjyI.js} +2 -2
  62. package/dist/{schemas-DlOtf2vf.js.map → schemas-CDXuSjyI.js.map} +1 -1
  63. package/dist/server.cjs.js +3 -3
  64. package/dist/server.cjs.js.map +1 -1
  65. package/dist/server.d.ts +12 -1
  66. package/dist/server.es.js +84 -56
  67. package/dist/server.es.js.map +1 -1
  68. package/dist/theme/components/index.cjs.js +1 -1
  69. package/dist/theme/components/index.es.js +1 -1
  70. package/dist/theme/index.cjs.js +1 -1
  71. package/dist/theme/index.cjs.js.map +1 -1
  72. package/dist/theme/index.d.ts +1 -0
  73. package/dist/theme/index.es.js +27 -25
  74. package/dist/theme/index.es.js.map +1 -1
  75. package/dist/{urls-DtHr1d3H.js → urls-BY-za1bX.js} +2 -2
  76. package/dist/{urls-DtHr1d3H.js.map → urls-BY-za1bX.js.map} +1 -1
  77. package/dist/utils/api.es.js +2 -2
  78. package/dist/utils/router.cjs.js +1 -1
  79. package/dist/utils/router.cjs.js.map +1 -1
  80. package/dist/utils/router.d.ts +1 -1
  81. package/dist/utils/router.es.js +4 -4
  82. package/dist/utils/router.es.js.map +1 -1
  83. package/dist/utils/test.es.js +1 -1
  84. package/dist/utils/theme.cjs.js +1 -1
  85. package/dist/utils/theme.es.js +2 -2
  86. package/package.json +3 -3
  87. package/dist/Countdown-zY3nMzmi.cjs +0 -2
  88. package/dist/LinkButton-BYFkvL_O.cjs +0 -2
  89. package/dist/LinkButton-BYFkvL_O.cjs.map +0 -1
  90. package/dist/LinkButton-oK0RThqn.js +0 -12
  91. package/dist/LinkButton-oK0RThqn.js.map +0 -1
  92. package/dist/Navigate-Dq47aqC8.js.map +0 -1
  93. package/dist/Navigate-dQocLhzN.cjs +0 -2
  94. package/dist/Navigate-dQocLhzN.cjs.map +0 -1
  95. package/dist/auth-BPfUPjmM.js.map +0 -1
  96. package/dist/auth-Vf1MgMci.cjs +0 -2
  97. package/dist/auth-Vf1MgMci.cjs.map +0 -1
  98. package/dist/index-BgsynEGX.cjs +0 -2
  99. package/dist/index-BgsynEGX.cjs.map +0 -1
  100. package/dist/index-DkM_cG3a.js.map +0 -1
  101. package/dist/palette-CE2mKYse.cjs +0 -2
  102. package/dist/palette-C_L0akN_.js +0 -43
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","sources":["../../src/theme/ThemedBox.tsx","../../src/theme/index.ts"],"sourcesContent":["import {\n Box,\n type BoxProps,\n type CSSObject,\n type PaletteColor,\n type SxProps,\n type ThemeOptions,\n ThemeProvider,\n buttonClasses,\n createTheme,\n responsiveFontSizes,\n} from \"@mui/material\"\nimport {\n Circle as CircleIcon,\n Hexagon as HexagonIcon,\n} from \"@mui/icons-material\"\nimport type { CommonProps } from \"@mui/material/OverridableComponent\"\nimport type React from \"react\"\n\nimport { getStyleOverrides, includesClassNames } from \"../utils/theme\"\nimport { primary, secondary, tertiary } from \"./colors\"\nimport type Components from \"./components/_components\"\nimport palette from \"./palette\"\nimport { themeOptions } from \".\"\n\nexport interface ThemedBoxProps extends BoxProps {\n options?: ThemeOptions\n withShapes?: boolean\n userType: \"teacher\" | \"student\" | \"independent\"\n bgcolor?: string\n}\n\nconst ThemedBox: React.FC<ThemedBoxProps> = ({\n options = themeOptions,\n withShapes = false,\n userType,\n bgcolor,\n children,\n sx,\n ...otherBoxProps\n}) => {\n let circleColor: \"primary\" | \"secondary\" | \"tertiary\"\n let hexagonColor: \"primary\" | \"secondary\" | \"tertiary\"\n let contrastText: string\n switch (userType) {\n case \"teacher\":\n bgcolor = bgcolor ?? primary[400]\n circleColor = \"tertiary\"\n hexagonColor = \"secondary\"\n contrastText = (palette.primary as PaletteColor).contrastText\n break\n case \"student\":\n bgcolor = bgcolor ?? tertiary[500]\n circleColor = \"secondary\"\n hexagonColor = \"primary\"\n contrastText = palette.tertiary.contrastText\n break\n case \"independent\":\n bgcolor = bgcolor ?? secondary[500]\n circleColor = \"primary\"\n hexagonColor = \"tertiary\"\n contrastText = (palette.secondary as PaletteColor).contrastText\n break\n }\n\n const commonIconSxProps: SxProps = {\n display: { xs: \"none\", md: \"block\" },\n fontSize: \"180px\",\n position: \"absolute\",\n }\n\n const fontStyleOverrides = {\n color: contrastText,\n textDecorationColor: contrastText,\n }\n\n function overrideStyles(\n ownerState: CommonProps,\n styleOverrides: CSSObject,\n componentKey: keyof Components,\n muiClassName: string = \"root\",\n ): CSSObject {\n return {\n // Get the original styles.\n ...getStyleOverrides(\n ownerState,\n componentKey,\n muiClassName,\n options.components,\n ),\n // Override styles unless the class name 'no-override' is set.\n ...(!includesClassNames(ownerState, [\"no-override\"]) && styleOverrides),\n }\n }\n\n const theme = responsiveFontSizes(\n createTheme({\n ...options,\n components: {\n ...options.components,\n MuiTypography: {\n ...options.components?.MuiTypography,\n styleOverrides: {\n ...options.components?.MuiTypography?.styleOverrides,\n root: ({ ownerState }) =>\n overrideStyles(\n ownerState,\n {\n ...fontStyleOverrides,\n },\n \"MuiTypography\",\n ),\n },\n },\n MuiFormHelperText: {\n ...options.components?.MuiFormHelperText,\n styleOverrides: {\n ...options.components?.MuiFormHelperText?.styleOverrides,\n root: ({ ownerState }) =>\n overrideStyles(\n ownerState,\n {\n ...fontStyleOverrides,\n },\n \"MuiFormHelperText\",\n ),\n },\n },\n MuiLink: {\n ...options.components?.MuiLink,\n styleOverrides: {\n ...options.components?.MuiLink?.styleOverrides,\n root: ({ ownerState }) =>\n overrideStyles(\n ownerState,\n {\n ...fontStyleOverrides,\n },\n \"MuiLink\",\n ),\n },\n },\n MuiButton: {\n ...options.components?.MuiButton,\n styleOverrides: {\n ...options.components?.MuiButton?.styleOverrides,\n contained: ({ ownerState }) =>\n overrideStyles(\n ownerState,\n {\n ...(userType === \"independent\" && {\n backgroundColor: \"white\",\n \"&:hover\": {\n backgroundColor: \"#f6f5f5\",\n boxShadow: [\n \"0px 6px 10px 0px rgba(0, 0, 0, 0.14)\",\n \"0px 1px 18px 0px rgba(0, 0, 0, 0.12)\",\n \"0px 3px 5px 0px rgba(0, 0, 0, 0.2);\",\n ].join(),\n },\n [`&.${buttonClasses.disabled}`]: {\n backgroundColor: \"white\",\n color: contrastText,\n },\n }),\n },\n \"MuiButton\",\n \"contained\",\n ),\n outlined: ({ ownerState }) =>\n overrideStyles(\n ownerState,\n {\n ...fontStyleOverrides,\n border: `2px solid ${contrastText}`,\n \"&:hover\": {\n border: `2px solid ${contrastText}`,\n backgroundColor: \"transparent\",\n textDecoration: \"underline\",\n },\n },\n \"MuiButton\",\n \"outlined\",\n ),\n },\n },\n MuiCheckbox: {\n ...options.components?.MuiCheckbox,\n styleOverrides: {\n ...options.components?.MuiCheckbox?.styleOverrides,\n root: ({ ownerState }) =>\n overrideStyles(\n ownerState,\n {\n color: `${contrastText} !important`,\n },\n \"MuiCheckbox\",\n ),\n },\n },\n MuiSvgIcon: {\n ...options.components?.MuiSvgIcon,\n styleOverrides: {\n ...options.components?.MuiSvgIcon?.styleOverrides,\n root: ({ ownerState }) =>\n overrideStyles(\n ownerState,\n {\n \"&.checkbox-error\": {\n color: `${contrastText} !important`,\n },\n },\n \"MuiSvgIcon\",\n ),\n },\n },\n },\n }),\n )\n\n return (\n <ThemeProvider theme={theme}>\n <Box\n sx={{\n ...sx,\n ...(withShapes && {\n paddingY: { xs: 2, sm: 3, md: 5 },\n paddingX: { xs: 2, sm: 5, md: 10 },\n marginX: { md: \"90px\" },\n }),\n bgcolor,\n alignItems: \"center\",\n position: \"relative\",\n }}\n {...otherBoxProps}\n >\n {withShapes && (\n <>\n <CircleIcon\n color={circleColor}\n sx={{\n ...commonIconSxProps,\n top: \"5%\",\n left: \"0%\",\n transform: \"translate(-60%, 0%)\",\n }}\n />\n <HexagonIcon\n color={hexagonColor}\n sx={{\n ...commonIconSxProps,\n bottom: \"5%\",\n right: \"0%\",\n transform: \"translate(60%, 0%) rotate(90deg)\",\n }}\n />\n </>\n )}\n {children}\n </Box>\n </ThemeProvider>\n )\n}\n\nexport default ThemedBox\n","import {\n type ThemeOptions,\n createTheme,\n responsiveFontSizes,\n} from \"@mui/material\"\n\nimport components from \"./components\"\nimport palette from \"./palette\"\nimport spacing from \"./spacing\"\nimport typography from \"./typography\"\n\nexport * from \"./palette\"\nexport * from \"./ThemedBox\"\nexport { default as ThemedBox } from \"./ThemedBox\"\n\nexport const themeOptions: ThemeOptions = {\n palette,\n components,\n spacing,\n typography,\n}\n\nconst theme = responsiveFontSizes(createTheme(themeOptions))\n\nexport default theme\n"],"names":["ThemedBox","options","themeOptions","withShapes","userType","bgcolor","children","sx","otherBoxProps","circleColor","hexagonColor","contrastText","primary","palette","tertiary","secondary","commonIconSxProps","fontStyleOverrides","overrideStyles","ownerState","styleOverrides","componentKey","muiClassName","getStyleOverrides","includesClassNames","theme","responsiveFontSizes","createTheme","buttonClasses","jsx","ThemeProvider","jsxs","Box","Fragment","CircleIcon","HexagonIcon","components","spacing","typography"],"mappings":"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"}
1
+ {"version":3,"file":"index.es.js","sources":["../../src/theme/ThemedBox.tsx","../../src/theme/index.ts"],"sourcesContent":["import {\n Box,\n type BoxProps,\n type CSSObject,\n type PaletteColor,\n type SxProps,\n type ThemeOptions,\n ThemeProvider,\n buttonClasses,\n createTheme,\n responsiveFontSizes,\n} from \"@mui/material\"\nimport {\n Circle as CircleIcon,\n Hexagon as HexagonIcon,\n} from \"@mui/icons-material\"\nimport type { CommonProps } from \"@mui/material/OverridableComponent\"\nimport type React from \"react\"\n\nimport { getStyleOverrides, includesClassNames } from \"../utils/theme\"\nimport { primary, secondary, tertiary } from \"./colors\"\nimport type Components from \"./components/_components\"\nimport palette from \"./palette\"\nimport { themeOptions } from \".\"\n\nexport interface ThemedBoxProps extends BoxProps {\n options?: ThemeOptions\n withShapes?: boolean\n userType: \"teacher\" | \"student\" | \"independent\"\n bgcolor?: string\n}\n\nconst ThemedBox: React.FC<ThemedBoxProps> = ({\n options = themeOptions,\n withShapes = false,\n userType,\n bgcolor,\n children,\n sx,\n ...otherBoxProps\n}) => {\n let circleColor: \"primary\" | \"secondary\" | \"tertiary\"\n let hexagonColor: \"primary\" | \"secondary\" | \"tertiary\"\n let contrastText: string\n switch (userType) {\n case \"teacher\":\n bgcolor = bgcolor ?? primary[400]\n circleColor = \"tertiary\"\n hexagonColor = \"secondary\"\n contrastText = (palette.primary as PaletteColor).contrastText\n break\n case \"student\":\n bgcolor = bgcolor ?? tertiary[500]\n circleColor = \"secondary\"\n hexagonColor = \"primary\"\n contrastText = palette.tertiary.contrastText\n break\n case \"independent\":\n bgcolor = bgcolor ?? secondary[500]\n circleColor = \"primary\"\n hexagonColor = \"tertiary\"\n contrastText = (palette.secondary as PaletteColor).contrastText\n break\n }\n\n const commonIconSxProps: SxProps = {\n display: { xs: \"none\", md: \"block\" },\n fontSize: \"180px\",\n position: \"absolute\",\n }\n\n const fontStyleOverrides = {\n color: contrastText,\n textDecorationColor: contrastText,\n }\n\n function overrideStyles(\n ownerState: CommonProps,\n styleOverrides: CSSObject,\n componentKey: keyof Components,\n muiClassName: string = \"root\",\n ): CSSObject {\n return {\n // Get the original styles.\n ...getStyleOverrides(\n ownerState,\n componentKey,\n muiClassName,\n options.components,\n ),\n // Override styles unless the class name 'no-override' is set.\n ...(!includesClassNames(ownerState, [\"no-override\"]) && styleOverrides),\n }\n }\n\n const theme = responsiveFontSizes(\n createTheme({\n ...options,\n components: {\n ...options.components,\n MuiTypography: {\n ...options.components?.MuiTypography,\n styleOverrides: {\n ...options.components?.MuiTypography?.styleOverrides,\n root: ({ ownerState }) =>\n overrideStyles(\n ownerState,\n {\n ...fontStyleOverrides,\n },\n \"MuiTypography\",\n ),\n },\n },\n MuiFormHelperText: {\n ...options.components?.MuiFormHelperText,\n styleOverrides: {\n ...options.components?.MuiFormHelperText?.styleOverrides,\n root: ({ ownerState }) =>\n overrideStyles(\n ownerState,\n {\n ...fontStyleOverrides,\n },\n \"MuiFormHelperText\",\n ),\n },\n },\n MuiLink: {\n ...options.components?.MuiLink,\n styleOverrides: {\n ...options.components?.MuiLink?.styleOverrides,\n root: ({ ownerState }) =>\n overrideStyles(\n ownerState,\n {\n ...fontStyleOverrides,\n },\n \"MuiLink\",\n ),\n },\n },\n MuiButton: {\n ...options.components?.MuiButton,\n styleOverrides: {\n ...options.components?.MuiButton?.styleOverrides,\n contained: ({ ownerState }) =>\n overrideStyles(\n ownerState,\n {\n ...(userType === \"independent\" && {\n backgroundColor: \"white\",\n \"&:hover\": {\n backgroundColor: \"#f6f5f5\",\n boxShadow: [\n \"0px 6px 10px 0px rgba(0, 0, 0, 0.14)\",\n \"0px 1px 18px 0px rgba(0, 0, 0, 0.12)\",\n \"0px 3px 5px 0px rgba(0, 0, 0, 0.2);\",\n ].join(),\n },\n [`&.${buttonClasses.disabled}`]: {\n backgroundColor: \"white\",\n color: contrastText,\n },\n }),\n },\n \"MuiButton\",\n \"contained\",\n ),\n outlined: ({ ownerState }) =>\n overrideStyles(\n ownerState,\n {\n ...fontStyleOverrides,\n border: `2px solid ${contrastText}`,\n \"&:hover\": {\n border: `2px solid ${contrastText}`,\n backgroundColor: \"transparent\",\n textDecoration: \"underline\",\n },\n },\n \"MuiButton\",\n \"outlined\",\n ),\n },\n },\n MuiCheckbox: {\n ...options.components?.MuiCheckbox,\n styleOverrides: {\n ...options.components?.MuiCheckbox?.styleOverrides,\n root: ({ ownerState }) =>\n overrideStyles(\n ownerState,\n {\n color: `${contrastText} !important`,\n },\n \"MuiCheckbox\",\n ),\n },\n },\n MuiSvgIcon: {\n ...options.components?.MuiSvgIcon,\n styleOverrides: {\n ...options.components?.MuiSvgIcon?.styleOverrides,\n root: ({ ownerState }) =>\n overrideStyles(\n ownerState,\n {\n \"&.checkbox-error\": {\n color: `${contrastText} !important`,\n },\n },\n \"MuiSvgIcon\",\n ),\n },\n },\n },\n }),\n )\n\n return (\n <ThemeProvider theme={theme}>\n <Box\n sx={{\n ...sx,\n ...(withShapes && {\n paddingY: { xs: 2, sm: 3, md: 5 },\n paddingX: { xs: 2, sm: 5, md: 10 },\n marginX: { md: \"90px\" },\n }),\n bgcolor,\n alignItems: \"center\",\n position: \"relative\",\n }}\n {...otherBoxProps}\n >\n {withShapes && (\n <>\n <CircleIcon\n color={circleColor}\n sx={{\n ...commonIconSxProps,\n top: \"5%\",\n left: \"0%\",\n transform: \"translate(-60%, 0%)\",\n }}\n />\n <HexagonIcon\n color={hexagonColor}\n sx={{\n ...commonIconSxProps,\n bottom: \"5%\",\n right: \"0%\",\n transform: \"translate(60%, 0%) rotate(90deg)\",\n }}\n />\n </>\n )}\n {children}\n </Box>\n </ThemeProvider>\n )\n}\n\nexport default ThemedBox\n","import {\n type ThemeOptions,\n createTheme,\n responsiveFontSizes,\n} from \"@mui/material\"\n\nimport components from \"./components\"\nimport palette from \"./palette\"\nimport spacing from \"./spacing\"\nimport typography from \"./typography\"\n\nexport * as colors from \"./colors\"\nexport * from \"./palette\"\nexport * from \"./ThemedBox\"\nexport { default as ThemedBox } from \"./ThemedBox\"\n\nexport const themeOptions: ThemeOptions = {\n palette,\n components,\n spacing,\n typography,\n}\n\nconst theme = responsiveFontSizes(createTheme(themeOptions))\n\nexport default theme\n"],"names":["ThemedBox","options","themeOptions","withShapes","userType","bgcolor","children","sx","otherBoxProps","circleColor","hexagonColor","contrastText","primary","palette","tertiary","secondary","commonIconSxProps","fontStyleOverrides","overrideStyles","ownerState","styleOverrides","componentKey","muiClassName","getStyleOverrides","includesClassNames","theme","responsiveFontSizes","createTheme","buttonClasses","jsx","ThemeProvider","jsxs","Box","Fragment","CircleIcon","HexagonIcon","components","spacing","typography"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { m as s } from "./api-Cbyt3rw0.js";
1
+ import { m as s } from "./api-CYqNqtN9.js";
2
2
  const t = {
3
3
  user: s("users/", "users/<id>/"),
4
4
  teacher: s("users/teachers/", "users/teachers/<id>/"),
@@ -11,4 +11,4 @@ const t = {
11
11
  export {
12
12
  t as u
13
13
  };
14
- //# sourceMappingURL=urls-DtHr1d3H.js.map
14
+ //# sourceMappingURL=urls-BY-za1bX.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"urls-DtHr1d3H.js","sources":["../src/api/urls.ts"],"sourcesContent":["import { modelUrls } from \"../utils/api\"\n\nconst urls = {\n user: modelUrls(\"users/\", \"users/<id>/\"),\n teacher: modelUrls(\"users/teachers/\", \"users/teachers/<id>/\"),\n student: modelUrls(\"users/students/\", \"users/students/<id>/\"),\n school: modelUrls(\"schools/\", \"schools/<id>/\"),\n class: modelUrls(\"classes/\", \"classes/<id>/\"),\n otpBypassToken: modelUrls(\"otp-bypass-tokens/\", \"otp-bypass-tokens/<id>/\"),\n authFactor: modelUrls(\"auth-factors/\", \"auth-factors/<id>/\"),\n}\n\nexport default urls\n"],"names":["urls","modelUrls"],"mappings":";AAEA,MAAMA,IAAO;AAAA,EACX,MAAMC,EAAU,UAAU,aAAa;AAAA,EACvC,SAASA,EAAU,mBAAmB,sBAAsB;AAAA,EAC5D,SAASA,EAAU,mBAAmB,sBAAsB;AAAA,EAC5D,QAAQA,EAAU,YAAY,eAAe;AAAA,EAC7C,OAAOA,EAAU,YAAY,eAAe;AAAA,EAC5C,gBAAgBA,EAAU,sBAAsB,yBAAyB;AAAA,EACzE,YAAYA,EAAU,iBAAiB,oBAAoB;AAC7D;"}
1
+ {"version":3,"file":"urls-BY-za1bX.js","sources":["../src/api/urls.ts"],"sourcesContent":["import { modelUrls } from \"../utils/api\"\n\nconst urls = {\n user: modelUrls(\"users/\", \"users/<id>/\"),\n teacher: modelUrls(\"users/teachers/\", \"users/teachers/<id>/\"),\n student: modelUrls(\"users/students/\", \"users/students/<id>/\"),\n school: modelUrls(\"schools/\", \"schools/<id>/\"),\n class: modelUrls(\"classes/\", \"classes/<id>/\"),\n otpBypassToken: modelUrls(\"otp-bypass-tokens/\", \"otp-bypass-tokens/<id>/\"),\n authFactor: modelUrls(\"auth-factors/\", \"auth-factors/<id>/\"),\n}\n\nexport default urls\n"],"names":["urls","modelUrls"],"mappings":";AAEA,MAAMA,IAAO;AAAA,EACX,MAAMC,EAAU,UAAU,aAAa;AAAA,EACvC,SAASA,EAAU,mBAAmB,sBAAsB;AAAA,EAC5D,SAASA,EAAU,mBAAmB,sBAAsB;AAAA,EAC5D,QAAQA,EAAU,YAAY,eAAe;AAAA,EAC7C,OAAOA,EAAU,YAAY,eAAe;AAAA,EAC5C,gBAAgBA,EAAU,sBAAsB,yBAAyB;AAAA,EACzE,YAAYA,EAAU,iBAAiB,oBAAoB;AAC7D;"}
@@ -1,9 +1,9 @@
1
- import "../jsx-runtime-Dpn_P65e.js";
1
+ import "../jsx-runtime-XvoU0p7t.js";
2
2
  import "@mui/material";
3
3
  import "react";
4
4
  import "./general.es.js";
5
5
  import "yup";
6
- import { b as e, h as m, a as p, i as d, l as h, m as b, t as f } from "../api-Cbyt3rw0.js";
6
+ import { b as e, h as m, a as p, i as d, l as h, m as b, t as f } from "../api-CYqNqtN9.js";
7
7
  export {
8
8
  e as buildUrl,
9
9
  m as handleResultState,
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=require("react-router-dom");require("../jsx-runtime-CeSfJrVB.cjs");require("react");require("@mui/icons-material");require("@mui/material");require("../palette-CE2mKYse.cjs");require("../auth-Vf1MgMci.cjs");function q(e,o={}){function c(r,g,t){typeof r.__=="object"&&(t=t?{...t,...r.__}:r.__);const _=typeof e=="string"&&t?l.generatePath(e,t):e;Object.entries(r).forEach(([u,i])=>{if(u!=="__")if(i=i,typeof i=="string"){if(typeof _=="string"&&(!g||u!=="_")){let n=_+i;n.endsWith("/")&&(n=n.slice(0,-1)),r[u]=n}}else c(i,!1,t)})}const f={...o,_:typeof e=="string"?e:"",__:e};return e===""?f._="/":c(f,!0),f}function s(e,o){return e.__[o]}exports.getParam=s;exports.path=q;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=require("react-router");require("../jsx-runtime-CeSfJrVB.cjs");require("react");require("@mui/icons-material");require("@mui/material");require("../palette-BnIdHKDE.cjs");require("../auth-C_aSIrwD.cjs");function q(e,o={}){function c(r,g,t){typeof r.__=="object"&&(t=t?{...t,...r.__}:r.__);const _=typeof e=="string"&&t?l.generatePath(e,t):e;Object.entries(r).forEach(([u,i])=>{if(u!=="__")if(i=i,typeof i=="string"){if(typeof _=="string"&&(!g||u!=="_")){let n=_+i;n.endsWith("/")&&(n=n.slice(0,-1)),r[u]=n}}else c(i,!1,t)})}const f={...o,_:typeof e=="string"?e:"",__:e};return e===""?f._="/":c(f,!0),f}function s(e,o){return e.__[o]}exports.getParam=s;exports.path=q;
2
2
  //# sourceMappingURL=router.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"router.cjs.js","sources":["../../src/utils/router.ts"],"sourcesContent":["import {\n type To,\n type LinkProps as _LinkProps,\n generatePath,\n} from \"react-router-dom\"\n\nimport { type PageState } from \"../components/page/Page\"\n\nexport type LinkProps<\n Override extends \"delta\" | \"to\",\n State extends Record<string, any> = Record<string, any>,\n> = Omit<_LinkProps, \"to\" | \"state\"> &\n (Override extends \"delta\"\n ? { to: number }\n : { to: To; state?: State & Partial<PageState> })\n\nexport type ReadOnly<T> = {\n readonly [P in keyof T]: T[P]\n}\n\nexport type Parameters = Record<string, string>\n\nexport interface Path {\n _: string\n __: string | Parameters\n [subpath: string]: string | Path | Parameters\n}\n\nexport function path<Subpaths extends Record<string, Path>>(\n _: string | Parameters,\n subpaths: Subpaths = {} as Subpaths,\n): Path & Subpaths {\n function updatePath(path: Path, root: boolean, params?: Parameters) {\n if (typeof path.__ === \"object\") {\n params = params ? { ...params, ...path.__ } : path.__\n }\n\n const _path = typeof _ === \"string\" && params ? generatePath(_, params) : _\n\n Object.entries(path).forEach(([key, subpath]) => {\n if (key !== \"__\") {\n subpath = subpath as string | Path\n if (typeof subpath === \"string\") {\n if (typeof _path === \"string\" && (!root || key !== \"_\")) {\n let __path = _path + subpath\n if (__path.endsWith(\"/\")) __path = __path.slice(0, -1)\n path[key] = __path\n }\n } else {\n updatePath(subpath, false, params)\n }\n }\n })\n }\n\n const path = { ...subpaths, _: typeof _ === \"string\" ? _ : \"\", __: _ }\n if (_ === \"\") {\n path._ = \"/\"\n } else {\n updatePath(path, true)\n }\n return path\n}\n\nexport function getParam(path: Path, key: string) {\n return (path.__ as Parameters)[key]\n}\n"],"names":["path","_","subpaths","updatePath","root","params","_path","generatePath","key","subpath","__path","getParam"],"mappings":"uSA4BO,SAASA,EACdC,EACAC,EAAqB,GACJ,CACjB,SAASC,EAAWH,EAAYI,EAAeC,EAAqB,CAC9D,OAAOL,EAAK,IAAO,WACrBK,EAASA,EAAS,CAAE,GAAGA,EAAQ,GAAGL,EAAK,EAAA,EAAOA,EAAK,IAGrD,MAAMM,EAAQ,OAAOL,GAAM,UAAYI,EAASE,eAAaN,EAAGI,CAAM,EAAIJ,EAE1E,OAAO,QAAQD,CAAI,EAAE,QAAQ,CAAC,CAACQ,EAAKC,CAAO,IAAM,CAC/C,GAAID,IAAQ,KAEV,GADAC,EAAUA,EACN,OAAOA,GAAY,UACrB,GAAI,OAAOH,GAAU,WAAa,CAACF,GAAQI,IAAQ,KAAM,CACvD,IAAIE,EAASJ,EAAQG,EACjBC,EAAO,SAAS,GAAG,MAAYA,EAAO,MAAM,EAAG,EAAE,GACrDV,EAAKQ,CAAG,EAAIE,CACd,OAEAP,EAAWM,EAAS,GAAOJ,CAAM,CAGvC,CAAC,CACH,CAEA,MAAML,EAAO,CAAE,GAAGE,EAAU,EAAG,OAAOD,GAAM,SAAWA,EAAI,GAAI,GAAIA,CAAA,EACnE,OAAIA,IAAM,GACRD,EAAK,EAAI,IAETG,EAAWH,EAAM,EAAI,EAEhBA,CACT,CAEO,SAASW,EAASX,EAAYQ,EAAa,CAChD,OAAQR,EAAK,GAAkBQ,CAAG,CACpC"}
1
+ {"version":3,"file":"router.cjs.js","sources":["../../src/utils/router.ts"],"sourcesContent":["import {\n type To,\n type LinkProps as _LinkProps,\n generatePath,\n} from \"react-router\"\n\nimport { type PageState } from \"../components/page/Page\"\n\nexport type LinkProps<\n Override extends \"delta\" | \"to\",\n State extends Record<string, any> = Record<string, any>,\n> = Omit<_LinkProps, \"to\" | \"state\"> &\n (Override extends \"delta\"\n ? { to: number }\n : { to: To; state?: State & Partial<PageState> })\n\nexport type ReadOnly<T> = {\n readonly [P in keyof T]: T[P]\n}\n\nexport type Parameters = Record<string, string>\n\nexport interface Path {\n _: string\n __: string | Parameters\n [subpath: string]: string | Path | Parameters\n}\n\nexport function path<Subpaths extends Record<string, Path>>(\n _: string | Parameters,\n subpaths: Subpaths = {} as Subpaths,\n): Path & Subpaths {\n function updatePath(path: Path, root: boolean, params?: Parameters) {\n if (typeof path.__ === \"object\") {\n params = params ? { ...params, ...path.__ } : path.__\n }\n\n const _path = typeof _ === \"string\" && params ? generatePath(_, params) : _\n\n Object.entries(path).forEach(([key, subpath]) => {\n if (key !== \"__\") {\n subpath = subpath as string | Path\n if (typeof subpath === \"string\") {\n if (typeof _path === \"string\" && (!root || key !== \"_\")) {\n let __path = _path + subpath\n if (__path.endsWith(\"/\")) __path = __path.slice(0, -1)\n path[key] = __path\n }\n } else {\n updatePath(subpath, false, params)\n }\n }\n })\n }\n\n const path = { ...subpaths, _: typeof _ === \"string\" ? _ : \"\", __: _ }\n if (_ === \"\") {\n path._ = \"/\"\n } else {\n updatePath(path, true)\n }\n return path\n}\n\nexport function getParam(path: Path, key: string) {\n return (path.__ as Parameters)[key]\n}\n"],"names":["path","_","subpaths","updatePath","root","params","_path","generatePath","key","subpath","__path","getParam"],"mappings":"mSA4BO,SAASA,EACdC,EACAC,EAAqB,GACJ,CACjB,SAASC,EAAWH,EAAYI,EAAeC,EAAqB,CAC9D,OAAOL,EAAK,IAAO,WACrBK,EAASA,EAAS,CAAE,GAAGA,EAAQ,GAAGL,EAAK,EAAA,EAAOA,EAAK,IAGrD,MAAMM,EAAQ,OAAOL,GAAM,UAAYI,EAASE,eAAaN,EAAGI,CAAM,EAAIJ,EAE1E,OAAO,QAAQD,CAAI,EAAE,QAAQ,CAAC,CAACQ,EAAKC,CAAO,IAAM,CAC/C,GAAID,IAAQ,KAEV,GADAC,EAAUA,EACN,OAAOA,GAAY,UACrB,GAAI,OAAOH,GAAU,WAAa,CAACF,GAAQI,IAAQ,KAAM,CACvD,IAAIE,EAASJ,EAAQG,EACjBC,EAAO,SAAS,GAAG,MAAYA,EAAO,MAAM,EAAG,EAAE,GACrDV,EAAKQ,CAAG,EAAIE,CACd,OAEAP,EAAWM,EAAS,GAAOJ,CAAM,CAGvC,CAAC,CACH,CAEA,MAAML,EAAO,CAAE,GAAGE,EAAU,EAAG,OAAOD,GAAM,SAAWA,EAAI,GAAI,GAAIA,CAAA,EACnE,OAAIA,IAAM,GACRD,EAAK,EAAI,IAETG,EAAWH,EAAM,EAAI,EAEhBA,CACT,CAEO,SAASW,EAASX,EAAYQ,EAAa,CAChD,OAAQR,EAAK,GAAkBQ,CAAG,CACpC"}
@@ -1,4 +1,4 @@
1
- import { To, LinkProps as _LinkProps } from 'react-router-dom';
1
+ import { To, LinkProps as _LinkProps } from 'react-router';
2
2
  import { PageState } from '../components/page/Page';
3
3
  export type LinkProps<Override extends "delta" | "to", State extends Record<string, any> = Record<string, any>> = Omit<_LinkProps, "to" | "state"> & (Override extends "delta" ? {
4
4
  to: number;
@@ -1,10 +1,10 @@
1
- import { generatePath as p } from "react-router-dom";
2
- import "../jsx-runtime-Dpn_P65e.js";
1
+ import { generatePath as p } from "react-router";
2
+ import "../jsx-runtime-XvoU0p7t.js";
3
3
  import "react";
4
4
  import "@mui/icons-material";
5
5
  import "@mui/material";
6
- import "../palette-C_L0akN_.js";
7
- import "../auth-BPfUPjmM.js";
6
+ import "../palette-CYwuLBW7.js";
7
+ import "../auth-CvJ5Mh6y.js";
8
8
  function x(t, n = {}) {
9
9
  function c(i, l, e) {
10
10
  typeof i.__ == "object" && (e = e ? { ...e, ...i.__ } : i.__);
@@ -1 +1 @@
1
- {"version":3,"file":"router.es.js","sources":["../../src/utils/router.ts"],"sourcesContent":["import {\n type To,\n type LinkProps as _LinkProps,\n generatePath,\n} from \"react-router-dom\"\n\nimport { type PageState } from \"../components/page/Page\"\n\nexport type LinkProps<\n Override extends \"delta\" | \"to\",\n State extends Record<string, any> = Record<string, any>,\n> = Omit<_LinkProps, \"to\" | \"state\"> &\n (Override extends \"delta\"\n ? { to: number }\n : { to: To; state?: State & Partial<PageState> })\n\nexport type ReadOnly<T> = {\n readonly [P in keyof T]: T[P]\n}\n\nexport type Parameters = Record<string, string>\n\nexport interface Path {\n _: string\n __: string | Parameters\n [subpath: string]: string | Path | Parameters\n}\n\nexport function path<Subpaths extends Record<string, Path>>(\n _: string | Parameters,\n subpaths: Subpaths = {} as Subpaths,\n): Path & Subpaths {\n function updatePath(path: Path, root: boolean, params?: Parameters) {\n if (typeof path.__ === \"object\") {\n params = params ? { ...params, ...path.__ } : path.__\n }\n\n const _path = typeof _ === \"string\" && params ? generatePath(_, params) : _\n\n Object.entries(path).forEach(([key, subpath]) => {\n if (key !== \"__\") {\n subpath = subpath as string | Path\n if (typeof subpath === \"string\") {\n if (typeof _path === \"string\" && (!root || key !== \"_\")) {\n let __path = _path + subpath\n if (__path.endsWith(\"/\")) __path = __path.slice(0, -1)\n path[key] = __path\n }\n } else {\n updatePath(subpath, false, params)\n }\n }\n })\n }\n\n const path = { ...subpaths, _: typeof _ === \"string\" ? _ : \"\", __: _ }\n if (_ === \"\") {\n path._ = \"/\"\n } else {\n updatePath(path, true)\n }\n return path\n}\n\nexport function getParam(path: Path, key: string) {\n return (path.__ as Parameters)[key]\n}\n"],"names":["path","_","subpaths","updatePath","root","params","_path","generatePath","key","subpath","__path","getParam"],"mappings":";;;;;;;AA4BO,SAASA,EACdC,GACAC,IAAqB,IACJ;AACjB,WAASC,EAAWH,GAAYI,GAAeC,GAAqB;AAClE,IAAI,OAAOL,EAAK,MAAO,aACrBK,IAASA,IAAS,EAAE,GAAGA,GAAQ,GAAGL,EAAK,GAAA,IAAOA,EAAK;AAGrD,UAAMM,IAAQ,OAAOL,KAAM,YAAYI,IAASE,EAAaN,GAAGI,CAAM,IAAIJ;AAE1E,WAAO,QAAQD,CAAI,EAAE,QAAQ,CAAC,CAACQ,GAAKC,CAAO,MAAM;AAC/C,UAAID,MAAQ;AAEV,YADAC,IAAUA,GACN,OAAOA,KAAY;AACrB,cAAI,OAAOH,KAAU,aAAa,CAACF,KAAQI,MAAQ,MAAM;AACvD,gBAAIE,IAASJ,IAAQG;AACrB,YAAIC,EAAO,SAAS,GAAG,UAAYA,EAAO,MAAM,GAAG,EAAE,IACrDV,EAAKQ,CAAG,IAAIE;AAAA,UACd;AAAA;AAEA,UAAAP,EAAWM,GAAS,IAAOJ,CAAM;AAAA,IAGvC,CAAC;AAAA,EACH;AAEA,QAAML,IAAO,EAAE,GAAGE,GAAU,GAAG,OAAOD,KAAM,WAAWA,IAAI,IAAI,IAAIA,EAAA;AACnE,SAAIA,MAAM,KACRD,EAAK,IAAI,MAETG,EAAWH,GAAM,EAAI,GAEhBA;AACT;AAEO,SAASW,EAASX,GAAYQ,GAAa;AAChD,SAAQR,EAAK,GAAkBQ,CAAG;AACpC;"}
1
+ {"version":3,"file":"router.es.js","sources":["../../src/utils/router.ts"],"sourcesContent":["import {\n type To,\n type LinkProps as _LinkProps,\n generatePath,\n} from \"react-router\"\n\nimport { type PageState } from \"../components/page/Page\"\n\nexport type LinkProps<\n Override extends \"delta\" | \"to\",\n State extends Record<string, any> = Record<string, any>,\n> = Omit<_LinkProps, \"to\" | \"state\"> &\n (Override extends \"delta\"\n ? { to: number }\n : { to: To; state?: State & Partial<PageState> })\n\nexport type ReadOnly<T> = {\n readonly [P in keyof T]: T[P]\n}\n\nexport type Parameters = Record<string, string>\n\nexport interface Path {\n _: string\n __: string | Parameters\n [subpath: string]: string | Path | Parameters\n}\n\nexport function path<Subpaths extends Record<string, Path>>(\n _: string | Parameters,\n subpaths: Subpaths = {} as Subpaths,\n): Path & Subpaths {\n function updatePath(path: Path, root: boolean, params?: Parameters) {\n if (typeof path.__ === \"object\") {\n params = params ? { ...params, ...path.__ } : path.__\n }\n\n const _path = typeof _ === \"string\" && params ? generatePath(_, params) : _\n\n Object.entries(path).forEach(([key, subpath]) => {\n if (key !== \"__\") {\n subpath = subpath as string | Path\n if (typeof subpath === \"string\") {\n if (typeof _path === \"string\" && (!root || key !== \"_\")) {\n let __path = _path + subpath\n if (__path.endsWith(\"/\")) __path = __path.slice(0, -1)\n path[key] = __path\n }\n } else {\n updatePath(subpath, false, params)\n }\n }\n })\n }\n\n const path = { ...subpaths, _: typeof _ === \"string\" ? _ : \"\", __: _ }\n if (_ === \"\") {\n path._ = \"/\"\n } else {\n updatePath(path, true)\n }\n return path\n}\n\nexport function getParam(path: Path, key: string) {\n return (path.__ as Parameters)[key]\n}\n"],"names":["path","_","subpaths","updatePath","root","params","_path","generatePath","key","subpath","__path","getParam"],"mappings":";;;;;;;AA4BO,SAASA,EACdC,GACAC,IAAqB,IACJ;AACjB,WAASC,EAAWH,GAAYI,GAAeC,GAAqB;AAClE,IAAI,OAAOL,EAAK,MAAO,aACrBK,IAASA,IAAS,EAAE,GAAGA,GAAQ,GAAGL,EAAK,GAAA,IAAOA,EAAK;AAGrD,UAAMM,IAAQ,OAAOL,KAAM,YAAYI,IAASE,EAAaN,GAAGI,CAAM,IAAIJ;AAE1E,WAAO,QAAQD,CAAI,EAAE,QAAQ,CAAC,CAACQ,GAAKC,CAAO,MAAM;AAC/C,UAAID,MAAQ;AAEV,YADAC,IAAUA,GACN,OAAOA,KAAY;AACrB,cAAI,OAAOH,KAAU,aAAa,CAACF,KAAQI,MAAQ,MAAM;AACvD,gBAAIE,IAASJ,IAAQG;AACrB,YAAIC,EAAO,SAAS,GAAG,UAAYA,EAAO,MAAM,GAAG,EAAE,IACrDV,EAAKQ,CAAG,IAAIE;AAAA,UACd;AAAA;AAEA,UAAAP,EAAWM,GAAS,IAAOJ,CAAM;AAAA,IAGvC,CAAC;AAAA,EACH;AAEA,QAAML,IAAO,EAAE,GAAGE,GAAU,GAAG,OAAOD,KAAM,WAAWA,IAAI,IAAI,IAAIA,EAAA;AACnE,SAAIA,MAAM,KACRD,EAAK,IAAI,MAETG,EAAWH,GAAM,EAAI,GAEhBA;AACT;AAEO,SAASW,EAASX,GAAYQ,GAAa;AAChD,SAAQR,EAAK,GAAkBQ,CAAG;AACpC;"}
@@ -1,4 +1,4 @@
1
- import { j as d } from "../jsx-runtime-Dpn_P65e.js";
1
+ import { j as d } from "../jsx-runtime-XvoU0p7t.js";
2
2
  import "@testing-library/dom";
3
3
  import { render as a } from "@testing-library/react";
4
4
  import c from "react-dom";
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("../jsx-runtime-CeSfJrVB.cjs");require("@mui/material");require("react");const e=require("../index-B_Zy_zwA.cjs");exports.getClassNames=e.getClassNames;exports.getStyleOverrides=e.getStyleOverrides;exports.includesClassNames=e.includesClassNames;exports.insertDividerBetweenElements=e.insertDividerBetweenElements;exports.matchClassNames=e.matchClassNames;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("../jsx-runtime-CeSfJrVB.cjs");require("@mui/material");require("react");const e=require("../index-DZ7ETsOg.cjs");exports.getClassNames=e.getClassNames;exports.getStyleOverrides=e.getStyleOverrides;exports.includesClassNames=e.includesClassNames;exports.insertDividerBetweenElements=e.insertDividerBetweenElements;exports.matchClassNames=e.matchClassNames;
2
2
  //# sourceMappingURL=theme.cjs.js.map
@@ -1,7 +1,7 @@
1
- import "../jsx-runtime-Dpn_P65e.js";
1
+ import "../jsx-runtime-XvoU0p7t.js";
2
2
  import "@mui/material";
3
3
  import "react";
4
- import { b as i, g as r, i as l, a as o, m as n } from "../index-CNtOlJ49.js";
4
+ import { b as i, g as r, i as l, a as o, m as n } from "../index-Brh3Kbv6.js";
5
5
  export {
6
6
  i as getClassNames,
7
7
  r as getStyleOverrides,
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "codeforlife",
3
3
  "description": "Common frontend code",
4
4
  "private": false,
5
- "version": "2.9.1",
5
+ "version": "2.10.0",
6
6
  "type": "module",
7
7
  "types": "dist/index.d.ts",
8
8
  "module": "dist/index.es.js",
@@ -178,9 +178,9 @@
178
178
  "memory-cache": "^0.2.0",
179
179
  "qs": "^6.11.2",
180
180
  "react": "^18.2.0",
181
- "react-dom": "^18.2.0",
181
+ "react-dom": "18.3.1",
182
182
  "react-redux": "^9.1.0",
183
- "react-router-dom": "^6.23.1",
183
+ "react-router": "7.8.2",
184
184
  "sirv": "^3.0.0",
185
185
  "yup": "^1.1.1"
186
186
  },
@@ -1,2 +0,0 @@
1
- "use strict";const n=require("./jsx-runtime-CeSfJrVB.cjs"),c=require("react"),m=require("@mui/material");require("./auth-Vf1MgMci.cjs");const q=require("./general-BPbbmkeX.cjs");require("react-router-dom");require("yup");require("@mui/icons-material");require("./palette-CE2mKYse.cjs");const x=({seconds:e,start:u=!0,onEnd:i,...o})=>{e=Math.floor(e);const r=q.useCountdown(e)[0],[s,a]=c.useState(!u);r===0&&!s&&(a(!0),i()),e=Math.floor(r%60);const t=Math.floor(r/60);return n.jsxRuntimeExports.jsx(n.jsxRuntimeExports.Fragment,{children:r>0&&n.jsxRuntimeExports.jsxs(m.Typography,{...o,children:[t>0&&`${t} ${t>1?"mins":"min"} `,e>0&&`${e} ${e>1?"secs":"sec"}`]})})};exports.Countdown=x;
2
- //# sourceMappingURL=Countdown-zY3nMzmi.cjs.map
@@ -1,2 +0,0 @@
1
- "use strict";const r=require("./jsx-runtime-CeSfJrVB.cjs"),t=require("@mui/material");require("react");const n=require("react-router-dom");require("@mui/icons-material");require("./palette-CE2mKYse.cjs");require("./auth-Vf1MgMci.cjs");const u=e=>r.jsxRuntimeExports.jsx(t.Button,{...e,component:n.Link});exports.LinkButton=u;
2
- //# sourceMappingURL=LinkButton-BYFkvL_O.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"LinkButton-BYFkvL_O.cjs","sources":["../src/components/router/LinkButton.tsx"],"sourcesContent":["import { Button, type ButtonProps } from \"@mui/material\"\nimport { type JSX } from \"react\"\nimport { Link } from \"react-router-dom\"\n\nimport { type LinkProps } from \"../../utils/router\"\n\nexport type LinkButtonProps<\n Override extends \"delta\" | \"to\",\n State extends Record<string, any> = Record<string, any>,\n> = Omit<ButtonProps, \"component\"> & LinkProps<Override, State>\n\n// https://mui.com/material-ui/integrations/routing/#button\nconst LinkButton: {\n (props: LinkButtonProps<\"delta\">): JSX.Element\n <State extends Record<string, any> = Record<string, any>>(\n props: LinkButtonProps<\"to\", State>,\n ): JSX.Element\n} = (props: LinkButtonProps<\"delta\"> | LinkButtonProps<\"to\">) => {\n return <Button {...{ ...props, component: Link }} />\n}\n\nexport default LinkButton\n"],"names":["LinkButton","props","jsx","Button","Link"],"mappings":"2OAYA,MAAMA,EAKDC,GACIC,EAAAA,kBAAAA,IAACC,EAAAA,QAAa,GAAGF,EAAO,UAAWG,EAAAA,KAAQ"}
@@ -1,12 +0,0 @@
1
- import { j as t } from "./jsx-runtime-Dpn_P65e.js";
2
- import { Button as r } from "@mui/material";
3
- import "react";
4
- import { Link as m } from "react-router-dom";
5
- import "@mui/icons-material";
6
- import "./palette-C_L0akN_.js";
7
- import "./auth-BPfUPjmM.js";
8
- const f = (o) => /* @__PURE__ */ t.jsx(r, { ...o, component: m });
9
- export {
10
- f as L
11
- };
12
- //# sourceMappingURL=LinkButton-oK0RThqn.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"LinkButton-oK0RThqn.js","sources":["../src/components/router/LinkButton.tsx"],"sourcesContent":["import { Button, type ButtonProps } from \"@mui/material\"\nimport { type JSX } from \"react\"\nimport { Link } from \"react-router-dom\"\n\nimport { type LinkProps } from \"../../utils/router\"\n\nexport type LinkButtonProps<\n Override extends \"delta\" | \"to\",\n State extends Record<string, any> = Record<string, any>,\n> = Omit<ButtonProps, \"component\"> & LinkProps<Override, State>\n\n// https://mui.com/material-ui/integrations/routing/#button\nconst LinkButton: {\n (props: LinkButtonProps<\"delta\">): JSX.Element\n <State extends Record<string, any> = Record<string, any>>(\n props: LinkButtonProps<\"to\", State>,\n ): JSX.Element\n} = (props: LinkButtonProps<\"delta\"> | LinkButtonProps<\"to\">) => {\n return <Button {...{ ...props, component: Link }} />\n}\n\nexport default LinkButton\n"],"names":["LinkButton","props","jsx","Button","Link"],"mappings":";;;;;;;AAYA,MAAMA,IAKF,CAACC,MACIC,gBAAAA,EAAAA,IAACC,KAAa,GAAGF,GAAO,WAAWG,GAAQ;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Navigate-Dq47aqC8.js","sources":["../src/components/router/Link.tsx","../src/components/router/LinkIconButton.tsx","../src/components/router/LinkListItem.tsx","../src/components/router/LinkTab.tsx","../src/components/router/Navigate.tsx"],"sourcesContent":["import { Link as MuiLink, type LinkProps as MuiLinkProps } from \"@mui/material\"\nimport { type JSX } from \"react\"\nimport { Link as RouterLink } from \"react-router-dom\"\n\nimport { type LinkProps as RouterLinkProps } from \"../../utils/router\"\n\nexport type LinkProps<\n Override extends \"delta\" | \"to\",\n State extends Record<string, any> = Record<string, any>,\n> = Omit<MuiLinkProps, \"component\"> & RouterLinkProps<Override, State>\n\n// https://mui.com/material-ui/integrations/routing/#link\nconst Link: {\n (props: LinkProps<\"delta\">): JSX.Element\n <State extends Record<string, any> = Record<string, any>>(\n props: LinkProps<\"to\", State>,\n ): JSX.Element\n} = (props: LinkProps<\"delta\"> | LinkProps<\"to\">) => {\n // @ts-expect-error props are assignable\n return <MuiLink component={RouterLink} {...props} />\n}\n\nexport default Link\n","import { IconButton, type IconButtonProps } from \"@mui/material\"\nimport { type JSX } from \"react\"\nimport { Link } from \"react-router-dom\"\n\nimport { type LinkProps } from \"../../utils/router\"\n\nexport type LinkIconButtonProps<\n Override extends \"delta\" | \"to\",\n State extends Record<string, any> = Record<string, any>,\n> = Omit<IconButtonProps, \"component\"> & LinkProps<Override, State>\n\n// https://mui.com/material-ui/integrations/routing/#button\nconst LinkIconButton: {\n (props: LinkIconButtonProps<\"delta\">): JSX.Element\n <State extends Record<string, any> = Record<string, any>>(\n props: LinkIconButtonProps<\"to\", State>,\n ): JSX.Element\n} = (props: LinkIconButtonProps<\"delta\"> | LinkIconButtonProps<\"to\">) => {\n return <IconButton {...{ ...props, component: Link }} />\n}\n\nexport default LinkIconButton\n","import { ListItem, type ListItemProps } from \"@mui/material\"\nimport { type JSX } from \"react\"\nimport { Link } from \"react-router-dom\"\n\nimport { type LinkProps } from \"../../utils/router\"\n\nexport type LinkListItemProps<\n Override extends \"delta\" | \"to\",\n State extends Record<string, any> = Record<string, any>,\n> = Omit<ListItemProps, \"component\"> & LinkProps<Override, State>\n\n// https://mui.com/material-ui/integrations/routing/#list\nconst LinkListItem: {\n (props: LinkListItemProps<\"delta\">): JSX.Element\n <State extends Record<string, any> = Record<string, any>>(\n props: LinkListItemProps<\"to\", State>,\n ): JSX.Element\n} = (props: LinkListItemProps<\"delta\"> | LinkListItemProps<\"to\">) => {\n return <ListItem {...{ ...props, component: Link }} />\n}\n\nexport default LinkListItem\n","import { Tab, type TabProps } from \"@mui/material\"\nimport { type JSX } from \"react\"\nimport { Link } from \"react-router-dom\"\n\nimport { type LinkProps } from \"../../utils/router\"\n\nexport type LinkTabProps<\n Override extends \"delta\" | \"to\",\n State extends Record<string, any> = Record<string, any>,\n> = Omit<TabProps, \"component\"> & LinkProps<Override, State>\n\n// https://mui.com/material-ui/integrations/routing/#tabs\nconst LinkTab: {\n (props: LinkTabProps<\"delta\">): JSX.Element\n <State extends Record<string, any> = Record<string, any>>(\n props: LinkTabProps<\"to\", State>,\n ): JSX.Element\n} = (props: LinkTabProps<\"delta\"> | LinkTabProps<\"to\">) => {\n return <Tab {...{ ...props, component: Link }} />\n}\n\nexport default LinkTab\n","import { type JSX, useEffect } from \"react\"\nimport { type To } from \"react-router-dom\"\n\nimport { type NavigateOptions, useNavigate } from \"../../hooks\"\n\nexport type NavigateProps<\n Override extends \"delta\" | \"to\",\n State extends Record<string, any> = Record<string, any>,\n> = Override extends \"delta\"\n ? { delta: number; to?: undefined }\n : { delta?: undefined; to: To } & NavigateOptions<State>\n\nconst Navigate: {\n (props: NavigateProps<\"delta\">): JSX.Element\n <State extends Record<string, any> = Record<string, any>>(\n props: NavigateProps<\"to\", State>,\n ): JSX.Element\n} = ({\n delta,\n to,\n ...options\n}: NavigateProps<\"delta\"> | NavigateProps<\"to\">) => {\n const navigate = useNavigate()\n\n useEffect(() => {\n if (typeof delta === \"number\") navigate(delta)\n else navigate(to, options)\n }, [navigate, delta, to, options])\n\n return <></>\n}\n\nexport default Navigate\n"],"names":["Link","props","jsx","MuiLink","RouterLink","LinkIconButton","IconButton","LinkListItem","ListItem","LinkTab","Tab","Navigate","delta","to","options","navigate","useNavigate","useEffect","Fragment"],"mappings":";;;;;;;AAYA,MAAMA,IAKF,CAACC,MAEIC,gBAAAA,EAAAA,IAACC,GAAA,EAAQ,WAAWC,GAAa,GAAGH,GAAO,GCP9CI,IAKF,CAACJ,MACIC,gBAAAA,EAAAA,IAACI,KAAiB,GAAGL,GAAO,WAAWD,GAAQ,GCNlDO,IAKF,CAACN,MACIC,gBAAAA,EAAAA,IAACM,KAAe,GAAGP,GAAO,WAAWD,GAAQ,GCNhDS,IAKF,CAACR,MACIC,gBAAAA,EAAAA,IAACQ,KAAU,GAAGT,GAAO,WAAWD,GAAQ,GCN3CW,IAKF,CAAC;AAAA,EACH,OAAAC;AAAA,EACA,IAAAC;AAAA,EACA,GAAGC;AACL,MAAoD;AAClD,QAAMC,IAAWC,EAAA;AAEjB,SAAAC,EAAU,MAAM;AACd,IAAI,OAAOL,KAAU,WAAUG,EAASH,CAAK,IACxCG,EAASF,GAAIC,CAAO;AAAA,EAC3B,GAAG,CAACC,GAAUH,GAAOC,GAAIC,CAAO,CAAC,GAE1BZ,gBAAAA,EAAAA,IAAAgB,EAAAA,UAAA,EAAE;AACX;"}
@@ -1,2 +0,0 @@
1
- "use strict";const n=require("./jsx-runtime-CeSfJrVB.cjs"),e=require("@mui/material"),u=require("react"),i=require("react-router-dom");require("@mui/icons-material");require("./palette-CE2mKYse.cjs");const c=require("./auth-Vf1MgMci.cjs"),m=t=>n.jsxRuntimeExports.jsx(e.Link,{component:i.Link,...t}),x=t=>n.jsxRuntimeExports.jsx(e.IconButton,{...t,component:i.Link}),L=t=>n.jsxRuntimeExports.jsx(e.ListItem,{...t,component:i.Link}),a=t=>n.jsxRuntimeExports.jsx(e.Tab,{...t,component:i.Link}),k=({delta:t,to:s,...o})=>{const r=c.useNavigate();return u.useEffect(()=>{typeof t=="number"?r(t):r(s,o)},[r,t,s,o]),n.jsxRuntimeExports.jsx(n.jsxRuntimeExports.Fragment,{})};exports.Link=m;exports.LinkIconButton=x;exports.LinkListItem=L;exports.LinkTab=a;exports.Navigate=k;
2
- //# sourceMappingURL=Navigate-dQocLhzN.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Navigate-dQocLhzN.cjs","sources":["../src/components/router/Link.tsx","../src/components/router/LinkIconButton.tsx","../src/components/router/LinkListItem.tsx","../src/components/router/LinkTab.tsx","../src/components/router/Navigate.tsx"],"sourcesContent":["import { Link as MuiLink, type LinkProps as MuiLinkProps } from \"@mui/material\"\nimport { type JSX } from \"react\"\nimport { Link as RouterLink } from \"react-router-dom\"\n\nimport { type LinkProps as RouterLinkProps } from \"../../utils/router\"\n\nexport type LinkProps<\n Override extends \"delta\" | \"to\",\n State extends Record<string, any> = Record<string, any>,\n> = Omit<MuiLinkProps, \"component\"> & RouterLinkProps<Override, State>\n\n// https://mui.com/material-ui/integrations/routing/#link\nconst Link: {\n (props: LinkProps<\"delta\">): JSX.Element\n <State extends Record<string, any> = Record<string, any>>(\n props: LinkProps<\"to\", State>,\n ): JSX.Element\n} = (props: LinkProps<\"delta\"> | LinkProps<\"to\">) => {\n // @ts-expect-error props are assignable\n return <MuiLink component={RouterLink} {...props} />\n}\n\nexport default Link\n","import { IconButton, type IconButtonProps } from \"@mui/material\"\nimport { type JSX } from \"react\"\nimport { Link } from \"react-router-dom\"\n\nimport { type LinkProps } from \"../../utils/router\"\n\nexport type LinkIconButtonProps<\n Override extends \"delta\" | \"to\",\n State extends Record<string, any> = Record<string, any>,\n> = Omit<IconButtonProps, \"component\"> & LinkProps<Override, State>\n\n// https://mui.com/material-ui/integrations/routing/#button\nconst LinkIconButton: {\n (props: LinkIconButtonProps<\"delta\">): JSX.Element\n <State extends Record<string, any> = Record<string, any>>(\n props: LinkIconButtonProps<\"to\", State>,\n ): JSX.Element\n} = (props: LinkIconButtonProps<\"delta\"> | LinkIconButtonProps<\"to\">) => {\n return <IconButton {...{ ...props, component: Link }} />\n}\n\nexport default LinkIconButton\n","import { ListItem, type ListItemProps } from \"@mui/material\"\nimport { type JSX } from \"react\"\nimport { Link } from \"react-router-dom\"\n\nimport { type LinkProps } from \"../../utils/router\"\n\nexport type LinkListItemProps<\n Override extends \"delta\" | \"to\",\n State extends Record<string, any> = Record<string, any>,\n> = Omit<ListItemProps, \"component\"> & LinkProps<Override, State>\n\n// https://mui.com/material-ui/integrations/routing/#list\nconst LinkListItem: {\n (props: LinkListItemProps<\"delta\">): JSX.Element\n <State extends Record<string, any> = Record<string, any>>(\n props: LinkListItemProps<\"to\", State>,\n ): JSX.Element\n} = (props: LinkListItemProps<\"delta\"> | LinkListItemProps<\"to\">) => {\n return <ListItem {...{ ...props, component: Link }} />\n}\n\nexport default LinkListItem\n","import { Tab, type TabProps } from \"@mui/material\"\nimport { type JSX } from \"react\"\nimport { Link } from \"react-router-dom\"\n\nimport { type LinkProps } from \"../../utils/router\"\n\nexport type LinkTabProps<\n Override extends \"delta\" | \"to\",\n State extends Record<string, any> = Record<string, any>,\n> = Omit<TabProps, \"component\"> & LinkProps<Override, State>\n\n// https://mui.com/material-ui/integrations/routing/#tabs\nconst LinkTab: {\n (props: LinkTabProps<\"delta\">): JSX.Element\n <State extends Record<string, any> = Record<string, any>>(\n props: LinkTabProps<\"to\", State>,\n ): JSX.Element\n} = (props: LinkTabProps<\"delta\"> | LinkTabProps<\"to\">) => {\n return <Tab {...{ ...props, component: Link }} />\n}\n\nexport default LinkTab\n","import { type JSX, useEffect } from \"react\"\nimport { type To } from \"react-router-dom\"\n\nimport { type NavigateOptions, useNavigate } from \"../../hooks\"\n\nexport type NavigateProps<\n Override extends \"delta\" | \"to\",\n State extends Record<string, any> = Record<string, any>,\n> = Override extends \"delta\"\n ? { delta: number; to?: undefined }\n : { delta?: undefined; to: To } & NavigateOptions<State>\n\nconst Navigate: {\n (props: NavigateProps<\"delta\">): JSX.Element\n <State extends Record<string, any> = Record<string, any>>(\n props: NavigateProps<\"to\", State>,\n ): JSX.Element\n} = ({\n delta,\n to,\n ...options\n}: NavigateProps<\"delta\"> | NavigateProps<\"to\">) => {\n const navigate = useNavigate()\n\n useEffect(() => {\n if (typeof delta === \"number\") navigate(delta)\n else navigate(to, options)\n }, [navigate, delta, to, options])\n\n return <></>\n}\n\nexport default Navigate\n"],"names":["Link","props","jsx","MuiLink","RouterLink","LinkIconButton","IconButton","LinkListItem","ListItem","LinkTab","Tab","Navigate","delta","to","options","navigate","useNavigate","useEffect","Fragment"],"mappings":"+OAYMA,EAKDC,GAEIC,EAAAA,kBAAAA,IAACC,EAAAA,KAAA,CAAQ,UAAWC,EAAAA,KAAa,GAAGH,EAAO,ECP9CI,EAKDJ,GACIC,EAAAA,kBAAAA,IAACI,EAAAA,YAAiB,GAAGL,EAAO,UAAWD,EAAAA,KAAQ,ECNlDO,EAKDN,GACIC,EAAAA,kBAAAA,IAACM,EAAAA,UAAe,GAAGP,EAAO,UAAWD,EAAAA,KAAQ,ECNhDS,EAKDR,GACIC,EAAAA,kBAAAA,IAACQ,EAAAA,KAAU,GAAGT,EAAO,UAAWD,EAAAA,KAAQ,ECN3CW,EAKF,CAAC,CACH,MAAAC,EACA,GAAAC,EACA,GAAGC,CACL,IAAoD,CAClD,MAAMC,EAAWC,EAAAA,YAAA,EAEjBC,OAAAA,EAAAA,UAAU,IAAM,CACV,OAAOL,GAAU,SAAUG,EAASH,CAAK,EACxCG,EAASF,EAAIC,CAAO,CAC3B,EAAG,CAACC,EAAUH,EAAOC,EAAIC,CAAO,CAAC,EAE1BZ,EAAAA,kBAAAA,IAAAgB,EAAAA,kBAAAA,SAAA,EAAE,CACX"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth-BPfUPjmM.js","sources":["../src/hooks/router.tsx","../src/hooks/auth.tsx"],"sourcesContent":["import {\n type Location,\n type Params,\n type To,\n type NavigateOptions as _NavigateOptions,\n useLocation as _useLocation,\n useNavigate as _useNavigate,\n useParams as _useParams,\n useSearchParams as _useSearchParams,\n} from \"react-router-dom\"\nimport { type ObjectShape, object as objectSchema } from \"yup\"\nimport { type ReactNode, useEffect } from \"react\"\n\nimport {\n type ObjectSchemaFromShape,\n type TryValidateSyncOnErrorRT,\n type TryValidateSyncOptions,\n type TryValidateSyncRT,\n tryValidateSync,\n} from \"../utils/schema\"\nimport { type PageState } from \"../components/page\"\nimport { type ReadOnly } from \"../utils/router\"\n\nexport type NavigateOptions<\n State extends Record<string, any> = Record<string, any>,\n> = Omit<_NavigateOptions, \"state\"> & {\n state?: State & Partial<PageState>\n next?: boolean\n}\n\nexport type Navigate = {\n <State extends Record<string, any> = Record<string, any>>(\n to: To,\n options?: NavigateOptions<State>,\n ): void\n (delta: number): void\n}\n\nexport function useNavigate(): Navigate {\n const navigate = _useNavigate()\n const searchParams = useSearchParams()\n\n return (\n toOrDelta: To | number,\n options: (NavigateOptions & { next?: boolean }) | undefined = undefined,\n ) => {\n if (typeof toOrDelta === \"number\") navigate(toOrDelta)\n else {\n const { next = true, ..._options } = options || {}\n\n navigate(\n next && \"next\" in searchParams ? searchParams.next : toOrDelta,\n _options,\n )\n }\n }\n}\n\nexport function useLocation<State = {}>() {\n return _useLocation() as Location<null | Partial<PageState & State>>\n}\n\n// -----------------------------------------------------------------------------\n// Use Search Params\n// -----------------------------------------------------------------------------\n\nexport function useSearchParams(): { [k: string]: string }\n\nexport function useSearchParams<\n OnErrorRT extends TryValidateSyncOnErrorRT<ObjectSchemaFromShape<Shape>>,\n Shape extends ObjectShape = {},\n>(\n shape: Shape,\n validateOptions?: TryValidateSyncOptions<\n ObjectSchemaFromShape<Shape>,\n OnErrorRT\n >,\n): TryValidateSyncRT<ObjectSchemaFromShape<Shape>, OnErrorRT>\n\nexport function useSearchParams<\n OnErrorRT extends TryValidateSyncOnErrorRT<ObjectSchemaFromShape<Shape>>,\n Shape extends ObjectShape = {},\n>(\n shape?: Shape,\n validateOptions?: TryValidateSyncOptions<\n ObjectSchemaFromShape<Shape>,\n OnErrorRT\n >,\n) {\n const searchParams = Object.fromEntries(_useSearchParams()[0].entries())\n if (!shape) return searchParams\n\n return tryValidateSync(searchParams, objectSchema(shape), validateOptions)\n}\n\n// -----------------------------------------------------------------------------\n// Use Params\n// -----------------------------------------------------------------------------\n\nexport function useParams(): ReadOnly<Params<string>>\n\nexport function useParams<\n OnErrorRT extends TryValidateSyncOnErrorRT<ObjectSchemaFromShape<Shape>>,\n Shape extends ObjectShape = {},\n>(\n shape: Shape,\n validateOptions?: TryValidateSyncOptions<\n ObjectSchemaFromShape<Shape>,\n OnErrorRT\n >,\n): TryValidateSyncRT<ObjectSchemaFromShape<Shape>, OnErrorRT>\n\nexport function useParams<\n OnErrorRT extends TryValidateSyncOnErrorRT<ObjectSchemaFromShape<Shape>>,\n Shape extends ObjectShape = {},\n>(\n shape?: Shape,\n validateOptions?: TryValidateSyncOptions<\n ObjectSchemaFromShape<Shape>,\n OnErrorRT\n >,\n) {\n const params = _useParams()\n if (!shape) return params\n\n return tryValidateSync(params, objectSchema(shape), validateOptions)\n}\n\nexport function useParamsRequired<\n OnErrorRT extends TryValidateSyncOnErrorRT<ObjectSchemaFromShape<Shape>>,\n Shape extends ObjectShape = {},\n>({\n shape,\n children,\n onValidationError,\n onValidationSuccess = () => {},\n validateOptions,\n}: {\n shape: Shape\n children: (\n data: NonNullable<\n TryValidateSyncRT<ObjectSchemaFromShape<Shape>, OnErrorRT>\n >,\n ) => ReactNode\n onValidationError: (navigate: Navigate) => void\n onValidationSuccess?: (\n params: NonNullable<\n TryValidateSyncRT<ObjectSchemaFromShape<Shape>, OnErrorRT>\n >,\n ) => void\n validateOptions?: TryValidateSyncOptions<\n ObjectSchemaFromShape<Shape>,\n OnErrorRT\n >\n}) {\n const params = useParams(shape, validateOptions)\n const navigate = useNavigate()\n\n useEffect(\n () => {\n if (params) onValidationSuccess(params)\n else onValidationError(navigate)\n },\n [], // eslint-disable-line react-hooks/exhaustive-deps\n )\n\n return params ? children(params) : <></>\n}\n","import * as yup from \"yup\"\nimport { type ReactNode, useCallback, useEffect, useState } from \"react\"\nimport Cookies from \"js-cookie\"\nimport type { TypedUseMutation } from \"@reduxjs/toolkit/query/react\"\nimport { createSearchParams } from \"react-router-dom\"\n// eslint-disable-next-line @typescript-eslint/no-restricted-imports\nimport { useSelector } from \"react-redux\"\n\nimport { type AuthFactor, type User } from \"../api\"\nimport {\n type OAuth2CodeChallenge,\n type OAuth2CodeChallengeLengths,\n type OAuth2ReceiveCodeUrlSearchParams,\n type OAuth2RequestCodeUrlSearchParams,\n generateOAuth2CodeChallenge,\n makeOAuth2StorageKey,\n} from \"../utils/auth\"\nimport { useLocation, useNavigate, useSearchParams } from \"./router\"\nimport { type ExchangeOAuth2CodeArg } from \"../api/endpoints/session\"\nimport { SESSION_METADATA_COOKIE_NAME } from \"../settings\"\nimport { generateSecureRandomString } from \"../utils/general\"\nimport { selectIsLoggedIn } from \"../slices/session\"\n\n// -----------------------------------------------------------------------------\n// Session\n// -----------------------------------------------------------------------------\n\nexport interface SessionMetadata {\n user_id: User[\"id\"]\n user_type: \"teacher\" | \"student\" | \"indy\"\n auth_factors: Array<AuthFactor[\"type\"]>\n otp_bypass_token_exists: boolean\n}\n\nexport function useSessionMetadata<T = SessionMetadata>(\n cookieName = SESSION_METADATA_COOKIE_NAME,\n): T | undefined {\n return useSelector(selectIsLoggedIn)\n ? (JSON.parse(Cookies.get(cookieName)!) as T)\n : undefined\n}\n\n/**\n * A utility function to predefine a useSessionMetadata hook.\n * @param cookieName The name of the session metadata cookie.\n * @returns An object containing the session metadata.\n */\nuseSessionMetadata.predefine = <SessionMetadata,>(\n cookieName = SESSION_METADATA_COOKIE_NAME,\n) => {\n return () => useSessionMetadata<SessionMetadata>(cookieName)\n}\n\nexport type UseSessionChildrenFunction<Required extends boolean> = (\n metadata: Required extends true\n ? SessionMetadata\n : SessionMetadata | undefined,\n) => ReactNode\n\nexport type UseSessionChildren<\n UserType extends SessionMetadata[\"user_type\"] | undefined,\n> =\n | ReactNode\n | (UserType extends undefined\n ? UseSessionChildrenFunction<false>\n : UseSessionChildrenFunction<true>)\n\nexport type UseSessionOptions<\n UserType extends SessionMetadata[\"user_type\"] | undefined,\n> = Partial<{\n userType: UserType\n next: boolean\n}>\n\nexport function useSession<\n UserType extends SessionMetadata[\"user_type\"] | undefined = undefined,\n>(\n children: UseSessionChildren<UserType>,\n options: UseSessionOptions<UserType> = {},\n) {\n const { userType, next = true } = options\n\n const { pathname } = useLocation()\n const navigate = useNavigate()\n const sessionMetadata = useSessionMetadata()\n\n const loginRequired =\n userType && (!sessionMetadata || sessionMetadata.user_type !== userType)\n\n useEffect(() => {\n if (loginRequired) {\n navigate({\n pathname:\n \"/login\" +\n {\n teacher: \"/teacher\",\n student: \"/student\",\n indy: \"/independent\",\n }[userType],\n search: next\n ? createSearchParams({ next: pathname }).toString()\n : undefined,\n })\n }\n }, [navigate, loginRequired, userType, next, pathname])\n\n if (loginRequired) return <></>\n\n if (typeof children === \"function\") {\n return sessionMetadata\n ? (children as UseSessionChildrenFunction<true>)(sessionMetadata)\n : (children as UseSessionChildrenFunction<false>)(sessionMetadata)\n }\n\n return children\n}\n\n// -----------------------------------------------------------------------------\n// OAuth2\n// -----------------------------------------------------------------------------\n\nexport function useOAuth2State(\n provider: string,\n length: number = 32,\n storageKey: string = \"state\",\n): [string | undefined, () => void] {\n const oAuth2StorageKey = makeOAuth2StorageKey(provider, storageKey)\n const storageValue = sessionStorage.getItem(oAuth2StorageKey)\n\n const [_state, _setState] = useState<string>()\n\n useEffect(() => {\n let state: string\n if (storageValue && storageValue.length === length) {\n state = storageValue\n } else {\n state = generateSecureRandomString(length)\n sessionStorage.setItem(oAuth2StorageKey, state)\n }\n\n _setState(state)\n }, [oAuth2StorageKey, storageValue, length])\n\n const resetState = useCallback(() => {\n sessionStorage.removeItem(oAuth2StorageKey)\n _setState(undefined)\n }, [oAuth2StorageKey])\n\n return [_state, resetState]\n}\n\nexport function useOAuth2CodeChallenge(\n provider: string,\n length: OAuth2CodeChallengeLengths = 128,\n storageKey: string = \"codeChallenge\",\n): [OAuth2CodeChallenge | undefined, () => void] {\n const oAuth2StorageKey = makeOAuth2StorageKey(provider, storageKey)\n const storageValue = sessionStorage.getItem(oAuth2StorageKey)\n\n const [_codeChallenge, _setCodeChallenge] = useState<OAuth2CodeChallenge>()\n\n useEffect(() => {\n let codeChallenge: OAuth2CodeChallenge | undefined\n if (storageValue) {\n const storageJsonValue: unknown = JSON.parse(storageValue)\n if (\n typeof storageJsonValue === \"object\" &&\n storageJsonValue &&\n \"verifier\" in storageJsonValue &&\n typeof storageJsonValue.verifier == \"string\" &&\n storageJsonValue.verifier.length === length &&\n \"challenge\" in storageJsonValue &&\n typeof storageJsonValue.challenge === \"string\" &&\n \"method\" in storageJsonValue &&\n storageJsonValue.method === \"S256\"\n ) {\n codeChallenge = {\n verifier: storageJsonValue.verifier,\n challenge: storageJsonValue.challenge,\n method: storageJsonValue.method,\n }\n }\n }\n\n if (codeChallenge) _setCodeChallenge(codeChallenge)\n else {\n generateOAuth2CodeChallenge(length)\n .then(codeChallenge => {\n sessionStorage.setItem(\n oAuth2StorageKey,\n JSON.stringify(codeChallenge),\n )\n\n _setCodeChallenge(codeChallenge)\n })\n .catch(error => {\n if (error) console.error(error)\n })\n }\n }, [oAuth2StorageKey, storageValue, length])\n\n const resetCodeChallenge = useCallback(() => {\n sessionStorage.removeItem(oAuth2StorageKey)\n _setCodeChallenge(undefined)\n }, [oAuth2StorageKey])\n\n return [_codeChallenge, resetCodeChallenge]\n}\n\ninterface BaseUseOAuth2KwArgs<SessionMetadata> {\n provider: string\n authUri: string\n clientId: string\n redirectUri: string\n scope: string\n responseType?: \"code\"\n accessType?: \"offline\"\n prompt?: string\n useLoginMutation: TypedUseMutation<\n SessionMetadata,\n ExchangeOAuth2CodeArg,\n any\n >\n onCreateSession: (result: SessionMetadata) => void\n onRetrieveSession: (metadata: SessionMetadata) => void\n}\n\ninterface UseOAuth2KwArgs<SessionMetadata>\n extends BaseUseOAuth2KwArgs<SessionMetadata> {\n useSessionMetadata: () => SessionMetadata | undefined\n}\n\nexport type OAuth2 = [string, OAuth2RequestCodeUrlSearchParams] | []\n\n// https://datatracker.ietf.org/doc/html/rfc7636\nfunction useOAuth2Internal<SessionMetadata>({\n provider,\n authUri,\n clientId,\n redirectUri,\n scope,\n responseType = \"code\",\n accessType = \"offline\",\n prompt,\n useSessionMetadata,\n useLoginMutation,\n onCreateSession,\n onRetrieveSession,\n}: UseOAuth2KwArgs<SessionMetadata>): OAuth2 {\n const [state, resetState] = useOAuth2State(provider)\n const [\n {\n verifier: codeVerifier,\n challenge: codeChallenge,\n method: codeChallengeMethod,\n } = {},\n resetCodeChallenge,\n ] = useOAuth2CodeChallenge(provider)\n const [\n login,\n {\n originalArgs: loginArgs = {} as ExchangeOAuth2CodeArg,\n isLoading: loginIsLoading,\n isError: loginIsError,\n },\n ] = useLoginMutation()\n const sessionMetadata = useSessionMetadata()\n const navigate = useNavigate()\n const searchParams =\n useSearchParams({ code: yup.string(), state: yup.string() }) || {}\n const location = useLocation<OAuth2ReceiveCodeUrlSearchParams>()\n\n const locationState = location.state || {}\n\n useEffect(() => {\n // If the the auth provider has redirected back to our site with the\n // expected search params, we redirect to the current page to remove them.\n if (searchParams.code && searchParams.state) {\n navigate<OAuth2ReceiveCodeUrlSearchParams>(\".\", {\n // Removes the URL containing the search params from the history stack.\n replace: true,\n // Ensure we don't break the auth flow by navigating to another page.\n next: false,\n // Store the search params in the page's state instead.\n state: { code: searchParams.code, state: searchParams.state },\n })\n }\n }, [searchParams.code, searchParams.state, navigate])\n\n useEffect(() => {\n // If we're already logged in, no need to log in again.\n if (sessionMetadata) onRetrieveSession(sessionMetadata)\n else if (\n // If the state and code verifier have been generated...\n state &&\n codeVerifier &&\n // ...and the page's state contains a code...\n locationState.code &&\n // ...and the page's state contains the stored state...\n locationState.state === state &&\n // ...and the login endpoint was not called with the current values or has\n // not returned an error...\n (loginArgs.code !== locationState.code ||\n loginArgs.code_verifier !== codeVerifier ||\n loginArgs.redirect_uri !== redirectUri ||\n !loginIsError) &&\n // ...and the login endpoint is not currently being called...\n !loginIsLoading\n ) {\n // ...call the login endpoint.\n login({\n code: locationState.code,\n code_verifier: codeVerifier,\n redirect_uri: redirectUri,\n })\n .unwrap()\n .then(onCreateSession)\n .catch(() => {\n navigate(\".\", {\n replace: true,\n state: {\n notifications: [\n {\n props: {\n error: true,\n children: \"Failed to login. Please try again.\",\n },\n },\n ],\n },\n })\n })\n .finally(() => {\n resetState()\n resetCodeChallenge()\n })\n }\n }, [\n navigate,\n redirectUri,\n // State\n state,\n locationState.state,\n resetState,\n // Code\n codeVerifier,\n locationState.code,\n resetCodeChallenge,\n // Login\n login,\n loginIsLoading,\n loginIsError,\n loginArgs.code,\n loginArgs.code_verifier,\n loginArgs.redirect_uri,\n // Session\n sessionMetadata,\n onCreateSession,\n onRetrieveSession,\n ])\n\n if (state && codeChallenge && codeChallengeMethod) {\n const urlSearchParams: OAuth2RequestCodeUrlSearchParams = {\n client_id: clientId,\n redirect_uri: redirectUri,\n scope,\n response_type: responseType,\n access_type: accessType,\n state,\n code_challenge: codeChallenge,\n code_challenge_method: codeChallengeMethod,\n }\n\n if (prompt) urlSearchParams[\"prompt\"] = prompt\n\n return [\n authUri + \"?\" + new URLSearchParams(urlSearchParams).toString(),\n urlSearchParams,\n ]\n }\n\n return []\n}\n\nexport const useOAuth2: {\n <SessionMetadata>(kwargs: UseOAuth2KwArgs<SessionMetadata>): OAuth2\n (kwargs: BaseUseOAuth2KwArgs<SessionMetadata>): OAuth2\n} = <_SessionMetadata,>(\n kwargs:\n | UseOAuth2KwArgs<_SessionMetadata>\n | BaseUseOAuth2KwArgs<SessionMetadata>,\n): OAuth2 => {\n return useOAuth2Internal(\n // @ts-expect-error value is assignable\n \"useSessionMetadata\" in kwargs ? kwargs : { ...kwargs, useSessionMetadata },\n )\n}\n"],"names":["useNavigate","navigate","_useNavigate","searchParams","useSearchParams","toOrDelta","options","next","_options","useLocation","_useLocation","shape","validateOptions","_useSearchParams","tryValidateSync","objectSchema","useParams","params","_useParams","useParamsRequired","children","onValidationError","onValidationSuccess","useEffect","jsx","Fragment","useSessionMetadata","cookieName","SESSION_METADATA_COOKIE_NAME","useSelector","selectIsLoggedIn","Cookies","useSession","userType","pathname","sessionMetadata","loginRequired","createSearchParams","useOAuth2State","provider","length","storageKey","oAuth2StorageKey","makeOAuth2StorageKey","storageValue","_state","_setState","useState","state","generateSecureRandomString","resetState","useCallback","useOAuth2CodeChallenge","_codeChallenge","_setCodeChallenge","codeChallenge","storageJsonValue","generateOAuth2CodeChallenge","error","resetCodeChallenge","useOAuth2Internal","authUri","clientId","redirectUri","scope","responseType","accessType","prompt","useLoginMutation","onCreateSession","onRetrieveSession","codeVerifier","codeChallengeMethod","login","loginArgs","loginIsLoading","loginIsError","yup","locationState","urlSearchParams","useOAuth2","kwargs"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- "use strict";const y=require("./jsx-runtime-CeSfJrVB.cjs"),C=require("yup"),l=require("react"),w=require("js-cookie"),S=require("react-router-dom"),z=require("react-redux"),V=require("./settings/index.cjs.js"),B=require("./session-CE2U7oL1.cjs"),E=require("./utils/auth.cjs.js");require("@mui/material");const G=require("./utils/general.cjs.js");require("@mui/icons-material");require("./schemas-BZbJpkD5.cjs");require("./urls-MaVXL_C2.cjs");const k=require("./utils/schema.cjs.js");require("./palette-CE2mKYse.cjs");function H(e){const n=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const t in e)if(t!=="default"){const s=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(n,t,s.get?s:{enumerable:!0,get:()=>e[t]})}}return n.default=e,Object.freeze(n)}const T=H(C);function O(){const e=S.useNavigate(),n=x();return(t,s=void 0)=>{if(typeof t=="number")e(t);else{const{next:o=!0,...i}=s||{};e(o&&"next"in n?n.next:t,i)}}}function q(){return S.useLocation()}function x(e,n){const t=Object.fromEntries(S.useSearchParams()[0].entries());return e?k.tryValidateSync(t,C.object(e),n):t}function J(e,n){const t=S.useParams();return e?k.tryValidateSync(t,C.object(e),n):t}function Q({shape:e,children:n,onValidationError:t,onValidationSuccess:s=()=>{},validateOptions:o}){const i=J(e,o),a=O();return l.useEffect(()=>{i?s(i):t(a)},[]),i?n(i):y.jsxRuntimeExports.jsx(y.jsxRuntimeExports.Fragment,{})}function m(e=V.SESSION_METADATA_COOKIE_NAME){return z.useSelector(B.selectIsLoggedIn)?JSON.parse(w.get(e)):void 0}m.predefine=(e=V.SESSION_METADATA_COOKIE_NAME)=>()=>m(e);function W(e,n={}){const{userType:t,next:s=!0}=n,{pathname:o}=q(),i=O(),a=m(),c=t&&(!a||a.user_type!==t);return l.useEffect(()=>{c&&i({pathname:"/login"+{teacher:"/teacher",student:"/student",indy:"/independent"}[t],search:s?S.createSearchParams({next:o}).toString():void 0})},[i,c,t,s,o]),c?y.jsxRuntimeExports.jsx(y.jsxRuntimeExports.Fragment,{}):typeof e=="function"?e(a):e}function D(e,n=32,t="state"){const s=E.makeOAuth2StorageKey(e,t),o=sessionStorage.getItem(s),[i,a]=l.useState();l.useEffect(()=>{let u;o&&o.length===n?u=o:(u=G.generateSecureRandomString(n),sessionStorage.setItem(s,u)),a(u)},[s,o,n]);const c=l.useCallback(()=>{sessionStorage.removeItem(s),a(void 0)},[s]);return[i,c]}function F(e,n=128,t="codeChallenge"){const s=E.makeOAuth2StorageKey(e,t),o=sessionStorage.getItem(s),[i,a]=l.useState();l.useEffect(()=>{let u;if(o){const r=JSON.parse(o);typeof r=="object"&&r&&"verifier"in r&&typeof r.verifier=="string"&&r.verifier.length===n&&"challenge"in r&&typeof r.challenge=="string"&&"method"in r&&r.method==="S256"&&(u={verifier:r.verifier,challenge:r.challenge,method:r.method})}u?a(u):E.generateOAuth2CodeChallenge(n).then(r=>{sessionStorage.setItem(s,JSON.stringify(r)),a(r)}).catch(r=>{r&&console.error(r)})},[s,o,n]);const c=l.useCallback(()=>{sessionStorage.removeItem(s),a(void 0)},[s]);return[i,c]}function X({provider:e,authUri:n,clientId:t,redirectUri:s,scope:o,responseType:i="code",accessType:a="offline",prompt:c,useSessionMetadata:u,useLoginMutation:r,onCreateSession:P,onRetrieveSession:j}){const[h,I]=D(e),[{verifier:p,challenge:b,method:M}={},R]=F(e),[N,{originalArgs:f={},isLoading:L,isError:K}]=r(),v=u(),_=O(),g=x({code:T.string(),state:T.string()})||{},d=q().state||{};if(l.useEffect(()=>{g.code&&g.state&&_(".",{replace:!0,next:!1,state:{code:g.code,state:g.state}})},[g.code,g.state,_]),l.useEffect(()=>{v?j(v):h&&p&&d.code&&d.state===h&&(f.code!==d.code||f.code_verifier!==p||f.redirect_uri!==s||!K)&&!L&&N({code:d.code,code_verifier:p,redirect_uri:s}).unwrap().then(P).catch(()=>{_(".",{replace:!0,state:{notifications:[{props:{error:!0,children:"Failed to login. Please try again."}}]}})}).finally(()=>{I(),R()})},[_,s,h,d.state,I,p,d.code,R,N,L,K,f.code,f.code_verifier,f.redirect_uri,v,P,j]),h&&b&&M){const A={client_id:t,redirect_uri:s,scope:o,response_type:i,access_type:a,state:h,code_challenge:b,code_challenge_method:M};return c&&(A.prompt=c),[n+"?"+new URLSearchParams(A).toString(),A]}return[]}const Y=e=>X("useSessionMetadata"in e?e:{...e,useSessionMetadata:m});exports.useLocation=q;exports.useNavigate=O;exports.useOAuth2=Y;exports.useOAuth2CodeChallenge=F;exports.useOAuth2State=D;exports.useParams=J;exports.useParamsRequired=Q;exports.useSearchParams=x;exports.useSession=W;exports.useSessionMetadata=m;
2
- //# sourceMappingURL=auth-Vf1MgMci.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth-Vf1MgMci.cjs","sources":["../src/hooks/router.tsx","../src/hooks/auth.tsx"],"sourcesContent":["import {\n type Location,\n type Params,\n type To,\n type NavigateOptions as _NavigateOptions,\n useLocation as _useLocation,\n useNavigate as _useNavigate,\n useParams as _useParams,\n useSearchParams as _useSearchParams,\n} from \"react-router-dom\"\nimport { type ObjectShape, object as objectSchema } from \"yup\"\nimport { type ReactNode, useEffect } from \"react\"\n\nimport {\n type ObjectSchemaFromShape,\n type TryValidateSyncOnErrorRT,\n type TryValidateSyncOptions,\n type TryValidateSyncRT,\n tryValidateSync,\n} from \"../utils/schema\"\nimport { type PageState } from \"../components/page\"\nimport { type ReadOnly } from \"../utils/router\"\n\nexport type NavigateOptions<\n State extends Record<string, any> = Record<string, any>,\n> = Omit<_NavigateOptions, \"state\"> & {\n state?: State & Partial<PageState>\n next?: boolean\n}\n\nexport type Navigate = {\n <State extends Record<string, any> = Record<string, any>>(\n to: To,\n options?: NavigateOptions<State>,\n ): void\n (delta: number): void\n}\n\nexport function useNavigate(): Navigate {\n const navigate = _useNavigate()\n const searchParams = useSearchParams()\n\n return (\n toOrDelta: To | number,\n options: (NavigateOptions & { next?: boolean }) | undefined = undefined,\n ) => {\n if (typeof toOrDelta === \"number\") navigate(toOrDelta)\n else {\n const { next = true, ..._options } = options || {}\n\n navigate(\n next && \"next\" in searchParams ? searchParams.next : toOrDelta,\n _options,\n )\n }\n }\n}\n\nexport function useLocation<State = {}>() {\n return _useLocation() as Location<null | Partial<PageState & State>>\n}\n\n// -----------------------------------------------------------------------------\n// Use Search Params\n// -----------------------------------------------------------------------------\n\nexport function useSearchParams(): { [k: string]: string }\n\nexport function useSearchParams<\n OnErrorRT extends TryValidateSyncOnErrorRT<ObjectSchemaFromShape<Shape>>,\n Shape extends ObjectShape = {},\n>(\n shape: Shape,\n validateOptions?: TryValidateSyncOptions<\n ObjectSchemaFromShape<Shape>,\n OnErrorRT\n >,\n): TryValidateSyncRT<ObjectSchemaFromShape<Shape>, OnErrorRT>\n\nexport function useSearchParams<\n OnErrorRT extends TryValidateSyncOnErrorRT<ObjectSchemaFromShape<Shape>>,\n Shape extends ObjectShape = {},\n>(\n shape?: Shape,\n validateOptions?: TryValidateSyncOptions<\n ObjectSchemaFromShape<Shape>,\n OnErrorRT\n >,\n) {\n const searchParams = Object.fromEntries(_useSearchParams()[0].entries())\n if (!shape) return searchParams\n\n return tryValidateSync(searchParams, objectSchema(shape), validateOptions)\n}\n\n// -----------------------------------------------------------------------------\n// Use Params\n// -----------------------------------------------------------------------------\n\nexport function useParams(): ReadOnly<Params<string>>\n\nexport function useParams<\n OnErrorRT extends TryValidateSyncOnErrorRT<ObjectSchemaFromShape<Shape>>,\n Shape extends ObjectShape = {},\n>(\n shape: Shape,\n validateOptions?: TryValidateSyncOptions<\n ObjectSchemaFromShape<Shape>,\n OnErrorRT\n >,\n): TryValidateSyncRT<ObjectSchemaFromShape<Shape>, OnErrorRT>\n\nexport function useParams<\n OnErrorRT extends TryValidateSyncOnErrorRT<ObjectSchemaFromShape<Shape>>,\n Shape extends ObjectShape = {},\n>(\n shape?: Shape,\n validateOptions?: TryValidateSyncOptions<\n ObjectSchemaFromShape<Shape>,\n OnErrorRT\n >,\n) {\n const params = _useParams()\n if (!shape) return params\n\n return tryValidateSync(params, objectSchema(shape), validateOptions)\n}\n\nexport function useParamsRequired<\n OnErrorRT extends TryValidateSyncOnErrorRT<ObjectSchemaFromShape<Shape>>,\n Shape extends ObjectShape = {},\n>({\n shape,\n children,\n onValidationError,\n onValidationSuccess = () => {},\n validateOptions,\n}: {\n shape: Shape\n children: (\n data: NonNullable<\n TryValidateSyncRT<ObjectSchemaFromShape<Shape>, OnErrorRT>\n >,\n ) => ReactNode\n onValidationError: (navigate: Navigate) => void\n onValidationSuccess?: (\n params: NonNullable<\n TryValidateSyncRT<ObjectSchemaFromShape<Shape>, OnErrorRT>\n >,\n ) => void\n validateOptions?: TryValidateSyncOptions<\n ObjectSchemaFromShape<Shape>,\n OnErrorRT\n >\n}) {\n const params = useParams(shape, validateOptions)\n const navigate = useNavigate()\n\n useEffect(\n () => {\n if (params) onValidationSuccess(params)\n else onValidationError(navigate)\n },\n [], // eslint-disable-line react-hooks/exhaustive-deps\n )\n\n return params ? children(params) : <></>\n}\n","import * as yup from \"yup\"\nimport { type ReactNode, useCallback, useEffect, useState } from \"react\"\nimport Cookies from \"js-cookie\"\nimport type { TypedUseMutation } from \"@reduxjs/toolkit/query/react\"\nimport { createSearchParams } from \"react-router-dom\"\n// eslint-disable-next-line @typescript-eslint/no-restricted-imports\nimport { useSelector } from \"react-redux\"\n\nimport { type AuthFactor, type User } from \"../api\"\nimport {\n type OAuth2CodeChallenge,\n type OAuth2CodeChallengeLengths,\n type OAuth2ReceiveCodeUrlSearchParams,\n type OAuth2RequestCodeUrlSearchParams,\n generateOAuth2CodeChallenge,\n makeOAuth2StorageKey,\n} from \"../utils/auth\"\nimport { useLocation, useNavigate, useSearchParams } from \"./router\"\nimport { type ExchangeOAuth2CodeArg } from \"../api/endpoints/session\"\nimport { SESSION_METADATA_COOKIE_NAME } from \"../settings\"\nimport { generateSecureRandomString } from \"../utils/general\"\nimport { selectIsLoggedIn } from \"../slices/session\"\n\n// -----------------------------------------------------------------------------\n// Session\n// -----------------------------------------------------------------------------\n\nexport interface SessionMetadata {\n user_id: User[\"id\"]\n user_type: \"teacher\" | \"student\" | \"indy\"\n auth_factors: Array<AuthFactor[\"type\"]>\n otp_bypass_token_exists: boolean\n}\n\nexport function useSessionMetadata<T = SessionMetadata>(\n cookieName = SESSION_METADATA_COOKIE_NAME,\n): T | undefined {\n return useSelector(selectIsLoggedIn)\n ? (JSON.parse(Cookies.get(cookieName)!) as T)\n : undefined\n}\n\n/**\n * A utility function to predefine a useSessionMetadata hook.\n * @param cookieName The name of the session metadata cookie.\n * @returns An object containing the session metadata.\n */\nuseSessionMetadata.predefine = <SessionMetadata,>(\n cookieName = SESSION_METADATA_COOKIE_NAME,\n) => {\n return () => useSessionMetadata<SessionMetadata>(cookieName)\n}\n\nexport type UseSessionChildrenFunction<Required extends boolean> = (\n metadata: Required extends true\n ? SessionMetadata\n : SessionMetadata | undefined,\n) => ReactNode\n\nexport type UseSessionChildren<\n UserType extends SessionMetadata[\"user_type\"] | undefined,\n> =\n | ReactNode\n | (UserType extends undefined\n ? UseSessionChildrenFunction<false>\n : UseSessionChildrenFunction<true>)\n\nexport type UseSessionOptions<\n UserType extends SessionMetadata[\"user_type\"] | undefined,\n> = Partial<{\n userType: UserType\n next: boolean\n}>\n\nexport function useSession<\n UserType extends SessionMetadata[\"user_type\"] | undefined = undefined,\n>(\n children: UseSessionChildren<UserType>,\n options: UseSessionOptions<UserType> = {},\n) {\n const { userType, next = true } = options\n\n const { pathname } = useLocation()\n const navigate = useNavigate()\n const sessionMetadata = useSessionMetadata()\n\n const loginRequired =\n userType && (!sessionMetadata || sessionMetadata.user_type !== userType)\n\n useEffect(() => {\n if (loginRequired) {\n navigate({\n pathname:\n \"/login\" +\n {\n teacher: \"/teacher\",\n student: \"/student\",\n indy: \"/independent\",\n }[userType],\n search: next\n ? createSearchParams({ next: pathname }).toString()\n : undefined,\n })\n }\n }, [navigate, loginRequired, userType, next, pathname])\n\n if (loginRequired) return <></>\n\n if (typeof children === \"function\") {\n return sessionMetadata\n ? (children as UseSessionChildrenFunction<true>)(sessionMetadata)\n : (children as UseSessionChildrenFunction<false>)(sessionMetadata)\n }\n\n return children\n}\n\n// -----------------------------------------------------------------------------\n// OAuth2\n// -----------------------------------------------------------------------------\n\nexport function useOAuth2State(\n provider: string,\n length: number = 32,\n storageKey: string = \"state\",\n): [string | undefined, () => void] {\n const oAuth2StorageKey = makeOAuth2StorageKey(provider, storageKey)\n const storageValue = sessionStorage.getItem(oAuth2StorageKey)\n\n const [_state, _setState] = useState<string>()\n\n useEffect(() => {\n let state: string\n if (storageValue && storageValue.length === length) {\n state = storageValue\n } else {\n state = generateSecureRandomString(length)\n sessionStorage.setItem(oAuth2StorageKey, state)\n }\n\n _setState(state)\n }, [oAuth2StorageKey, storageValue, length])\n\n const resetState = useCallback(() => {\n sessionStorage.removeItem(oAuth2StorageKey)\n _setState(undefined)\n }, [oAuth2StorageKey])\n\n return [_state, resetState]\n}\n\nexport function useOAuth2CodeChallenge(\n provider: string,\n length: OAuth2CodeChallengeLengths = 128,\n storageKey: string = \"codeChallenge\",\n): [OAuth2CodeChallenge | undefined, () => void] {\n const oAuth2StorageKey = makeOAuth2StorageKey(provider, storageKey)\n const storageValue = sessionStorage.getItem(oAuth2StorageKey)\n\n const [_codeChallenge, _setCodeChallenge] = useState<OAuth2CodeChallenge>()\n\n useEffect(() => {\n let codeChallenge: OAuth2CodeChallenge | undefined\n if (storageValue) {\n const storageJsonValue: unknown = JSON.parse(storageValue)\n if (\n typeof storageJsonValue === \"object\" &&\n storageJsonValue &&\n \"verifier\" in storageJsonValue &&\n typeof storageJsonValue.verifier == \"string\" &&\n storageJsonValue.verifier.length === length &&\n \"challenge\" in storageJsonValue &&\n typeof storageJsonValue.challenge === \"string\" &&\n \"method\" in storageJsonValue &&\n storageJsonValue.method === \"S256\"\n ) {\n codeChallenge = {\n verifier: storageJsonValue.verifier,\n challenge: storageJsonValue.challenge,\n method: storageJsonValue.method,\n }\n }\n }\n\n if (codeChallenge) _setCodeChallenge(codeChallenge)\n else {\n generateOAuth2CodeChallenge(length)\n .then(codeChallenge => {\n sessionStorage.setItem(\n oAuth2StorageKey,\n JSON.stringify(codeChallenge),\n )\n\n _setCodeChallenge(codeChallenge)\n })\n .catch(error => {\n if (error) console.error(error)\n })\n }\n }, [oAuth2StorageKey, storageValue, length])\n\n const resetCodeChallenge = useCallback(() => {\n sessionStorage.removeItem(oAuth2StorageKey)\n _setCodeChallenge(undefined)\n }, [oAuth2StorageKey])\n\n return [_codeChallenge, resetCodeChallenge]\n}\n\ninterface BaseUseOAuth2KwArgs<SessionMetadata> {\n provider: string\n authUri: string\n clientId: string\n redirectUri: string\n scope: string\n responseType?: \"code\"\n accessType?: \"offline\"\n prompt?: string\n useLoginMutation: TypedUseMutation<\n SessionMetadata,\n ExchangeOAuth2CodeArg,\n any\n >\n onCreateSession: (result: SessionMetadata) => void\n onRetrieveSession: (metadata: SessionMetadata) => void\n}\n\ninterface UseOAuth2KwArgs<SessionMetadata>\n extends BaseUseOAuth2KwArgs<SessionMetadata> {\n useSessionMetadata: () => SessionMetadata | undefined\n}\n\nexport type OAuth2 = [string, OAuth2RequestCodeUrlSearchParams] | []\n\n// https://datatracker.ietf.org/doc/html/rfc7636\nfunction useOAuth2Internal<SessionMetadata>({\n provider,\n authUri,\n clientId,\n redirectUri,\n scope,\n responseType = \"code\",\n accessType = \"offline\",\n prompt,\n useSessionMetadata,\n useLoginMutation,\n onCreateSession,\n onRetrieveSession,\n}: UseOAuth2KwArgs<SessionMetadata>): OAuth2 {\n const [state, resetState] = useOAuth2State(provider)\n const [\n {\n verifier: codeVerifier,\n challenge: codeChallenge,\n method: codeChallengeMethod,\n } = {},\n resetCodeChallenge,\n ] = useOAuth2CodeChallenge(provider)\n const [\n login,\n {\n originalArgs: loginArgs = {} as ExchangeOAuth2CodeArg,\n isLoading: loginIsLoading,\n isError: loginIsError,\n },\n ] = useLoginMutation()\n const sessionMetadata = useSessionMetadata()\n const navigate = useNavigate()\n const searchParams =\n useSearchParams({ code: yup.string(), state: yup.string() }) || {}\n const location = useLocation<OAuth2ReceiveCodeUrlSearchParams>()\n\n const locationState = location.state || {}\n\n useEffect(() => {\n // If the the auth provider has redirected back to our site with the\n // expected search params, we redirect to the current page to remove them.\n if (searchParams.code && searchParams.state) {\n navigate<OAuth2ReceiveCodeUrlSearchParams>(\".\", {\n // Removes the URL containing the search params from the history stack.\n replace: true,\n // Ensure we don't break the auth flow by navigating to another page.\n next: false,\n // Store the search params in the page's state instead.\n state: { code: searchParams.code, state: searchParams.state },\n })\n }\n }, [searchParams.code, searchParams.state, navigate])\n\n useEffect(() => {\n // If we're already logged in, no need to log in again.\n if (sessionMetadata) onRetrieveSession(sessionMetadata)\n else if (\n // If the state and code verifier have been generated...\n state &&\n codeVerifier &&\n // ...and the page's state contains a code...\n locationState.code &&\n // ...and the page's state contains the stored state...\n locationState.state === state &&\n // ...and the login endpoint was not called with the current values or has\n // not returned an error...\n (loginArgs.code !== locationState.code ||\n loginArgs.code_verifier !== codeVerifier ||\n loginArgs.redirect_uri !== redirectUri ||\n !loginIsError) &&\n // ...and the login endpoint is not currently being called...\n !loginIsLoading\n ) {\n // ...call the login endpoint.\n login({\n code: locationState.code,\n code_verifier: codeVerifier,\n redirect_uri: redirectUri,\n })\n .unwrap()\n .then(onCreateSession)\n .catch(() => {\n navigate(\".\", {\n replace: true,\n state: {\n notifications: [\n {\n props: {\n error: true,\n children: \"Failed to login. Please try again.\",\n },\n },\n ],\n },\n })\n })\n .finally(() => {\n resetState()\n resetCodeChallenge()\n })\n }\n }, [\n navigate,\n redirectUri,\n // State\n state,\n locationState.state,\n resetState,\n // Code\n codeVerifier,\n locationState.code,\n resetCodeChallenge,\n // Login\n login,\n loginIsLoading,\n loginIsError,\n loginArgs.code,\n loginArgs.code_verifier,\n loginArgs.redirect_uri,\n // Session\n sessionMetadata,\n onCreateSession,\n onRetrieveSession,\n ])\n\n if (state && codeChallenge && codeChallengeMethod) {\n const urlSearchParams: OAuth2RequestCodeUrlSearchParams = {\n client_id: clientId,\n redirect_uri: redirectUri,\n scope,\n response_type: responseType,\n access_type: accessType,\n state,\n code_challenge: codeChallenge,\n code_challenge_method: codeChallengeMethod,\n }\n\n if (prompt) urlSearchParams[\"prompt\"] = prompt\n\n return [\n authUri + \"?\" + new URLSearchParams(urlSearchParams).toString(),\n urlSearchParams,\n ]\n }\n\n return []\n}\n\nexport const useOAuth2: {\n <SessionMetadata>(kwargs: UseOAuth2KwArgs<SessionMetadata>): OAuth2\n (kwargs: BaseUseOAuth2KwArgs<SessionMetadata>): OAuth2\n} = <_SessionMetadata,>(\n kwargs:\n | UseOAuth2KwArgs<_SessionMetadata>\n | BaseUseOAuth2KwArgs<SessionMetadata>,\n): OAuth2 => {\n return useOAuth2Internal(\n // @ts-expect-error value is assignable\n \"useSessionMetadata\" in kwargs ? kwargs : { ...kwargs, useSessionMetadata },\n )\n}\n"],"names":["useNavigate","navigate","_useNavigate","searchParams","useSearchParams","toOrDelta","options","next","_options","useLocation","_useLocation","shape","validateOptions","_useSearchParams","tryValidateSync","objectSchema","useParams","params","_useParams","useParamsRequired","children","onValidationError","onValidationSuccess","useEffect","jsx","Fragment","useSessionMetadata","cookieName","SESSION_METADATA_COOKIE_NAME","useSelector","selectIsLoggedIn","Cookies","useSession","userType","pathname","sessionMetadata","loginRequired","createSearchParams","useOAuth2State","provider","length","storageKey","oAuth2StorageKey","makeOAuth2StorageKey","storageValue","_state","_setState","useState","state","generateSecureRandomString","resetState","useCallback","useOAuth2CodeChallenge","_codeChallenge","_setCodeChallenge","codeChallenge","storageJsonValue","generateOAuth2CodeChallenge","error","resetCodeChallenge","useOAuth2Internal","authUri","clientId","redirectUri","scope","responseType","accessType","prompt","useLoginMutation","onCreateSession","onRetrieveSession","codeVerifier","codeChallengeMethod","login","loginArgs","loginIsLoading","loginIsError","yup","locationState","urlSearchParams","useOAuth2","kwargs"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- "use strict";const t=require("./jsx-runtime-CeSfJrVB.cjs"),i=require("@mui/material"),B=require("./Image-mgT45r_B.cjs"),l=require("react"),E=require("react-router-dom"),j=require("@mui/icons-material"),u=require("./palette-CE2mKYse.cjs"),C=require("./auth-Vf1MgMci.cjs"),y=require("./LinkButton-BYFkvL_O.cjs"),b=require("yup"),_=require("./utils/schema.cjs.js"),m=({boxProps:s,...r})=>t.jsxRuntimeExports.jsx(i.Box,{...s,children:t.jsxRuntimeExports.jsx(i.Container,{...r})}),g=({open:s=!0,error:r=!1,onClose:p,children:e,bgcolor:n="secondary"})=>{const[c,a]=l.useState(s);if(l.useEffect(()=>{a(s)},[s]),!c)return t.jsxRuntimeExports.jsx(t.jsxRuntimeExports.Fragment,{});const x=u.palette[n].contrastText;return t.jsxRuntimeExports.jsx(m,{boxProps:{bgcolor:{secondary:"#ffd23b",tertiary:"#08bafc"}[n]},sx:{paddingY:"5px"},children:t.jsxRuntimeExports.jsxs(i.Stack,{direction:"row",alignItems:"center",gap:2,children:[r?t.jsxRuntimeExports.jsx(j.ErrorOutline,{htmlColor:x}):t.jsxRuntimeExports.jsx(j.InfoOutlined,{htmlColor:x}),t.jsxRuntimeExports.jsx(i.Typography,{variant:"body2",color:x,mb:0,children:e}),t.jsxRuntimeExports.jsx(i.IconButton,{style:{marginLeft:"auto"},onClick:()=>{a(!1),p!==void 0&&p()},children:t.jsxRuntimeExports.jsx(j.CloseOutlined,{htmlColor:x})})]})})},v=({children:s,session:r})=>{const{state:p}=E.useLocation();let{scroll:e,notifications:n}=p||{};return e=e||{x:0,y:0},n=n||[],l.useEffect(()=>{window.scroll(e.x,e.y)},[e.x,e.y]),t.jsxRuntimeExports.jsx(t.jsxRuntimeExports.Fragment,{children:C.useSession(c=>{if(typeof s=="function"&&(s=s(c)),n.length){const a=l.Children.toArray(s);return n.forEach((x,R)=>{a.splice(x.index??R,0,t.jsxRuntimeExports.jsx(g,{...x.props}))}),a}return s},r)})},S=({header:s,subheader:r,textAlign:p="start",imageProps:e,button1Props:n,button2Props:c,bgcolor:a="primary"})=>{const x=u.palette[a].contrastText;return t.jsxRuntimeExports.jsx(m,{boxProps:{bgcolor:{primary:u.primary[500],secondary:u.secondary[500],tertiary:u.tertiary[500]}[a]},sx:{paddingY:0},children:t.jsxRuntimeExports.jsxs(i.Stack,{direction:"row",alignItems:"center",justifyContent:p,gap:2,children:[t.jsxRuntimeExports.jsxs(i.Stack,{py:{xs:"80px",md:e!==void 0?0:"100px"},textAlign:p,children:[t.jsxRuntimeExports.jsx(i.Typography,{variant:"h2",color:x,mb:r!==void 0?void 0:0,children:s}),r!==void 0&&t.jsxRuntimeExports.jsx(i.Typography,{color:x,variant:"h4",mb:n!==void 0?void 0:0,children:r}),t.jsxRuntimeExports.jsxs(i.Stack,{direction:"row",gap:2,children:[n!==void 0&&t.jsxRuntimeExports.jsx(y.LinkButton,{...n}),c!==void 0&&t.jsxRuntimeExports.jsx(y.LinkButton,{...c})]})]}),e!==void 0&&t.jsxRuntimeExports.jsx(B.Image,{...e,display:{xs:"none",md:"block"},maxWidth:"320px",marginLeft:"auto"})]})})},T=({header:s,tabs:r,originalPath:p,value:e=0})=>{const n=E.useParams(),c=E.useNavigate(),[a,x]=l.useState(e<0?0:e>=r.length?r.length-1:e),R=r.map(o=>o.label),q=r.map(o=>o.children),d=r.map(o=>o.path);return l.useEffect(()=>{x(e)},[e]),l.useEffect(()=>{const o=_.tryValidateSync(n,b.object({tab:b.string().oneOf(d).required()}))?.tab;o!==void 0&&x(d.indexOf(o))},[n,d]),t.jsxRuntimeExports.jsxs(t.jsxRuntimeExports.Fragment,{children:[t.jsxRuntimeExports.jsx(m,{boxProps:{bgcolor:u.primary[500]},sx:{paddingY:"100px"},className:"flex-center",children:t.jsxRuntimeExports.jsx(i.Typography,{textAlign:"center",variant:"h2",style:{color:"white"},mb:0,children:s})}),t.jsxRuntimeExports.jsx(m,{boxProps:{bgcolor:u.primary[300]},sx:{paddingY:"6px"},className:"flex-center",children:t.jsxRuntimeExports.jsx(i.Tabs,{value:a,onChange:(o,h)=>{c(E.generatePath(p,{tab:d[h]}))},ScrollButtonComponent:({disabled:o,onClick:h,direction:f})=>t.jsxRuntimeExports.jsx(t.jsxRuntimeExports.Fragment,{children:o===!1&&t.jsxRuntimeExports.jsx(i.IconButton,{onClick:h,style:{padding:0,[f==="left"?"marginRight":"marginLeft"]:"15px",color:"white"},children:f==="left"?t.jsxRuntimeExports.jsx(t.jsxRuntimeExports.Fragment,{children:t.jsxRuntimeExports.jsx(j.ChevronLeft,{})}):t.jsxRuntimeExports.jsx(t.jsxRuntimeExports.Fragment,{children:t.jsxRuntimeExports.jsx(j.ChevronRight,{})})})}),children:R.map(o=>t.jsxRuntimeExports.jsx(i.Tab,{disableRipple:!0,label:o},o))})}),q[a]]})},k=Object.freeze(Object.defineProperty({__proto__:null,Banner:S,Notification:g,Page:v,Section:m,TabBar:T},Symbol.toStringTag,{value:"Module"}));exports.Banner=S;exports.Notification=g;exports.Page=v;exports.Section=m;exports.TabBar=T;exports.index=k;
2
- //# sourceMappingURL=index-BgsynEGX.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-BgsynEGX.cjs","sources":["../src/components/page/Section.tsx","../src/components/page/Notification.tsx","../src/components/page/Page.tsx","../src/components/page/Banner.tsx","../src/components/page/TabBar.tsx"],"sourcesContent":["import {\n Box,\n type BoxProps,\n Container,\n type ContainerProps,\n} from \"@mui/material\"\nimport type { FC } from \"react\"\n\nexport interface SectionProps extends ContainerProps {\n boxProps?: Omit<BoxProps, \"children\">\n}\n\nconst Section: FC<SectionProps> = ({ boxProps, ...containerProps }) => {\n return (\n <Box {...boxProps}>\n <Container {...containerProps} />\n </Box>\n )\n}\n\nexport default Section\n","import {\n CloseOutlined as CloseOutlinedIcon,\n ErrorOutline as ErrorOutlineIcon,\n InfoOutlined as InfoOutlinedIcon,\n} from \"@mui/icons-material\"\nimport { type FC, type ReactNode, useEffect, useState } from \"react\"\nimport { IconButton, Stack, Typography } from \"@mui/material\"\n\nimport Section from \"./Section\"\nimport palette from \"../../theme/palette\"\n\nexport interface NotificationProps {\n open?: boolean\n error?: boolean\n onClose?: () => void\n children: ReactNode\n bgcolor?: \"secondary\" | \"tertiary\"\n}\n\nconst Notification: FC<NotificationProps> = ({\n open = true,\n error = false,\n onClose,\n children,\n bgcolor = \"secondary\",\n}) => {\n const [_open, _setOpen] = useState(open)\n\n useEffect(() => {\n _setOpen(open)\n }, [open])\n\n if (!_open) return <></>\n\n // @ts-expect-error guaranteed to be in palette\n const contrastText = palette[bgcolor].contrastText as string\n\n return (\n <Section\n boxProps={{\n bgcolor: {\n secondary: \"#ffd23b\",\n tertiary: \"#08bafc\",\n }[bgcolor],\n }}\n sx={{ paddingY: \"5px\" }}\n >\n <Stack direction=\"row\" alignItems=\"center\" gap={2}>\n {error ? (\n <ErrorOutlineIcon htmlColor={contrastText} />\n ) : (\n <InfoOutlinedIcon htmlColor={contrastText} />\n )}\n <Typography variant=\"body2\" color={contrastText} mb={0}>\n {children}\n </Typography>\n <IconButton\n style={{ marginLeft: \"auto\" }}\n onClick={() => {\n _setOpen(false)\n if (onClose !== undefined) onClose()\n }}\n >\n <CloseOutlinedIcon htmlColor={contrastText} />\n </IconButton>\n </Stack>\n </Section>\n )\n}\n\nexport default Notification\n","import { Children, type JSX, useEffect } from \"react\"\nimport { type Location, useLocation } from \"react-router-dom\"\n\nimport Notification, { type NotificationProps } from \"./Notification\"\nimport {\n type SessionMetadata,\n type UseSessionChildren,\n type UseSessionChildrenFunction,\n type UseSessionOptions,\n useSession,\n} from \"../../hooks/auth\"\n\nexport type PageState = {\n notifications: Array<{\n index?: number\n props: NotificationProps\n }>\n scroll: { x: number; y: number }\n}\n\nexport interface PageProps<\n SessionUserType extends SessionMetadata[\"user_type\"] | undefined,\n> {\n children: UseSessionChildren<SessionUserType>\n session?: UseSessionOptions<SessionUserType>\n}\n\nconst Page = <\n SessionUserType extends SessionMetadata[\"user_type\"] | undefined = undefined,\n>({\n children,\n session,\n}: PageProps<SessionUserType>): JSX.Element => {\n const { state } = useLocation() as Location<null | Partial<PageState>>\n\n let { scroll, notifications } = state || {}\n scroll = scroll || { x: 0, y: 0 }\n notifications = notifications || []\n\n useEffect(() => {\n window.scroll(scroll.x, scroll.y)\n }, [scroll.x, scroll.y])\n\n return (\n <>\n {useSession((metadata?: SessionMetadata) => {\n if (typeof children === \"function\") {\n children = metadata\n ? (children as UseSessionChildrenFunction<true>)(metadata)\n : (children as UseSessionChildrenFunction<false>)(metadata)\n }\n\n if (notifications.length) {\n const childrenArray = Children.toArray(children)\n\n notifications.forEach((notification, index) => {\n void childrenArray.splice(\n notification.index ?? index,\n 0,\n <Notification {...notification.props} />,\n )\n })\n\n return childrenArray\n }\n\n return children\n }, session)}\n </>\n )\n}\n\nexport default Page\n","import { Stack, Typography } from \"@mui/material\"\n\nimport Image, { type ImageProps } from \"../Image\"\nimport { LinkButton, type LinkButtonProps } from \"../router\"\nimport { primary, secondary, tertiary } from \"../../theme/colors\"\nimport Section from \"./Section\"\nimport palette from \"../../theme/palette\"\n\nexport interface BannerProps<\n Button1State extends Record<string, any> = Record<string, any>,\n Button2State extends Record<string, any> = Record<string, any>,\n> {\n header: string\n subheader?: string\n textAlign?: \"start\" | \"center\"\n imageProps?: ImageProps\n button1Props?: LinkButtonProps<\"to\", Button1State>\n button2Props?: LinkButtonProps<\"to\", Button2State>\n bgcolor?: \"primary\" | \"secondary\" | \"tertiary\"\n}\n\nconst Banner = <\n Button1State extends Record<string, any> = Record<string, any>,\n Button2State extends Record<string, any> = Record<string, any>,\n>({\n header,\n subheader,\n textAlign = \"start\",\n imageProps,\n button1Props,\n button2Props,\n bgcolor = \"primary\",\n}: BannerProps<Button1State, Button2State>) => {\n // @ts-expect-error guaranteed to be in palette\n const contrastText = palette[bgcolor].contrastText as string\n\n return (\n <Section\n boxProps={{\n bgcolor: {\n primary: primary[500],\n secondary: secondary[500],\n tertiary: tertiary[500],\n }[bgcolor],\n }}\n sx={{ paddingY: 0 }}\n >\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n justifyContent={textAlign}\n gap={2}\n >\n <Stack\n py={{\n xs: \"80px\",\n md: imageProps !== undefined ? 0 : \"100px\",\n }}\n textAlign={textAlign}\n >\n <Typography\n variant=\"h2\"\n color={contrastText}\n mb={subheader !== undefined ? undefined : 0}\n >\n {header}\n </Typography>\n {subheader !== undefined && (\n <Typography\n color={contrastText}\n variant=\"h4\"\n mb={button1Props !== undefined ? undefined : 0}\n >\n {subheader}\n </Typography>\n )}\n <Stack direction=\"row\" gap={2}>\n {button1Props !== undefined && <LinkButton {...button1Props} />}\n {button2Props !== undefined && <LinkButton {...button2Props} />}\n </Stack>\n </Stack>\n {imageProps !== undefined && (\n <Image\n {...imageProps}\n display={{ xs: \"none\", md: \"block\" }}\n maxWidth=\"320px\"\n marginLeft=\"auto\"\n />\n )}\n </Stack>\n </Section>\n )\n}\n\nexport default Banner\n","import {\n ChevronLeft as ChevronLeftIcon,\n ChevronRight as ChevronRightIcon,\n} from \"@mui/icons-material\"\nimport { type FC, type ReactNode, useEffect, useState } from \"react\"\nimport {\n IconButton,\n Tab,\n type TabScrollButtonProps,\n Tabs,\n Typography,\n} from \"@mui/material\"\nimport { object as YupObject, string as YupString } from \"yup\"\nimport { generatePath, useNavigate, useParams } from \"react-router-dom\"\n\nimport Section from \"./Section\"\nimport { primary } from \"../../theme/colors\"\nimport { tryValidateSync } from \"../../utils/schema\"\n\nexport interface TabBarProps {\n header: string\n tabs: Array<{\n label: string\n children: ReactNode\n path: string\n }>\n originalPath: string\n value?: number\n}\n\nconst TabBar: FC<TabBarProps> = ({ header, tabs, originalPath, value = 0 }) => {\n const params = useParams()\n const navigate = useNavigate()\n const [_value, _setValue] = useState(\n value < 0 ? 0 : value >= tabs.length ? tabs.length - 1 : value,\n )\n\n const labels = tabs.map(tab => tab.label)\n const children = tabs.map(tab => tab.children)\n const paths = tabs.map(tab => tab.path)\n\n useEffect(() => {\n _setValue(value)\n }, [value])\n\n useEffect(() => {\n const tab = tryValidateSync(\n params,\n YupObject({\n tab: YupString().oneOf(paths).required(),\n }),\n )?.tab\n\n if (tab !== undefined) {\n _setValue(paths.indexOf(tab))\n }\n }, [params, paths])\n\n return (\n <>\n <Section\n boxProps={{ bgcolor: primary[500] }}\n sx={{ paddingY: \"100px\" }}\n className=\"flex-center\"\n >\n <Typography\n textAlign=\"center\"\n variant=\"h2\"\n style={{ color: \"white\" }}\n mb={0}\n >\n {header}\n </Typography>\n </Section>\n <Section\n boxProps={{ bgcolor: primary[300] }}\n sx={{ paddingY: \"6px\" }}\n className=\"flex-center\"\n >\n <Tabs\n value={_value}\n onChange={(_, value: number) => {\n navigate(\n generatePath(originalPath, {\n tab: paths[value],\n }),\n )\n }}\n ScrollButtonComponent={({\n disabled,\n onClick,\n direction,\n }: TabScrollButtonProps) => {\n return (\n <>\n {disabled === false && (\n <IconButton\n onClick={onClick}\n style={{\n padding: 0,\n [direction === \"left\" ? \"marginRight\" : \"marginLeft\"]:\n \"15px\",\n color: \"white\",\n }}\n >\n {direction === \"left\" ? (\n <>\n <ChevronLeftIcon />\n </>\n ) : (\n <>\n <ChevronRightIcon />\n </>\n )}\n </IconButton>\n )}\n </>\n )\n }}\n >\n {labels.map(label => (\n <Tab disableRipple key={label} label={label} />\n ))}\n </Tabs>\n </Section>\n {children[_value]}\n </>\n )\n}\n\nexport default TabBar\n"],"names":["Section","boxProps","containerProps","jsx","Box","Container","Notification","open","error","onClose","children","bgcolor","_open","_setOpen","useState","useEffect","Fragment","contrastText","palette","Stack","ErrorOutlineIcon","InfoOutlinedIcon","Typography","IconButton","CloseOutlinedIcon","Page","session","state","useLocation","scroll","notifications","useSession","metadata","childrenArray","Children","notification","index","Banner","header","subheader","textAlign","imageProps","button1Props","button2Props","primary","secondary","tertiary","jsxs","LinkButton","Image","TabBar","tabs","originalPath","value","params","useParams","navigate","useNavigate","_value","_setValue","labels","tab","paths","tryValidateSync","YupObject","YupString","Tabs","_","generatePath","disabled","onClick","direction","ChevronLeftIcon","ChevronRightIcon","label","Tab"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-DkM_cG3a.js","sources":["../src/components/page/Section.tsx","../src/components/page/Notification.tsx","../src/components/page/Page.tsx","../src/components/page/Banner.tsx","../src/components/page/TabBar.tsx"],"sourcesContent":["import {\n Box,\n type BoxProps,\n Container,\n type ContainerProps,\n} from \"@mui/material\"\nimport type { FC } from \"react\"\n\nexport interface SectionProps extends ContainerProps {\n boxProps?: Omit<BoxProps, \"children\">\n}\n\nconst Section: FC<SectionProps> = ({ boxProps, ...containerProps }) => {\n return (\n <Box {...boxProps}>\n <Container {...containerProps} />\n </Box>\n )\n}\n\nexport default Section\n","import {\n CloseOutlined as CloseOutlinedIcon,\n ErrorOutline as ErrorOutlineIcon,\n InfoOutlined as InfoOutlinedIcon,\n} from \"@mui/icons-material\"\nimport { type FC, type ReactNode, useEffect, useState } from \"react\"\nimport { IconButton, Stack, Typography } from \"@mui/material\"\n\nimport Section from \"./Section\"\nimport palette from \"../../theme/palette\"\n\nexport interface NotificationProps {\n open?: boolean\n error?: boolean\n onClose?: () => void\n children: ReactNode\n bgcolor?: \"secondary\" | \"tertiary\"\n}\n\nconst Notification: FC<NotificationProps> = ({\n open = true,\n error = false,\n onClose,\n children,\n bgcolor = \"secondary\",\n}) => {\n const [_open, _setOpen] = useState(open)\n\n useEffect(() => {\n _setOpen(open)\n }, [open])\n\n if (!_open) return <></>\n\n // @ts-expect-error guaranteed to be in palette\n const contrastText = palette[bgcolor].contrastText as string\n\n return (\n <Section\n boxProps={{\n bgcolor: {\n secondary: \"#ffd23b\",\n tertiary: \"#08bafc\",\n }[bgcolor],\n }}\n sx={{ paddingY: \"5px\" }}\n >\n <Stack direction=\"row\" alignItems=\"center\" gap={2}>\n {error ? (\n <ErrorOutlineIcon htmlColor={contrastText} />\n ) : (\n <InfoOutlinedIcon htmlColor={contrastText} />\n )}\n <Typography variant=\"body2\" color={contrastText} mb={0}>\n {children}\n </Typography>\n <IconButton\n style={{ marginLeft: \"auto\" }}\n onClick={() => {\n _setOpen(false)\n if (onClose !== undefined) onClose()\n }}\n >\n <CloseOutlinedIcon htmlColor={contrastText} />\n </IconButton>\n </Stack>\n </Section>\n )\n}\n\nexport default Notification\n","import { Children, type JSX, useEffect } from \"react\"\nimport { type Location, useLocation } from \"react-router-dom\"\n\nimport Notification, { type NotificationProps } from \"./Notification\"\nimport {\n type SessionMetadata,\n type UseSessionChildren,\n type UseSessionChildrenFunction,\n type UseSessionOptions,\n useSession,\n} from \"../../hooks/auth\"\n\nexport type PageState = {\n notifications: Array<{\n index?: number\n props: NotificationProps\n }>\n scroll: { x: number; y: number }\n}\n\nexport interface PageProps<\n SessionUserType extends SessionMetadata[\"user_type\"] | undefined,\n> {\n children: UseSessionChildren<SessionUserType>\n session?: UseSessionOptions<SessionUserType>\n}\n\nconst Page = <\n SessionUserType extends SessionMetadata[\"user_type\"] | undefined = undefined,\n>({\n children,\n session,\n}: PageProps<SessionUserType>): JSX.Element => {\n const { state } = useLocation() as Location<null | Partial<PageState>>\n\n let { scroll, notifications } = state || {}\n scroll = scroll || { x: 0, y: 0 }\n notifications = notifications || []\n\n useEffect(() => {\n window.scroll(scroll.x, scroll.y)\n }, [scroll.x, scroll.y])\n\n return (\n <>\n {useSession((metadata?: SessionMetadata) => {\n if (typeof children === \"function\") {\n children = metadata\n ? (children as UseSessionChildrenFunction<true>)(metadata)\n : (children as UseSessionChildrenFunction<false>)(metadata)\n }\n\n if (notifications.length) {\n const childrenArray = Children.toArray(children)\n\n notifications.forEach((notification, index) => {\n void childrenArray.splice(\n notification.index ?? index,\n 0,\n <Notification {...notification.props} />,\n )\n })\n\n return childrenArray\n }\n\n return children\n }, session)}\n </>\n )\n}\n\nexport default Page\n","import { Stack, Typography } from \"@mui/material\"\n\nimport Image, { type ImageProps } from \"../Image\"\nimport { LinkButton, type LinkButtonProps } from \"../router\"\nimport { primary, secondary, tertiary } from \"../../theme/colors\"\nimport Section from \"./Section\"\nimport palette from \"../../theme/palette\"\n\nexport interface BannerProps<\n Button1State extends Record<string, any> = Record<string, any>,\n Button2State extends Record<string, any> = Record<string, any>,\n> {\n header: string\n subheader?: string\n textAlign?: \"start\" | \"center\"\n imageProps?: ImageProps\n button1Props?: LinkButtonProps<\"to\", Button1State>\n button2Props?: LinkButtonProps<\"to\", Button2State>\n bgcolor?: \"primary\" | \"secondary\" | \"tertiary\"\n}\n\nconst Banner = <\n Button1State extends Record<string, any> = Record<string, any>,\n Button2State extends Record<string, any> = Record<string, any>,\n>({\n header,\n subheader,\n textAlign = \"start\",\n imageProps,\n button1Props,\n button2Props,\n bgcolor = \"primary\",\n}: BannerProps<Button1State, Button2State>) => {\n // @ts-expect-error guaranteed to be in palette\n const contrastText = palette[bgcolor].contrastText as string\n\n return (\n <Section\n boxProps={{\n bgcolor: {\n primary: primary[500],\n secondary: secondary[500],\n tertiary: tertiary[500],\n }[bgcolor],\n }}\n sx={{ paddingY: 0 }}\n >\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n justifyContent={textAlign}\n gap={2}\n >\n <Stack\n py={{\n xs: \"80px\",\n md: imageProps !== undefined ? 0 : \"100px\",\n }}\n textAlign={textAlign}\n >\n <Typography\n variant=\"h2\"\n color={contrastText}\n mb={subheader !== undefined ? undefined : 0}\n >\n {header}\n </Typography>\n {subheader !== undefined && (\n <Typography\n color={contrastText}\n variant=\"h4\"\n mb={button1Props !== undefined ? undefined : 0}\n >\n {subheader}\n </Typography>\n )}\n <Stack direction=\"row\" gap={2}>\n {button1Props !== undefined && <LinkButton {...button1Props} />}\n {button2Props !== undefined && <LinkButton {...button2Props} />}\n </Stack>\n </Stack>\n {imageProps !== undefined && (\n <Image\n {...imageProps}\n display={{ xs: \"none\", md: \"block\" }}\n maxWidth=\"320px\"\n marginLeft=\"auto\"\n />\n )}\n </Stack>\n </Section>\n )\n}\n\nexport default Banner\n","import {\n ChevronLeft as ChevronLeftIcon,\n ChevronRight as ChevronRightIcon,\n} from \"@mui/icons-material\"\nimport { type FC, type ReactNode, useEffect, useState } from \"react\"\nimport {\n IconButton,\n Tab,\n type TabScrollButtonProps,\n Tabs,\n Typography,\n} from \"@mui/material\"\nimport { object as YupObject, string as YupString } from \"yup\"\nimport { generatePath, useNavigate, useParams } from \"react-router-dom\"\n\nimport Section from \"./Section\"\nimport { primary } from \"../../theme/colors\"\nimport { tryValidateSync } from \"../../utils/schema\"\n\nexport interface TabBarProps {\n header: string\n tabs: Array<{\n label: string\n children: ReactNode\n path: string\n }>\n originalPath: string\n value?: number\n}\n\nconst TabBar: FC<TabBarProps> = ({ header, tabs, originalPath, value = 0 }) => {\n const params = useParams()\n const navigate = useNavigate()\n const [_value, _setValue] = useState(\n value < 0 ? 0 : value >= tabs.length ? tabs.length - 1 : value,\n )\n\n const labels = tabs.map(tab => tab.label)\n const children = tabs.map(tab => tab.children)\n const paths = tabs.map(tab => tab.path)\n\n useEffect(() => {\n _setValue(value)\n }, [value])\n\n useEffect(() => {\n const tab = tryValidateSync(\n params,\n YupObject({\n tab: YupString().oneOf(paths).required(),\n }),\n )?.tab\n\n if (tab !== undefined) {\n _setValue(paths.indexOf(tab))\n }\n }, [params, paths])\n\n return (\n <>\n <Section\n boxProps={{ bgcolor: primary[500] }}\n sx={{ paddingY: \"100px\" }}\n className=\"flex-center\"\n >\n <Typography\n textAlign=\"center\"\n variant=\"h2\"\n style={{ color: \"white\" }}\n mb={0}\n >\n {header}\n </Typography>\n </Section>\n <Section\n boxProps={{ bgcolor: primary[300] }}\n sx={{ paddingY: \"6px\" }}\n className=\"flex-center\"\n >\n <Tabs\n value={_value}\n onChange={(_, value: number) => {\n navigate(\n generatePath(originalPath, {\n tab: paths[value],\n }),\n )\n }}\n ScrollButtonComponent={({\n disabled,\n onClick,\n direction,\n }: TabScrollButtonProps) => {\n return (\n <>\n {disabled === false && (\n <IconButton\n onClick={onClick}\n style={{\n padding: 0,\n [direction === \"left\" ? \"marginRight\" : \"marginLeft\"]:\n \"15px\",\n color: \"white\",\n }}\n >\n {direction === \"left\" ? (\n <>\n <ChevronLeftIcon />\n </>\n ) : (\n <>\n <ChevronRightIcon />\n </>\n )}\n </IconButton>\n )}\n </>\n )\n }}\n >\n {labels.map(label => (\n <Tab disableRipple key={label} label={label} />\n ))}\n </Tabs>\n </Section>\n {children[_value]}\n </>\n )\n}\n\nexport default TabBar\n"],"names":["Section","boxProps","containerProps","jsx","Box","Container","Notification","open","error","onClose","children","bgcolor","_open","_setOpen","useState","useEffect","Fragment","contrastText","palette","Stack","ErrorOutlineIcon","InfoOutlinedIcon","Typography","IconButton","CloseOutlinedIcon","Page","session","state","useLocation","scroll","notifications","useSession","metadata","childrenArray","Children","notification","index","Banner","header","subheader","textAlign","imageProps","button1Props","button2Props","primary","secondary","tertiary","jsxs","LinkButton","Image","TabBar","tabs","originalPath","value","params","useParams","navigate","useNavigate","_value","_setValue","labels","tab","paths","tryValidateSync","YupObject","YupString","Tabs","_","generatePath","disabled","onClick","direction","ChevronLeftIcon","ChevronRightIcon","label","Tab"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- "use strict";const i=require("@mui/material"),a={500:"#E0004D",400:"#EE0857",300:"#FA1664"},c={500:"#F6BE00"},n={500:"#00A3E0"},{palette:{augmentColor:t}}=i.createTheme(),r={main:a[500],contrastText:"#fff"},e={main:n[500],contrastText:"#fff"},o={main:c[500],contrastText:"#000"},s={primary:r,teacher:t({color:r}),secondary:o,indy:t({color:o}),tertiary:t({color:e}),student:t({color:e}),white:t({color:{main:"#fff"}}),black:t({color:{main:"#000"}}),info:{main:"#f1ecec"},error:{main:"#d50000"}};exports.palette=s;exports.primary=a;exports.secondary=c;exports.tertiary=n;
2
- //# sourceMappingURL=palette-CE2mKYse.cjs.map