diff --git a/packages/fl_query/example/pubspec.lock b/packages/fl_query/example/pubspec.lock index 746084c..ee17d2d 100644 --- a/packages/fl_query/example/pubspec.lock +++ b/packages/fl_query/example/pubspec.lock @@ -111,21 +111,21 @@ packages: path: ".." relative: true source: path - version: "1.0.0-alpha.5" + version: "1.0.0-alpha.6" fl_query_connectivity_plus_adapter: dependency: "direct main" description: path: "../../fl_query_connectivity_plus_adapter" relative: true source: path - version: "0.1.0-alpha.4" + version: "0.1.0-alpha.5" fl_query_devtools: dependency: "direct main" description: path: "../../fl_query_devtools" relative: true source: path - version: "0.1.0-alpha.3" + version: "0.1.0-alpha.4" flutter: dependency: "direct main" description: flutter diff --git a/packages/fl_query/lib/fl_query.dart b/packages/fl_query/lib/fl_query.dart index 2ef1e4f..bf7f05c 100644 --- a/packages/fl_query/lib/fl_query.dart +++ b/packages/fl_query/lib/fl_query.dart @@ -6,6 +6,10 @@ export 'src/collections/refresh_config.dart'; export 'src/collections/retry_config.dart'; export 'src/collections/connectivity_adapter.dart'; +export 'src/collections/jobs/query_job.dart'; +export 'src/collections/jobs/infinite_query_job.dart'; +export 'src/collections/jobs/mutation_job.dart'; + export 'src/core/cache.dart'; export 'src/core/client.dart'; export 'src/core/infinite_query.dart'; diff --git a/packages/fl_query/lib/src/collections/jobs/infinite_query_job.dart b/packages/fl_query/lib/src/collections/jobs/infinite_query_job.dart new file mode 100644 index 0000000..7a892f3 --- /dev/null +++ b/packages/fl_query/lib/src/collections/jobs/infinite_query_job.dart @@ -0,0 +1,62 @@ +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'; +import 'package:fl_query/src/core/infinite_query.dart'; + +typedef InfiniteQueryJobFn = Future + Function(PageType page, ArgsType args); + +typedef InfiniteQueryJobVariableKeyFn + = InfiniteQueryJob Function( + String variable); + +class InfiniteQueryJob { + final InfiniteQueryJobFn task; + final String queryKey; + + final PageType initialPage; + final InfiniteQueryNextPage nextPage; + + final RetryConfig? retryConfig; + final RefreshConfig? refreshConfig; + final JsonConfig? jsonConfig; + + final bool enabled; + + const InfiniteQueryJob({ + required this.queryKey, + required this.task, + required this.nextPage, + required this.initialPage, + this.retryConfig, + this.refreshConfig, + this.jsonConfig, + this.enabled = true, + }) : assert( + (jsonConfig != null && enabled) || jsonConfig == null, + 'jsonConfig is only supported when enabled is true', + ); + + static InfiniteQueryJobVariableKeyFn + withVariableKey({ + required String baseQueryKey, + required InfiniteQueryJobFn task, + required final InfiniteQueryNextPage nextPage, + required final PageType initialPage, + RetryConfig? retryConfig, + RefreshConfig? refreshConfig, + JsonConfig? jsonConfig, + bool enabled = true, + }) { + return (String variable) => InfiniteQueryJob( + queryKey: "$baseQueryKey$variable", + task: task, + nextPage: nextPage, + initialPage: initialPage, + retryConfig: retryConfig, + refreshConfig: refreshConfig, + jsonConfig: jsonConfig, + enabled: enabled, + ); + } +} diff --git a/packages/fl_query/lib/src/collections/jobs/mutation_job.dart b/packages/fl_query/lib/src/collections/jobs/mutation_job.dart new file mode 100644 index 0000000..ac3317b --- /dev/null +++ b/packages/fl_query/lib/src/collections/jobs/mutation_job.dart @@ -0,0 +1,49 @@ +import 'package:fl_query/src/collections/retry_config.dart'; + +typedef MutationJobFn = Future + Function( + VariablesType variables, + ArgsType args, +); + +typedef MutationJobVariableKeyFn + = MutationJob + Function(String variable); + +class MutationJob { + final MutationJobFn task; + final String mutationKey; + + final RetryConfig? retryConfig; + + final List? refreshQueries; + final List? refreshInfiniteQueries; + + const MutationJob({ + required this.mutationKey, + required this.task, + this.retryConfig, + this.refreshQueries, + this.refreshInfiniteQueries, + }); + + static MutationJobVariableKeyFn + withVariableKey({ + required String baseMutationKey, + required MutationJobFn task, + RetryConfig? retryConfig, + List? refreshQueries, + List? refreshInfiniteQueries, + }) { + return (String variable) => MutationJob( + mutationKey: "$baseMutationKey$variable", + task: task, + retryConfig: retryConfig, + refreshQueries: refreshQueries, + refreshInfiniteQueries: refreshInfiniteQueries, + ); + } +} diff --git a/packages/fl_query/lib/src/collections/jobs/query_job.dart b/packages/fl_query/lib/src/collections/jobs/query_job.dart new file mode 100644 index 0000000..c0a6798 --- /dev/null +++ b/packages/fl_query/lib/src/collections/jobs/query_job.dart @@ -0,0 +1,57 @@ +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'; + +typedef QueryJobFn = Future Function( + ArgsType args); + +typedef QueryJobVariableKeyFn + = QueryJob Function(String variable); + +class QueryJob { + final QueryJobFn task; + final String queryKey; + + final DataType? initial; + + final RetryConfig? retryConfig; + final RefreshConfig? refreshConfig; + final JsonConfig? jsonConfig; + + // widget specific + final bool enabled; + + const QueryJob({ + required this.queryKey, + required this.task, + this.initial, + this.retryConfig, + this.refreshConfig, + this.jsonConfig, + this.enabled = true, + }) : assert( + (jsonConfig != null && enabled) || jsonConfig == null, + 'jsonConfig is only supported when enabled is true', + ); + + static QueryJobVariableKeyFn + withVariableKey({ + required String baseQueryKey, + required QueryJobFn task, + DataType? initial, + RetryConfig? retryConfig, + RefreshConfig? refreshConfig, + JsonConfig? jsonConfig, + bool enabled = true, + }) { + return (String variable) => QueryJob( + queryKey: "$baseQueryKey$variable", + task: task, + initial: initial, + retryConfig: retryConfig, + refreshConfig: refreshConfig, + jsonConfig: jsonConfig, + enabled: enabled, + ); + } +} 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 517f5fa..1760d3b 100644 --- a/packages/fl_query/lib/src/widgets/infinite_query_builder.dart +++ b/packages/fl_query/lib/src/widgets/infinite_query_builder.dart @@ -1,5 +1,6 @@ import 'dart:async'; +import 'package:fl_query/src/collections/jobs/infinite_query_job.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'; @@ -55,6 +56,31 @@ class InfiniteQueryBuilder 'jsonConfig is only supported when enabled is true', ); + static InfiniteQueryBuilder + withJob({ + required InfiniteQueryJob job, + required InfiniteQueryBuilderFn builder, + ValueChanged>? onData, + ValueChanged>? onError, + Key? key, + ArgsType? args, + }) { + return InfiniteQueryBuilder( + job.queryKey, + (page) => job.task(page, args), + builder: builder, + initialPage: job.initialPage, + nextPage: job.nextPage, + retryConfig: job.retryConfig, + refreshConfig: job.refreshConfig, + jsonConfig: job.jsonConfig, + onData: onData, + onError: onError, + enabled: job.enabled, + key: key, + ); + } + @override State> createState() => _InfiniteQueryBuilderState(); diff --git a/packages/fl_query/lib/src/widgets/mutation_builder.dart b/packages/fl_query/lib/src/widgets/mutation_builder.dart index ab6e639..a92dd4e 100644 --- a/packages/fl_query/lib/src/widgets/mutation_builder.dart +++ b/packages/fl_query/lib/src/widgets/mutation_builder.dart @@ -1,5 +1,6 @@ import 'dart:async'; +import 'package:fl_query/src/collections/jobs/mutation_job.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'; @@ -53,6 +54,32 @@ class MutationBuilder super.key, }); + static MutationBuilder + withJob({ + required MutationJob + job, + required MutationBuilderFn builder, + Key? key, + MutationOnDataFn? onData, + MutationOnErrorFn? onError, + MutationOnMutationFn? onMutate, + ArgsType? args, + }) { + return MutationBuilder( + job.mutationKey, + (variables) => job.task(variables, args), + builder: builder, + retryConfig: job.retryConfig, + onData: onData, + onError: onError, + onMutate: onMutate, + refreshQueries: job.refreshQueries, + refreshInfiniteQueries: job.refreshInfiniteQueries, + key: key, + ); + } + @override State> createState() => _MutationBuilderState extends StatefulWidget { 'jsonConfig is only supported when enabled is true', ); + static QueryBuilder + withJob({ + required QueryJob job, + required QueryBuilderFn builder, + ValueChanged? onData, + ValueChanged? onError, + ArgsType? args, + Key? key, + }) { + return QueryBuilder( + job.queryKey, + () => job.task(args), + builder: builder, + initial: job.initial, + retryConfig: job.retryConfig, + refreshConfig: job.refreshConfig, + jsonConfig: job.jsonConfig, + onData: onData, + onError: onError, + enabled: job.enabled, + key: key, + ); + } + @override State> createState() => _QueryBuilderState();