feat: profile enhanced mode

This commit is contained in:
GyDi
2022-03-06 14:59:25 +08:00
parent a43dab8057
commit ef47a74920
10 changed files with 292 additions and 63 deletions

View File

@@ -1,12 +1,14 @@
import useSWR, { useSWRConfig } from "swr";
import { useEffect, useMemo, useState } from "react";
import { useLockFn } from "ahooks";
import { useEffect, useMemo, useState } from "react";
import { Box, Button, Grid, TextField } from "@mui/material";
import {
getProfiles,
selectProfile,
patchProfile,
deleteProfile,
selectProfile,
importProfile,
changeProfileChain,
} from "../services/cmds";
import { getProxies, updateProxy } from "../services/api";
import Notice from "../components/base/base-notice";
@@ -25,13 +27,20 @@ const ProfilePage = () => {
const { data: profiles = {} } = useSWR("getProfiles", getProfiles);
const { regularItems, enhanceItems } = useMemo(() => {
const { items = [] } = profiles;
const regularItems = items.filter((i) =>
["local", "remote"].includes(i.type!)
);
const enhanceItems = items.filter((i) =>
["merge", "script"].includes(i.type!)
);
const items = profiles.items || [];
const chain = profiles.chain || [];
const type1 = ["local", "remote"];
const type2 = ["merge", "script"];
const regularItems = items.filter((i) => type1.includes(i.type!));
const restItems = items.filter((i) => type2.includes(i.type!));
const restMap = Object.fromEntries(restItems.map((i) => [i.uid, i]));
const enhanceItems = chain
.map((i) => restMap[i]!)
.concat(restItems.filter((i) => !chain.includes(i.uid)));
return { regularItems, enhanceItems };
}, [profiles]);
@@ -113,10 +122,51 @@ const ProfilePage = () => {
}
});
const onEnhanceEnable = useLockFn(async (uid: string) => {});
const onEnhanceDisable = useLockFn(async (uid: string) => {});
const onMoveTop = useLockFn(async (uid: string) => {});
const onMoveEnd = useLockFn(async (uid: string) => {});
/** enhanced profile mode */
const chain = profiles.chain || [];
const onEnhanceEnable = useLockFn(async (uid: string) => {
if (chain.includes(uid)) return;
const newChain = [...chain, uid];
await changeProfileChain(newChain);
mutate("getProfiles", { ...profiles, chain: newChain }, true);
});
const onEnhanceDisable = useLockFn(async (uid: string) => {
if (!chain.includes(uid)) return;
const newChain = chain.filter((i) => i !== uid);
await changeProfileChain(newChain);
mutate("getProfiles", { ...profiles, chain: newChain }, true);
});
const onEnhanceDelete = useLockFn(async (uid: string) => {
try {
await onEnhanceDisable(uid);
await deleteProfile(uid);
mutate("getProfiles");
} catch (err: any) {
Notice.error(err?.message || err.toString());
}
});
const onMoveTop = useLockFn(async (uid: string) => {
if (!chain.includes(uid)) return;
const newChain = [uid].concat(chain.filter((i) => i !== uid));
await changeProfileChain(newChain);
mutate("getProfiles", { ...profiles, chain: newChain }, true);
});
const onMoveEnd = useLockFn(async (uid: string) => {
if (!chain.includes(uid)) return;
const newChain = chain.filter((i) => i !== uid).concat([uid]);
await changeProfileChain(newChain);
mutate("getProfiles", { ...profiles, chain: newChain }, true);
});
return (
<BasePage title="Profiles">
@@ -164,6 +214,7 @@ const ProfilePage = () => {
itemData={item}
onEnable={() => onEnhanceEnable(item.uid)}
onDisable={() => onEnhanceDisable(item.uid)}
onDelete={() => onEnhanceDelete(item.uid)}
onMoveTop={() => onMoveTop(item.uid)}
onMoveEnd={() => onMoveEnd(item.uid)}
/>