feat: save global selected
This commit is contained in:
parent
1a7b3c7294
commit
b09b7b11a1
@ -1,5 +1,5 @@
|
|||||||
|
import useSWR, { useSWRConfig } from "swr";
|
||||||
import { useEffect, useRef, useState } from "react";
|
import { useEffect, useRef, useState } from "react";
|
||||||
import { useSWRConfig } from "swr";
|
|
||||||
import { useLockFn } from "ahooks";
|
import { useLockFn } from "ahooks";
|
||||||
import { Virtuoso } from "react-virtuoso";
|
import { Virtuoso } from "react-virtuoso";
|
||||||
import { Box, IconButton, TextField } from "@mui/material";
|
import { Box, IconButton, TextField } from "@mui/material";
|
||||||
@ -13,6 +13,7 @@ import {
|
|||||||
} from "@mui/icons-material";
|
} from "@mui/icons-material";
|
||||||
import { ApiType } from "../../services/types";
|
import { ApiType } from "../../services/types";
|
||||||
import { updateProxy } from "../../services/api";
|
import { updateProxy } from "../../services/api";
|
||||||
|
import { getProfiles, patchProfile } from "../../services/cmds";
|
||||||
import delayManager from "../../services/delay";
|
import delayManager from "../../services/delay";
|
||||||
import useFilterProxy from "./use-filter-proxy";
|
import useFilterProxy from "./use-filter-proxy";
|
||||||
import ProxyItem from "./proxy-item";
|
import ProxyItem from "./proxy-item";
|
||||||
@ -23,6 +24,7 @@ interface Props {
|
|||||||
proxies: ApiType.ProxyItem[];
|
proxies: ApiType.ProxyItem[];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// this component will be used for DIRECT/GLOBAL
|
||||||
const ProxyGlobal = (props: Props) => {
|
const ProxyGlobal = (props: Props) => {
|
||||||
const { groupName, curProxy, proxies } = props;
|
const { groupName, curProxy, proxies } = props;
|
||||||
|
|
||||||
@ -35,10 +37,27 @@ const ProxyGlobal = (props: Props) => {
|
|||||||
const virtuosoRef = useRef<any>();
|
const virtuosoRef = useRef<any>();
|
||||||
const filterProxies = useFilterProxy(proxies, groupName, filterText);
|
const filterProxies = useFilterProxy(proxies, groupName, filterText);
|
||||||
|
|
||||||
|
const { data: profiles } = useSWR("getProfiles", getProfiles);
|
||||||
|
|
||||||
const onChangeProxy = useLockFn(async (name: string) => {
|
const onChangeProxy = useLockFn(async (name: string) => {
|
||||||
await updateProxy("GLOBAL", name);
|
await updateProxy(groupName, name);
|
||||||
mutate("getProxies");
|
|
||||||
setNow(name);
|
setNow(name);
|
||||||
|
|
||||||
|
if (groupName === "DIRECT") return;
|
||||||
|
|
||||||
|
// update global selected
|
||||||
|
const profile = profiles?.items?.find((p) => p.uid === profiles.current);
|
||||||
|
if (!profile) return;
|
||||||
|
if (!profile.selected) profile.selected = [];
|
||||||
|
|
||||||
|
const index = profile.selected.findIndex((item) => item.name === groupName);
|
||||||
|
if (index < 0) {
|
||||||
|
profile.selected.unshift({ name: groupName, now: name });
|
||||||
|
} else {
|
||||||
|
profile.selected[index] = { name: groupName, now: name };
|
||||||
|
}
|
||||||
|
|
||||||
|
await patchProfile(profiles!.current!, { selected: profile.selected });
|
||||||
});
|
});
|
||||||
|
|
||||||
const onLocation = (smooth = true) => {
|
const onLocation = (smooth = true) => {
|
||||||
|
@ -29,6 +29,7 @@ const ProfilePage = () => {
|
|||||||
|
|
||||||
const { data: profiles = {} } = useSWR("getProfiles", getProfiles);
|
const { data: profiles = {} } = useSWR("getProfiles", getProfiles);
|
||||||
|
|
||||||
|
// distinguish type
|
||||||
const { regularItems, enhanceItems } = useMemo(() => {
|
const { regularItems, enhanceItems } = useMemo(() => {
|
||||||
const items = profiles.items || [];
|
const items = profiles.items || [];
|
||||||
const chain = profiles.chain || [];
|
const chain = profiles.chain || [];
|
||||||
@ -48,6 +49,7 @@ const ProfilePage = () => {
|
|||||||
return { regularItems, enhanceItems };
|
return { regularItems, enhanceItems };
|
||||||
}, [profiles]);
|
}, [profiles]);
|
||||||
|
|
||||||
|
// sync selected proxy
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (profiles.current == null) return;
|
if (profiles.current == null) return;
|
||||||
|
|
||||||
@ -65,9 +67,10 @@ const ProfilePage = () => {
|
|||||||
selected.map((each) => [each.name!, each.now!])
|
selected.map((each) => [each.name!, each.now!])
|
||||||
);
|
);
|
||||||
|
|
||||||
// todo: enhance error handle
|
|
||||||
let hasChange = false;
|
let hasChange = false;
|
||||||
proxiesData.groups.forEach((group) => {
|
|
||||||
|
const { global, groups } = proxiesData;
|
||||||
|
[global, ...groups].forEach((group) => {
|
||||||
const { name, now } = group;
|
const { name, now } = group;
|
||||||
|
|
||||||
if (!now || selectedMap[name] === now) return;
|
if (!now || selectedMap[name] === now) return;
|
||||||
@ -78,15 +81,14 @@ const ProfilePage = () => {
|
|||||||
updateProxy(name, selectedMap[name]);
|
updateProxy(name, selectedMap[name]);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// update profile selected list
|
// update profile selected list
|
||||||
profile.selected = Object.entries(selectedMap).map(([name, now]) => ({
|
profile.selected = Object.entries(selectedMap).map(([name, now]) => ({
|
||||||
name,
|
name,
|
||||||
now,
|
now,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
patchProfile(current!, { selected: profile.selected }).catch(
|
patchProfile(current!, { selected: profile.selected });
|
||||||
console.error
|
|
||||||
);
|
|
||||||
// update proxies cache
|
// update proxies cache
|
||||||
if (hasChange) mutate("getProxies", getProxies());
|
if (hasChange) mutate("getProxies", getProxies());
|
||||||
}, 100);
|
}, 100);
|
||||||
|
Loading…
Reference in New Issue
Block a user