import 'dart:async'; import 'package:fl_query/fl_query.dart'; import 'package:fl_query_hooks/src/use_query_client.dart'; import 'package:fl_query_hooks/src/utils/use_updater.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; Mutation useMutation( String mutationKey, MutationFn mutationFn, { RetryConfig? retryConfig, MutationOnDataFn? onData, MutationOnErrorFn? onError, MutationOnMutationFn? onMutate, List? refreshQueries, List? refreshInfiniteQueries, List? keys, }) { final mounted = useIsMounted(); final rebuild = useUpdater(); final client = useQueryClient(); final mutation = useMemoized>(() { return client.createMutation( mutationKey, mutationFn, retryConfig: retryConfig, ); }, [mutationKey]); final recoveryData = useState(null); useEffect(() { return mutation.addListener(rebuild); }, [mutation]); useEffect(() { mutation.updateMutationFn(mutationFn); return null; }, [mutationFn, mutation]); useEffect(() { if (onMutate != null) { return mutation.mutationStream.listen((event) async { if (mounted()) { recoveryData.value = await onMutate.call(event); } }).cancel; } return null; }, [onMutate, mutation]); useEffect(() { StreamSubscription? dataSubscription; StreamSubscription? errorSubscription; dataSubscription = mutation.dataStream.listen((event) { final data = onData?.call(event, recoveryData.value); if (refreshQueries != null) { client.refreshQueries(refreshQueries); } if (refreshInfiniteQueries != null) { client.refreshInfiniteQueries(refreshInfiniteQueries); } return data; }); if (onError != null) { errorSubscription = mutation.errorStream.listen( (event) { return onError(event, recoveryData.value); }, ); } return () { dataSubscription?.cancel(); errorSubscription?.cancel(); }; }, [onData, onError, recoveryData.value, mutation]); return mutation; }