mirror of
https://github.com/foss42/apidash.git
synced 2025-12-01 18:28:25 +08:00
Implemented AnswerTab for AI Output
This commit is contained in:
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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 =
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user