Skip to content

Commit 73aeeea

Browse files
Merge pull request #56 from leancodepl/fix/query-cubit-handling-on-empty-state
Improve empty state handling in query cubits
2 parents 00a0d1c + 026ea8e commit 73aeeea

15 files changed

Lines changed: 233 additions & 263 deletions

.github/workflows/leancode_cubit_utils_cqrs-publish.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ jobs:
3030
- name: Set up Flutter
3131
uses: subosito/flutter-action@v2
3232
with:
33-
flutter-version: 3.27.x
33+
flutter-version: 3.35.x
3434
cache: true
3535

3636
- name: Publish and release

.github/workflows/leancode_cubit_utils_cqrs-test.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ jobs:
2020
fail-fast: false
2121
matrix:
2222
include:
23-
- version: '3.27.x'
23+
- version: '3.35.x'
2424

2525
defaults:
2626
run:

packages/leancode_cubit_utils_cqrs/CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
## 0.5.0
2+
3+
* **BREAKING CHANGE:** Remove `useQueryWithEmptyCubit` and `SimpleQueryWithEmptyCubit`.
4+
* **BREAKING CHANGE:** Remove `useArgsQueryWithEmptyCubit` and `SimpleArgsQueryWithEmptyCubit`.
5+
* Start using `isEmpty` checker of `useQueryCubit` and pass it `SimpleQueryCubit`.
6+
* Add `isEmpty` checker to `useArgsQueryCubit` and `SimpleArgsQueryCubit`.
7+
18
## 0.4.0
29

310
* Update `leancode_cubit_utils` dependency to `^0.4.0` (includes breaking change: `builder` parameter renamed to `onSuccess` in `RequestCubitBuilder`)

packages/leancode_cubit_utils_cqrs/example/pubspec.lock

Lines changed: 50 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@ packages:
1313
dependency: transitive
1414
description:
1515
name: bloc
16-
sha256: "52c10575f4445c61dd9e0cafcc6356fdd827c4c64dd7945ef3c4105f6b6ac189"
16+
sha256: a48653a82055a900b88cd35f92429f068c5a8057ae9b136d197b3d56c57efb81
1717
url: "https://pub.dev"
1818
source: hosted
19-
version: "9.0.0"
19+
version: "9.2.0"
2020
boolean_selector:
2121
dependency: transitive
2222
description:
@@ -53,26 +53,26 @@ packages:
5353
dependency: "direct main"
5454
description:
5555
name: cqrs
56-
sha256: "3c1831144293ad90ef9fcc24cacb33470f44d594d26969ac83b899b228b155b7"
56+
sha256: abca06c3300fe1e752a31055074580412ae2dcd02a59ca64b1fb517752aca02f
5757
url: "https://pub.dev"
5858
source: hosted
59-
version: "10.0.1"
59+
version: "10.1.0"
6060
crypto:
6161
dependency: transitive
6262
description:
6363
name: crypto
64-
sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab
64+
sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf
6565
url: "https://pub.dev"
6666
source: hosted
67-
version: "3.0.3"
67+
version: "3.0.7"
6868
equatable:
6969
dependency: "direct main"
7070
description:
7171
name: equatable
72-
sha256: "567c64b3cb4cf82397aac55f4f0cbd3ca20d77c6c03bedbc4ceaddc08904aef7"
72+
sha256: "3e0141505477fd8ad55d6eb4e7776d3fe8430be8e497ccb1521370c3f21a3e2b"
7373
url: "https://pub.dev"
7474
source: hosted
75-
version: "2.0.7"
75+
version: "2.0.8"
7676
fake_async:
7777
dependency: transitive
7878
description:
@@ -98,18 +98,18 @@ packages:
9898
dependency: "direct main"
9999
description:
100100
name: flutter_bloc
101-
sha256: "153856bdaac302bbdc58a1d1403d50c40557254aa05eaeed40515d88a25a526b"
101+
sha256: cf51747952201a455a1c840f8171d273be009b932c75093020f9af64f2123e38
102102
url: "https://pub.dev"
103103
source: hosted
104-
version: "9.0.0"
104+
version: "9.1.1"
105105
flutter_hooks:
106106
dependency: transitive
107107
description:
108108
name: flutter_hooks
109-
sha256: cde36b12f7188c85286fba9b38cc5a902e7279f36dd676967106c041dc9dde70
109+
sha256: "8ae1f090e5f4ef5cfa6670ce1ab5dddadd33f3533a7f9ba19d9f958aa2a89f42"
110110
url: "https://pub.dev"
111111
source: hosted
112-
version: "0.20.5"
112+
version: "0.21.3+1"
113113
flutter_lints:
114114
dependency: "direct dev"
115115
description:
@@ -127,50 +127,49 @@ packages:
127127
dependency: transitive
128128
description:
129129
name: http
130-
sha256: "759d1a329847dd0f39226c688d3e06a6b8679668e350e2891a6474f8b4bb8525"
130+
sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412"
131131
url: "https://pub.dev"
132132
source: hosted
133-
version: "1.1.0"
133+
version: "1.6.0"
134134
http_parser:
135135
dependency: transitive
136136
description:
137137
name: http_parser
138-
sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
138+
sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571"
139139
url: "https://pub.dev"
140140
source: hosted
141-
version: "4.0.2"
141+
version: "4.1.2"
142142
leak_tracker:
143143
dependency: transitive
144144
description:
145145
name: leak_tracker
146-
sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0"
146+
sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de"
147147
url: "https://pub.dev"
148148
source: hosted
149-
version: "10.0.9"
149+
version: "11.0.2"
150150
leak_tracker_flutter_testing:
151151
dependency: transitive
152152
description:
153153
name: leak_tracker_flutter_testing
154-
sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573
154+
sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1"
155155
url: "https://pub.dev"
156156
source: hosted
157-
version: "3.0.9"
157+
version: "3.0.10"
158158
leak_tracker_testing:
159159
dependency: transitive
160160
description:
161161
name: leak_tracker_testing
162-
sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3"
162+
sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1"
163163
url: "https://pub.dev"
164164
source: hosted
165-
version: "3.0.1"
165+
version: "3.0.2"
166166
leancode_cubit_utils:
167167
dependency: transitive
168168
description:
169-
name: leancode_cubit_utils
170-
sha256: "67529b4e8d5fb68c04127a4247e6aa6ed9f9d18d99fb560e33063812311f936d"
171-
url: "https://pub.dev"
172-
source: hosted
173-
version: "0.4.0"
169+
path: "../../leancode_cubit_utils"
170+
relative: true
171+
source: path
172+
version: "0.5.0"
174173
leancode_cubit_utils_cqrs:
175174
dependency: "direct main"
176175
description:
@@ -182,10 +181,10 @@ packages:
182181
dependency: "direct main"
183182
description:
184183
name: leancode_hooks
185-
sha256: "79e6d08feb004ac784a71c641a51cb5de71da60d65616ca75d4cbcb4453377bc"
184+
sha256: d42dbb6af4dba5b5cfa4e90d9b61e9d4f978e847a3df0676fa4ec8a4b339d0b4
186185
url: "https://pub.dev"
187186
source: hosted
188-
version: "0.1.1"
187+
version: "0.1.2"
189188
lints:
190189
dependency: transitive
191190
description:
@@ -222,10 +221,10 @@ packages:
222221
dependency: transitive
223222
description:
224223
name: meta
225-
sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c
224+
sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394"
226225
url: "https://pub.dev"
227226
source: hosted
228-
version: "1.16.0"
227+
version: "1.17.0"
229228
mocktail:
230229
dependency: "direct main"
231230
description:
@@ -254,10 +253,10 @@ packages:
254253
dependency: "direct main"
255254
description:
256255
name: provider
257-
sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c
256+
sha256: "4e82183fa20e5ca25703ead7e05de9e4cceed1fbd1eadc1ac3cb6f565a09f272"
258257
url: "https://pub.dev"
259258
source: hosted
260-
version: "6.1.2"
259+
version: "6.1.5+1"
261260
sky_engine:
262261
dependency: transitive
263262
description: flutter
@@ -307,34 +306,42 @@ packages:
307306
dependency: transitive
308307
description:
309308
name: test_api
310-
sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd
309+
sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55
311310
url: "https://pub.dev"
312311
source: hosted
313-
version: "0.7.4"
312+
version: "0.7.7"
314313
typed_data:
315314
dependency: transitive
316315
description:
317316
name: typed_data
318-
sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c
317+
sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006
319318
url: "https://pub.dev"
320319
source: hosted
321-
version: "1.3.2"
320+
version: "1.4.0"
322321
vector_math:
323322
dependency: transitive
324323
description:
325324
name: vector_math
326-
sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
325+
sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b
327326
url: "https://pub.dev"
328327
source: hosted
329-
version: "2.1.4"
328+
version: "2.2.0"
330329
vm_service:
331330
dependency: transitive
332331
description:
333332
name: vm_service
334-
sha256: ddfa8d30d89985b96407efce8acbdd124701f96741f2d981ca860662f1c0dc02
333+
sha256: "45caa6c5917fa127b5dbcfbd1fa60b14e583afdc08bfc96dda38886ca252eb60"
334+
url: "https://pub.dev"
335+
source: hosted
336+
version: "15.0.2"
337+
web:
338+
dependency: transitive
339+
description:
340+
name: web
341+
sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a"
335342
url: "https://pub.dev"
336343
source: hosted
337-
version: "15.0.0"
344+
version: "1.1.1"
338345
sdks:
339-
dart: ">=3.7.0-0 <4.0.0"
340-
flutter: ">=3.18.0-18.0.pre.54"
346+
dart: ">=3.9.0 <4.0.0"
347+
flutter: ">=3.35.0"

packages/leancode_cubit_utils_cqrs/lib/leancode_cubit_utils_cqrs.dart

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,10 @@ export 'package:leancode_cubit_utils/leancode_cubit_utils.dart';
55

66
export 'src/paginated/paginated_query_cubit.dart';
77
export 'src/paginated/pre_request/query_pre_request.dart';
8-
export 'src/request/query_cubit.dart';
9-
export 'src/request/use_query_cubit.dart';
8+
export 'src/request/args_query_cubit/args_query_cubit.dart';
9+
export 'src/request/args_query_cubit/simple_args_query_cubit.dart';
10+
export 'src/request/args_query_cubit/use_args_query_cubit.dart';
11+
export 'src/request/query_cubit/query_cubit.dart';
12+
export 'src/request/query_cubit/simple_query_cubit.dart';
13+
export 'src/request/query_cubit/use_query_cubit.dart';
14+
export 'src/request/query_result_handler.dart';
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import 'package:cqrs/cqrs.dart';
2+
import 'package:leancode_cubit_utils/leancode_cubit_utils.dart';
3+
import 'package:leancode_cubit_utils_cqrs/src/request/query_result_handler.dart';
4+
5+
/// Base class for all request cubits that perform a CQRS query
6+
/// and require arguments.
7+
abstract class ArgsQueryCubit<TArgs, TRes, TOut>
8+
extends ArgsRequestCubit<TArgs, QueryResult<TRes>, TOut, QueryError>
9+
with QueryResultHandler<TRes, TOut> {
10+
/// Creates a new [ArgsQueryCubit] with the given [requestMode].
11+
ArgsQueryCubit(
12+
super.loggerTag, {
13+
EmptyChecker<TOut>? isEmpty,
14+
super.requestMode,
15+
}) : _isEmpty = isEmpty;
16+
17+
/// The function to check if the data is empty.
18+
final EmptyChecker<TOut>? _isEmpty;
19+
20+
@override
21+
bool isEmpty(TOut data) => _isEmpty?.call(data) ?? false;
22+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import 'package:cqrs/cqrs.dart';
2+
import 'package:leancode_cubit_utils/leancode_cubit_utils.dart';
3+
import 'package:leancode_cubit_utils_cqrs/src/request/args_query_cubit/args_query_cubit.dart';
4+
import 'package:leancode_cubit_utils_cqrs/src/request/args_query_cubit/use_args_query_cubit.dart';
5+
6+
/// Simplified implementation of [ArgsQueryCubit] created in order to be used
7+
/// by [useArgsQueryCubit].
8+
class SimpleArgsQueryCubit<TArgs, TOut>
9+
extends ArgsQueryCubit<TArgs, TOut, TOut> {
10+
/// Creates a new [SimpleArgsQueryCubit].
11+
SimpleArgsQueryCubit(
12+
super.loggerTag,
13+
this._customRequest, {
14+
super.isEmpty,
15+
super.requestMode,
16+
});
17+
18+
/// The request to be executed.
19+
final ArgsRequest<TArgs, QueryResult<TOut>> _customRequest;
20+
21+
@override
22+
Future<QueryResult<TOut>> request(TArgs args) => _customRequest(args);
23+
24+
@override
25+
TOut map(TOut data) => data;
26+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import 'package:cqrs/cqrs.dart';
2+
import 'package:leancode_cubit_utils/leancode_cubit_utils.dart';
3+
import 'package:leancode_cubit_utils_cqrs/src/request/args_query_cubit/simple_args_query_cubit.dart';
4+
import 'package:leancode_hooks/leancode_hooks.dart';
5+
6+
import 'args_query_cubit.dart';
7+
8+
/// Provides a [ArgsQueryCubit] specialized for [QueryResult] that is
9+
/// automatically disposed without having to use BlocProvider and requires
10+
/// arguments. It is a wrapper of [useBloc] that creates a
11+
/// [SimpleArgsQueryCubit].
12+
SimpleArgsQueryCubit<TArgs, TOut> useArgsQueryCubit<TArgs, TOut>(
13+
ArgsRequest<TArgs, QueryResult<TOut>> request, {
14+
String loggerTag = 'SimpleArgsQueryCubit',
15+
EmptyChecker<TOut>? isEmpty,
16+
RequestMode? requestMode,
17+
List<Object?> keys = const [],
18+
}) {
19+
return useBloc(
20+
() => SimpleArgsQueryCubit<TArgs, TOut>(
21+
loggerTag,
22+
request,
23+
isEmpty: isEmpty,
24+
requestMode: requestMode,
25+
),
26+
keys: keys,
27+
);
28+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import 'package:cqrs/cqrs.dart';
2+
import 'package:leancode_cubit_utils/leancode_cubit_utils.dart';
3+
import 'package:leancode_cubit_utils_cqrs/src/request/query_result_handler.dart';
4+
5+
/// Base class for all request cubits that perform a CQRS query
6+
/// and do not require any arguments.
7+
abstract class QueryCubit<TRes, TOut>
8+
extends RequestCubit<QueryResult<TRes>, TOut, QueryError>
9+
with QueryResultHandler<TRes, TOut> {
10+
/// Creates a new [QueryCubit] with the given [requestMode].
11+
QueryCubit(
12+
super.loggerTag, {
13+
EmptyChecker<TOut>? isEmpty,
14+
super.requestMode,
15+
}) : _isEmpty = isEmpty;
16+
17+
/// The function to check if the data is empty.
18+
final EmptyChecker<TOut>? _isEmpty;
19+
20+
@override
21+
bool isEmpty(TOut data) => _isEmpty?.call(data) ?? false;
22+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import 'package:cqrs/cqrs.dart';
2+
import 'package:leancode_cubit_utils/leancode_cubit_utils.dart';
3+
import 'package:leancode_cubit_utils_cqrs/src/request/query_cubit/query_cubit.dart';
4+
import 'package:leancode_cubit_utils_cqrs/src/request/query_cubit/use_query_cubit.dart';
5+
6+
/// Simplified implementation of [QueryCubit] created in order to be used by
7+
/// [useQueryCubit].
8+
class SimpleQueryCubit<TOut> extends QueryCubit<TOut, TOut> {
9+
/// Creates a new [SimpleQueryCubit].
10+
SimpleQueryCubit(
11+
super.loggerTag,
12+
this._customRequest, {
13+
super.isEmpty,
14+
super.requestMode,
15+
});
16+
17+
/// The request to be executed.
18+
final Request<QueryResult<TOut>> _customRequest;
19+
20+
@override
21+
Future<QueryResult<TOut>> request() => _customRequest();
22+
23+
@override
24+
TOut map(TOut data) => data;
25+
}

0 commit comments

Comments
 (0)