Skip to content

CRUD Operations

Problem

A users screen needs a cached list and predictable cache updates after creating a user.

Solution

Fetch cache entry by stable key, then use direct mutation for write.

ts
import { createCourier } from '@vielzeug/courier';

type User = { id: number; name: string };

const courier = createCourier({ baseUrl: 'https://api.example.com' });
const key = ['users'] as const;

await courier.queries.fetch({
  key,
  fetch: ({ signal }) => courier.get<User[]>('/users', { signal }),
  staleTime: 5_000,
});
await courier.mutate({
  request: ({ signal }) => courier.post<User>('/users', { body: { name: 'Ada' }, signal }),
  onSuccess: (user, queries) => queries.set(['users', user.id], user),
  invalidateKeys: [key],
});

Pitfalls

  • Cache keys must be stable values rather than values generated during render.
  • invalidate() marks cached data stale; pass { refetch: true } to refetch in the background.
  • Prefer set() only when new value is known complete.