_layout.tsx 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. import { useMemo } from "react";
  2. import { Route, Routes } from "react-router-dom";
  3. import { useRecoilValue } from "recoil";
  4. import {
  5. createTheme,
  6. List,
  7. Paper,
  8. ThemeProvider,
  9. Typography,
  10. } from "@mui/material";
  11. import { atomPaletteMode } from "../states/setting";
  12. import LogPage from "../pages/log";
  13. import HomePage from "../pages/home";
  14. import ProxyPage from "../pages/proxy";
  15. import SettingPage from "../pages/setting";
  16. import ProfilesPage from "../pages/profiles";
  17. import ConnectionsPage from "../pages/connections";
  18. import ListItemLink from "../components/list-item-link";
  19. import Traffic from "../components/traffic";
  20. const Layout = () => {
  21. const paletteMode = useRecoilValue(atomPaletteMode);
  22. const routers = [
  23. {
  24. label: "代理",
  25. link: "/proxy",
  26. },
  27. {
  28. label: "规则",
  29. link: "/profiles",
  30. },
  31. {
  32. label: "连接",
  33. link: "/connections",
  34. },
  35. {
  36. label: "日志",
  37. link: "/log",
  38. },
  39. {
  40. label: "设置",
  41. link: "/setting",
  42. },
  43. ];
  44. const theme = useMemo(() => {
  45. const bgcolor = paletteMode === "light" ? "#f5f5f5" : "#000";
  46. document.documentElement.style.background = bgcolor;
  47. return createTheme({
  48. palette: {
  49. mode: paletteMode,
  50. primary: {
  51. main: "#5b5c9d",
  52. },
  53. text: {
  54. primary: "#637381",
  55. secondary: "#909399",
  56. },
  57. },
  58. });
  59. }, [paletteMode]);
  60. return (
  61. <ThemeProvider theme={theme}>
  62. <Paper square elevation={0} className="layout">
  63. <div className="layout__sidebar">
  64. <Typography
  65. variant="h3"
  66. component="h1"
  67. sx={{ my: 2, px: 2, textAlign: "center", userSelect: "none" }}
  68. >
  69. Clash Verge
  70. </Typography>
  71. <List sx={{ userSelect: "none" }}>
  72. {routers.map((router) => (
  73. <ListItemLink key={router.label} to={router.link}>
  74. {router.label}
  75. </ListItemLink>
  76. ))}
  77. </List>
  78. <div className="layout__traffic">
  79. <Traffic />
  80. </div>
  81. </div>
  82. <div className="layout__content">
  83. <Routes>
  84. <Route path="/" element={<HomePage />} />
  85. <Route path="/proxy" element={<ProxyPage />} />
  86. <Route path="/profiles" element={<ProfilesPage />} />
  87. <Route path="/log" element={<LogPage />} />
  88. <Route path="/connections" element={<ConnectionsPage />} />
  89. <Route path="/setting" element={<SettingPage />} />
  90. </Routes>
  91. </div>
  92. </Paper>
  93. </ThemeProvider>
  94. );
  95. };
  96. export default Layout;