From fa244b20978d805af607fc56c5f2fe524441ea2d Mon Sep 17 00:00:00 2001 From: Gabe Yuan Date: Mon, 11 Sep 2023 22:53:04 +0800 Subject: [PATCH] subrules sync time --- src/hooks/Storage.js | 1 + src/hooks/Sync.js | 7 ++++--- src/libs/rules.js | 5 ++--- src/libs/subRules.js | 20 ++++++++++++++++---- src/views/Options/Rules.js | 6 +++++- 5 files changed, 28 insertions(+), 11 deletions(-) diff --git a/src/hooks/Storage.js b/src/hooks/Storage.js index 2c0ad80..f368af5 100644 --- a/src/hooks/Storage.js +++ b/src/hooks/Storage.js @@ -31,6 +31,7 @@ export function useStorage(key, defaultVal = null) { if (val) { setData(val); } else if (defaultVal) { + setData(defaultVal); await storage.setObj(key, defaultVal); } }, [key, defaultVal]); diff --git a/src/hooks/Sync.js b/src/hooks/Sync.js index f7edf80..3e1e26e 100644 --- a/src/hooks/Sync.js +++ b/src/hooks/Sync.js @@ -7,8 +7,8 @@ import { useStorage } from "./Storage"; * @returns */ export function useSync() { - const { data, update } = useStorage(STOKEY_SYNC, DEFAULT_SYNC); - return { sync: data, updateSync: update }; + const { data, update, reload } = useStorage(STOKEY_SYNC, DEFAULT_SYNC); + return { sync: data, updateSync: update, reloadSync: reload }; } /** @@ -17,7 +17,7 @@ export function useSync() { * @returns */ export function useSyncCaches() { - const { sync, updateSync } = useSync(); + const { sync, updateSync, reloadSync } = useSync(); const updateDataCache = useCallback( async (url) => { @@ -41,5 +41,6 @@ export function useSyncCaches() { dataCaches: sync.dataCaches || {}, updateDataCache, deleteDataCache, + reloadSync, }; } diff --git a/src/libs/rules.js b/src/libs/rules.js index 4800d50..8835d3b 100644 --- a/src/libs/rules.js +++ b/src/libs/rules.js @@ -49,9 +49,8 @@ export const matchRule = async ( mixRule[key] = val; }); - const subRules = (await loadOrFetchSubRules(selectedSub.url)).map( - (item) => ({ ...item, ...mixRule }) - ); + let subRules = await loadOrFetchSubRules(selectedSub.url); + subRules = subRules.map((item) => ({ ...item, ...mixRule })); rules.splice(-1, 0, ...subRules); } } catch (err) { diff --git a/src/libs/subRules.js b/src/libs/subRules.js index 6dc5bef..3f868d0 100644 --- a/src/libs/subRules.js +++ b/src/libs/subRules.js @@ -10,6 +10,16 @@ import { apiFetch } from "../apis"; import { checkRules } from "./rules"; import { isAllchar } from "./utils"; +/** + * 更新缓存同步时间 + * @param {*} url + */ +const updateSyncDataCache = async (url) => { + const { dataCaches = {} } = await getSyncWithDefault(); + dataCaches[url] = Date.now(); + await updateSync({ dataCaches }); +}; + /** * 同步订阅规则 * @param {*} url @@ -35,6 +45,7 @@ export const syncAllSubRules = async (subrulesList, isBg = false) => { for (let subrules of subrulesList) { try { await syncSubRules(subrules.url, isBg); + await updateSyncDataCache(subrules.url); } catch (err) { console.log(`[sync subrule error]: ${subrules.url}`, err); } @@ -70,9 +81,10 @@ export const trySyncAllSubRules = async ({ subrulesList }, isBg = false) => { * @returns */ export const loadOrFetchSubRules = async (url) => { - const rules = await getSubRules(url); - if (rules?.length) { - return rules; + let rules = await getSubRules(url); + if (!rules || rules.length === 0) { + rules = await syncSubRules(url); + await updateSyncDataCache(url); } - return syncSubRules(url); + return rules || []; }; diff --git a/src/views/Options/Rules.js b/src/views/Options/Rules.js index 5b952fe..d53de57 100644 --- a/src/views/Options/Rules.js +++ b/src/views/Options/Rules.js @@ -798,7 +798,7 @@ function SubRules({ subRules }) { setSelectedRules, loading, } = subRules; - const { dataCaches, updateDataCache, deleteDataCache } = + const { dataCaches, updateDataCache, deleteDataCache, reloadSync } = useSyncCaches(); const handleSelect = (e) => { @@ -806,6 +806,10 @@ function SubRules({ subRules }) { selectSub(url); }; + useEffect(() => { + reloadSync(); + }, [selectedRules, reloadSync]); + return (