diff --git a/lib/models/request_model.dart b/lib/models/request_model.dart index 9154e428..a8d3569a 100644 --- a/lib/models/request_model.dart +++ b/lib/models/request_model.dart @@ -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? 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, ); } diff --git a/lib/providers/collection_providers.dart b/lib/providers/collection_providers.dart index 0432b0e4..a1afa070 100644 --- a/lib/providers/collection_providers.dart +++ b/lib/providers/collection_providers.dart @@ -156,11 +156,20 @@ class CollectionStateNotifier } Future 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; } diff --git a/lib/screens/home_page/editor_pane/details_card/response_pane.dart b/lib/screens/home_page/editor_pane/details_card/response_pane.dart index e7fc9f09..3e344117 100644 --- a/lib/screens/home_page/editor_pane/details_card/response_pane.dart +++ b/lib/screens/home_page/editor_pane/details_card/response_pane.dart @@ -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) { diff --git a/lib/screens/home_page/editor_pane/url_card.dart b/lib/screens/home_page/editor_pane/url_card.dart index 5fa4b404..8e00f377 100644 --- a/lib/screens/home_page/editor_pane/url_card.dart +++ b/lib/screens/home_page/editor_pane/url_card.dart @@ -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) diff --git a/lib/widgets/buttons.dart b/lib/widgets/buttons.dart index 2d63ede7..2dc28ba6 100644 --- a/lib/widgets/buttons.dart +++ b/lib/widgets/buttons.dart @@ -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,