import "package:shadcn_flutter/shadcn_flutter.dart"; import "../../constants.dart"; class ModelPickerDialog extends StatefulWidget { final List models; final String? selectedModel; const ModelPickerDialog({ super.key, required this.models, this.selectedModel, }); @override State createState() => _ModelPickerDialogState(); } class _ModelPickerDialogState extends State { 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 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, ], ), ), ), ); }, ), ), ], ), ), ); } }