newsnow/src/hooks/useRefetch.ts

47 lines
1.4 KiB
TypeScript
Raw Normal View History

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,
}
}