function useToggleTodo(id, sort) {
const queryClient = useQueryClient()
return useMutation({
mutationFn: () => toggleTodo(id),
onMutate: async () => {
await queryClient.cancelQueries({
queryKey: ['todos', 'list', { sort }]
})
const snapshot = queryClient.getQueryData(
['todos', 'list', { sort }]
)
queryClient.setQueryData(
['todos', 'list', { sort }],
(previousTodos) => previousTodos?.map((todo) =>
todo.id === id ? { ...todo, done: !todo.done } : todo
)
)
return () => {
queryClient.setQueryData(
['todos', 'list', { sort }],
snapshot
)
}
},
onError: (error, variables, rollback) => {
rollback?.()
}
})
}
function useTodos(sort) {
const queryClient = useQueryClient()
return useQuery({
queryKey: ['todos', 'list', { sort }],
queryFn: () => fetchTodos(sort),
})
}
function useToggleTodo(id, sort) {
const queryClient = useQueryClient()
return useMutation({
mutationFn: () => toggleTodo(id),
onMutate: async () => {
await queryClient.cancelQueries({
queryKey: ['todos', 'list', { sort }]
})
const snapshot = queryClient.getQueryData(
['todos', 'list', { sort }]
)
queryClient.setQueryData(
['todos', 'list', { sort }],
(previousTodos) => previousTodos?.map((todo) =>
todo.id === id ? { ...todo, done: !todo.done } : todo
)
)
return () => {
queryClient.setQueryData(
['todos', 'list', { sort }],
snapshot
)
}
},
onError: (error, variables, rollback) => {
rollback?.()
}
})
}
function useTodos(sort) {
const queryClient = useQueryClient()
return useQuery({
queryKey: ['todos', 'list', { sort }],
queryFn: () => fetchTodos(sort),
})
}