genai: Fixed ModelSelector InkWell Bleed & made it visible in History

This commit is contained in:
Manas Hejmadi
2025-08-16 16:02:34 +05:30
parent 30075a6d95
commit db326b434a
3 changed files with 63 additions and 44 deletions

View File

@@ -1,3 +1,4 @@
import 'package:apidash/screens/home_page/editor_pane/url_card.dart';
import 'package:apidash_core/apidash_core.dart'; import 'package:apidash_core/apidash_core.dart';
import 'package:apidash_design_system/apidash_design_system.dart'; import 'package:apidash_design_system/apidash_design_system.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@@ -58,6 +59,12 @@ class HistoryURLCard extends StatelessWidget {
), ),
isCompact ? kHSpacer10 : kHSpacer20, isCompact ? kHSpacer10 : kHSpacer20,
], ],
if (apiType == APIType.ai) ...[
AIProviderSelector(
readOnlyModel: historyRequestModel?.aiRequestModel,
),
SizedBox(width: 20),
],
Expanded( Expanded(
child: ReadOnlyTextField( child: ReadOnlyTextField(
initialValue: url, initialValue: url,

View File

@@ -4,30 +4,34 @@ import 'package:flutter/material.dart';
class DefaultLLMSelectorButton extends StatelessWidget { class DefaultLLMSelectorButton extends StatelessWidget {
final LLMSaveObject? defaultLLM; final LLMSaveObject? defaultLLM;
final bool readonly;
final Function(LLMSaveObject) onDefaultLLMUpdated; final Function(LLMSaveObject) onDefaultLLMUpdated;
const DefaultLLMSelectorButton({ const DefaultLLMSelectorButton({
super.key, super.key,
this.defaultLLM, this.defaultLLM,
this.readonly = false,
required this.onDefaultLLMUpdated, required this.onDefaultLLMUpdated,
}); });
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return ElevatedButton( return ElevatedButton(
onPressed: () async { onPressed: readonly
final saveObject = await showDialog( ? null
context: context, : () async {
builder: (context) { final saveObject = await showDialog(
return AlertDialog( context: context,
scrollable: true, builder: (context) {
content: DefaultLLMSelectorDialog(defaultLLM: defaultLLM), return AlertDialog(
contentPadding: EdgeInsets.all(10), scrollable: true,
); content: DefaultLLMSelectorDialog(defaultLLM: defaultLLM),
}, contentPadding: EdgeInsets.all(10),
); );
if (saveObject == null) return; },
onDefaultLLMUpdated(saveObject); );
}, if (saveObject == null) return;
onDefaultLLMUpdated(saveObject);
},
child: Text(defaultLLM?.selectedLLM.modelName ?? 'Select Model'), child: Text(defaultLLM?.selectedLLM.modelName ?? 'Select Model'),
); );
} }
@@ -171,37 +175,41 @@ class _DefaultLLMSelectorDialogState extends State<DefaultLLMSelectorDialog> {
borderRadius: BorderRadius.circular(10), borderRadius: BorderRadius.circular(10),
color: const Color.fromARGB(27, 0, 0, 0), color: const Color.fromARGB(27, 0, 0, 0),
), ),
child: SingleChildScrollView( child: Material(
child: Column( color: Colors.transparent,
children: [ child: SingleChildScrollView(
...selectedLLMProvider.models.map( clipBehavior: Clip.hardEdge,
(x) => ListTile( child: Column(
title: Text(x.modelName), children: [
subtitle: Text(x.identifier), ...selectedLLMProvider.models.map(
trailing: Row( (x) => ListTile(
mainAxisSize: MainAxisSize.min, title: Text(x.modelName),
children: [ subtitle: Text(x.identifier),
if (llmSaveObject.selectedLLM.identifier == trailing: Row(
x.identifier) mainAxisSize: MainAxisSize.min,
CircleAvatar( children: [
radius: 5, if (llmSaveObject.selectedLLM.identifier ==
backgroundColor: Colors.green, x.identifier)
), CircleAvatar(
IconButton( radius: 5,
onPressed: () => removeModel(x), backgroundColor: Colors.green,
icon: Icon( ),
Icons.delete, IconButton(
size: 20, onPressed: () => removeModel(x),
)) icon: Icon(
], Icons.delete,
size: 20,
))
],
),
onTap: () {
llmSaveObject.selectedLLM = x;
setState(() {});
},
), ),
onTap: () {
llmSaveObject.selectedLLM = x;
setState(() {});
},
), ),
), ],
], ),
), ),
), ),
), ),

View File

@@ -171,15 +171,18 @@ class SendRequestButton extends ConsumerWidget {
} }
class AIProviderSelector extends ConsumerWidget { class AIProviderSelector extends ConsumerWidget {
final AIRequestModel? readOnlyModel;
const AIProviderSelector({ const AIProviderSelector({
super.key, super.key,
this.readOnlyModel,
}); });
@override @override
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context, WidgetRef ref) {
final selectedId = ref.watch(selectedIdStateProvider); final selectedId = ref.watch(selectedIdStateProvider);
final req = ref.watch(collectionStateNotifierProvider)![selectedId]!; final req = ref.watch(collectionStateNotifierProvider)![selectedId]!;
AIRequestModel? aiRequestModel = req.aiRequestModel; AIRequestModel? aiRequestModel = readOnlyModel ?? req.aiRequestModel;
if (aiRequestModel == null) { if (aiRequestModel == null) {
return Container(); return Container();
@@ -194,6 +197,7 @@ class AIProviderSelector extends ConsumerWidget {
); );
return DefaultLLMSelectorButton( return DefaultLLMSelectorButton(
readonly: (readOnlyModel != null),
key: ValueKey(ref.watch(selectedIdStateProvider)), key: ValueKey(ref.watch(selectedIdStateProvider)),
defaultLLM: defaultLLMSO, defaultLLM: defaultLLMSO,
onDefaultLLMUpdated: (llmso) { onDefaultLLMUpdated: (llmso) {