diff --git a/src/components/proxy/provider-button.tsx b/src/components/proxy/provider-button.tsx
new file mode 100644
index 0000000..29665a5
--- /dev/null
+++ b/src/components/proxy/provider-button.tsx
@@ -0,0 +1,86 @@
+import dayjs from "dayjs";
+import useSWR, { mutate } from "swr";
+import { useState } from "react";
+import {
+ Button,
+ IconButton,
+ List,
+ ListItem,
+ ListItemText,
+} from "@mui/material";
+import { RefreshRounded } from "@mui/icons-material";
+import { useTranslation } from "react-i18next";
+import { useLockFn } from "ahooks";
+import { getProviders, providerUpdate } from "@/services/api";
+import { BaseDialog } from "../base";
+
+export const ProviderButton = () => {
+ const { t } = useTranslation();
+ const { data } = useSWR("getProviders", getProviders);
+
+ const [open, setOpen] = useState(false);
+
+ const hasProvider = Object.keys(data || {}).length > 0;
+
+ const handleUpdate = useLockFn(async (key: string) => {
+ await providerUpdate(key);
+ await mutate("getProxies");
+ await mutate("getProviders");
+ });
+
+ if (!hasProvider) return null;
+
+ return (
+ <>
+
+
+ setOpen(false)}
+ onCancel={() => setOpen(false)}
+ >
+
+ {Object.entries(data || {}).map(([key, item]) => {
+ const time = dayjs(item.updatedAt);
+ return (
+
+
+
+ Type: {item.vehicleType}
+
+
+ Updated: {time.fromNow()}
+
+
+ }
+ />
+ handleUpdate(key)}
+ >
+
+
+
+ );
+ })}
+
+
+ >
+ );
+};
diff --git a/src/pages/_layout.tsx b/src/pages/_layout.tsx
index 84263d5..f0b1b96 100644
--- a/src/pages/_layout.tsx
+++ b/src/pages/_layout.tsx
@@ -48,6 +48,7 @@ const Layout = () => {
mutate("getProxies");
mutate("getVersion");
mutate("getClashConfig");
+ mutate("getProviders");
});
// update the verge config
diff --git a/src/pages/proxies.tsx b/src/pages/proxies.tsx
index 2e2e629..39c777b 100644
--- a/src/pages/proxies.tsx
+++ b/src/pages/proxies.tsx
@@ -2,7 +2,7 @@ import useSWR from "swr";
import { useEffect, useMemo } from "react";
import { useLockFn } from "ahooks";
import { useTranslation } from "react-i18next";
-import { Button, ButtonGroup, Paper } from "@mui/material";
+import { Box, Button, ButtonGroup, Paper } from "@mui/material";
import {
closeAllConnections,
getClashConfig,
@@ -12,6 +12,7 @@ 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();
@@ -53,18 +54,22 @@ const ProxyPage = () => {
contentStyle={{ height: "100%" }}
title={t("Proxy Groups")}
header={
-
- {modeList.map((mode) => (
-
- ))}
-
+
+
+
+
+ {modeList.map((mode) => (
+
+ ))}
+
+
}
>
{
);
};
+export const providerUpdate = async (name: string) => {
+ const instance = await getAxios();
+ return instance.put(`/providers/proxies/${encodeURIComponent(name)}`);
+};
+
export const getConnections = async () => {
const instance = await getAxios();
const result = await instance.get("/connections");