Skip to content

pathFilter()

Use pathFilter() from the treaty proxy to create a QueryFilters object for route-based cache invalidation.

Signature

ts
utils.path.to.route.pathFilter(filters?)

Returns

Returns a filter object for invalidateQueries, cancelQueries, etc.

tsx
const utils = useTreatyUtils()
const queryClient = useQueryClient()

// Invalidate all queries under /api/users
queryClient.invalidateQueries(utils.api.users.pathFilter())

// Invalidate specific user queries
queryClient.invalidateQueries(utils.api.users({ id: '1' }).pathFilter())

// Cancel queries
queryClient.cancelQueries(utils.api.users.pathFilter())

Use useTreatyUtils() when you want to invalidate/cancel by a route group (a non-endpoint node). If the node is an endpoint, you can also call pathFilter() on useTreaty() directly.

Example

tsx
import { useMutation, useQueryClient } from '@tanstack/react-query'
import { useTreaty, useTreatyUtils } from './lib/treaty'

function CreateUserForm() {
  const treaty = useTreaty()
  const utils = useTreatyUtils()
  const queryClient = useQueryClient()

  const createUser = useMutation(
    treaty.api.users.mutationOptions({
      onSuccess() {
        // Invalidate all user-related queries
        queryClient.invalidateQueries(utils.api.users.pathFilter())
      }
    })
  )

  return (
    <form onSubmit={(e) => {
      e.preventDefault()
      createUser.mutate({ name: 'Alice' })
    }}>
      <button>Create User</button>
    </form>
  )
}

Optimistic Updates Example

tsx
function UpdateUser({ userId }: { userId: string }) {
  const treaty = useTreaty()
  const utils = useTreatyUtils()
  const queryClient = useQueryClient()

  const updateUser = useMutation(
    treaty.api.users({ id: userId }).mutationOptions({
      async onMutate(newData) {
        // Cancel any outgoing refetches
        await queryClient.cancelQueries(utils.api.users.pathFilter())

        // Snapshot the previous value
        const previousUsers = queryClient.getQueryData(
          treaty.api.users.queryKey()
        )

        // Optimistically update
        queryClient.setQueryData(
          treaty.api.users.queryKey(),
          (old) => old?.map(u =>
            u.id === userId ? { ...u, ...newData } : u
          )
        )

        return { previousUsers }
      },

      onError(err, vars, context) {
        // Rollback on error
        queryClient.setQueryData(
          treaty.api.users.queryKey(),
          context?.previousUsers
        )
      },

      onSettled() {
        // Always refetch after mutation
        queryClient.invalidateQueries(utils.api.users.pathFilter())
      }
    })
  )

  return (
    <button onClick={() => updateUser.mutate({ name: 'Updated' })}>
      Update
    </button>
  )
}

Released under the Apache 2.0 License.