listSet<TData> static method

ZenMutation<TData, TData> listSet<TData>({
  1. required Object queryKey,
  2. String? mutationKey,
  3. required Future<TData> mutationFn(
    1. TData item
    ),
  4. required bool where(
    1. TData item,
    2. TData updated
    ),
  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 updates an item in a list.

Automatically:

  • Updates item in list immediately (optimistic update)
  • Rolls back on error
  • Supports offline queueing

Example:

final updatePost = ZenMutation.listSet<Post>(
  queryKey: 'posts',
  mutationFn: (post) => api.updatePost(post),
  where: (item, updated) => item.id == updated.id,
);

Implementation

static ZenMutation<TData, TData> listSet<TData>({
  required Object queryKey,
  String? mutationKey,
  required Future<TData> Function(TData item) mutationFn,
  required bool Function(TData item, TData updated) where,
  void Function(TData data, TData item, Object? context)? onSuccess,
  void Function(Object error, TData item)? onError,
}) {
  return ZenMutation<TData, TData>(
    mutationKey: mutationKey ?? '${queryKey}_listSet',
    mutationFn: mutationFn,
    onMutate: (item) async {
      final oldList =
          ZenQueryCache.instance.getCachedData<List<TData>>(queryKey);
      ZenQueryCache.instance.setQueryData<List<TData>>(
        queryKey,
        (old) => old?.map((i) => where(i, item) ? item : i).toList() ?? [],
      );
      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);
    },
  );
}