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

110 lines
2.6 KiB
JavaScript
Raw Normal View History

2023-07-20 13:45:41 +08:00
import {
STOKEY_RULES,
OPT_TRANS_ALL,
OPT_STYLE_ALL,
OPT_LANGS_FROM,
OPT_LANGS_TO,
2023-07-31 03:10:09 +08:00
STOKEY_RULES_UPDATE_AT,
2023-07-20 13:45:41 +08:00
} from "../config";
import storage from "../libs/storage";
import { useStorages } from "./Storage";
import { matchValue } from "../libs/utils";
2023-07-31 03:10:09 +08:00
import { apiSyncRules } from "../apis/data";
2023-07-20 13:45:41 +08:00
/**
* 匹配规则增删改查 hook
* @returns
*/
export function useRules() {
const storages = useStorages();
2023-07-28 15:34:05 +08:00
const list = storages?.[STOKEY_RULES] || [];
2023-07-20 13:45:41 +08:00
2023-07-31 03:10:09 +08:00
const update = async (rules) => {
const now = Date.now();
await storage.setObj(STOKEY_RULES, rules);
await storage.setObj(STOKEY_RULES_UPDATE_AT, now);
try {
await apiSyncRules(rules, now);
} catch (err) {
console.log("[sync rules]", err);
}
};
2023-07-20 13:45:41 +08:00
const add = async (rule) => {
2023-07-28 15:34:05 +08:00
const rules = [...list];
2023-07-20 13:45:41 +08:00
if (rule.pattern === "*") {
return;
}
if (rules.map((item) => item.pattern).includes(rule.pattern)) {
return;
}
2023-07-28 15:34:05 +08:00
rules.unshift(rule);
2023-07-31 03:10:09 +08:00
await update(rules);
2023-07-20 13:45:41 +08:00
};
const del = async (pattern) => {
2023-07-28 15:34:05 +08:00
let rules = [...list];
2023-07-20 13:45:41 +08:00
if (pattern === "*") {
return;
}
2023-07-28 15:34:05 +08:00
rules = rules.filter((item) => item.pattern !== pattern);
2023-07-31 03:10:09 +08:00
await update(rules);
2023-07-20 13:45:41 +08:00
};
2023-07-28 15:34:05 +08:00
const put = async (pattern, obj) => {
const rules = [...list];
if (pattern === "*") {
2023-07-20 13:45:41 +08:00
obj.pattern = "*";
}
2023-07-28 15:34:05 +08:00
const rule = rules.find((r) => r.pattern === pattern);
rule && Object.assign(rule, obj);
2023-07-31 03:10:09 +08:00
await update(rules);
2023-07-20 13:45:41 +08:00
};
const merge = async (newRules) => {
2023-07-31 03:10:09 +08:00
const rules = [...list];
2023-07-20 13:45:41 +08:00
const fromLangs = OPT_LANGS_FROM.map((item) => item[0]);
const toLangs = OPT_LANGS_TO.map((item) => item[0]);
newRules
.filter(
({ pattern, selector }) =>
pattern &&
selector &&
typeof pattern === "string" &&
typeof selector === "string"
)
.map(
({
pattern,
selector,
translator,
fromLang,
toLang,
textStyle,
transOpen,
}) => ({
pattern,
selector,
translator: matchValue(OPT_TRANS_ALL, translator),
fromLang: matchValue(fromLangs, fromLang),
toLang: matchValue(toLangs, toLang),
textStyle: matchValue(OPT_STYLE_ALL, textStyle),
transOpen: matchValue([true, false], transOpen),
})
)
.forEach((newRule) => {
const rule = rules.find(
(oldRule) => oldRule.pattern === newRule.pattern
);
if (rule) {
Object.assign(rule, newRule);
} else {
rules.unshift(newRule);
}
});
2023-07-31 03:10:09 +08:00
await update(rules);
2023-07-20 13:45:41 +08:00
};
2023-07-28 15:34:05 +08:00
return { list, add, del, put, merge };
2023-07-20 13:45:41 +08:00
}