listRemove<TData> static method
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);
},
);
}