proxies.tsx 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import useSWR from "swr";
  2. import { useEffect, useMemo } from "react";
  3. import { useLockFn } from "ahooks";
  4. import { useTranslation } from "react-i18next";
  5. import { Box, Button, ButtonGroup, Paper } from "@mui/material";
  6. import {
  7. closeAllConnections,
  8. getClashConfig,
  9. updateConfigs,
  10. } from "@/services/api";
  11. import { patchClashConfig } from "@/services/cmds";
  12. import { useVerge } from "@/hooks/use-verge";
  13. import { BasePage } from "@/components/base";
  14. import { ProxyGroups } from "@/components/proxy/proxy-groups";
  15. import { ProviderButton } from "@/components/proxy/provider-button";
  16. const ProxyPage = () => {
  17. const { t } = useTranslation();
  18. const { data: clashConfig, mutate: mutateClash } = useSWR(
  19. "getClashConfig",
  20. getClashConfig
  21. );
  22. const { verge } = useVerge();
  23. const modeList = useMemo(() => {
  24. if (verge?.clash_core === "clash-meta") {
  25. return ["rule", "global", "direct"];
  26. }
  27. return ["rule", "global", "direct", "script"];
  28. }, [verge?.clash_core]);
  29. const curMode = clashConfig?.mode?.toLowerCase();
  30. const onChangeMode = useLockFn(async (mode: string) => {
  31. // 断开连接
  32. if (mode !== curMode && verge?.auto_close_connection) {
  33. closeAllConnections();
  34. }
  35. await updateConfigs({ mode });
  36. await patchClashConfig({ mode });
  37. mutateClash();
  38. });
  39. useEffect(() => {
  40. if (curMode && !modeList.includes(curMode)) {
  41. onChangeMode("rule");
  42. }
  43. }, [curMode]);
  44. return (
  45. <BasePage
  46. contentStyle={{ height: "100%" }}
  47. title={t("Proxy Groups")}
  48. header={
  49. <Box display="flex" alignItems="center" gap={1}>
  50. <ProviderButton />
  51. <ButtonGroup size="small">
  52. {modeList.map((mode) => (
  53. <Button
  54. key={mode}
  55. variant={mode === curMode ? "contained" : "outlined"}
  56. onClick={() => onChangeMode(mode)}
  57. sx={{ textTransform: "capitalize" }}
  58. >
  59. {t(mode)}
  60. </Button>
  61. ))}
  62. </ButtonGroup>
  63. </Box>
  64. }
  65. >
  66. <Box
  67. sx={{
  68. borderRadius: 1,
  69. boxShadow: 0,
  70. height: "100%",
  71. boxSizing: "border-box",
  72. }}
  73. >
  74. <ProxyGroups mode={curMode!} />
  75. </Box>
  76. </BasePage>
  77. );
  78. };
  79. export default ProxyPage;