123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- import { useState } from "react";
- import { Virtuoso } from "react-virtuoso";
- import {
- Box,
- Collapse,
- Divider,
- IconButton,
- List,
- ListItem,
- ListItemText,
- } from "@mui/material";
- import {
- SendRounded,
- ExpandLessRounded,
- ExpandMoreRounded,
- MyLocationRounded,
- NetworkCheckRounded,
- } from "@mui/icons-material";
- import { updateProxy } from "../services/api";
- import { ApiType } from "../services/types";
- import { getProfiles, patchProfile } from "../services/cmds";
- import ProxyItem from "./proxy-item";
- interface Props {
- group: ApiType.ProxyGroupItem;
- }
- const ProxyGroup = ({ group }: Props) => {
- const [open, setOpen] = useState(false);
- const [now, setNow] = useState(group.now);
- const proxies = group.all ?? [];
- const onUpdate = async (name: string) => {
- // can not call update
- if (group.type !== "Selector") {
- // Todo
- // error Tips
- return;
- }
- const oldValue = now;
- try {
- setNow(name);
- await updateProxy(group.name, name);
- const profiles = await getProfiles().catch(console.error);
- if (!profiles) return;
- const profile = profiles.items![profiles.current!]!;
- if (!profile) return;
- if (!profile.selected) profile.selected = [];
- const index = profile.selected.findIndex(
- (item) => item.name === group.name
- );
- if (index < 0) {
- profile.selected.push({ name: group.name, now: name });
- } else {
- profile.selected[index] = { name: group.name, now: name };
- }
- patchProfile(profiles.current!, profile).catch(console.error);
- } catch {
- setNow(oldValue);
- // Todo
- // error tips
- }
- };
- return (
- <>
- <ListItem button onClick={() => setOpen(!open)} dense>
- <ListItemText
- primary={group.name}
- secondary={
- <>
- <SendRounded color="primary" sx={{ mr: 1, fontSize: 14 }} />
- <span>{now}</span>
- </>
- }
- secondaryTypographyProps={{
- sx: { display: "flex", alignItems: "center" },
- }}
- />
- {open ? <ExpandLessRounded /> : <ExpandMoreRounded />}
- </ListItem>
- <Collapse in={open} timeout="auto" unmountOnExit>
- <Box sx={{ pl: 4, pr: 3, my: 0.5 }}>
- <IconButton size="small" title="location">
- <MyLocationRounded />
- </IconButton>
- <IconButton size="small" title="check">
- <NetworkCheckRounded />
- </IconButton>
- </Box>
- {proxies.length >= 10 ? (
- <Virtuoso
- style={{ height: "400px", marginBottom: "4px" }}
- totalCount={proxies.length}
- itemContent={(index) => (
- <ProxyItem
- proxy={proxies[index]}
- selected={proxies[index].name === now}
- sx={{ py: 0, pl: 4 }}
- onClick={onUpdate}
- />
- )}
- />
- ) : (
- <List
- component="div"
- disablePadding
- sx={{ maxHeight: "400px", overflow: "auto", mb: "4px" }}
- >
- {proxies.map((proxy) => (
- <ProxyItem
- key={proxy.name}
- proxy={proxy}
- selected={proxy.name === now}
- sx={{ py: 0, pl: 4 }}
- onClick={onUpdate}
- />
- ))}
- </List>
- )}
- <Divider variant="middle" />
- </Collapse>
- </>
- );
- };
- export default ProxyGroup;
|