[feat] send multiple API requests in parallel

This commit is contained in:
Delwin Mathew
2024-03-01 12:22:52 +05:30
parent dc25c6a70e
commit 7dbe0b5d5f
5 changed files with 32 additions and 22 deletions

View File

@ -29,6 +29,7 @@ class RequestModel {
this.responseStatus,
this.message,
this.responseModel,
this.isWorking = false,
});
final String id;
@ -47,6 +48,7 @@ class RequestModel {
final int? responseStatus;
final String? message;
final ResponseModel? responseModel;
final bool isWorking;
List<NameValueModel>? get enabledRequestHeaders =>
getEnabledRows(requestHeaders, isHeaderEnabledList);
@ -106,6 +108,7 @@ class RequestModel {
int? responseStatus,
String? message,
ResponseModel? responseModel,
bool? isWorking,
}) {
var headers = requestHeaders ?? this.requestHeaders;
var params = requestParams ?? this.requestParams;
@ -129,6 +132,7 @@ class RequestModel {
responseStatus: responseStatus ?? this.responseStatus,
message: message ?? this.message,
responseModel: responseModel ?? this.responseModel,
isWorking: isWorking ?? this.isWorking,
);
}

View File

@ -156,11 +156,20 @@ class CollectionStateNotifier
}
Future<void> sendRequest(String id) async {
ref.read(sentRequestIdStateProvider.notifier).state = id;
ref.read(codePaneVisibleStateProvider.notifier).state = false;
final defaultUriScheme =
ref.read(settingsProvider.select((value) => value.defaultUriScheme));
final defaultUriScheme = ref.read(
settingsProvider.select(
(value) => value.defaultUriScheme,
),
);
RequestModel requestModel = state![id]!;
// set current model's isWorking to true and update state
var map = {...state!};
map[id] = requestModel.copyWith(isWorking: true);
state = map;
(http.Response?, Duration?, String?)? responseRec = await request(
requestModel,
defaultUriScheme: defaultUriScheme,
@ -172,6 +181,7 @@ class CollectionStateNotifier
newRequestModel = requestModel.copyWith(
responseStatus: -1,
message: responseRec.$3,
isWorking: false,
);
} else {
final responseModel = baseResponseModel.fromResponse(
@ -183,10 +193,12 @@ class CollectionStateNotifier
responseStatus: statusCode,
message: kResponseCodeReasons[statusCode],
responseModel: responseModel,
isWorking: false,
);
}
ref.read(sentRequestIdStateProvider.notifier).state = null;
var map = {...state!};
// update state with response data
map = {...state!};
map[id] = newRequestModel;
state = map;
}

View File

@ -9,13 +9,12 @@ class ResponsePane extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final selectedId = ref.watch(selectedIdStateProvider);
final sentRequestId = ref.watch(sentRequestIdStateProvider);
final responseStatus = ref.watch(
selectedRequestModelProvider.select((value) => value?.responseStatus));
final isWorking = ref.watch(selectedRequestModelProvider)?.isWorking;
final message = ref
.watch(selectedRequestModelProvider.select((value) => value?.message));
if (sentRequestId != null && sentRequestId == selectedId) {
if (isWorking == true) {
return const SendingWidget();
}
if (responseStatus == null) {

View File

@ -93,10 +93,10 @@ class SendButton extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final selectedId = ref.watch(selectedIdStateProvider);
final sentRequestId = ref.watch(sentRequestIdStateProvider);
final isWorking = ref.watch(selectedRequestModelProvider)?.isWorking;
return SendRequestButton(
selectedId: selectedId,
sentRequestId: sentRequestId,
isWorking: isWorking,
onTap: () {
ref
.read(collectionStateNotifierProvider.notifier)

View File

@ -47,31 +47,26 @@ class CopyButton extends StatelessWidget {
class SendRequestButton extends StatelessWidget {
const SendRequestButton({
super.key,
required this.selectedId,
required this.sentRequestId,
required this.isWorking,
required this.onTap,
});
final String? selectedId;
final String? sentRequestId;
final bool? isWorking;
final void Function() onTap;
@override
Widget build(BuildContext context) {
bool disable = sentRequestId != null;
return FilledButton(
onPressed: disable ? null : onTap,
onPressed: isWorking == true ? null : onTap,
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
Text(
disable
? (selectedId == sentRequestId ? kLabelSending : kLabelBusy)
: kLabelSend,
isWorking == true ? kLabelSending : kLabelSend,
style: kTextStyleButton,
),
if (!disable) kHSpacer10,
if (!disable)
if (isWorking == false) kHSpacer10,
if (isWorking == false)
const Icon(
size: 16,
Icons.send,