Skip to content

Commit f412507

Browse files
authored
Merge pull request #236 from opxdelwin/issue-114
[feat] Enable parallel request handling
2 parents 58f5ae0 + 6972ca8 commit f412507

File tree

7 files changed

+54
-61
lines changed

7 files changed

+54
-61
lines changed

lib/models/request_model.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ class RequestModel {
2929
this.responseStatus,
3030
this.message,
3131
this.responseModel,
32+
this.isWorking = false,
3233
});
3334

3435
final String id;
@@ -47,6 +48,7 @@ class RequestModel {
4748
final int? responseStatus;
4849
final String? message;
4950
final ResponseModel? responseModel;
51+
final bool isWorking;
5052

5153
List<NameValueModel>? get enabledRequestHeaders =>
5254
getEnabledRows(requestHeaders, isHeaderEnabledList);
@@ -106,6 +108,7 @@ class RequestModel {
106108
int? responseStatus,
107109
String? message,
108110
ResponseModel? responseModel,
111+
bool? isWorking,
109112
}) {
110113
var headers = requestHeaders ?? this.requestHeaders;
111114
var params = requestParams ?? this.requestParams;
@@ -129,6 +132,7 @@ class RequestModel {
129132
responseStatus: responseStatus ?? this.responseStatus,
130133
message: message ?? this.message,
131134
responseModel: responseModel ?? this.responseModel,
135+
isWorking: isWorking ?? this.isWorking,
132136
);
133137
}
134138

lib/providers/collection_providers.dart

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -156,11 +156,20 @@ class CollectionStateNotifier
156156
}
157157

158158
Future<void> sendRequest(String id) async {
159-
ref.read(sentRequestIdStateProvider.notifier).state = id;
160159
ref.read(codePaneVisibleStateProvider.notifier).state = false;
161-
final defaultUriScheme =
162-
ref.read(settingsProvider.select((value) => value.defaultUriScheme));
160+
final defaultUriScheme = ref.read(
161+
settingsProvider.select(
162+
(value) => value.defaultUriScheme,
163+
),
164+
);
165+
163166
RequestModel requestModel = state![id]!;
167+
168+
// set current model's isWorking to true and update state
169+
var map = {...state!};
170+
map[id] = requestModel.copyWith(isWorking: true);
171+
state = map;
172+
164173
(http.Response?, Duration?, String?)? responseRec = await request(
165174
requestModel,
166175
defaultUriScheme: defaultUriScheme,
@@ -172,6 +181,7 @@ class CollectionStateNotifier
172181
newRequestModel = requestModel.copyWith(
173182
responseStatus: -1,
174183
message: responseRec.$3,
184+
isWorking: false,
175185
);
176186
} else {
177187
final responseModel = baseResponseModel.fromResponse(
@@ -183,10 +193,12 @@ class CollectionStateNotifier
183193
responseStatus: statusCode,
184194
message: kResponseCodeReasons[statusCode],
185195
responseModel: responseModel,
196+
isWorking: false,
186197
);
187198
}
188-
ref.read(sentRequestIdStateProvider.notifier).state = null;
189-
var map = {...state!};
199+
200+
// update state with response data
201+
map = {...state!};
190202
map[id] = newRequestModel;
191203
state = map;
192204
}

lib/providers/ui_providers.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
33

44
final navRailIndexStateProvider = StateProvider<int>((ref) => 0);
55
final selectedIdEditStateProvider = StateProvider<String?>((ref) => null);
6-
final sentRequestIdStateProvider = StateProvider<String?>((ref) => null);
76
final codePaneVisibleStateProvider = StateProvider<bool>((ref) => false);
87
final saveDataStateProvider = StateProvider<bool>((ref) => false);
98
final clearDataStateProvider = StateProvider<bool>((ref) => false);

lib/screens/home_page/editor_pane/details_card/response_pane.dart

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,14 @@ class ResponsePane extends ConsumerWidget {
99

1010
@override
1111
Widget build(BuildContext context, WidgetRef ref) {
12-
final selectedId = ref.watch(selectedIdStateProvider);
13-
final sentRequestId = ref.watch(sentRequestIdStateProvider);
12+
final isWorking = ref.watch(
13+
selectedRequestModelProvider.select((value) => value?.isWorking)) ??
14+
false;
1415
final responseStatus = ref.watch(
1516
selectedRequestModelProvider.select((value) => value?.responseStatus));
1617
final message = ref
1718
.watch(selectedRequestModelProvider.select((value) => value?.message));
18-
if (sentRequestId != null && sentRequestId == selectedId) {
19+
if (isWorking) {
1920
return const SendingWidget();
2021
}
2122
if (responseStatus == null) {

lib/screens/home_page/editor_pane/url_card.dart

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,10 +98,11 @@ class SendButton extends ConsumerWidget {
9898
@override
9999
Widget build(BuildContext context, WidgetRef ref) {
100100
final selectedId = ref.watch(selectedIdStateProvider);
101-
final sentRequestId = ref.watch(sentRequestIdStateProvider);
101+
final isWorking = ref.watch(
102+
selectedRequestModelProvider.select((value) => value?.isWorking));
103+
102104
return SendRequestButton(
103-
selectedId: selectedId,
104-
sentRequestId: sentRequestId,
105+
isWorking: isWorking ?? false,
105106
onTap: () {
106107
ref
107108
.read(collectionStateNotifierProvider.notifier)

lib/widgets/buttons.dart

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -47,36 +47,37 @@ class CopyButton extends StatelessWidget {
4747
class SendRequestButton extends StatelessWidget {
4848
const SendRequestButton({
4949
super.key,
50-
required this.selectedId,
51-
required this.sentRequestId,
50+
required this.isWorking,
5251
required this.onTap,
5352
});
5453

55-
final String? selectedId;
56-
final String? sentRequestId;
54+
final bool isWorking;
5755
final void Function() onTap;
5856

5957
@override
6058
Widget build(BuildContext context) {
61-
bool disable = sentRequestId != null;
6259
return FilledButton(
63-
onPressed: disable ? null : onTap,
60+
onPressed: isWorking ? null : onTap,
6461
child: Row(
6562
mainAxisSize: MainAxisSize.min,
66-
children: [
67-
Text(
68-
disable
69-
? (selectedId == sentRequestId ? kLabelSending : kLabelBusy)
70-
: kLabelSend,
71-
style: kTextStyleButton,
72-
),
73-
if (!disable) kHSpacer10,
74-
if (!disable)
75-
const Icon(
76-
size: 16,
77-
Icons.send,
78-
),
79-
],
63+
children: isWorking
64+
? const [
65+
Text(
66+
kLabelSending,
67+
style: kTextStyleButton,
68+
),
69+
]
70+
: const [
71+
Text(
72+
kLabelSend,
73+
style: kTextStyleButton,
74+
),
75+
kHSpacer10,
76+
Icon(
77+
size: 16,
78+
Icons.send,
79+
),
80+
],
8081
),
8182
);
8283
}

test/widgets/buttons_test.dart

Lines changed: 4 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,7 @@ void main() {
3636
theme: kThemeDataLight,
3737
home: Scaffold(
3838
body: SendRequestButton(
39-
selectedId: '1',
40-
sentRequestId: null,
39+
isWorking: false,
4140
onTap: () {
4241
changedValue = 'Send';
4342
},
@@ -55,40 +54,16 @@ void main() {
5554
expect(changedValue, 'Send');
5655
});
5756

58-
testWidgets('Testing for Send Request button when sentRequestId is not null',
57+
testWidgets(
58+
'Testing for Send Request button when RequestModel is viewed and is waiting for response',
5959
(tester) async {
6060
await tester.pumpWidget(
6161
MaterialApp(
6262
title: 'Send Request button',
6363
theme: kThemeDataLight,
6464
home: Scaffold(
6565
body: SendRequestButton(
66-
selectedId: '1',
67-
sentRequestId: '2',
68-
onTap: () {},
69-
),
70-
),
71-
),
72-
);
73-
74-
expect(find.byIcon(Icons.send), findsNothing);
75-
expect(find.text(kLabelBusy), findsOneWidget);
76-
final button1 = find.byType(FilledButton);
77-
expect(button1, findsOneWidget);
78-
79-
expect(tester.widget<FilledButton>(button1).enabled, isFalse);
80-
});
81-
82-
testWidgets('Testing for Send Request button when sentRequestId = selectedId',
83-
(tester) async {
84-
await tester.pumpWidget(
85-
MaterialApp(
86-
title: 'Send Request button',
87-
theme: kThemeDataLight,
88-
home: Scaffold(
89-
body: SendRequestButton(
90-
selectedId: '1',
91-
sentRequestId: '1',
66+
isWorking: true,
9267
onTap: () {},
9368
),
9469
),

0 commit comments

Comments
 (0)