useMutation<TData, TVariables> function

UseMutationResult<TData, TVariables> useMutation<TData, TVariables>(
  1. Future<TData> mutationFn(
    1. TVariables variables
    ), {
  2. MutationOptions<TData, TVariables>? options,
  3. void onSuccess(
    1. TData data
    )?,
  4. void onError(
    1. Object error
    )?,
})

Creates a FASQ Mutation and exposes its state through a hook.

The returned UseMutationResult provides imperative mutate/reset callbacks together with reactive status flags that update as the mutation progresses.

Implementation

UseMutationResult<TData, TVariables> useMutation<TData, TVariables>(
  Future<TData> Function(TVariables variables) mutationFn, {
  MutationOptions<TData, TVariables>? options,
  void Function(TData data)? onSuccess,
  void Function(Object error)? onError,
}) {
  final state = useState<MutationState<TData>>(const MutationState.idle());
  final mutation = useMemoized(
    () => Mutation<TData, TVariables>(
      mutationFn: mutationFn,
      options:
          options ??
          MutationOptions<TData, TVariables>(
            onSuccess: onSuccess,
            onError: onError,
          ),
    ),
  );

  useEffect(() {
    final subscription = mutation.stream.listen((newState) {
      state.value = newState;
    });

    state.value = mutation.state;

    return () {
      subscription.cancel();
      mutation.dispose();
    };
  }, [mutation]);

  return UseMutationResult(
    mutate: mutation.mutate,
    reset: mutation.reset,
    state: state.value,
  );
}