Skip to content
Snippets Groups Projects
proxies.tsx 2.11 KiB
Newer Older
GyDi's avatar
GyDi committed
import useSWR from "swr";
import { useEffect, useMemo } from "react";
GyDi's avatar
GyDi committed
import { useLockFn } from "ahooks";
GyDi's avatar
GyDi committed
import { useTranslation } from "react-i18next";
GyDi's avatar
GyDi committed
import { Button, ButtonGroup, Paper } from "@mui/material";
import {
  closeAllConnections,
  getClashConfig,
  updateConfigs,
} from "@/services/api";
GyDi's avatar
GyDi committed
import { patchClashConfig } from "@/services/cmds";
import { useVerge } from "@/hooks/use-verge";
import { BasePage } from "@/components/base";
import { ProxyGroups } from "@/components/proxy/proxy-groups";
GyDi's avatar
GyDi committed
const ProxyPage = () => {
GyDi's avatar
GyDi committed
  const { t } = useTranslation();
GyDi's avatar
GyDi committed

  const { data: clashConfig, mutate: mutateClash } = useSWR(
    "getClashConfig",
    getClashConfig
  );
  const { verge } = useVerge();

  const modeList = useMemo(() => {
    if (verge?.clash_core === "clash-meta") {
      return ["rule", "global", "direct"];
    }
    return ["rule", "global", "direct", "script"];
  }, [verge?.clash_core]);

GyDi's avatar
GyDi committed
  const curMode = clashConfig?.mode?.toLowerCase();
GyDi's avatar
GyDi committed
  const onChangeMode = useLockFn(async (mode: string) => {
    // 断开连接
    if (mode !== curMode && verge?.auto_close_connection) {
      closeAllConnections();
    }
GyDi's avatar
GyDi committed
    await updateConfigs({ mode });
    await patchClashConfig({ mode });
GyDi's avatar
GyDi committed
    mutateClash();
GyDi's avatar
GyDi committed
  });
  useEffect(() => {
    if (curMode && !modeList.includes(curMode)) {
      onChangeMode("rule");
    }
  }, [curMode]);

GyDi's avatar
GyDi committed
    <BasePage
GyDi's avatar
GyDi committed
      contentStyle={{ height: "100%" }}
      title={t("Proxy Groups")}
GyDi's avatar
GyDi committed
      header={
        <ButtonGroup size="small">
          {modeList.map((mode) => (
            <Button
              key={mode}
              variant={mode === curMode ? "contained" : "outlined"}
              onClick={() => onChangeMode(mode)}
              sx={{ textTransform: "capitalize" }}
            >
GyDi's avatar
GyDi committed
              {t(mode)}
GyDi's avatar
GyDi committed
            </Button>
          ))}
        </ButtonGroup>
      }
    >
GyDi's avatar
GyDi committed
      <Paper
        sx={{
          borderRadius: 1,
          boxShadow: 2,
          height: "100%",
          boxSizing: "border-box",
          py: 1,
        }}
      >
        <ProxyGroups mode={curMode!} />
GyDi's avatar
GyDi committed
      </Paper>
GyDi's avatar
GyDi committed
    </BasePage>
GyDi's avatar
GyDi committed
};

export default ProxyPage;