set<TData> static method

ZenMutation<TData, TData> set<TData>({
  1. required Object queryKey,
  2. String? mutationKey,
  3. required Future<TData> mutationFn(
    1. TData value
    ),
  4. void onSuccess(
    1. TData data,
    2. TData value,
    3. Object? context
    )?,
  5. void onError(
    1. Object error,
    2. TData value
    )?,
})

Create a mutation that optimistically updates a single value.

Automatically:

  • Updates value immediately (optimistic update)
  • Rolls back on error
  • Supports offline queueing

Example:

final updateUser = ZenMutation.set<User>(
  queryKey: 'current_user',
  mutationFn: (user) => api.updateUser(user),
);

Implementation

static ZenMutation<TData, TData> set<TData>({
  required Object queryKey,
  String? mutationKey,
  required Future<TData> Function(TData value) mutationFn,
  void Function(TData data, TData value, Object? context)? onSuccess,
  void Function(Object error, TData value)? onError,
}) {
  return ZenMutation<TData, TData>(
    mutationKey: mutationKey ?? '${queryKey}_set',
    mutationFn: mutationFn,
    onMutate: (value) async {
      final oldValue = ZenQueryCache.instance.getCachedData<TData>(queryKey);
      ZenQueryCache.instance.setQueryData<TData>(
        queryKey,
        (_) => value,
      );
      return oldValue;
    },
    onSuccess: (data, value, context) =>
        onSuccess?.call(data, value, context),
    onError: (err, value, context) {
      if (context != null) {
        ZenQueryCache.instance.setQueryData<TData>(
          queryKey,
          (_) => context as TData,
        );
      }
      onError?.call(err, value);
    },
  );
}