From 82afd0ae61dc61a1c2d438ac573d42a30dc82aee Mon Sep 17 00:00:00 2001 From: "Aamir.Muhammad" Date: Mon, 24 Oct 2022 11:02:43 +0300 Subject: [PATCH 1/8] Chat Fixes --- lib/api/chat/chat_provider_model.dart | 11 +++++++++++ .../bottom_sheets/search_employee_bottom_sheet.dart | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/lib/api/chat/chat_provider_model.dart b/lib/api/chat/chat_provider_model.dart index ea6ea13..708096b 100644 --- a/lib/api/chat/chat_provider_model.dart +++ b/lib/api/chat/chat_provider_model.dart @@ -224,6 +224,17 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin { if (chatMessage == null || chatMessage.isEmpty) { return; } + + var contain = searchedChats!.where((ChatUser element) => element.id == targetUserId); + if (contain.isEmpty) { + searchedChats!.add( + ChatUser( + id: targetUserId, + userName: targetUserName, + ), + ); + } + String chatData = '{"contant":"$chatMessage","contantNo":"8a129295-36d7-7185-5d34-cc4eec7bcba4","chatEventId":1,"fileTypeId":null,"currentUserId":${AppState().chatDetails!.response!.id},"chatSource":1,"userChatHistoryLineRequestList":[{"isSeen":false,"isDelivered":false,"targetUserId":$targetUserId,"targetUserStatus":1}],"conversationId":"715f8b13-96ee-cd36-cb07-5a982a219982"}'; await hubConnection.invoke("AddChatUserAsync", args: [json.decode(chatData)]); diff --git a/lib/widgets/bottom_sheets/search_employee_bottom_sheet.dart b/lib/widgets/bottom_sheets/search_employee_bottom_sheet.dart index face11b..e7db4e2 100644 --- a/lib/widgets/bottom_sheets/search_employee_bottom_sheet.dart +++ b/lib/widgets/bottom_sheets/search_employee_bottom_sheet.dart @@ -230,7 +230,7 @@ class _SearchEmployeeBottomSheetState extends State { }, ); }, - separatorBuilder: (cxt, index) => Container( + separatorBuilder: (BuildContext cxt, int index) => Container( height: 1, color: MyColors.borderE3Color, ), From 912ac8070712117d810236ed0b09ba3d7f92a0ba Mon Sep 17 00:00:00 2001 From: "Aamir.Muhammad" Date: Mon, 24 Oct 2022 11:29:28 +0300 Subject: [PATCH 2/8] Chat Fixes --- assets/langs/ar-SA.json | 3 ++- assets/langs/en-US.json | 3 ++- lib/generated/locale_keys.g.dart | 1 + lib/ui/chat/chat_detailed_screen.dart | 4 +++- lib/ui/chat/chat_home.dart | 2 +- 5 files changed, 9 insertions(+), 4 deletions(-) diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index f5d9495..e6628b8 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -467,5 +467,6 @@ "fromUserName": "من", "sentDate": "تاريخ الإرسال", "itemTypeDisplayName": "اسم العرض", - "none": "بدون" + "none": "بدون", + "typeheretoreply": "اكتب هنا للرد" } \ No newline at end of file diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index 640afdb..3527ed4 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -467,5 +467,6 @@ "fromUserName": "From User Name", "sentDate": "Sent Date", "itemTypeDisplayName": "Item Type Display Name", - "none": "None" + "none": "None", + "typeheretoreply": "Type here to reply" } \ No newline at end of file diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart index d2fae58..b351236 100644 --- a/lib/generated/locale_keys.g.dart +++ b/lib/generated/locale_keys.g.dart @@ -454,5 +454,6 @@ abstract class LocaleKeys { static const sentDate = 'sentDate'; static const itemTypeDisplayName = 'itemTypeDisplayName'; static const none = 'none'; + static const typeheretoreply = 'typeheretoreply'; } diff --git a/lib/ui/chat/chat_detailed_screen.dart b/lib/ui/chat/chat_detailed_screen.dart index b647a38..654b026 100644 --- a/lib/ui/chat/chat_detailed_screen.dart +++ b/lib/ui/chat/chat_detailed_screen.dart @@ -1,11 +1,13 @@ import 'dart:async'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:mohem_flutter_app/api/chat/chat_provider_model.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/classes/colors.dart'; +import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/ui/chat/chat_bubble.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:mohem_flutter_app/widgets/shimmer/dashboard_shimmer_widget.dart'; @@ -56,7 +58,7 @@ class ChatDetailScreen extends StatelessWidget { child: TextField( controller: m.message, decoration: InputDecoration( - hintText: 'Type here to reply', + hintText: LocaleKeys.typeheretoreply.tr(), hintStyle: const TextStyle(color: MyColors.grey98Color), border: InputBorder.none, focusedBorder: InputBorder.none, diff --git a/lib/ui/chat/chat_home.dart b/lib/ui/chat/chat_home.dart index ef984a3..5d6d065 100644 --- a/lib/ui/chat/chat_home.dart +++ b/lib/ui/chat/chat_home.dart @@ -45,7 +45,7 @@ class _ChatHomeScreenState extends State { Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.white, - appBar: AppBarWidget(context, title: "My Chats", showHomeButton: false), + appBar: AppBarWidget(context, title: LocaleKeys.mychats.tr(), showHomeButton: false), body: Consumer(builder: (BuildContext context, ChatProviderModel m, Widget? child) { return m.isLoading ? ChatHomeShimmer() From 40b9cb95767e4096d19c1a735f1cd050791175c1 Mon Sep 17 00:00:00 2001 From: "Aamir.Muhammad" Date: Mon, 31 Oct 2022 08:45:03 +0300 Subject: [PATCH 3/8] Chat Fixes --- lib/ui/chat/chat_detailed_screen.dart | 100 +++++++++++++++----------- 1 file changed, 59 insertions(+), 41 deletions(-) diff --git a/lib/ui/chat/chat_detailed_screen.dart b/lib/ui/chat/chat_detailed_screen.dart index 654b026..1a9cf7d 100644 --- a/lib/ui/chat/chat_detailed_screen.dart +++ b/lib/ui/chat/chat_detailed_screen.dart @@ -1,5 +1,4 @@ import 'dart:async'; - import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -21,7 +20,10 @@ class ChatDetailScreen extends StatelessWidget { @override Widget build(BuildContext context) { - userDetails = ModalRoute.of(context)!.settings.arguments; + userDetails = ModalRoute + .of(context)! + .settings + .arguments; data = Provider.of(context, listen: false); data.getSingleUserChatHistory(senderUID: AppState().chatDetails!.response!.id.toString(), receiverUID: userDetails["targetUser"].id, pagination: "0"); Timer(const Duration(seconds: 1), () => data.scrollDown()); @@ -33,56 +35,72 @@ class ChatDetailScreen extends StatelessWidget { return (m.isLoading ? ChatHomeShimmer() : Column( - children: [ - Expanded( - child: ListView.builder( - controller: m.scrollController, - shrinkWrap: true, - itemCount: m.userChatHistory.length, - padding: const EdgeInsets.symmetric(vertical: 10), - itemBuilder: (BuildContext context, int i) { - return ChatBubble( - text: m.userChatHistory[i].contant.toString(), - isSeen: m.userChatHistory[i].isSeen == true ? true : false, - isCurrentUser: m.userChatHistory[i].currentUserId == 42062 ? true : false, - isDelivered: m.userChatHistory[i].currentUserId == 42062 && m.userChatHistory[i].isDelivered == true ? true : false, - dateTime: m.userChatHistory[i].createdDate.toString(), - ); - }, - ), - ), - Card( - margin: EdgeInsets.zero, - child: Padding( - padding: const EdgeInsets.symmetric(vertical: 10), - child: TextField( - controller: m.message, - decoration: InputDecoration( - hintText: LocaleKeys.typeheretoreply.tr(), - hintStyle: const TextStyle(color: MyColors.grey98Color), - border: InputBorder.none, - focusedBorder: InputBorder.none, - enabledBorder: InputBorder.none, - errorBorder: InputBorder.none, - disabledBorder: InputBorder.none, - contentPadding: const EdgeInsets.symmetric(vertical: 10, horizontal: 15), - suffixIcon: IconButton( + children: [ + Expanded( + child: ListView.builder( + controller: m.scrollController, + shrinkWrap: true, + itemCount: m.userChatHistory.length, + padding: const EdgeInsets.symmetric(vertical: 10), + itemBuilder: (BuildContext context, int i) { + return ChatBubble( + text: m.userChatHistory[i].contant.toString(), + isSeen: m.userChatHistory[i].isSeen == true ? true : false, + isCurrentUser: m.userChatHistory[i].currentUserId == AppState().chatDetails!.response!.id ? true : false, + isDelivered: m.userChatHistory[i].currentUserId == AppState().chatDetails!.response!.id && m.userChatHistory[i].isDelivered == true ? true : false, + dateTime: m.userChatHistory[i].createdDate.toString(), + ); + }, + ), + ), + Card( + margin: EdgeInsets.zero, + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 10), + child: TextField( + controller: m.message, + decoration: InputDecoration( + hintText: LocaleKeys.typeheretoreply.tr(), + hintStyle: const TextStyle(color: MyColors.grey98Color), + border: InputBorder.none, + focusedBorder: InputBorder.none, + enabledBorder: InputBorder.none, + errorBorder: InputBorder.none, + disabledBorder: InputBorder.none, + contentPadding: const EdgeInsets.symmetric(vertical: 10, horizontal: 15), + suffixIcon: SizedBox( + width: 100, + child: Row( + crossAxisAlignment: CrossAxisAlignment.end, + mainAxisAlignment: MainAxisAlignment.end, + children: [ + IconButton( + icon: const Icon( + Icons.attach_file_rounded, + size: 27, + color: MyColors.lightGreenColor, + ), + onPressed: () {}, + ), + IconButton( icon: SvgPicture.asset( "assets/icons/chat/chat_send_icon.svg", height: 26, width: 35, ), onPressed: () { - // m.logger.d(userDetails); - m.sendChatMessage(m.message.text, userDetails["targetUser"].id, userDetails["targetUser"].userName); + m.sendChatMessage(m.message.text, userDetails["targetUser"].id, userDetails["targetUser"].userName); }, ), - ), + ], ), ), ), - ], - )); + ), + ), + ), + ], + )); }, ), ); From c0ee98b06ec80eee36bfbe24a63df01d0087e654 Mon Sep 17 00:00:00 2001 From: "Aamir.Muhammad" Date: Tue, 1 Nov 2022 09:16:55 +0300 Subject: [PATCH 4/8] Merge branch 'master' into development_aamir # Conflicts: # assets/langs/ar-SA.json # assets/langs/en-US.json # lib/generated/locale_keys.g.dart --- assets/langs/ar-SA.json | 4 +--- assets/langs/en-US.json | 3 +-- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index 88f0b75..bfcaa1c 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -492,8 +492,6 @@ "winnerSelectedRandomly": "سيتم اختيار الفائز عشوائياً من بين التصفيات.", "fingersCrossed": "تشابك الاصابع!!!", "congrats": "مبروك !!!", - "allQuestionsCorrect": "لقد أجبت على جميع الأسئلة بشكل صحيح." - - "none": "بدون", + "allQuestionsCorrect": "لقد أجبت على جميع الأسئلة بشكل صحيح.", "typeheretoreply": "اكتب هنا للرد" } \ No newline at end of file diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index 0c7434a..7e9b42a 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -492,7 +492,6 @@ "winnerSelectedRandomly": "The winner will be selected randomly among the qualifiers.", "fingersCrossed": "Fingers Crossed!!!", "congrats": "Congratulations!!!", - "allQuestionsCorrect": "You have answered all questions correct" - "none": "None", + "allQuestionsCorrect": "You have answered all questions correct", "typeheretoreply": "Type here to reply" } \ No newline at end of file From 7408e242457f04d76853c4d1436f40115f1aac33 Mon Sep 17 00:00:00 2001 From: "Aamir.Muhammad" Date: Tue, 1 Nov 2022 11:35:18 +0300 Subject: [PATCH 5/8] Chat Delivered&Seen Event Added. --- lib/api/chat/chat_provider_model.dart | 42 ++++++++++++++++++++------- lib/classes/consts.dart | 4 +-- lib/ui/chat/chat_detailed_screen.dart | 1 + lib/ui/chat/chat_home.dart | 2 +- 4 files changed, 36 insertions(+), 13 deletions(-) diff --git a/lib/api/chat/chat_provider_model.dart b/lib/api/chat/chat_provider_model.dart index d5abd79..bcb748c 100644 --- a/lib/api/chat/chat_provider_model.dart +++ b/lib/api/chat/chat_provider_model.dart @@ -91,18 +91,18 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin { .build(); hubConnection.onclose( ({Exception? error}) { - logger.d(error); + // logger.d(error); }, ); hubConnection.onreconnecting( ({Exception? error}) { - logger.d(error); - logger.d("Reconnecting"); + // logger.d(error); + // logger.d("Reconnecting"); }, ); hubConnection.onreconnected( ({String? connectionId}) { - logger.d("Reconnected"); + // logger.d("Reconnected"); }, ); if (hubConnection.state != HubConnectionState.Connected) { @@ -110,23 +110,39 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin { hubConnection.on("OnUpdateUserStatusAsync", changeStatus); hubConnection.on("OnDeliveredChatUserAsync", onMsgReceived); - // hubConnection.on("OnUserTypingAsync", onUserTyping); + hubConnection.on("OnUserTypingAsync", onUserTyping); // hubConnection.on("OnUserCountAsync", userCountAsync); // hubConnection.on("OnUpdateUserChatHistoryWindowsAsync", updateChatHistoryWindow); // hubConnection.on("OnGetUserChatHistoryNotDeliveredAsync", chatNotDelivered); + hubConnection.on("OnUpdateUserChatHistoryStatusAsync", updateUserChatStatus); } else { hubConnection.on("OnUpdateUserStatusAsync", changeStatus); hubConnection.on("OnDeliveredChatUserAsync", onMsgReceived); - // hubConnection.on("OnUserTypingAsync", onUserTyping); + hubConnection.on("OnUserTypingAsync", onUserTyping); // hubConnection.on("OnUserCountAsync", userCountAsync); // hubConnection.on("OnUpdateUserChatHistoryWindowsAsync", updateChatHistoryWindow); // hubConnection.on("OnGetUserChatHistoryNotDeliveredAsync", chatNotDelivered); + hubConnection.on("OnUpdateUserChatHistoryStatusAsync", updateUserChatStatus); } isLoading = false; notifyListeners(); } + void updateUserChatStatus(List? args) { + dynamic items = args!.toList(); + for (dynamic cItem in items[0]) { + for (SingleUserChatModel chat in userChatHistory) { + if (chat.userChatHistoryId.toString() == cItem["userChatHistoryId"].toString()) { + logger.d(jsonEncode(chat)); + chat.isSeen = cItem["isSeen"]; + chat.isDelivered = cItem["isDelivered"]; + notifyListeners(); + } + } + } + } + void userCountAsync(List? args) { List items = args!.toList(); print("---------------------------------User Count Async -------------------------------------"); @@ -166,7 +182,7 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin { void changeStatus(List? args) { // print("================= Status Online // Offline ===================="); List items = args!.toList(); - logger.d(items); + // logger.d(items); for (ChatUser user in searchedChats!) { if (user.id == items.first["id"]) { user.userStatus = items.first["userStatus"]; @@ -192,9 +208,14 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin { Future onMsgReceived(List? parameters) async { List data = []; + List temp = []; for (dynamic msg in parameters!) { data = getSingleUserChatModel(jsonEncode(msg)); - logger.d(msg); + temp = getSingleUserChatModel(jsonEncode(msg)); + data.first.targetUserId = temp.first.currentUserId; + data.first.targetUserName = temp.first.currentUserName; + data.first.currentUserId = temp.first.targetUserId; + data.first.currentUserName = temp.first.targetUserName; } userChatHistory.add(data.first); notifyListeners(); @@ -207,11 +228,12 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin { for (ChatUser user in searchedChats!) { if (user.id == parameters![1] && parameters[0] == true) { user.isTyping = parameters[0] as bool?; - } else { + Future.delayed( - const Duration(milliseconds: 500), + const Duration(seconds: 2), () { user.isTyping = false; + notifyListeners(); }, ); } diff --git a/lib/classes/consts.dart b/lib/classes/consts.dart index e82c30a..3fd992f 100644 --- a/lib/classes/consts.dart +++ b/lib/classes/consts.dart @@ -1,7 +1,7 @@ class ApiConsts { //static String baseUrl = "http://10.200.204.20:2801/"; // Local server - static String baseUrl = "https://uat.hmgwebservices.com"; // UAT server - // static String baseUrl = "https://hmgwebservices.com"; // Live server + //static String baseUrl = "https://uat.hmgwebservices.com"; // UAT server + static String baseUrl = "https://hmgwebservices.com"; // Live server static String baseUrlServices = baseUrl + "/Services/"; // server // static String baseUrlServices = "https://api.cssynapses.com/tangheem/"; // Live server static String utilitiesRest = baseUrlServices + "Utilities.svc/REST/"; diff --git a/lib/ui/chat/chat_detailed_screen.dart b/lib/ui/chat/chat_detailed_screen.dart index 1a9cf7d..5f2fa97 100644 --- a/lib/ui/chat/chat_detailed_screen.dart +++ b/lib/ui/chat/chat_detailed_screen.dart @@ -43,6 +43,7 @@ class ChatDetailScreen extends StatelessWidget { itemCount: m.userChatHistory.length, padding: const EdgeInsets.symmetric(vertical: 10), itemBuilder: (BuildContext context, int i) { + i == 0 ? m.logger.d(m.userChatHistory.length) : ""; return ChatBubble( text: m.userChatHistory[i].contant.toString(), isSeen: m.userChatHistory[i].isSeen == true ? true : false, diff --git a/lib/ui/chat/chat_home.dart b/lib/ui/chat/chat_home.dart index 5d6d065..b8696ae 100644 --- a/lib/ui/chat/chat_home.dart +++ b/lib/ui/chat/chat_home.dart @@ -110,7 +110,7 @@ class _ChatHomeScreenState extends State { ], ), title: (m.searchedChats![index].userName ?? "").toText14(color: MyColors.darkTextColor), - subtitle: (m.searchedChats![index].isTyping == true ? "Something is Typing" : "Last message text").toText11(color: MyColors.normalTextColor), + subtitle: (m.searchedChats![index].isTyping == true ? "Typing ..." : "").toText11(color: MyColors.normalTextColor), trailing: ("Today").toText10(color: MyColors.lightTextColor), minVerticalPadding: 0, onTap: () { From 96e1be782353ddce3c0bf35017fcee294e1d39d1 Mon Sep 17 00:00:00 2001 From: "Aamir.Muhammad" Date: Tue, 1 Nov 2022 11:50:51 +0300 Subject: [PATCH 6/8] Chat Delivered&Seen Event Added. --- lib/classes/consts.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/classes/consts.dart b/lib/classes/consts.dart index 3fd992f..e82c30a 100644 --- a/lib/classes/consts.dart +++ b/lib/classes/consts.dart @@ -1,7 +1,7 @@ class ApiConsts { //static String baseUrl = "http://10.200.204.20:2801/"; // Local server - //static String baseUrl = "https://uat.hmgwebservices.com"; // UAT server - static String baseUrl = "https://hmgwebservices.com"; // Live server + static String baseUrl = "https://uat.hmgwebservices.com"; // UAT server + // static String baseUrl = "https://hmgwebservices.com"; // Live server static String baseUrlServices = baseUrl + "/Services/"; // server // static String baseUrlServices = "https://api.cssynapses.com/tangheem/"; // Live server static String utilitiesRest = baseUrlServices + "Utilities.svc/REST/"; From f0d2c78f8348affc00853be23f60977922f5a852 Mon Sep 17 00:00:00 2001 From: "Aamir.Muhammad" Date: Tue, 1 Nov 2022 14:51:51 +0300 Subject: [PATCH 7/8] Chat Delivered&Seen Event Added. --- lib/widgets/bottom_sheets/search_employee_bottom_sheet.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/widgets/bottom_sheets/search_employee_bottom_sheet.dart b/lib/widgets/bottom_sheets/search_employee_bottom_sheet.dart index e7db4e2..1904a48 100644 --- a/lib/widgets/bottom_sheets/search_employee_bottom_sheet.dart +++ b/lib/widgets/bottom_sheets/search_employee_bottom_sheet.dart @@ -217,7 +217,7 @@ class _SearchEmployeeBottomSheetState extends State { ], ), title: (chatUsersList![index].userName ?? "").toText14(color: MyColors.darkTextColor), - subtitle: (chatUsersList![index].isTyping == true ? "Something is Typing" : "Last message text").toText11(color: MyColors.normalTextColor), + // subtitle: (chatUsersList![index].isTyping == true ? "Something is Typing" : "Last message text").toText11(color: MyColors.normalTextColor), trailing: ("Today").toText10(color: MyColors.lightTextColor), minVerticalPadding: 0, onTap: () { From 77a56759dc3c4f6f1b484f1ecc442f78603d2637 Mon Sep 17 00:00:00 2001 From: "Aamir.Muhammad" Date: Tue, 1 Nov 2022 15:03:38 +0300 Subject: [PATCH 8/8] Chat Delivered&Seen Event Added. --- lib/widgets/bottom_sheets/search_employee_bottom_sheet.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/widgets/bottom_sheets/search_employee_bottom_sheet.dart b/lib/widgets/bottom_sheets/search_employee_bottom_sheet.dart index 1904a48..16942c5 100644 --- a/lib/widgets/bottom_sheets/search_employee_bottom_sheet.dart +++ b/lib/widgets/bottom_sheets/search_employee_bottom_sheet.dart @@ -218,7 +218,7 @@ class _SearchEmployeeBottomSheetState extends State { ), title: (chatUsersList![index].userName ?? "").toText14(color: MyColors.darkTextColor), // subtitle: (chatUsersList![index].isTyping == true ? "Something is Typing" : "Last message text").toText11(color: MyColors.normalTextColor), - trailing: ("Today").toText10(color: MyColors.lightTextColor), + // trailing: ("Today").toText10(color: MyColors.lightTextColor), minVerticalPadding: 0, onTap: () { Navigator.pop(context);