1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- import useSWR from "swr";
- import { useEffect, useMemo } from "react";
- import { useLockFn } from "ahooks";
- import { useTranslation } from "react-i18next";
- import { Box, Button, ButtonGroup, Paper } from "@mui/material";
- import {
- closeAllConnections,
- getClashConfig,
- updateConfigs,
- } from "@/services/api";
- import { patchClashConfig } from "@/services/cmds";
- import { useVerge } from "@/hooks/use-verge";
- import { BasePage } from "@/components/base";
- import { ProxyGroups } from "@/components/proxy/proxy-groups";
- import { ProviderButton } from "@/components/proxy/provider-button";
- const ProxyPage = () => {
- const { t } = useTranslation();
- 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]);
- const curMode = clashConfig?.mode?.toLowerCase();
- const onChangeMode = useLockFn(async (mode: string) => {
- // 断开连接
- if (mode !== curMode && verge?.auto_close_connection) {
- closeAllConnections();
- }
- await updateConfigs({ mode });
- await patchClashConfig({ mode });
- mutateClash();
- });
- useEffect(() => {
- if (curMode && !modeList.includes(curMode)) {
- onChangeMode("rule");
- }
- }, [curMode]);
- return (
- <BasePage
- contentStyle={{ height: "100%" }}
- title={t("Proxy Groups")}
- header={
- <Box display="flex" alignItems="center" gap={1}>
- <ProviderButton />
- <ButtonGroup size="small">
- {modeList.map((mode) => (
- <Button
- key={mode}
- variant={mode === curMode ? "contained" : "outlined"}
- onClick={() => onChangeMode(mode)}
- sx={{ textTransform: "capitalize" }}
- >
- {t(mode)}
- </Button>
- ))}
- </ButtonGroup>
- </Box>
- }
- >
- <Box
- sx={{
- borderRadius: 1,
- boxShadow: 0,
- height: "100%",
- boxSizing: "border-box",
- }}
- >
- <ProxyGroups mode={curMode!} />
- </Box>
- </BasePage>
- );
- };
- export default ProxyPage;
|