You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			437 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			Dart
		
	
			
		
		
	
	
			437 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			Dart
		
	
| 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<GetActionHistoryList>? actionHistoryList;
 | |
|   Function(ReplacementList) onSelectEmployee;
 | |
|   Function(String)? onSearchClick;
 | |
|   bool fromChat;
 | |
|   bool? fromDynamicScreen;
 | |
|   SearchEmployeeBottomSheet({
 | |
|     required this.title,
 | |
|     required this.apiMode,
 | |
|     this.notificationID,
 | |
|     this.actionHistoryList,
 | |
|     required this.onSelectEmployee,
 | |
|     required this.fromChat,
 | |
|     this.fromDynamicScreen =false,
 | |
|     this.onSearchClick,
 | |
|   });
 | |
| 
 | |
|   @override
 | |
|   State<SearchEmployeeBottomSheet> createState() => _SearchEmployeeBottomSheetState();
 | |
| }
 | |
| 
 | |
| class _SearchEmployeeBottomSheetState extends State<SearchEmployeeBottomSheet> {
 | |
|   TextEditingController username = TextEditingController();
 | |
|   ScrollController sc = ScrollController();
 | |
| 
 | |
|   String searchText = "";
 | |
| 
 | |
|   List<String>? optionsList = [
 | |
|     LocaleKeys.fullName.tr(),
 | |
|     LocaleKeys.username.tr(),
 | |
|     LocaleKeys.endDate.tr(),
 | |
|   ];
 | |
|   List<GetFavoriteReplacements>? favUsersList;
 | |
| 
 | |
|   List<ReplacementList>? replacementList;
 | |
|   List<ReplacementList>? favouriteUserList;
 | |
|   List<ReplacementList>? 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<ChatProviderModel>(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,
 | |
|              widget.fromDynamicScreen! ? Row(
 | |
|                children: [
 | |
|                  radioOption( "UserId" , 0, _selectedSearchIndex),
 | |
| 
 | |
|                ],
 | |
|              ) :   Row(
 | |
|                 children: [
 | |
|                   radioOption(widget.fromChat ? "UserId" : "Name", 0, _selectedSearchIndex),
 | |
|                   radioOption("User Name", 1, _selectedSearchIndex),
 | |
|                   radioOption("Email", 2, _selectedSearchIndex),
 | |
|                 ],
 | |
|               ),
 | |
|               14.height,
 | |
|               Row(
 | |
|                 children: [
 | |
|                   DynamicTextFieldWidget(
 | |
|                     "Search",
 | |
|                     widget.fromDynamicScreen! ? "Search By UserID"  :  "Search By Username",
 | |
|                     inputAction: TextInputAction.done,
 | |
|                     suffixIconData: Icons.search,
 | |
|                     onChange: (text) {
 | |
|                       searchText = text;
 | |
|                       setState(() {});
 | |
|                     },
 | |
|                   ).expanded,
 | |
|                   IconButton(
 | |
|                     constraints: const BoxConstraints(),
 | |
|                     onPressed: () async {
 | |
|                       if(widget.onSearchClick !=null){
 | |
|                         widget.onSearchClick!(searchText);
 | |
|                       }else {
 | |
|                         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: <Widget>[
 | |
|                                       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: <Widget>[
 | |
|                                         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;
 | |
|   }
 | |
| }
 |