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

114 lines
2.8 KiB
JavaScript
Raw Normal View History

2023-09-01 22:27:25 +08:00
import { DEFAULT_SUBRULES_LIST, DEFAULT_OW_RULE } from "../config";
2023-08-30 18:05:37 +08:00
import { useSetting } from "./Setting";
2023-08-31 00:18:57 +08:00
import { useCallback, useEffect, useMemo, useState } from "react";
import { loadOrFetchSubRules } from "../libs/subRules";
import { delSubRules } from "../libs/storage";
2023-08-30 18:05:37 +08:00
/**
* 订阅规则
* @returns
*/
export function useSubRules() {
2023-08-31 00:18:57 +08:00
const [loading, setLoading] = useState(false);
const [selectedRules, setSelectedRules] = useState([]);
const { setting, updateSetting } = useSetting();
const list = setting?.subrulesList || DEFAULT_SUBRULES_LIST;
2023-08-30 18:05:37 +08:00
2023-08-31 00:18:57 +08:00
const selectedSub = useMemo(() => list.find((item) => item.selected), [list]);
const selectedUrl = selectedSub.url;
const selectSub = useCallback(
2023-08-30 18:05:37 +08:00
async (url) => {
2023-08-31 00:18:57 +08:00
const subrulesList = [...list];
subrulesList.forEach((item) => {
2023-08-30 18:05:37 +08:00
if (item.url === url) {
item.selected = true;
} else {
item.selected = false;
}
});
2023-08-31 00:18:57 +08:00
await updateSetting({ subrulesList });
2023-08-30 18:05:37 +08:00
},
2023-08-31 00:18:57 +08:00
[list, updateSetting]
2023-08-30 18:05:37 +08:00
);
2023-09-08 15:16:10 +08:00
const updateSub = useCallback(
async (url, obj) => {
const subrulesList = [...list];
subrulesList.forEach((item) => {
if (item.url === url) {
Object.assign(item, obj);
}
});
await updateSetting({ subrulesList });
},
[list, updateSetting]
);
2023-08-31 00:18:57 +08:00
const addSub = useCallback(
2023-08-30 18:05:37 +08:00
async (url) => {
2023-08-31 00:18:57 +08:00
const subrulesList = [...list];
2023-09-08 15:16:10 +08:00
subrulesList.push({ url, selected: false, syncAt: Date.now() });
2023-08-31 00:18:57 +08:00
await updateSetting({ subrulesList });
2023-08-30 18:05:37 +08:00
},
2023-08-31 00:18:57 +08:00
[list, updateSetting]
2023-08-30 18:05:37 +08:00
);
2023-08-31 00:18:57 +08:00
const delSub = useCallback(
2023-08-30 18:05:37 +08:00
async (url) => {
2023-08-31 00:18:57 +08:00
let subrulesList = [...list];
subrulesList = subrulesList.filter((item) => item.url !== url);
await updateSetting({ subrulesList });
await delSubRules(url);
2023-08-30 18:05:37 +08:00
},
2023-08-31 00:18:57 +08:00
[list, updateSetting]
2023-08-30 18:05:37 +08:00
);
2023-08-31 00:18:57 +08:00
useEffect(() => {
(async () => {
if (selectedUrl) {
try {
setLoading(true);
const rules = await loadOrFetchSubRules(selectedUrl);
setSelectedRules(rules);
} catch (err) {
console.log("[loadOrFetchSubRules]", err);
} finally {
setLoading(false);
}
}
})();
}, [selectedUrl]);
return {
subList: list,
selectSub,
2023-09-08 15:16:10 +08:00
updateSub,
2023-08-31 00:18:57 +08:00
addSub,
delSub,
selectedSub,
selectedUrl,
selectedRules,
setSelectedRules,
loading,
};
2023-08-30 18:05:37 +08:00
}
2023-09-01 22:27:25 +08:00
/**
* 覆写订阅规则
* @returns
*/
export function useOwSubRule() {
const { setting, updateSetting } = useSetting();
const { owSubrule = DEFAULT_OW_RULE } = setting;
const updateOwSubrule = useCallback(
async (obj) => {
await updateSetting({ owSubrule: { ...owSubrule, ...obj } });
},
[owSubrule, updateSetting]
);
return { owSubrule, updateOwSubrule };
}