Skip to content
Snippets Groups Projects
Unverified Commit a2cf26e7 authored by GyDi's avatar GyDi
Browse files

feat: add proxy item check loading

parent 71e69003
No related branches found
No related tags found
No related merge requests found
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 (
<Loading>
<LoadingItem />
<LoadingItem />
<LoadingItem />
</Loading>
);
};
export default BaseLoading;
...@@ -13,6 +13,7 @@ import { ...@@ -13,6 +13,7 @@ import {
Theme, Theme,
} from "@mui/material"; } from "@mui/material";
import delayManager from "@/services/delay"; import delayManager from "@/services/delay";
import BaseLoading from "../base/base-loading";
interface Props { interface Props {
groupName: string; groupName: string;
...@@ -43,6 +44,9 @@ const TypeBox = styled(Box)(({ theme }) => ({ ...@@ -43,6 +44,9 @@ const TypeBox = styled(Box)(({ theme }) => ({
const ProxyItem = (props: Props) => { const ProxyItem = (props: Props) => {
const { groupName, proxy, selected, showType = true, sx, onClick } = props; const { groupName, proxy, selected, showType = true, sx, onClick } = props;
// -1/<=0 为 不显示
// -2 为 loading
const [delay, setDelay] = useState(-1); const [delay, setDelay] = useState(-1);
useEffect(() => { useEffect(() => {
...@@ -61,6 +65,7 @@ const ProxyItem = (props: Props) => { ...@@ -61,6 +65,7 @@ const ProxyItem = (props: Props) => {
}, [proxy]); }, [proxy]);
const onDelay = useLockFn(async () => { const onDelay = useLockFn(async () => {
setDelay(-2);
return delayManager return delayManager
.checkDelay(proxy.name, groupName) .checkDelay(proxy.name, groupName)
.then((result) => setDelay(result)) .then((result) => setDelay(result))
...@@ -81,14 +86,9 @@ const ProxyItem = (props: Props) => { ...@@ -81,14 +86,9 @@ const ProxyItem = (props: Props) => {
? alpha(primary.main, 0.15) ? alpha(primary.main, 0.15)
: alpha(primary.main, 0.35); : alpha(primary.main, 0.35);
const color = mode === "light" ? primary.main : primary.light; const color = mode === "light" ? primary.main : primary.light;
const showDelay = delay > 0; const showDelay = delay > 0;
const showIcon = !showDelay && selected;
return { 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-check": { display: !showDelay ? "block" : "none" },
"&:hover .the-delay": { display: showDelay ? "block" : "none" }, "&:hover .the-delay": { display: showDelay ? "block" : "none" },
"&:hover .the-icon": { display: "none" }, "&:hover .the-icon": { display: "none" },
...@@ -116,7 +116,14 @@ const ProxyItem = (props: Props) => { ...@@ -116,7 +116,14 @@ const ProxyItem = (props: Props) => {
<ListItemIcon <ListItemIcon
sx={{ justifyContent: "flex-end", color: "primary.main" }} sx={{ justifyContent: "flex-end", color: "primary.main" }}
> >
{!proxy.provider && ( {delay === -2 && (
<Widget>
<BaseLoading />
</Widget>
)}
{!proxy.provider && delay !== -2 && (
// provider的节点不支持检测
<Widget <Widget
className="the-check" className="the-check"
onClick={(e) => { onClick={(e) => {
...@@ -124,43 +131,49 @@ const ProxyItem = (props: Props) => { ...@@ -124,43 +131,49 @@ const ProxyItem = (props: Props) => {
e.stopPropagation(); e.stopPropagation();
onDelay(); onDelay();
}} }}
sx={(theme) => ({ sx={({ palette }) => ({
":hover": { bgcolor: alpha(theme.palette.primary.main, 0.15) }, display: "none", // hover才显示
":hover": { bgcolor: alpha(palette.primary.main, 0.15) },
})} })}
> >
Check Check
</Widget> </Widget>
)} )}
<Widget {delay > 0 && (
className="the-delay" // 显示延迟
onClick={(e) => { <Widget
if (proxy.provider) return; className="the-delay"
onClick={(e) => {
e.preventDefault(); if (proxy.provider) return;
e.stopPropagation(); e.preventDefault();
onDelay(); e.stopPropagation();
}} onDelay();
color={ }}
delay > 500 color={
? "error.main" delay > 500
: delay < 100 ? "error.main"
? "success.main" : delay < 100
: "text.secondary" ? "success.main"
} : "text.secondary"
sx={({ palette }) => }
!proxy.provider sx={({ palette }) =>
? { ":hover": { bgcolor: alpha(palette.primary.main, 0.15) } } !proxy.provider
: {} ? { ":hover": { bgcolor: alpha(palette.primary.main, 0.15) } }
} : {}
> }
{delay > 1e5 ? "Error" : delay > 3000 ? "Timeout" : `${delay}ms`} >
</Widget> {delay > 1e5 ? "Error" : delay > 3000 ? "Timeout" : `${delay}ms`}
</Widget>
<CheckCircleOutlineRounded )}
className="the-icon"
sx={{ fontSize: 16 }} {delay !== -2 && delay <= 0 && selected && (
/> // 展示已选择的icon
<CheckCircleOutlineRounded
className="the-icon"
sx={{ fontSize: 16 }}
/>
)}
</ListItemIcon> </ListItemIcon>
</ListItemButton> </ListItemButton>
</ListItem> </ListItem>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment