diff --git a/lib/consts.dart b/lib/consts.dart index 66972b14..681d7698 100644 --- a/lib/consts.dart +++ b/lib/consts.dart @@ -159,6 +159,7 @@ enum ResponseBodyView { preview("Preview", Icons.visibility_rounded), code("Preview", Icons.code_rounded), raw("Raw", Icons.text_snippet_rounded), + answer("Answer", Icons.abc), sse("SSE", Icons.stream), none("Preview", Icons.warning); diff --git a/lib/providers/collection_providers.dart b/lib/providers/collection_providers.dart index 127fc9a9..a139844f 100644 --- a/lib/providers/collection_providers.dart +++ b/lib/providers/collection_providers.dart @@ -141,6 +141,7 @@ class CollectionStateNotifier final rId = id ?? ref.read(selectedIdStateProvider); if (rId == null || state?[rId] == null) return; var currentModel = state![rId]!; + final newModel = currentModel.copyWith( responseStatus: null, message: null, @@ -328,7 +329,7 @@ class CollectionStateNotifier method: HTTPVerb.post, headers: [ ...genAIRequest.headers.entries.map( - (x) => NameValueModel.fromJson({x.key: x.value}), + (x) => NameValueModel(name: x.key, value: x.value), ), ], url: genAIRequest.endpoint, diff --git a/lib/screens/home_page/editor_pane/details_card/request_pane/ai_request/request_pane_ai.dart b/lib/screens/home_page/editor_pane/details_card/request_pane/ai_request/request_pane_ai.dart index 5d219717..31a490b8 100644 --- a/lib/screens/home_page/editor_pane/details_card/request_pane/ai_request/request_pane_ai.dart +++ b/lib/screens/home_page/editor_pane/details_card/request_pane/ai_request/request_pane_ai.dart @@ -18,7 +18,7 @@ class EditAIRequestPane extends ConsumerWidget { return RequestPane( selectedId: selectedId, - codePaneVisible: false, + codePaneVisible: codePaneVisible, tabIndex: tabIndex, onPressedCodeButton: () { ref.read(codePaneVisibleStateProvider.notifier).state = diff --git a/lib/widgets/response_body.dart b/lib/widgets/response_body.dart index 8b72b44a..c682b756 100644 --- a/lib/widgets/response_body.dart +++ b/lib/widgets/response_body.dart @@ -18,8 +18,8 @@ class ResponseBody extends StatelessWidget { @override Widget build(BuildContext context) { - HttpResponseModel? httpResponseModel; - httpResponseModel = selectedRequestModel?.httpResponseModel; + HttpResponseModel? httpResponseModel = + selectedRequestModel?.httpResponseModel; if (httpResponseModel == null) { return const ErrorMessage( @@ -55,7 +55,9 @@ class ResponseBody extends StatelessWidget { // '$kMsgUnknowContentType - ${responseModel.contentType}. $kUnexpectedRaiseIssue'); // } - var responseBodyView = getResponseBodyViewOptions(mediaType); + var responseBodyView = selectedRequestModel?.apiType == APIType.ai + ? ([ResponseBodyView.answer, ResponseBodyView.raw], 'text') + : getResponseBodyViewOptions(mediaType); var options = responseBodyView.$1; var highlightLanguage = responseBodyView.$2; diff --git a/lib/widgets/response_body_success.dart b/lib/widgets/response_body_success.dart index 9b22a4b9..b4c75dfa 100644 --- a/lib/widgets/response_body_success.dart +++ b/lib/widgets/response_body_success.dart @@ -46,6 +46,8 @@ class _ResponseBodySuccessState extends State { borderRadius: kBorderRadius8, ); + final isAIRequest = widget.options.contains(ResponseBodyView.answer); + return LayoutBuilder( builder: (BuildContext context, BoxConstraints constraints) { var showLabel = showButtonLabelsInBodySuccess( @@ -87,20 +89,33 @@ class _ResponseBodySuccessState extends State { ), const Spacer(), ((widget.options == kPreviewRawBodyViewOptions) || - kCodeRawBodyViewOptions.contains(currentSeg)) + kCodeRawBodyViewOptions.contains(currentSeg) || + isAIRequest) ? CopyButton( - toCopy: widget.formattedBody ?? widget.body, + toCopy: (currentSeg == ResponseBodyView.answer) + ? widget.formattedBody! + : isAIRequest + ? formatBody(widget.body, widget.mediaType)! + : (widget.formattedBody ?? widget.body), showLabel: showLabel, ) : const SizedBox(), kIsMobile ? ShareButton( - toShare: widget.formattedBody ?? widget.body, + toShare: (currentSeg == ResponseBodyView.answer) + ? widget.formattedBody! + : isAIRequest + ? formatBody(widget.body, widget.mediaType)! + : (widget.formattedBody ?? widget.body), showLabel: showLabel, ) : SaveInDownloadsButton( - content: widget.bytes, - mimeType: widget.mediaType.mimeType, + content: (currentSeg == ResponseBodyView.answer) + ? utf8.encode(widget.formattedBody!) + : widget.bytes, + mimeType: (currentSeg == ResponseBodyView.answer) + ? 'text/plain' + : widget.mediaType.mimeType, showLabel: showLabel, ), ], @@ -135,6 +150,24 @@ class _ResponseBodySuccessState extends State { ), ), ResponseBodyView.raw => Expanded( + child: Container( + width: double.maxFinite, + padding: kP8, + decoration: textContainerdecoration, + child: SingleChildScrollView( + child: SelectableText( + widget.options.contains(ResponseBodyView.answer) + ? formatBody( + widget.body, + MediaType(kTypeApplication, kSubTypeJson), + )! + : (widget.formattedBody ?? widget.body), + style: kCodeStyle, + ), + ), + ), + ), + ResponseBodyView.answer => Expanded( child: Container( width: double.maxFinite, padding: kP8,