diff --git a/src/components/proxy-group.tsx b/src/components/proxy-group.tsx index 090539a..e901c77 100644 --- a/src/components/proxy-group.tsx +++ b/src/components/proxy-group.tsx @@ -1,15 +1,12 @@ import { useState } from "react"; import { Virtuoso } from "react-virtuoso"; import { - alpha, Box, Collapse, Divider, IconButton, List, ListItem, - ListItemButton, - ListItemIcon, ListItemText, } from "@mui/material"; import { @@ -18,53 +15,11 @@ import { ExpandMoreRounded, MyLocationRounded, NetworkCheckRounded, - CheckCircleOutlineRounded, } from "@mui/icons-material"; import { updateProxy } from "../services/api"; import { ApiType } from "../services/types"; import { getProfiles, patchProfile } from "../services/cmds"; - -interface ItemProps { - proxy: ApiType.ProxyItem; - selected: boolean; - onClick?: (name: string) => void; -} - -const Item = ({ proxy, selected, onClick }: ItemProps) => { - return ( - - onClick?.(proxy.name)} - sx={[ - { - borderRadius: 1, - }, - ({ palette: { mode, primary } }) => { - const bgcolor = - mode === "light" - ? alpha(primary.main, 0.15) - : alpha(primary.main, 0.35); - const color = mode === "light" ? primary.main : primary.light; - - return { - "&.Mui-selected": { bgcolor }, - "&.Mui-selected .MuiListItemText-secondary": { color }, - }; - }, - ]} - > - - - {selected && } - - - - ); -}; +import ProxyItem from "./proxy-item"; interface Props { group: ApiType.ProxyGroupItem; @@ -146,9 +101,10 @@ const ProxyGroup = ({ group }: Props) => { style={{ height: "400px", marginBottom: "4px" }} totalCount={proxies.length} itemContent={(index) => ( - )} @@ -160,10 +116,11 @@ const ProxyGroup = ({ group }: Props) => { sx={{ maxHeight: "400px", overflow: "auto", mb: "4px" }} > {proxies.map((proxy) => ( - ))} diff --git a/src/components/proxy-item.tsx b/src/components/proxy-item.tsx new file mode 100644 index 0000000..6e90a2c --- /dev/null +++ b/src/components/proxy-item.tsx @@ -0,0 +1,58 @@ +import { CheckCircleOutlineRounded } from "@mui/icons-material"; +import { + alpha, + ListItem, + ListItemButton, + ListItemIcon, + ListItemText, + SxProps, + Theme, +} from "@mui/material"; +import { ApiType } from "../services/types"; + +interface Props { + proxy: ApiType.ProxyItem; + selected: boolean; + sx?: SxProps; + onClick?: (name: string) => void; +} + +const ProxyItem = (props: Props) => { + const { proxy, selected, sx, onClick } = props; + + return ( + + onClick?.(proxy.name)} + sx={[ + { + borderRadius: 1, + }, + ({ palette: { mode, primary } }) => { + const bgcolor = + mode === "light" + ? alpha(primary.main, 0.15) + : alpha(primary.main, 0.35); + const color = mode === "light" ? primary.main : primary.light; + + return { + "&.Mui-selected": { bgcolor }, + "&.Mui-selected .MuiListItemText-secondary": { color }, + }; + }, + ]} + > + + + {selected && } + + + + ); +}; + +export default ProxyItem; diff --git a/src/pages/proxy.tsx b/src/pages/proxy.tsx index 6e2fc86..02e5b0f 100644 --- a/src/pages/proxy.tsx +++ b/src/pages/proxy.tsx @@ -3,11 +3,12 @@ import { useEffect } from "react"; import { Box, List, Paper, Typography } from "@mui/material"; import { getProxies } from "../services/api"; import ProxyGroup from "../components/proxy-group"; +import ProxyItem from "../components/proxy-item"; const ProxyPage = () => { const { mutate } = useSWRConfig(); const { data: proxiesData } = useSWR("getProxies", getProxies); - const { groups = [] } = proxiesData ?? {}; + const { groups = [], proxies = [] } = proxiesData ?? {}; useEffect(() => { // fix the empty proxies on the first sight @@ -20,18 +21,31 @@ const ProxyPage = () => { return ( - Proxy Groups + {groups.length ? "Proxy Groups" : "Proxies"} - {groups.length > 0 && ( - + + {groups.length > 0 && ( {groups.map((group) => ( ))} - - )} + )} + + {!groups.length && ( + + {Object.values(proxies).map((proxy) => ( + + ))} + + )} + ); };