Implemented AnswerTab for AI Output

This commit is contained in:
Manas Hejmadi
2025-06-10 01:00:26 +05:30
parent 452020f720
commit 2c756df2c4
5 changed files with 47 additions and 10 deletions

View File

@@ -159,6 +159,7 @@ enum ResponseBodyView {
preview("Preview", Icons.visibility_rounded), preview("Preview", Icons.visibility_rounded),
code("Preview", Icons.code_rounded), code("Preview", Icons.code_rounded),
raw("Raw", Icons.text_snippet_rounded), raw("Raw", Icons.text_snippet_rounded),
answer("Answer", Icons.abc),
sse("SSE", Icons.stream), sse("SSE", Icons.stream),
none("Preview", Icons.warning); none("Preview", Icons.warning);

View File

@@ -141,6 +141,7 @@ class CollectionStateNotifier
final rId = id ?? ref.read(selectedIdStateProvider); final rId = id ?? ref.read(selectedIdStateProvider);
if (rId == null || state?[rId] == null) return; if (rId == null || state?[rId] == null) return;
var currentModel = state![rId]!; var currentModel = state![rId]!;
final newModel = currentModel.copyWith( final newModel = currentModel.copyWith(
responseStatus: null, responseStatus: null,
message: null, message: null,
@@ -328,7 +329,7 @@ class CollectionStateNotifier
method: HTTPVerb.post, method: HTTPVerb.post,
headers: [ headers: [
...genAIRequest.headers.entries.map( ...genAIRequest.headers.entries.map(
(x) => NameValueModel.fromJson({x.key: x.value}), (x) => NameValueModel(name: x.key, value: x.value),
), ),
], ],
url: genAIRequest.endpoint, url: genAIRequest.endpoint,

View File

@@ -18,7 +18,7 @@ class EditAIRequestPane extends ConsumerWidget {
return RequestPane( return RequestPane(
selectedId: selectedId, selectedId: selectedId,
codePaneVisible: false, codePaneVisible: codePaneVisible,
tabIndex: tabIndex, tabIndex: tabIndex,
onPressedCodeButton: () { onPressedCodeButton: () {
ref.read(codePaneVisibleStateProvider.notifier).state = ref.read(codePaneVisibleStateProvider.notifier).state =

View File

@@ -18,8 +18,8 @@ class ResponseBody extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
HttpResponseModel? httpResponseModel; HttpResponseModel? httpResponseModel =
httpResponseModel = selectedRequestModel?.httpResponseModel; selectedRequestModel?.httpResponseModel;
if (httpResponseModel == null) { if (httpResponseModel == null) {
return const ErrorMessage( return const ErrorMessage(
@@ -55,7 +55,9 @@ class ResponseBody extends StatelessWidget {
// '$kMsgUnknowContentType - ${responseModel.contentType}. $kUnexpectedRaiseIssue'); // '$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 options = responseBodyView.$1;
var highlightLanguage = responseBodyView.$2; var highlightLanguage = responseBodyView.$2;

View File

@@ -46,6 +46,8 @@ class _ResponseBodySuccessState extends State<ResponseBodySuccess> {
borderRadius: kBorderRadius8, borderRadius: kBorderRadius8,
); );
final isAIRequest = widget.options.contains(ResponseBodyView.answer);
return LayoutBuilder( return LayoutBuilder(
builder: (BuildContext context, BoxConstraints constraints) { builder: (BuildContext context, BoxConstraints constraints) {
var showLabel = showButtonLabelsInBodySuccess( var showLabel = showButtonLabelsInBodySuccess(
@@ -87,20 +89,33 @@ class _ResponseBodySuccessState extends State<ResponseBodySuccess> {
), ),
const Spacer(), const Spacer(),
((widget.options == kPreviewRawBodyViewOptions) || ((widget.options == kPreviewRawBodyViewOptions) ||
kCodeRawBodyViewOptions.contains(currentSeg)) kCodeRawBodyViewOptions.contains(currentSeg) ||
isAIRequest)
? CopyButton( ? CopyButton(
toCopy: widget.formattedBody ?? widget.body, toCopy: (currentSeg == ResponseBodyView.answer)
? widget.formattedBody!
: isAIRequest
? formatBody(widget.body, widget.mediaType)!
: (widget.formattedBody ?? widget.body),
showLabel: showLabel, showLabel: showLabel,
) )
: const SizedBox(), : const SizedBox(),
kIsMobile kIsMobile
? ShareButton( ? ShareButton(
toShare: widget.formattedBody ?? widget.body, toShare: (currentSeg == ResponseBodyView.answer)
? widget.formattedBody!
: isAIRequest
? formatBody(widget.body, widget.mediaType)!
: (widget.formattedBody ?? widget.body),
showLabel: showLabel, showLabel: showLabel,
) )
: SaveInDownloadsButton( : SaveInDownloadsButton(
content: widget.bytes, content: (currentSeg == ResponseBodyView.answer)
mimeType: widget.mediaType.mimeType, ? utf8.encode(widget.formattedBody!)
: widget.bytes,
mimeType: (currentSeg == ResponseBodyView.answer)
? 'text/plain'
: widget.mediaType.mimeType,
showLabel: showLabel, showLabel: showLabel,
), ),
], ],
@@ -135,6 +150,24 @@ class _ResponseBodySuccessState extends State<ResponseBodySuccess> {
), ),
), ),
ResponseBodyView.raw => Expanded( 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( child: Container(
width: double.maxFinite, width: double.maxFinite,
padding: kP8, padding: kP8,