diff --git a/src/components/base/base-loading.tsx b/src/components/base/base-loading.tsx
new file mode 100644
index 0000000..a1352d4
--- /dev/null
+++ b/src/components/base/base-loading.tsx
@@ -0,0 +1,50 @@
+import { styled } from "@mui/material";
+
+const Loading = styled("div")`
+ position: relative;
+ display: flex;
+ height: 100%;
+ min-height: 18px;
+ box-sizing: border-box;
+ align-items: center;
+
+ & > div {
+ box-sizing: border-box;
+ width: 6px;
+ height: 6px;
+ margin: 2px;
+ border-radius: 100%;
+ animation: loading 0.7s -0.15s infinite linear;
+ }
+
+ & > div:nth-child(2n-1) {
+ animation-delay: -0.5s;
+ }
+
+ @keyframes loading {
+ 50% {
+ opacity: 0.2;
+ transform: scale(0.75);
+ }
+ 100% {
+ opacity: 1;
+ transform: scale(1);
+ }
+ }
+`;
+
+const LoadingItem = styled("div")(({ theme }) => ({
+ background: theme.palette.text.secondary,
+}));
+
+const BaseLoading = () => {
+ return (
+
+
+
+
+
+ );
+};
+
+export default BaseLoading;
diff --git a/src/components/proxy/proxy-item.tsx b/src/components/proxy/proxy-item.tsx
index 7c7c07d..b51681d 100644
--- a/src/components/proxy/proxy-item.tsx
+++ b/src/components/proxy/proxy-item.tsx
@@ -13,6 +13,7 @@ import {
Theme,
} from "@mui/material";
import delayManager from "@/services/delay";
+import BaseLoading from "../base/base-loading";
interface Props {
groupName: string;
@@ -43,6 +44,9 @@ const TypeBox = styled(Box)(({ theme }) => ({
const ProxyItem = (props: Props) => {
const { groupName, proxy, selected, showType = true, sx, onClick } = props;
+
+ // -1/<=0 为 不显示
+ // -2 为 loading
const [delay, setDelay] = useState(-1);
useEffect(() => {
@@ -61,6 +65,7 @@ const ProxyItem = (props: Props) => {
}, [proxy]);
const onDelay = useLockFn(async () => {
+ setDelay(-2);
return delayManager
.checkDelay(proxy.name, groupName)
.then((result) => setDelay(result))
@@ -81,14 +86,9 @@ const ProxyItem = (props: Props) => {
? alpha(primary.main, 0.15)
: alpha(primary.main, 0.35);
const color = mode === "light" ? primary.main : primary.light;
-
const showDelay = delay > 0;
- const showIcon = !showDelay && selected;
return {
- ".the-check": { display: "none" },
- ".the-delay": { display: showDelay ? "block" : "none" },
- ".the-icon": { display: showIcon ? "block" : "none" },
"&:hover .the-check": { display: !showDelay ? "block" : "none" },
"&:hover .the-delay": { display: showDelay ? "block" : "none" },
"&:hover .the-icon": { display: "none" },
@@ -116,7 +116,14 @@ const ProxyItem = (props: Props) => {
- {!proxy.provider && (
+ {delay === -2 && (
+
+
+
+ )}
+
+ {!proxy.provider && delay !== -2 && (
+ // provider的节点不支持检测
{
@@ -124,43 +131,49 @@ const ProxyItem = (props: Props) => {
e.stopPropagation();
onDelay();
}}
- sx={(theme) => ({
- ":hover": { bgcolor: alpha(theme.palette.primary.main, 0.15) },
+ sx={({ palette }) => ({
+ display: "none", // hover才显示
+ ":hover": { bgcolor: alpha(palette.primary.main, 0.15) },
})}
>
Check
)}
- {
- if (proxy.provider) return;
+ {delay > 0 && (
+ // 显示延迟
+ {
+ if (proxy.provider) return;
+ e.preventDefault();
+ e.stopPropagation();
+ onDelay();
+ }}
+ color={
+ delay > 500
+ ? "error.main"
+ : delay < 100
+ ? "success.main"
+ : "text.secondary"
+ }
+ sx={({ palette }) =>
+ !proxy.provider
+ ? { ":hover": { bgcolor: alpha(palette.primary.main, 0.15) } }
+ : {}
+ }
+ >
+ {delay > 1e5 ? "Error" : delay > 3000 ? "Timeout" : `${delay}ms`}
+
+ )}
- e.preventDefault();
- e.stopPropagation();
- onDelay();
- }}
- color={
- delay > 500
- ? "error.main"
- : delay < 100
- ? "success.main"
- : "text.secondary"
- }
- sx={({ palette }) =>
- !proxy.provider
- ? { ":hover": { bgcolor: alpha(palette.primary.main, 0.15) } }
- : {}
- }
- >
- {delay > 1e5 ? "Error" : delay > 3000 ? "Timeout" : `${delay}ms`}
-
-
-
+ {delay !== -2 && delay <= 0 && selected && (
+ // 展示已选择的icon
+
+ )}