import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:mohem_flutter_app/api/chat/chat_api_client.dart'; import 'package:mohem_flutter_app/api/worklist/worklist_api_client.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/classes/utils.dart'; import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/main.dart'; import 'package:mohem_flutter_app/models/chat/get_search_user_chat_model.dart'; import 'package:mohem_flutter_app/models/get_action_history_list_model.dart'; import 'package:mohem_flutter_app/models/worklist/get_favorite_replacements_model.dart'; import 'package:mohem_flutter_app/models/worklist/replacement_list_model.dart'; import 'package:mohem_flutter_app/provider/chat_provider_model.dart'; import 'package:mohem_flutter_app/ui/chat/chat_detailed_screen.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart'; import 'package:mohem_flutter_app/widgets/circular_avatar.dart'; import 'package:mohem_flutter_app/widgets/dynamic_forms/dynamic_textfield_widget.dart'; import 'package:provider/provider.dart'; class SearchEmployeeBottomSheet extends StatefulWidget { int? notificationID; String title, apiMode; List? actionHistoryList; Function(ReplacementList) onSelectEmployee; bool fromChat; SearchEmployeeBottomSheet({ required this.title, required this.apiMode, this.notificationID, this.actionHistoryList, required this.onSelectEmployee, required this.fromChat, }); @override State createState() => _SearchEmployeeBottomSheetState(); } class _SearchEmployeeBottomSheetState extends State { TextEditingController username = TextEditingController(); ScrollController sc = ScrollController(); String searchText = ""; List? optionsList = [ LocaleKeys.fullName.tr(), LocaleKeys.username.tr(), LocaleKeys.endDate.tr(), ]; List? favUsersList; List? replacementList; List? favouriteUserList; List? nonFavouriteUserList; // Chat Items late ChatProviderModel provider; int _selectedSearchIndex = 0; void fetchUserByInput({bool isNeedLoading = true}) async { try { Utils.showLoading(context); replacementList = await WorkListApiClient().searchUserByInput( userName: _selectedSearchIndex == 0 ? searchText : "", userId: _selectedSearchIndex == 1 ? searchText : "", email: _selectedSearchIndex == 2 ? searchText : "", ); favouriteUserList = replacementList?.where((element) => element.isFavorite ?? false).toList(); nonFavouriteUserList = replacementList?.where((element) => !(element.isFavorite ?? false)).toList(); Utils.hideLoading(context); setState(() {}); } catch (e) { Utils.hideLoading(context); Utils.handleException(e, context, null); } if (isNeedLoading) Utils.hideLoading(context); setState(() {}); return null; } void fetchChatUser({bool isNeedLoading = true}) async { if (provider.pageNo == 1) provider.chatUsersList!.clear(); try { Utils.showLoading(context); await ChatApiClient().getChatMemberFromSearch(searchText, AppState().chatDetails!.response!.id!, provider.pageNo).then((ChatUserModel value) { if (value.response != null) { if (provider.pageNo == 1) { provider.chatUsersList = value.response; } else { print("--------------------------Added More----------------------"); provider.chatUsersList!.addAll(value.response!); } } }); provider.chatUsersList!.removeWhere((ChatUser element) => element.id == AppState().chatDetails!.response!.id); Utils.hideLoading(context); setState(() {}); } catch (e) { Utils.hideLoading(context); Utils.handleException(e, context, null); } if (isNeedLoading) Utils.hideLoading(context); setState(() {}); return null; } void scrollListener() async { if (sc.position.pixels == sc.position.maxScrollExtent) { provider.pageNo++; logger.w(provider.chatUsersList!.length); logger.w(provider.pageNo); fetchChatUser(); } } @override void initState() { super.initState(); sc.addListener(scrollListener); provider = Provider.of(context, listen: false); } @override void dispose() { super.dispose(); provider.chatUsersList = []; provider.pageNo = 1; } @override Widget build(BuildContext context) { return SizedBox( width: double.infinity, height: MediaQuery.of(context).size.height - 100, child: Column( children: [ Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ widget.title.toText24(isBold: true), 21.height, "Search".toText16(), 11.height, Row( children: [ radioOption(widget.fromChat ? "UserId" : "Name", 0, _selectedSearchIndex), radioOption("User Name", 1, _selectedSearchIndex), radioOption("Email", 2, _selectedSearchIndex), ], ), 14.height, Row( children: [ DynamicTextFieldWidget( "Search", "Search By Username", inputAction: TextInputAction.done, suffixIconData: Icons.search, onChange: (text) { searchText = text; setState(() {}); }, ).expanded, IconButton( constraints: const BoxConstraints(), onPressed: () async { await SystemChannels.textInput.invokeMethod('TextInput.hide'); widget.fromChat ? fetchChatUser() : fetchUserByInput(); }, icon: const Icon(Icons.search), ) ], ), if (replacementList != null) replacementList!.isEmpty ? Utils.getNoDataWidget(context).expanded : ListView( physics: const BouncingScrollPhysics(), padding: EdgeInsets.only(top: 21, bottom: 8), children: [ if (favouriteUserList?.isNotEmpty ?? false) ...[ "Favorites".toText16(), 12.height, ListView.separated( physics: const NeverScrollableScrollPhysics(), shrinkWrap: true, itemBuilder: (cxt, index) => employeeItemView(favouriteUserList![index]), separatorBuilder: (cxt, index) => Container( height: 1, color: MyColors.borderE3Color, ), itemCount: favouriteUserList?.length ?? 0), 12.height, ], if (nonFavouriteUserList?.isNotEmpty ?? false) ...[ "Related".toText16(), 12.height, ListView.separated( physics: const NeverScrollableScrollPhysics(), shrinkWrap: true, itemBuilder: (cxt, index) => employeeItemView(nonFavouriteUserList![index]), separatorBuilder: (cxt, index) => Container( height: 1, color: MyColors.borderE3Color, ), itemCount: nonFavouriteUserList?.length ?? 0), ] ], ).expanded, if (widget.fromChat) if (provider.chatUsersList != null && widget.fromChat) provider.chatUsersList!.isEmpty ? Column( children: [ 20.height, Utils.getNoDataWidget(context), ], ) : ListView.separated( itemCount: provider.chatUsersList!.length, shrinkWrap: true, physics: const ClampingScrollPhysics(), controller: sc, padding: const EdgeInsets.only(bottom: 80.0, top: 20), itemBuilder: (BuildContext context, int index) { return SizedBox( height: 55, child: Row( children: [ Stack( children: [ SvgPicture.asset( "assets/images/user.svg", height: 48, width: 48, ), Positioned( right: 5, bottom: 1, child: Container( width: 10, height: 10, decoration: BoxDecoration( color: provider.chatUsersList![index].userStatus == 1 ? MyColors.green2DColor : Colors.red, ), ).circle(10), ) ], ), Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ (provider.chatUsersList![index].userName!.replaceFirst(".", " ").capitalizeFirstofEach ?? "") .toText14(color: MyColors.darkTextColor) .paddingOnly(left: 11, top: 13), provider.chatUsersList![index].isTyping! ? 'Typing...' .toText10( color: MyColors.textMixColor, ) .paddingOnly(left: 11.0) : const SizedBox() ], ).expanded, SizedBox( width: 60, child: Row( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.end, mainAxisSize: MainAxisSize.max, children: [ if (provider.chatUsersList![index].unreadMessageCount! > 0) Container( alignment: Alignment.center, width: 18, height: 18, decoration: const BoxDecoration( color: MyColors.redColor, borderRadius: BorderRadius.all( Radius.circular(20), ), ), child: (provider.chatUsersList![index].unreadMessageCount!.toString()) .toText10( color: MyColors.white, ) .center, ).paddingOnly(right: 10).center, Icon( provider.chatUsersList![index].isFav != null && provider.chatUsersList![index].isFav == false ? Icons.star_sharp : Icons.star_sharp, color: provider.chatUsersList![index].isFav != null && provider.chatUsersList![index].isFav == true ? MyColors.yellowColor : MyColors.grey35Color, ).onPress( () { if (provider.chatUsersList![index].isFav == null || provider.chatUsersList![index].isFav == false) { provider.favoriteUser(userID: AppState().chatDetails!.response!.id!, targetUserID: provider.chatUsersList![index].id!, fromSearch: true).then((value) { setState(() {}); }); } else if (provider.chatUsersList![index].isFav == true) { provider .unFavoriteUser( userID: AppState().chatDetails!.response!.id!, targetUserID: provider.chatUsersList![index].id!, ) .then((value) { setState(() {}); }); } else { provider.favoriteUser(userID: AppState().chatDetails!.response!.id!, targetUserID: provider.chatUsersList![index].id!, fromSearch: true).then((value) { setState(() {}); }); } }, ).center ], ), ), ], ), ).onPress(() { Navigator.pop(context); Navigator.pushNamed( context, AppRoutes.chatDetailed, arguments: ChatDetailedScreenParams(provider.chatUsersList![index], true), ); }); }, separatorBuilder: (BuildContext context, int index) => const Divider(color: MyColors.lightGreyE5Color).paddingOnly(left: 59), ).expanded, ], ).paddingOnly(left: 21, right: 21, bottom: 0, top: 21).expanded, Container(width: double.infinity, height: 1, color: MyColors.lightGreyEFColor), DefaultButton( LocaleKeys.cancel.tr(), () { Navigator.pop(context); provider.chatUsersList = []; provider.pageNo = 1; }, textColor: MyColors.grey3AColor, colors: const [ Color(0xffE6E6E6), Color(0xffE6E6E6), ], ).insideContainer ], ), ); } Widget employeeItemView(ReplacementList replacement) { return InkWell( onTap: () { Navigator.pop(context); widget.onSelectEmployee(replacement); }, child: SizedBox( height: 50, child: Row( children: [ CircularAvatar( url: replacement.employeeImage ?? "", height: 30, width: 30, isImageBase64: true, ), 16.width, Expanded( child: (replacement.employeeDisplayName ?? "").toText12(), ), Icon(Icons.star, size: 16, color: replacement.isFavorite! ? MyColors.yellowFavColor : MyColors.borderCEColor), ], ), ), ); } Widget radioOption(String title, int value, int groupValue) { return Row( children: [ Container( width: 24, height: 24, decoration: BoxDecoration( color: Colors.transparent, border: Border.all(color: MyColors.borderColor, width: 1), borderRadius: const BorderRadius.all( Radius.circular(100), ), ), padding: const EdgeInsets.all(4), child: Container( width: double.infinity, height: double.infinity, decoration: BoxDecoration( color: value == groupValue ? MyColors.grey3AColor : Colors.transparent, borderRadius: const BorderRadius.all( Radius.circular(100), ), ), ), ), 9.width, title.toText12(color: MyColors.grey57Color) ], ).onPress(() { _selectedSearchIndex = value; setState(() {}); }).expanded; } }