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");