feat: save global selected

This commit is contained in:
GyDi 2022-03-22 12:38:59 +08:00 committed by GitHub
parent 1a7b3c7294
commit b09b7b11a1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 29 additions and 8 deletions

View File

@ -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) => {

View File

@ -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);