Files
kiss-translator/src/hooks/Rules.js

89 lines
2.1 KiB
JavaScript
Raw Normal View History

2023-08-30 18:05:37 +08:00
import { STOKEY_RULES, DEFAULT_RULES } from "../config";
import { useStorage } from "./Storage";
2023-08-26 14:31:13 +08:00
import { trySyncRules } from "../libs/sync";
2023-08-20 19:27:29 +08:00
import { checkRules } from "../libs/rules";
2023-08-30 18:05:37 +08:00
import { useCallback } from "react";
2023-07-20 13:45:41 +08:00
/**
2023-08-30 18:05:37 +08:00
* 规则 hook
2023-07-20 13:45:41 +08:00
* @returns
*/
export function useRules() {
2023-08-30 18:05:37 +08:00
const { data: list, save } = useStorage(STOKEY_RULES, DEFAULT_RULES);
2023-07-20 13:45:41 +08:00
2023-08-30 18:05:37 +08:00
const updateRules = useCallback(
async (rules) => {
await save(rules);
trySyncRules();
},
2023-09-09 19:26:22 +08:00
[save]
2023-08-30 18:05:37 +08:00
);
2023-07-31 03:10:09 +08:00
2023-08-30 18:05:37 +08:00
const add = useCallback(
async (rule) => {
const rules = [...list];
if (rule.pattern === "*") {
return;
}
if (rules.map((item) => item.pattern).includes(rule.pattern)) {
return;
}
rules.unshift(rule);
await updateRules(rules);
},
[list, updateRules]
);
2023-07-20 13:45:41 +08:00
2023-08-30 18:05:37 +08:00
const del = useCallback(
async (pattern) => {
let rules = [...list];
if (pattern === "*") {
return;
}
rules = rules.filter((item) => item.pattern !== pattern);
await updateRules(rules);
},
[list, updateRules]
);
2023-07-20 13:45:41 +08:00
2023-09-08 15:32:42 +08:00
const clear = useCallback(async () => {
let rules = [...list];
rules = rules.filter((item) => item.pattern === "*");
await updateRules(rules);
}, [list, updateRules]);
2023-08-30 18:05:37 +08:00
const put = useCallback(
async (pattern, obj) => {
const rules = [...list];
if (pattern === "*") {
obj.pattern = "*";
2023-08-20 19:27:29 +08:00
}
2023-08-30 18:05:37 +08:00
const rule = rules.find((r) => r.pattern === pattern);
rule && Object.assign(rule, obj);
await updateRules(rules);
},
[list, updateRules]
);
const merge = useCallback(
async (newRules) => {
const rules = [...list];
newRules = checkRules(newRules);
newRules.forEach((newRule) => {
const rule = rules.find(
(oldRule) => oldRule.pattern === newRule.pattern
);
if (rule) {
Object.assign(rule, newRule);
} else {
rules.unshift(newRule);
}
});
await updateRules(rules);
},
[list, updateRules]
);
2023-07-20 13:45:41 +08:00
2023-09-08 15:32:42 +08:00
return { list, add, del, clear, put, merge };
2023-07-20 13:45:41 +08:00
}