diff --git a/src/config/index.js b/src/config/index.js index ba203e9..3d4b2fa 100644 --- a/src/config/index.js +++ b/src/config/index.js @@ -285,4 +285,5 @@ export const DEFAULT_SYNC = { rulesUpdateAt: 0, rulesSyncAt: 0, subRulesSyncAt: 0, // 订阅规则同步时间 + dataCaches: {}, // 缓存同步时间 }; diff --git a/src/hooks/SubRules.js b/src/hooks/SubRules.js index 25b3de8..da42723 100644 --- a/src/hooks/SubRules.js +++ b/src/hooks/SubRules.js @@ -48,7 +48,7 @@ export function useSubRules() { const addSub = useCallback( async (url) => { const subrulesList = [...list]; - subrulesList.push({ url, selected: false, syncAt: Date.now() }); + subrulesList.push({ url, selected: false }); await updateSetting({ subrulesList }); }, [list, updateSetting] diff --git a/src/hooks/Sync.js b/src/hooks/Sync.js index 9cec0a8..f7edf80 100644 --- a/src/hooks/Sync.js +++ b/src/hooks/Sync.js @@ -1,3 +1,4 @@ +import { useCallback } from "react"; import { STOKEY_SYNC, DEFAULT_SYNC } from "../config"; import { useStorage } from "./Storage"; @@ -9,3 +10,36 @@ export function useSync() { const { data, update } = useStorage(STOKEY_SYNC, DEFAULT_SYNC); 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, + }; +} diff --git a/src/views/Options/Rules.js b/src/views/Options/Rules.js index 2843a8e..5b952fe 100644 --- a/src/views/Options/Rules.js +++ b/src/views/Options/Rules.js @@ -48,6 +48,7 @@ import { delSubRules, getSyncWithDefault } from "../../libs/storage"; import OwSubRule from "./OwSubRule"; import ClearAllIcon from "@mui/icons-material/ClearAll"; import HelpButton from "./HelpButton"; +import { useSyncCaches } from "../../hooks/Sync"; function RuleFields({ rule, rules, setShow, setKeyword }) { const initFormValues = rule || { @@ -624,8 +625,9 @@ function SubRulesItem({ syncAt, selectedUrl, delSub, - updateSub, setSelectedRules, + updateDataCache, + deleteDataCache, }) { const [loading, setLoading] = useState(false); @@ -633,6 +635,7 @@ function SubRulesItem({ try { await delSub(url); await delSubRules(url); + await deleteDataCache(url); } catch (err) { console.log("[del subrules]", err); } @@ -645,7 +648,7 @@ function SubRulesItem({ if (rules.length > 0 && url === selectedUrl) { setSelectedRules(rules); } - await updateSub(url, { syncAt: Date.now() }); + await updateDataCache(url); } catch (err) { console.log("[sync sub rules]", err); } finally { @@ -680,7 +683,7 @@ function SubRulesItem({ ); } -function SubRulesEdit({ subList, addSub }) { +function SubRulesEdit({ subList, addSub, updateDataCache }) { const i18n = useI18n(); const [inputText, setInputText] = useState(""); const [inputError, setInputError] = useState(""); @@ -715,6 +718,7 @@ function SubRulesEdit({ subList, addSub }) { throw new Error("empty rules"); } await addSub(url); + await updateDataCache(url); setShowInput(false); setInputText(""); } catch (err) { @@ -787,7 +791,6 @@ function SubRules({ subRules }) { const { subList, selectSub, - updateSub, addSub, delSub, selectedUrl, @@ -795,6 +798,8 @@ function SubRules({ subRules }) { setSelectedRules, loading, } = subRules; + const { dataCaches, updateDataCache, deleteDataCache } = + useSyncCaches(); const handleSelect = (e) => { const url = e.target.value; @@ -803,19 +808,24 @@ function SubRules({ subRules }) { return ( - + {subList.map((item, index) => ( ))}