import 'package:fcs/domain/entities/user.dart'; import 'package:fcs/helpers/theme.dart'; import 'package:fcs/pages/package/model/package_model.dart'; import 'package:fcs/pages/user_search/user_list_row.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../../data/services/services.dart'; typedef OnUserSelect(User suer); typedef OnUserRowSelect(User suer); Future searchUser(BuildContext context, {required OnUserSelect onUserSelect, bool popPage = false}) async => await showSearch( context: context, delegate: UserSearchDelegate(onUserSelect: onUserSelect, popPage: popPage), ); class UserSearchDelegate extends SearchDelegate { final OnUserSelect? onUserSelect; final bool popPage; UserSearchDelegate({required this.onUserSelect, required this.popPage}); @override String get searchFieldLabel => 'Search by FCS ID or Name'; @override ThemeData appBarTheme(BuildContext context) { final ThemeData theme = Theme.of(context); return theme.copyWith( appBarTheme: AppBarTheme(color: primaryColor), iconButtonTheme: IconButtonThemeData( style: ButtonStyle( iconColor: MaterialStateProperty.all(Colors.white))), inputDecorationTheme: InputDecorationTheme( border: InputBorder.none, hintStyle: TextStyle(color: Colors.grey, fontSize: 14)), textTheme: TextTheme( displayLarge: TextStyle( color: theme.primaryTextTheme.displayLarge?.color, fontSize: 16, backgroundColor: primaryColor)), primaryColor: primaryColor, ); } @override List buildActions(BuildContext context) { return [ IconButton( icon: Icon(Icons.clear), onPressed: () => query = '', ), ]; } @override Widget buildLeading(BuildContext context) { return IconButton( icon: Icon(CupertinoIcons.back), onPressed: () => close(context, new User()), ); } @override Widget buildResults(BuildContext context) { final packageModel = Provider.of(context); return FutureBuilder( future: packageModel.searchUser(query), builder: (context, AsyncSnapshot> snapshot) { if (snapshot.hasData) { if (snapshot.data == null || snapshot.data!.length == 0) { return Container( child: Center( child: Text( "No result found", textAlign: TextAlign.center, style: TextStyle(color:Colors.black), ), ), ); } return Container( padding: EdgeInsets.only(top: 15), child: ListView( children: snapshot.data! .map((u) => UserListRow( user: u, onUserRowSelect: (u) => _onUserRowSelect(context, u), )) .toList(), ), ); } else if (snapshot.hasError) { return Container( child: Center( child: Text( '${snapshot.error}', textAlign: TextAlign.center, ), ), ); } else { return Container( child: Center( child: CircularProgressIndicator( valueColor: new AlwaysStoppedAnimation(primaryColor)), ), ); } }); } @override Widget buildSuggestions(BuildContext context) { return Container( child: Center( child: Opacity( opacity: 0.2, child: Icon(Icons.perm_identity, size: 200, color: primaryColor)), ), ); } _onUserRowSelect(BuildContext context, User user) async { User? u = await Services.instance.userService.getUser(user.id ?? ""); if (onUserSelect != null) { onUserSelect!(u ?? user); } if (popPage) { Navigator.pop(context); } } }