_layout.tsx 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. import { useEffect, useMemo } from "react";
  2. import useSWR, { SWRConfig } from "swr";
  3. import { Route, Routes } from "react-router-dom";
  4. import { useRecoilState } from "recoil";
  5. import { createTheme, List, Paper, ThemeProvider } from "@mui/material";
  6. import { atomPaletteMode } from "../states/setting";
  7. import { getVergeConfig } from "../services/command";
  8. import LogoSvg from "../assets/image/logo.svg";
  9. import LogPage from "../pages/log";
  10. import HomePage from "../pages/home";
  11. import RulesPage from "../pages/rules";
  12. import ProxyPage from "../pages/proxy";
  13. import SettingPage from "../pages/setting";
  14. import ConnectionsPage from "../pages/connections";
  15. import ListItemLink from "../components/list-item-link";
  16. import Traffic from "../components/traffic";
  17. const routers = [
  18. {
  19. label: "代理",
  20. link: "/proxy",
  21. },
  22. {
  23. label: "规则",
  24. link: "/rules",
  25. },
  26. {
  27. label: "连接",
  28. link: "/connections",
  29. },
  30. {
  31. label: "日志",
  32. link: "/log",
  33. },
  34. {
  35. label: "设置",
  36. link: "/setting",
  37. },
  38. ];
  39. const Layout = () => {
  40. const [mode, setMode] = useRecoilState(atomPaletteMode);
  41. const { data: vergeConfig } = useSWR("getVergeConfig", getVergeConfig);
  42. useEffect(() => {
  43. setMode(vergeConfig?.theme_mode ?? "light");
  44. }, [vergeConfig?.theme_mode]);
  45. const theme = useMemo(() => {
  46. if (mode === "light") {
  47. document.documentElement.style.background = "#f5f5f5";
  48. document.documentElement.style.setProperty(
  49. "--selection-color",
  50. "#f5f5f5"
  51. );
  52. } else {
  53. document.documentElement.style.background = "#000";
  54. document.documentElement.style.setProperty(
  55. "--selection-color",
  56. "#d5d5d5"
  57. );
  58. }
  59. return createTheme({
  60. breakpoints: {
  61. values: {
  62. xs: 0,
  63. sm: 650,
  64. md: 900,
  65. lg: 1200,
  66. xl: 1536,
  67. },
  68. },
  69. palette: {
  70. mode,
  71. primary: {
  72. main: "#5b5c9d",
  73. },
  74. text: {
  75. primary: "#637381",
  76. secondary: "#909399",
  77. },
  78. },
  79. });
  80. }, [mode]);
  81. return (
  82. <SWRConfig value={{}}>
  83. <ThemeProvider theme={theme}>
  84. <Paper square elevation={0} className="layout">
  85. <div className="layout__sidebar">
  86. <div className="layout__logo">
  87. <img src={LogoSvg} width="100%" alt="" />
  88. </div>
  89. <List sx={{ userSelect: "none" }}>
  90. {routers.map((router) => (
  91. <ListItemLink key={router.label} to={router.link}>
  92. {router.label}
  93. </ListItemLink>
  94. ))}
  95. </List>
  96. <div className="layout__traffic">
  97. <Traffic />
  98. </div>
  99. </div>
  100. <div className="layout__content">
  101. <Routes>
  102. <Route path="/" element={<HomePage />} />
  103. <Route path="/proxy" element={<ProxyPage />} />
  104. <Route path="/rules" element={<RulesPage />} />
  105. <Route path="/log" element={<LogPage />} />
  106. <Route path="/connections" element={<ConnectionsPage />} />
  107. <Route path="/setting" element={<SettingPage />} />
  108. </Routes>
  109. </div>
  110. </Paper>
  111. </ThemeProvider>
  112. </SWRConfig>
  113. );
  114. };
  115. export default Layout;