Files
newsnow/src/hooks/query.ts
T

54 lines
1.4 KiB
TypeScript

import { useQuery, useQueryClient } from "@tanstack/react-query"
import type { SourceID, SourceResponse } from "@shared/types"
export function useUpdateQuery() {
const queryClient = useQueryClient()
/**
* update query
*/
return useCallback(async (...sources: SourceID[]) => {
await queryClient.refetchQueries({
predicate: (query) => {
const [type, id] = query.queryKey as ["source" | "entire", SourceID]
return type === "source" && sources.includes(id)
},
})
}, [queryClient])
}
export function useEntireQuery(items: SourceID[]) {
const update = useUpdateQuery()
useQuery({
// sort in place
queryKey: ["entire", [...items].sort()],
queryFn: async ({ queryKey }) => {
const sources = queryKey[1]
if (sources.length === 0) return null
const res: SourceResponse[] | undefined = await myFetch("/s/entire", {
method: "POST",
body: {
sources,
},
})
if (res?.length) {
const s = [] as SourceID[]
res.forEach((v) => {
const id = v.id
if (!cacheSources.has(id) || cacheSources.get(id)!.updatedTime < v.updatedTime) {
s.push(id)
cacheSources.set(id, v)
}
})
// update now
update(...s)
return res
}
return null
},
staleTime: 1000 * 60 * 3,
retry: false,
})
}