The-Agency/lib/ui/widgets/chat/model_picker_dialog.dart

103 lines
2.9 KiB
Dart

import "package:shadcn_flutter/shadcn_flutter.dart";
import "../../constants.dart";
class ModelPickerDialog extends StatefulWidget {
final List<SelectableAiModel> models;
final String? selectedModel;
const ModelPickerDialog({
super.key,
required this.models,
this.selectedModel,
});
@override
State<ModelPickerDialog> createState() => _ModelPickerDialogState();
}
class _ModelPickerDialogState extends State<ModelPickerDialog> {
late TextEditingController _searchController;
String _query = '';
@override
void initState() {
super.initState();
_searchController = TextEditingController();
_searchController.addListener(() {
setState(() => _query = _searchController.text.trim().toLowerCase());
});
}
@override
void dispose() {
_searchController.dispose();
super.dispose();
}
List<SelectableAiModel> get _filtered {
if (_query.isEmpty) return widget.models;
return widget.models.where((m) =>
m.label.toLowerCase().contains(_query) ||
m.id.toLowerCase().contains(_query)
).toList();
}
@override
Widget build(BuildContext context) {
final filtered = _filtered;
return AlertDialog(
title: const Text('Select model'),
content: SizedBox(
width: 340,
height: 380,
child: Column(
children: [
TextField(
controller: _searchController,
autofocus: true,
placeholder: const Text('Search models...'),
features: const [InputFeature.clear()],
),
Gap(8),
Expanded(
child: filtered.isEmpty
? Center(child: Text("No results").muted)
: ListView.builder(
itemCount: filtered.length,
itemBuilder: (context, i) {
final model = filtered[i];
final isSelected = model.id == widget.selectedModel;
return SizedBox(
width: double.infinity,
child: Button(
style: isSelected ? ButtonStyle.secondary() : ButtonStyle.ghost(),
disableFocusOutline: true,
onPressed: () => Navigator.of(context).pop(model.id),
child: Align(
alignment: Alignment.centerLeft,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
Text(model.label),
Text(model.id).muted.small,
],
),
),
),
);
},
),
),
],
),
),
);
}
}