tanstack-query-intent-core-concurrent-optimistic-updates
Installation
SKILL.md
Core Patterns
Concurrent optimistic updates need per-mutation identity and scoped invalidation. A rollback or invalidation from one mutation should not erase another mutation that is still pending.
Scope related mutations
const mutation = useMutation({
mutationKey: ['items'],
mutationFn: toggleItem,
onMutate: async ({ id }) => {
await queryClient.cancelQueries({ queryKey: ['items', 'detail', id] })
const previousItem = queryClient.getQueryData<Item>(['items', 'detail', id])
queryClient.setQueryData<Item>(['items', 'detail', id], (item) =>
item ? { ...item, isActive: !item.isActive } : item,
)