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