Skip to content

Commit 7dbe0b5

Browse files
committed
[feat] send multiple API requests in parallel
1 parent dc25c6a commit 7dbe0b5

File tree

5 files changed

+32
-22
lines changed

5 files changed

+32
-22
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/screens/home_page/editor_pane/details_card/response_pane.dart

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,12 @@ 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);
1412
final responseStatus = ref.watch(
1513
selectedRequestModelProvider.select((value) => value?.responseStatus));
14+
final isWorking = ref.watch(selectedRequestModelProvider)?.isWorking;
1615
final message = ref
1716
.watch(selectedRequestModelProvider.select((value) => value?.message));
18-
if (sentRequestId != null && sentRequestId == selectedId) {
17+
if (isWorking == true) {
1918
return const SendingWidget();
2019
}
2120
if (responseStatus == null) {

lib/screens/home_page/editor_pane/url_card.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,10 +93,10 @@ class SendButton extends ConsumerWidget {
9393
@override
9494
Widget build(BuildContext context, WidgetRef ref) {
9595
final selectedId = ref.watch(selectedIdStateProvider);
96-
final sentRequestId = ref.watch(sentRequestIdStateProvider);
96+
final isWorking = ref.watch(selectedRequestModelProvider)?.isWorking;
97+
9798
return SendRequestButton(
98-
selectedId: selectedId,
99-
sentRequestId: sentRequestId,
99+
isWorking: isWorking,
100100
onTap: () {
101101
ref
102102
.read(collectionStateNotifierProvider.notifier)

lib/widgets/buttons.dart

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -47,31 +47,26 @@ 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 == true ? null : onTap,
6461
child: Row(
6562
mainAxisSize: MainAxisSize.min,
6663
children: [
6764
Text(
68-
disable
69-
? (selectedId == sentRequestId ? kLabelSending : kLabelBusy)
70-
: kLabelSend,
65+
isWorking == true ? kLabelSending : kLabelSend,
7166
style: kTextStyleButton,
7267
),
73-
if (!disable) kHSpacer10,
74-
if (!disable)
68+
if (isWorking == false) kHSpacer10,
69+
if (isWorking == false)
7570
const Icon(
7671
size: 16,
7772
Icons.send,

0 commit comments

Comments
 (0)