From 0c819d4e11572d592b5334280b8b4f2657f21459 Mon Sep 17 00:00:00 2001 From: Kingkor Roy Tirtho Date: Thu, 2 Mar 2023 18:51:50 +0600 Subject: [PATCH] refactor: more convenient ways customizing config --- .../lib/src/collections/default_configs.dart | 2 + .../lib/src/collections/refresh_config.dart | 48 ++++++++++++++ .../lib/src/collections/retry_config.dart | 35 ++++++++++ packages/fl_query/lib/src/core/cache.dart | 10 +-- packages/fl_query/lib/src/core/client.dart | 66 +++++++++++++------ .../fl_query/lib/src/core/infinite_query.dart | 4 +- packages/fl_query/lib/src/core/mutation.dart | 9 +-- packages/fl_query/lib/src/core/query.dart | 5 +- .../src/widgets/infinite_query_builder.dart | 9 ++- .../lib/src/widgets/mutation_builder.dart | 5 +- .../lib/src/widgets/query_builder.dart | 9 ++- .../lib/src/use_infinite_query.dart | 4 +- .../fl_query_hooks/lib/src/use_mutation.dart | 2 +- .../fl_query_hooks/lib/src/use_query.dart | 4 +- 14 files changed, 159 insertions(+), 53 deletions(-) diff --git a/packages/fl_query/lib/src/collections/default_configs.dart b/packages/fl_query/lib/src/collections/default_configs.dart index 6c697e3..809dfc5 100644 --- a/packages/fl_query/lib/src/collections/default_configs.dart +++ b/packages/fl_query/lib/src/collections/default_configs.dart @@ -1,6 +1,8 @@ import 'package:fl_query/src/collections/refresh_config.dart'; import 'package:fl_query/src/collections/retry_config.dart'; +import 'package:flutter/material.dart'; +@immutable abstract class DefaultConstants { static const RetryConfig retryConfig = RetryConfig( maxRetries: 3, diff --git a/packages/fl_query/lib/src/collections/refresh_config.dart b/packages/fl_query/lib/src/collections/refresh_config.dart index dade9de..de697e7 100644 --- a/packages/fl_query/lib/src/collections/refresh_config.dart +++ b/packages/fl_query/lib/src/collections/refresh_config.dart @@ -1,3 +1,7 @@ +import 'package:fl_query/src/collections/default_configs.dart'; +import 'package:fl_query/src/core/client.dart'; +import 'package:flutter/material.dart'; + class RefreshConfig { final Duration staleDuration; final Duration refreshInterval; @@ -10,4 +14,48 @@ class RefreshConfig { required this.refreshOnMount, required this.refreshOnQueryFnChange, }); + + factory RefreshConfig.withDefaults( + BuildContext context, { + Duration? staleDuration, + Duration? refreshInterval, + bool? refreshOnMount, + bool? refreshOnQueryFnChange, + }) { + return QueryClient.of(context).refreshConfig.copyWith( + staleDuration: staleDuration, + refreshInterval: refreshInterval, + refreshOnMount: refreshOnMount, + refreshOnQueryFnChange: refreshOnQueryFnChange, + ); + } + + factory RefreshConfig.withConstantDefaults({ + Duration? staleDuration, + Duration? refreshInterval, + bool? refreshOnMount, + bool? refreshOnQueryFnChange, + }) { + return DefaultConstants.refreshConfig.copyWith( + staleDuration: staleDuration, + refreshInterval: refreshInterval, + refreshOnMount: refreshOnMount, + refreshOnQueryFnChange: refreshOnQueryFnChange, + ); + } + + RefreshConfig copyWith({ + Duration? staleDuration, + Duration? refreshInterval, + bool? refreshOnMount, + bool? refreshOnQueryFnChange, + }) { + return RefreshConfig( + staleDuration: staleDuration ?? this.staleDuration, + refreshInterval: refreshInterval ?? this.refreshInterval, + refreshOnMount: refreshOnMount ?? this.refreshOnMount, + refreshOnQueryFnChange: + refreshOnQueryFnChange ?? this.refreshOnQueryFnChange, + ); + } } diff --git a/packages/fl_query/lib/src/collections/retry_config.dart b/packages/fl_query/lib/src/collections/retry_config.dart index f3e80f7..c329128 100644 --- a/packages/fl_query/lib/src/collections/retry_config.dart +++ b/packages/fl_query/lib/src/collections/retry_config.dart @@ -1,6 +1,41 @@ +import 'package:fl_query/src/collections/default_configs.dart'; +import 'package:fl_query/src/core/client.dart'; +import 'package:flutter/material.dart'; + class RetryConfig { final int maxRetries; final Duration retryDelay; const RetryConfig({required this.maxRetries, required this.retryDelay}); + + factory RetryConfig.withDefaults( + BuildContext context, { + int? maxRetries, + Duration? retryDelay, + }) { + return QueryClient.of(context).retryConfig.copyWith( + maxRetries: maxRetries, + retryDelay: retryDelay, + ); + } + + factory RetryConfig.withConstantDefaults({ + int? maxRetries, + Duration? retryDelay, + }) { + return DefaultConstants.retryConfig.copyWith( + maxRetries: maxRetries, + retryDelay: retryDelay, + ); + } + + RetryConfig copyWith({ + int? maxRetries, + Duration? retryDelay, + }) { + return RetryConfig( + maxRetries: maxRetries ?? this.maxRetries, + retryDelay: retryDelay ?? this.retryDelay, + ); + } } diff --git a/packages/fl_query/lib/src/core/cache.dart b/packages/fl_query/lib/src/core/cache.dart index e61dd76..0192349 100644 --- a/packages/fl_query/lib/src/core/cache.dart +++ b/packages/fl_query/lib/src/core/cache.dart @@ -1,11 +1,11 @@ import 'dart:async'; import 'package:collection/collection.dart'; -import 'package:fl_query/src/collections/default_configs.dart'; import 'package:fl_query/src/core/client.dart'; import 'package:fl_query/src/core/infinite_query.dart'; import 'package:fl_query/src/core/mutation.dart'; import 'package:fl_query/src/core/query.dart'; +import 'package:flutter/material.dart'; import 'package:hive_flutter/hive_flutter.dart'; enum QueryCacheEventType { @@ -17,6 +17,7 @@ enum QueryCacheEventType { removeMutation, } +@immutable class QueryCacheEvent { final QueryCacheEventType type; final Object data; @@ -31,13 +32,14 @@ class QueryCache { final Duration cacheDuration; - final _eventController = StreamController.broadcast(); + final StreamController _eventController; QueryCache({ - this.cacheDuration = DefaultConstants.cacheDuration, + required this.cacheDuration, }) : _queries = Set(), _infiniteQueries = Set(), - _mutations = Set() { + _mutations = Set(), + _eventController = StreamController.broadcast() { Timer.periodic(cacheDuration, (timer) { _queries.removeWhere((query) { if (query.isInactive) { diff --git a/packages/fl_query/lib/src/core/client.dart b/packages/fl_query/lib/src/core/client.dart index f07944b..ab70ba5 100644 --- a/packages/fl_query/lib/src/core/client.dart +++ b/packages/fl_query/lib/src/core/client.dart @@ -13,17 +13,41 @@ import 'package:fl_query/src/core/query.dart'; import 'package:flutter/material.dart'; import 'package:hive_flutter/adapters.dart'; +@immutable class QueryClient { final QueryCache cache; - QueryClient({QueryCache? cache}) : this.cache = cache ?? QueryCache(); + final RetryConfig retryConfig; + final RefreshConfig refreshConfig; + final Duration cacheDuration; + + QueryClient({ + QueryCache? cache, + this.cacheDuration = DefaultConstants.cacheDuration, + int? maxRetries, + Duration? retryDelay, + Duration? staleDuration, + Duration? refreshInterval, + bool? refreshOnMount, + bool? refreshOnQueryFnChange, + }) : this.cache = cache ?? QueryCache(cacheDuration: cacheDuration), + this.retryConfig = DefaultConstants.retryConfig.copyWith( + maxRetries: maxRetries, + retryDelay: retryDelay, + ), + this.refreshConfig = DefaultConstants.refreshConfig.copyWith( + staleDuration: staleDuration, + refreshInterval: refreshInterval, + refreshOnMount: refreshOnMount, + refreshOnQueryFnChange: refreshOnQueryFnChange, + ); Query createQuery( String key, QueryFn queryFn, { DataType? initial, - RetryConfig retryConfig = DefaultConstants.retryConfig, - RefreshConfig refreshConfig = DefaultConstants.refreshConfig, + RetryConfig? retryConfig, + RefreshConfig? refreshConfig, JsonConfig? jsonConfig, }) { final query = cache.queries @@ -33,8 +57,8 @@ class QueryClient { key, queryFn, initial: initial, - retryConfig: retryConfig, - refreshConfig: refreshConfig, + retryConfig: retryConfig ?? this.retryConfig, + refreshConfig: refreshConfig ?? this.refreshConfig, jsonConfig: jsonConfig, ), ) @@ -48,8 +72,8 @@ class QueryClient { String key, QueryFn queryFn, { DataType? initial, - RetryConfig retryConfig = DefaultConstants.retryConfig, - RefreshConfig refreshConfig = DefaultConstants.refreshConfig, + RetryConfig? retryConfig, + RefreshConfig? refreshConfig, JsonConfig? jsonConfig, }) async { try { @@ -114,8 +138,8 @@ class QueryClient { InfiniteQueryFn queryFn, { required InfiniteQueryNextPage nextPage, required PageType initialParam, - RetryConfig retryConfig = DefaultConstants.retryConfig, - RefreshConfig refreshConfig = DefaultConstants.refreshConfig, + RetryConfig? retryConfig, + RefreshConfig? refreshConfig, JsonConfig? jsonConfig, }) { final query = cache.infiniteQueries @@ -126,8 +150,8 @@ class QueryClient { queryFn, nextPage: nextPage, initialParam: initialParam, - retryConfig: retryConfig, - refreshConfig: refreshConfig, + retryConfig: retryConfig ?? this.retryConfig, + refreshConfig: refreshConfig ?? this.refreshConfig, jsonConfig: jsonConfig, ), ) @@ -139,12 +163,14 @@ class QueryClient { } Future fetchInfiniteQuery( - String key, InfiniteQueryFn queryFn, - {required InfiniteQueryNextPage nextPage, - required PageType initialParam, - RetryConfig retryConfig = DefaultConstants.retryConfig, - RefreshConfig refreshConfig = DefaultConstants.refreshConfig, - JsonConfig? jsonConfig}) async { + String key, + InfiniteQueryFn queryFn, { + required InfiniteQueryNextPage nextPage, + required PageType initialParam, + RetryConfig? retryConfig, + RefreshConfig? refreshConfig, + JsonConfig? jsonConfig, + }) async { try { DataType? result; final completer = Completer(); @@ -224,7 +250,7 @@ class QueryClient { createMutation( String key, MutationFn mutationFn, { - RetryConfig retryConfig = DefaultConstants.retryConfig, + RetryConfig? retryConfig, }) { final mutation = cache.mutations .firstWhere( @@ -232,7 +258,7 @@ class QueryClient { orElse: () => Mutation( key, mutationFn, - retryConfig: retryConfig, + retryConfig: retryConfig ?? this.retryConfig, ), ) .cast(); @@ -246,7 +272,7 @@ class QueryClient { String key, VariablesType variables, { MutationFn? mutationFn, - RetryConfig retryConfig = DefaultConstants.retryConfig, + RetryConfig? retryConfig, List refreshQueries = const [], List refreshInfiniteQueries = const [], }) async { diff --git a/packages/fl_query/lib/src/core/infinite_query.dart b/packages/fl_query/lib/src/core/infinite_query.dart index b94b147..45ca8fb 100644 --- a/packages/fl_query/lib/src/core/infinite_query.dart +++ b/packages/fl_query/lib/src/core/infinite_query.dart @@ -104,8 +104,8 @@ class InfiniteQuery InfiniteQueryFn queryFn, { required InfiniteQueryNextPage nextPage, required PageType initialParam, - this.retryConfig = DefaultConstants.retryConfig, - this.refreshConfig = DefaultConstants.refreshConfig, + required this.retryConfig, + required this.refreshConfig, this.jsonConfig, }) : _initialParam = initialParam, _dataController = StreamController.broadcast(), diff --git a/packages/fl_query/lib/src/core/mutation.dart b/packages/fl_query/lib/src/core/mutation.dart index 7a7e5fd..5ccc2cd 100644 --- a/packages/fl_query/lib/src/core/mutation.dart +++ b/packages/fl_query/lib/src/core/mutation.dart @@ -1,7 +1,6 @@ import 'dart:async'; import 'package:async/async.dart'; -import 'package:fl_query/src/collections/default_configs.dart'; import 'package:fl_query/src/collections/retry_config.dart'; import 'package:fl_query/src/core/mixins/retryer.dart'; import 'package:mutex/mutex.dart'; @@ -44,11 +43,9 @@ class Mutation MutationFn _mutationFn; - Mutation( - this.key, - MutationFn mutationFn, { - this.retryConfig = DefaultConstants.retryConfig, - }) : _dataController = StreamController.broadcast(), + Mutation(this.key, MutationFn mutationFn, + {required this.retryConfig}) + : _dataController = StreamController.broadcast(), _errorController = StreamController.broadcast(), _mutationController = StreamController.broadcast(), _mutationFn = mutationFn, diff --git a/packages/fl_query/lib/src/core/query.dart b/packages/fl_query/lib/src/core/query.dart index da4e3cf..daab260 100644 --- a/packages/fl_query/lib/src/core/query.dart +++ b/packages/fl_query/lib/src/core/query.dart @@ -1,6 +1,5 @@ import 'dart:async'; -import 'package:fl_query/src/collections/default_configs.dart'; import 'package:fl_query/src/collections/json_config.dart'; import 'package:fl_query/src/collections/refresh_config.dart'; import 'package:fl_query/src/collections/retry_config.dart'; @@ -56,8 +55,8 @@ class Query this.key, QueryFn queryFn, { DataType? initial, - this.retryConfig = DefaultConstants.retryConfig, - this.refreshConfig = DefaultConstants.refreshConfig, + required this.retryConfig, + required this.refreshConfig, this.jsonConfig, }) : _box = Hive.lazyBox(QueryClient.queryCachePrefix), _dataController = StreamController.broadcast(), diff --git a/packages/fl_query/lib/src/widgets/infinite_query_builder.dart b/packages/fl_query/lib/src/widgets/infinite_query_builder.dart index e6c657a..26a7bbf 100644 --- a/packages/fl_query/lib/src/widgets/infinite_query_builder.dart +++ b/packages/fl_query/lib/src/widgets/infinite_query_builder.dart @@ -1,6 +1,5 @@ import 'dart:async'; -import 'package:fl_query/src/collections/default_configs.dart'; import 'package:fl_query/src/collections/json_config.dart'; import 'package:fl_query/src/collections/refresh_config.dart'; import 'package:fl_query/src/collections/retry_config.dart'; @@ -23,8 +22,8 @@ class InfiniteQueryBuilder final PageType initialPage; final InfiniteQueryNextPage nextPage; - final RetryConfig retryConfig; - final RefreshConfig refreshConfig; + final RetryConfig? retryConfig; + final RefreshConfig? refreshConfig; final JsonConfig? jsonConfig; final ValueChanged>? onData; @@ -40,8 +39,8 @@ class InfiniteQueryBuilder required this.nextPage, required this.builder, required this.initialPage, - this.retryConfig = DefaultConstants.retryConfig, - this.refreshConfig = DefaultConstants.refreshConfig, + this.retryConfig, + this.refreshConfig, this.jsonConfig, this.onData, this.onError, diff --git a/packages/fl_query/lib/src/widgets/mutation_builder.dart b/packages/fl_query/lib/src/widgets/mutation_builder.dart index 888a77e..67b7af1 100644 --- a/packages/fl_query/lib/src/widgets/mutation_builder.dart +++ b/packages/fl_query/lib/src/widgets/mutation_builder.dart @@ -1,6 +1,5 @@ import 'dart:async'; -import 'package:fl_query/src/collections/default_configs.dart'; import 'package:fl_query/src/collections/retry_config.dart'; import 'package:fl_query/src/core/client.dart'; import 'package:fl_query/src/core/mutation.dart'; @@ -30,7 +29,7 @@ class MutationBuilder final MutationFn mutationFn; final String mutationKey; - final RetryConfig retryConfig; + final RetryConfig? retryConfig; final MutationOnDataFn? onData; final MutationOnErrorFn? onError; @@ -45,7 +44,7 @@ class MutationBuilder this.mutationKey, this.mutationFn, { required this.builder, - this.retryConfig = DefaultConstants.retryConfig, + this.retryConfig, this.onData, this.onError, this.onMutate, diff --git a/packages/fl_query/lib/src/widgets/query_builder.dart b/packages/fl_query/lib/src/widgets/query_builder.dart index 53000ae..8491347 100644 --- a/packages/fl_query/lib/src/widgets/query_builder.dart +++ b/packages/fl_query/lib/src/widgets/query_builder.dart @@ -1,6 +1,5 @@ import 'dart:async'; -import 'package:fl_query/src/collections/default_configs.dart'; import 'package:fl_query/src/collections/json_config.dart'; import 'package:fl_query/src/collections/refresh_config.dart'; import 'package:fl_query/src/collections/retry_config.dart'; @@ -21,8 +20,8 @@ class QueryBuilder extends StatefulWidget { final DataType? initial; - final RetryConfig retryConfig; - final RefreshConfig refreshConfig; + final RetryConfig? retryConfig; + final RefreshConfig? refreshConfig; final JsonConfig? jsonConfig; final ValueChanged? onData; @@ -37,8 +36,8 @@ class QueryBuilder extends StatefulWidget { this.queryFn, { required this.builder, this.initial, - this.retryConfig = DefaultConstants.retryConfig, - this.refreshConfig = DefaultConstants.refreshConfig, + this.retryConfig, + this.refreshConfig, this.jsonConfig, this.onData, this.onError, diff --git a/packages/fl_query_hooks/lib/src/use_infinite_query.dart b/packages/fl_query_hooks/lib/src/use_infinite_query.dart index e09decf..454df89 100644 --- a/packages/fl_query_hooks/lib/src/use_infinite_query.dart +++ b/packages/fl_query_hooks/lib/src/use_infinite_query.dart @@ -12,8 +12,8 @@ InfiniteQuery InfiniteQueryFn queryFn, { required InfiniteQueryNextPage nextPage, required PageType initialPage, - RetryConfig retryConfig = DefaultConstants.retryConfig, - RefreshConfig refreshConfig = DefaultConstants.refreshConfig, + RetryConfig? retryConfig, + RefreshConfig? refreshConfig, JsonConfig? jsonConfig, ValueChanged>? onData, ValueChanged>? onError, diff --git a/packages/fl_query_hooks/lib/src/use_mutation.dart b/packages/fl_query_hooks/lib/src/use_mutation.dart index 240b4f5..d1f6eb3 100644 --- a/packages/fl_query_hooks/lib/src/use_mutation.dart +++ b/packages/fl_query_hooks/lib/src/use_mutation.dart @@ -9,7 +9,7 @@ Mutation useMutation( String mutationKey, MutationFn mutationFn, { - RetryConfig retryConfig = DefaultConstants.retryConfig, + RetryConfig? retryConfig, MutationOnDataFn? onData, MutationOnErrorFn? onError, MutationOnMutationFn? onMutate, diff --git a/packages/fl_query_hooks/lib/src/use_query.dart b/packages/fl_query_hooks/lib/src/use_query.dart index 6a47c32..97e4a73 100644 --- a/packages/fl_query_hooks/lib/src/use_query.dart +++ b/packages/fl_query_hooks/lib/src/use_query.dart @@ -10,8 +10,8 @@ Query useQuery( final String queryKey, final QueryFn queryFn, { final DataType? initial, - final RetryConfig retryConfig = DefaultConstants.retryConfig, - final RefreshConfig refreshConfig = DefaultConstants.refreshConfig, + final RetryConfig? retryConfig, + final RefreshConfig? refreshConfig, final JsonConfig? jsonConfig, final ValueChanged? onData, final ValueChanged? onError,