subrules sync time

This commit is contained in:
Gabe Yuan
2023-09-11 17:56:31 +08:00
parent 2bf79dbc51
commit 79612f8a1b
4 changed files with 53 additions and 8 deletions

View File

@@ -285,4 +285,5 @@ export const DEFAULT_SYNC = {
rulesUpdateAt: 0, rulesUpdateAt: 0,
rulesSyncAt: 0, rulesSyncAt: 0,
subRulesSyncAt: 0, // 订阅规则同步时间 subRulesSyncAt: 0, // 订阅规则同步时间
dataCaches: {}, // 缓存同步时间
}; };

View File

@@ -48,7 +48,7 @@ export function useSubRules() {
const addSub = useCallback( const addSub = useCallback(
async (url) => { async (url) => {
const subrulesList = [...list]; const subrulesList = [...list];
subrulesList.push({ url, selected: false, syncAt: Date.now() }); subrulesList.push({ url, selected: false });
await updateSetting({ subrulesList }); await updateSetting({ subrulesList });
}, },
[list, updateSetting] [list, updateSetting]

View File

@@ -1,3 +1,4 @@
import { useCallback } from "react";
import { STOKEY_SYNC, DEFAULT_SYNC } from "../config"; import { STOKEY_SYNC, DEFAULT_SYNC } from "../config";
import { useStorage } from "./Storage"; import { useStorage } from "./Storage";
@@ -9,3 +10,36 @@ export function useSync() {
const { data, update } = useStorage(STOKEY_SYNC, DEFAULT_SYNC); const { data, update } = useStorage(STOKEY_SYNC, DEFAULT_SYNC);
return { sync: data, updateSync: update }; return { sync: data, updateSync: update };
} }
/**
* caches sync hook
* @param {*} url
* @returns
*/
export function useSyncCaches() {
const { sync, updateSync } = useSync();
const updateDataCache = useCallback(
async (url) => {
const dataCaches = sync.dataCaches || {};
dataCaches[url] = Date.now();
await updateSync({ dataCaches });
},
[sync, updateSync]
);
const deleteDataCache = useCallback(
async (url) => {
const dataCaches = sync.dataCaches || {};
delete dataCaches[url];
await updateSync({ dataCaches });
},
[sync, updateSync]
);
return {
dataCaches: sync.dataCaches || {},
updateDataCache,
deleteDataCache,
};
}

View File

@@ -48,6 +48,7 @@ import { delSubRules, getSyncWithDefault } from "../../libs/storage";
import OwSubRule from "./OwSubRule"; import OwSubRule from "./OwSubRule";
import ClearAllIcon from "@mui/icons-material/ClearAll"; import ClearAllIcon from "@mui/icons-material/ClearAll";
import HelpButton from "./HelpButton"; import HelpButton from "./HelpButton";
import { useSyncCaches } from "../../hooks/Sync";
function RuleFields({ rule, rules, setShow, setKeyword }) { function RuleFields({ rule, rules, setShow, setKeyword }) {
const initFormValues = rule || { const initFormValues = rule || {
@@ -624,8 +625,9 @@ function SubRulesItem({
syncAt, syncAt,
selectedUrl, selectedUrl,
delSub, delSub,
updateSub,
setSelectedRules, setSelectedRules,
updateDataCache,
deleteDataCache,
}) { }) {
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
@@ -633,6 +635,7 @@ function SubRulesItem({
try { try {
await delSub(url); await delSub(url);
await delSubRules(url); await delSubRules(url);
await deleteDataCache(url);
} catch (err) { } catch (err) {
console.log("[del subrules]", err); console.log("[del subrules]", err);
} }
@@ -645,7 +648,7 @@ function SubRulesItem({
if (rules.length > 0 && url === selectedUrl) { if (rules.length > 0 && url === selectedUrl) {
setSelectedRules(rules); setSelectedRules(rules);
} }
await updateSub(url, { syncAt: Date.now() }); await updateDataCache(url);
} catch (err) { } catch (err) {
console.log("[sync sub rules]", err); console.log("[sync sub rules]", err);
} finally { } finally {
@@ -680,7 +683,7 @@ function SubRulesItem({
); );
} }
function SubRulesEdit({ subList, addSub }) { function SubRulesEdit({ subList, addSub, updateDataCache }) {
const i18n = useI18n(); const i18n = useI18n();
const [inputText, setInputText] = useState(""); const [inputText, setInputText] = useState("");
const [inputError, setInputError] = useState(""); const [inputError, setInputError] = useState("");
@@ -715,6 +718,7 @@ function SubRulesEdit({ subList, addSub }) {
throw new Error("empty rules"); throw new Error("empty rules");
} }
await addSub(url); await addSub(url);
await updateDataCache(url);
setShowInput(false); setShowInput(false);
setInputText(""); setInputText("");
} catch (err) { } catch (err) {
@@ -787,7 +791,6 @@ function SubRules({ subRules }) {
const { const {
subList, subList,
selectSub, selectSub,
updateSub,
addSub, addSub,
delSub, delSub,
selectedUrl, selectedUrl,
@@ -795,6 +798,8 @@ function SubRules({ subRules }) {
setSelectedRules, setSelectedRules,
loading, loading,
} = subRules; } = subRules;
const { dataCaches, updateDataCache, deleteDataCache } =
useSyncCaches();
const handleSelect = (e) => { const handleSelect = (e) => {
const url = e.target.value; const url = e.target.value;
@@ -803,19 +808,24 @@ function SubRules({ subRules }) {
return ( return (
<Stack spacing={3}> <Stack spacing={3}>
<SubRulesEdit subList={subList} addSub={addSub} /> <SubRulesEdit
subList={subList}
addSub={addSub}
updateDataCache={updateDataCache}
/>
<RadioGroup value={selectedUrl} onChange={handleSelect}> <RadioGroup value={selectedUrl} onChange={handleSelect}>
{subList.map((item, index) => ( {subList.map((item, index) => (
<SubRulesItem <SubRulesItem
key={item.url} key={item.url}
url={item.url} url={item.url}
syncAt={item.syncAt} syncAt={dataCaches[item.url]}
index={index} index={index}
selectedUrl={selectedUrl} selectedUrl={selectedUrl}
delSub={delSub} delSub={delSub}
updateSub={updateSub}
setSelectedRules={setSelectedRules} setSelectedRules={setSelectedRules}
updateDataCache={updateDataCache}
deleteDataCache={deleteDataCache}
/> />
))} ))}
</RadioGroup> </RadioGroup>