2024-11-03 00:59:44 +08:00
|
|
|
|
import type { SourceID } from "@shared/types"
|
|
|
|
|
|
|
|
|
|
function initRefetchSources() {
|
|
|
|
|
let time = 0
|
|
|
|
|
// useOnReload
|
|
|
|
|
// 没有放在 useOnReload 里面, 可以避免初始化后再修改 refetchSourceAtom,导致多次请求 API
|
|
|
|
|
const _ = localStorage.getItem("quitTime")
|
|
|
|
|
const now = Date.now()
|
|
|
|
|
const quitTime = _ ? Number(_) : 0
|
|
|
|
|
if (!Number.isNaN(quitTime) && now - quitTime < 1000) {
|
|
|
|
|
time = now
|
|
|
|
|
}
|
|
|
|
|
return Object.fromEntries(Object.keys(sources).map(k => [k, time])) as Record<SourceID, number>
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const refetchSourcesAtom = atom(initRefetchSources())
|
|
|
|
|
export function useRefetch() {
|
|
|
|
|
const [refetchSource, setRefetchSource] = useAtom(refetchSourcesAtom)
|
2024-11-03 20:13:49 +08:00
|
|
|
|
const { enableLogin, loggedIn, login } = useLogin()
|
|
|
|
|
const toaster = useToast()
|
2024-11-03 00:59:44 +08:00
|
|
|
|
|
|
|
|
|
const refresh = useCallback((...sources: SourceID[]) => {
|
2024-11-03 20:13:49 +08:00
|
|
|
|
if (loggedIn) {
|
|
|
|
|
const obj = Object.fromEntries(sources.map(id => [id, Date.now()]))
|
|
|
|
|
setRefetchSource(prev => ({
|
|
|
|
|
...prev,
|
|
|
|
|
...obj,
|
|
|
|
|
}))
|
|
|
|
|
} else if (enableLogin) {
|
|
|
|
|
toaster("登录后可以强制拉取最新数据", {
|
|
|
|
|
type: "warning",
|
|
|
|
|
action: {
|
|
|
|
|
label: "登录",
|
|
|
|
|
onClick: login,
|
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}, [setRefetchSource, loggedIn, toaster, login, enableLogin])
|
2024-11-03 00:59:44 +08:00
|
|
|
|
|
|
|
|
|
const getRefreshId = useCallback((id: SourceID) => refetchSource[id], [refetchSource])
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
refresh,
|
|
|
|
|
getRefreshId,
|
|
|
|
|
}
|
|
|
|
|
}
|