listRemove<TData> static method

ZenMutation<void, TData> listRemove<TData>({
  1. required Object queryKey,
  2. String? mutationKey,
  3. required Future<void> mutationFn(
    1. TData item
    ),
  4. required bool where(
    1. TData item,
    2. TData toRemove
    ),
  5. void onSuccess(
    1. TData item,
    2. Object? context
    )?,
  6. void onError(
    1. Object error,
    2. TData item
    )?,
})

Create a mutation that optimistically removes an item from a list.

Automatically:

  • Removes item from list immediately (optimistic update)
  • Rolls back on error
  • Supports offline queueing

Example:

final deletePost = ZenMutation.listRemove<Post>(
  queryKey: 'posts',
  mutationFn: (post) => api.deletePost(post.id),
  where: (item, toRemove) => item.id == toRemove.id,
);

Implementation

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