Notr Logo
API Reference

React Client (useOptimisticCrud, withTransition)

Optimistic UI updates and safe transitions for server actions.

'use client'

import { useOptimisticCrud, withTransition } from '@remcostoeten/drizzleasy/client'
import { createFn } from '@remcostoeten/drizzleasy/server'

type TTodo = { id: string; title: string; completed: boolean }

function TodoList(props: { initialTodos: TTodo[] }) {
  const { data, isPending, optimisticCreate } = useOptimisticCrud<TTodo>(props.initialTodos)
  const create = createFn<TTodo>()

  function handleSubmit(formData: FormData) {
    const title = String(formData.get('title') || '')
    optimisticCreate({ title, completed: false }, function onCreate() {
      return create('todos')({ id: crypto.randomUUID(), title, completed: false })
    })
  }

  return (
    <form action={handleSubmit}>
      <input name="title" placeholder="Add todo" />
      <button disabled={isPending}>{isPending ? 'Adding...' : 'Add'}</button>
    </form>
  )
}

Wrap server actions in a transition:

function saveUserAction() {
  'use server'
  // ... update in DB, return TResult
}

const save = withTransition(saveUserAction)