listPut<TData> static method

ZenMutation<TData, TData> listPut<TData>({
  1. required Object queryKey,
  2. String? mutationKey,
  3. required Future<TData> mutationFn(
    1. TData item
    ),
  4. bool addToStart = true,
  5. void onSuccess(
    1. TData data,
    2. TData item,
    3. Object? context
    )?,
  6. void onError(
    1. Object error,
    2. TData item
    )?,
})

Create a mutation that optimistically adds an item to a list.

Automatically:

  • Adds item to list immediately (optimistic update)
  • Rolls back on error
  • Supports offline queueing

Example:

final createPost = ZenMutation.listPut<Post>(
  queryKey: 'posts',
  mutationFn: (post) => api.createPost(post),
);

Implementation

static ZenMutation<TData, TData> listPut<TData>({
  required Object queryKey,
  String? mutationKey,
  required Future<TData> Function(TData item) mutationFn,
  bool addToStart = true,
  void Function(TData data, TData item, Object? context)? onSuccess,
  void Function(Object error, TData item)? onError,
}) {
  return ZenMutation<TData, TData>(
    mutationKey: mutationKey ?? '${queryKey}_listPut',
    mutationFn: mutationFn,
    onMutate: (item) async {
      final oldList =
          ZenQueryCache.instance.getCachedData<List<TData>>(queryKey);
      ZenQueryCache.instance.setQueryData<List<TData>>(
        queryKey,
        (old) {
          final list = old ?? <TData>[];
          return addToStart ? [item, ...list] : [...list, item];
        },
      );
      return oldList;
    },
    onSuccess: (data, item, context) => onSuccess?.call(data, item, context),
    onError: (err, item, context) {
      if (context != null) {
        ZenQueryCache.instance.setQueryData<List<TData>>(
          queryKey,
          (_) => context as List<TData>,
        );
      }
      onError?.call(err, item);
    },
  );
}