useServerAction<TArgs, TResult> function

ServerActionState<TArgs, TResult> useServerAction<TArgs, TResult>(
  1. ServerFunctionRef<TArgs, TResult> ref
)

Binds a generated server function to React pending/result/error state.

This is the ergonomic building block for buttons and form submit handlers:

final action = useServerAction(greetRef);
button(
  disabled: action.pending,
  onClick: (_) => action.invoke((name: 'Ada')),
  children: [Text(action.data ?? 'Greet')],
);

Implementation

ServerActionState<TArgs, TResult> useServerAction<TArgs, TResult>(
  ServerFunctionRef<TArgs, TResult> ref,
) {
  final (pending, setPending) = useState(false);
  final (data, setData) = useState<TResult?>(null);
  final (error, setError) = useState<Object?>(null);

  Future<TResult> invoke(TArgs arguments) async {
    setPending(true);
    setError(null);
    try {
      final result = await currentServerFunctionClient.invoke(ref, arguments);
      setData(result);
      return result;
    } catch (caught) {
      setError(caught);
      rethrow;
    } finally {
      setPending(false);
    }
  }

  return ServerActionState(
    pending: pending,
    data: data,
    error: error,
    invoke: invoke,
  );
}