useOptimisticServerAction<TArgs, TState, TResult> function

OptimisticServerActionState<TArgs, TState, TResult> useOptimisticServerAction<TArgs, TState, TResult>(
  1. ServerFunctionRef<TArgs, TResult> ref,
  2. TState initialState,
  3. TState optimisticUpdate(
    1. TState state,
    2. TArgs arguments
    )
)

Binds a server action to React 19's optimistic state and transitions.

optimisticUpdate runs immediately when invoke is called. React keeps that state visible while the transition is pending and restores the previous state when the action settles. The server result and error remain available through data and error, just as with useServerAction.

This hook requires a React runtime that supports useOptimistic and useTransition.

Implementation

OptimisticServerActionState<TArgs, TState, TResult>
useOptimisticServerAction<TArgs, TState, TResult>(
  ServerFunctionRef<TArgs, TResult> ref,
  TState initialState,
  TState Function(TState state, TArgs arguments) optimisticUpdate,
) {
  final action = useServerAction(ref);
  final (optimisticState, setOptimisticState) = useOptimistic<TState, TArgs>(
    initialState,
    optimisticUpdate,
  );
  final (transitionPending, startTransition) = useTransition();

  Future<TResult> invoke(TArgs arguments) {
    final result = Completer<TResult>();
    try {
      startTransition(() {
        setOptimisticState(arguments);
        action
            .invoke(arguments)
            .then(
              result.complete,
              onError: (Object error, StackTrace stack) {
                result.completeError(error, stack);
              },
            );
      });
    } catch (error, stack) {
      result.completeError(error, stack);
    }
    return result.future;
  }

  return OptimisticServerActionState(
    state: optimisticState,
    pending: transitionPending || action.pending,
    data: action.data,
    error: action.error,
    invoke: invoke,
  );
}