Bläddra i källkod

feat: support get merged rule-set name

MystiPanda 11 månader sedan
förälder
incheckning
e8440e06a1
2 ändrade filer med 63 tillägg och 27 borttagningar
  1. 2 0
      src/components/profile/profile-item.tsx
  2. 61 27
      src/components/profile/rules-editor-viewer.tsx

+ 2 - 0
src/components/profile/profile-item.tsx

@@ -483,6 +483,8 @@ export const ProfileItem = (props: Props) => {
         onClose={() => setFileOpen(false)}
       />
       <RulesEditorViewer
+        groupsUid={option?.groups ?? ""}
+        mergeUid={option?.merge ?? ""}
         profileUid={uid}
         property={option?.rules ?? ""}
         open={rulesOpen}

+ 61 - 27
src/components/profile/rules-editor-viewer.tsx

@@ -40,6 +40,8 @@ import MonacoEditor from "react-monaco-editor";
 import { useThemeMode } from "@/services/states";
 
 interface Props {
+  groupsUid: string;
+  mergeUid: string;
   profileUid: string;
   title?: string | ReactNode;
   property: string;
@@ -230,7 +232,16 @@ const rules: {
 const builtinProxyPolicies = ["DIRECT", "REJECT", "REJECT-DROP", "PASS"];
 
 export const RulesEditorViewer = (props: Props) => {
-  const { title, profileUid, property, open, onClose, onSave } = props;
+  const {
+    title,
+    groupsUid,
+    mergeUid,
+    profileUid,
+    property,
+    open,
+    onClose,
+    onSave,
+  } = props;
   const { t } = useTranslation();
   const themeMode = useThemeMode();
 
@@ -291,11 +302,11 @@ export const RulesEditorViewer = (props: Props) => {
   };
   const fetchContent = async () => {
     let data = await readProfileFile(property);
-    let obj = yaml.load(data) as { prepend: []; append: []; delete: [] };
+    let obj = yaml.load(data) as { prepend: []; append: []; delete: [] } | null;
 
-    setPrependSeq(obj.prepend || []);
-    setAppendSeq(obj.append || []);
-    setDeleteSeq(obj.delete || []);
+    setPrependSeq(obj?.prepend || []);
+    setAppendSeq(obj?.append || []);
+    setDeleteSeq(obj?.delete || []);
 
     setPrevData(data);
     setCurrData(data);
@@ -305,10 +316,14 @@ export const RulesEditorViewer = (props: Props) => {
     if (currData === "") return;
     if (visible !== true) return;
 
-    let obj = yaml.load(currData) as { prepend: []; append: []; delete: [] };
-    setPrependSeq(obj.prepend || []);
-    setAppendSeq(obj.append || []);
-    setDeleteSeq(obj.delete || []);
+    let obj = yaml.load(currData) as {
+      prepend: [];
+      append: [];
+      delete: [];
+    } | null;
+    setPrependSeq(obj?.prepend || []);
+    setAppendSeq(obj?.append || []);
+    setDeleteSeq(obj?.delete || []);
   }, [visible]);
 
   useEffect(() => {
@@ -320,26 +335,45 @@ export const RulesEditorViewer = (props: Props) => {
 
   const fetchProfile = async () => {
     let data = await readProfileFile(profileUid);
-    let groupsObj = yaml.load(data) as { "proxy-groups": [] };
-    let rulesObj = yaml.load(data) as { rules: [] };
-    let ruleSetObj = yaml.load(data) as { "rule-providers": [] };
-    let subRuleObj = yaml.load(data) as { "sub-rules": [] };
+    let groupsData = await readProfileFile(groupsUid);
+    let mergeData = await readProfileFile(mergeUid);
+    let globalMergeData = await readProfileFile("Merge");
+
+    let rulesObj = yaml.load(data) as { rules: [] } | null;
+
+    let originGroupsObj = yaml.load(data) as { "proxy-groups": [] } | null;
+    let originGroups = originGroupsObj?.["proxy-groups"] || [];
+    let moreGroupsObj = yaml.load(groupsData) as { "proxy-groups": [] } | null;
+    let moreGroups = moreGroupsObj?.["proxy-groups"] || [];
+    let groups = originGroups.concat(moreGroups);
+
+    let originRuleSetObj = yaml.load(data) as { "rule-providers": {} } | null;
+    let originRuleSet = originRuleSetObj?.["rule-providers"] || {};
+    let moreRuleSetObj = yaml.load(mergeData) as {
+      "rule-providers": {};
+    } | null;
+    let moreRuleSet = moreRuleSetObj?.["rule-providers"] || {};
+    let globalRuleSetObj = yaml.load(globalMergeData) as {
+      "rule-providers": {};
+    } | null;
+    let globalRuleSet = globalRuleSetObj?.["rule-providers"] || {};
+    let ruleSet = Object.assign({}, originRuleSet, moreRuleSet, globalRuleSet);
+
+    let originSubRuleObj = yaml.load(data) as { "sub-rules": {} } | null;
+    let originSubRule = originSubRuleObj?.["sub-rules"] || {};
+    let moreSubRuleObj = yaml.load(mergeData) as { "sub-rules": {} } | null;
+    let moreSubRule = moreSubRuleObj?.["sub-rules"] || {};
+    let globalSubRuleObj = yaml.load(globalMergeData) as {
+      "sub-rules": {};
+    } | null;
+    let globalSubRule = globalSubRuleObj?.["sub-rules"] || {};
+    let subRule = Object.assign({}, originSubRule, moreSubRule, globalSubRule);
     setProxyPolicyList(
-      builtinProxyPolicies.concat(
-        groupsObj["proxy-groups"]
-          ? groupsObj["proxy-groups"].map((item: any) => item.name)
-          : []
-      )
-    );
-    setRuleList(rulesObj.rules || []);
-    setRuleSetList(
-      ruleSetObj["rule-providers"]
-        ? Object.keys(ruleSetObj["rule-providers"])
-        : []
-    );
-    setSubRuleList(
-      subRuleObj["sub-rules"] ? Object.keys(subRuleObj["sub-rules"]) : []
+      builtinProxyPolicies.concat(groups.map((group: any) => group.name))
     );
+    setRuleSetList(Object.keys(ruleSet));
+    setSubRuleList(Object.keys(subRule));
+    setRuleList(rulesObj?.rules || []);
   };
 
   useEffect(() => {