import 'package:async/async.dart'; import 'package:flutter/material.dart'; import '../../../api/marianumcloud/autocomplete/autocompleteApi.dart'; import '../../../api/marianumcloud/autocomplete/autocompleteResponse.dart'; import '../../../model/endpointData.dart'; import '../../../widget/placeholderView.dart'; class JoinChat extends SearchDelegate { CancelableOperation? future; @override List? buildActions(BuildContext context) { return [ if(future != null && query.isNotEmpty) FutureBuilder( future: future!.value, builder: (context, snapshot) { if(snapshot.connectionState != ConnectionState.done) { return Container( padding: const EdgeInsets.all(10), child: const Center( child: SizedBox( height: 20, width: 20, child: CircularProgressIndicator( strokeWidth: 3, ), ), ), ); } return const SizedBox.shrink(); }, ), if(query.isNotEmpty) IconButton(onPressed: () => query = "", icon: const Icon(Icons.delete)), ]; } @override Widget? buildLeading(BuildContext context) { return null; } @override Widget buildResults(BuildContext context) { if(future != null) future!.cancel(); if(query.isEmpty) { return const PlaceholderView( text: "Suche nach benutzern", icon: Icons.person_search_outlined, ); } future = CancelableOperation.fromFuture(AutocompleteApi().find(query)); return FutureBuilder( future: future!.value, builder: (context, snapshot) { if(snapshot.hasData) { return ListView.builder( itemCount: snapshot.data!.data.length, itemBuilder: (context, index) { AutocompleteResponseObject object = snapshot.data!.data[index]; CircleAvatar circleAvatar = CircleAvatar( foregroundImage: Image.network("https://${EndpointData().nextcloud().full()}/avatar/${object.id}/128").image, backgroundColor: Theme.of(context).primaryColor, foregroundColor: Colors.white, child: const Icon(Icons.person), ); return ListTile( leading: circleAvatar, title: Text(object.label), subtitle: Text(object.id), trailing: const Icon(Icons.arrow_right), onTap: () { close(context, object.id); }, ); } ); } else if(snapshot.hasError) { return const PlaceholderView(icon: Icons.search_off, text: "Ein fehler ist aufgetreten. Bist du mit dem Internet verbunden?"); } return const Center(child: CircularProgressIndicator()); }, ); } @override Widget buildSuggestions(BuildContext context) { return buildResults(context); } }