Chat Fixes

merge-requests/55/head
Sikander Saleem 3 years ago
parent f1aadf5031
commit 29626ea408

@ -383,7 +383,7 @@
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = 3A359E86ZF; DEVELOPMENT_TEAM = 99Z3UD3LJM;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = Mohemm; INFOPLIST_KEY_CFBundleDisplayName = Mohemm;
@ -520,7 +520,7 @@
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = 3A359E86ZF; DEVELOPMENT_TEAM = 99Z3UD3LJM;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = Mohemm; INFOPLIST_KEY_CFBundleDisplayName = Mohemm;
@ -549,7 +549,7 @@
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = 3A359E86ZF; DEVELOPMENT_TEAM = 99Z3UD3LJM;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = Mohemm; INFOPLIST_KEY_CFBundleDisplayName = Mohemm;

@ -1,10 +1,12 @@
import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'dart:math';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
import 'package:logger/logger.dart' as L;
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:mohem_flutter_app/api/api_client.dart'; import 'package:mohem_flutter_app/api/api_client.dart';
import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart';
@ -15,17 +17,17 @@ import 'package:mohem_flutter_app/models/chat/get_single_user_chat_list_model.da
import 'package:mohem_flutter_app/models/chat/get_user_login_token_model.dart' as login; import 'package:mohem_flutter_app/models/chat/get_user_login_token_model.dart' as login;
import 'package:mohem_flutter_app/models/chat/make_user_favotire_unfavorite_chat_model.dart' as fav; import 'package:mohem_flutter_app/models/chat/make_user_favotire_unfavorite_chat_model.dart' as fav;
import 'package:mohem_flutter_app/widgets/image_picker.dart'; import 'package:mohem_flutter_app/widgets/image_picker.dart';
import 'package:path_provider/path_provider.dart';
import 'package:signalr_netcore/signalr_client.dart'; import 'package:signalr_netcore/signalr_client.dart';
import 'package:logger/logger.dart' as L;
import 'package:uuid/uuid.dart'; import 'package:uuid/uuid.dart';
class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin { class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
ScrollController scrollController = ScrollController();
TextEditingController message = TextEditingController();
List<SingleUserChatModel> userChatHistory = []; List<SingleUserChatModel> userChatHistory = [];
List<ChatUser>? pChatHistory, searchedChats; List<ChatUser>? pChatHistory, searchedChats;
late HubConnection hubConnection; late HubConnection hubConnection;
L.Logger logger = L.Logger(); L.Logger logger = L.Logger();
TextEditingController message = TextEditingController();
bool isLoading = true; bool isLoading = true;
bool isChatScreenActive = false; bool isChatScreenActive = false;
late File selectedFile; late File selectedFile;
@ -36,6 +38,10 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
List<ChatUser> favUsersList = []; List<ChatUser> favUsersList = [];
int paginationVal = 0; int paginationVal = 0;
//Scroll
bool _firstAutoscrollExecuted = false;
bool _shouldAutoscroll = false;
Future<void> getUserAutoLoginToken() async { Future<void> getUserAutoLoginToken() async {
String userName = AppState().memberInformationList!.eMPLOYEEEMAILADDRESS!.split("@").first.toString(); String userName = AppState().memberInformationList!.eMPLOYEEEMAILADDRESS!.split("@").first.toString();
Response response = Response response =
@ -87,12 +93,20 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
void getSingleUserChatHistory({required String senderUID, required int receiverUID, required bool loadMore}) async { void getSingleUserChatHistory({required String senderUID, required int receiverUID, required bool loadMore}) async {
isLoading = true; isLoading = true;
print(loadMore);
print(senderUID);
print(receiverUID);
if (!loadMore) paginationVal = 0; if (!loadMore) paginationVal = 0;
print(paginationVal);
isChatScreenActive = true; isChatScreenActive = true;
Response response = await ApiClient().getJsonForResponse( Response response = await ApiClient().getJsonForResponse(
"${ApiConsts.chatServerBaseApiUrl}${ApiConsts.chatSingleUserHistoryUrl}/$senderUID/$receiverUID/$paginationVal", "${ApiConsts.chatServerBaseApiUrl}${ApiConsts.chatSingleUserHistoryUrl}/$senderUID/$receiverUID/$paginationVal",
token: AppState().chatDetails!.response!.token, token: AppState().chatDetails!.response!.token,
); );
logger.d("${ApiConsts.chatServerBaseApiUrl}${ApiConsts.chatSingleUserHistoryUrl}/$senderUID/$receiverUID/$paginationVal");
logger.d("${AppState().chatDetails!.response!.token}");
logger.d(jsonEncode(response.body));
logger.d(jsonEncode(response.statusCode));
if (response.statusCode == 204) { if (response.statusCode == 204) {
if (!loadMore) userChatHistory = []; if (!loadMore) userChatHistory = [];
Utils.showToast("No More Data To Load"); Utils.showToast("No More Data To Load");
@ -105,7 +119,10 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
} }
} }
isLoading = false; isLoading = false;
//Timer(const Duration(milliseconds: 100),() => scrollToBottom());
notifyListeners(); notifyListeners();
// scrollToBottom();
} }
List<SingleUserChatModel> getSingleUserChatModel(String str) => List<SingleUserChatModel>.from(json.decode(str).map((x) => SingleUserChatModel.fromJson(x))); List<SingleUserChatModel> getSingleUserChatModel(String str) => List<SingleUserChatModel>.from(json.decode(str).map((x) => SingleUserChatModel.fromJson(x)));
@ -218,9 +235,9 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
} }
void changeStatus(List<Object?>? args) { void changeStatus(List<Object?>? args) {
if (kDebugMode) { if (kDebugMode) {
// print("================= Status Online // Offline ===================="); // print("================= Status Online // Offline ====================");
} }
dynamic items = args!.toList(); dynamic items = args!.toList();
// logger.d(items); // logger.d(items);
for (ChatUser user in searchedChats!) { for (ChatUser user in searchedChats!) {
@ -258,6 +275,7 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
data.first.currentUserName = temp.first.targetUserName; data.first.currentUserName = temp.first.targetUserName;
} }
userChatHistory.add(data.first); userChatHistory.add(data.first);
scrollToBottom();
notifyListeners(); notifyListeners();
// if (isChatScreenActive) scrollDown(); // if (isChatScreenActive) scrollDown();
} }
@ -356,7 +374,7 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
// } // }
Future<void> sendChatToServer( Future<void> sendChatToServer(
{required int chatEventId, required fileTypeId, required int targetUserId, required String targetUserName, required chatReplyId, required bool isAttachment, required bool isReply}) async { {required int chatEventId, required fileTypeId, required int targetUserId, required String targetUserName, required chatReplyId, required bool isAttachment, required bool isReply}) async {
Uuid uuid = const Uuid(); Uuid uuid = const Uuid();
SingleUserChatModel data = SingleUserChatModel( SingleUserChatModel data = SingleUserChatModel(
chatEventId: chatEventId, chatEventId: chatEventId,
@ -390,6 +408,7 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
isMsgReply = false; isMsgReply = false;
sFileType = ""; sFileType = "";
message.clear(); message.clear();
scrollToBottom();
notifyListeners(); notifyListeners();
} }
@ -575,4 +594,33 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
repliedMsg = []; repliedMsg = [];
sFileType = ""; sFileType = "";
} }
void scrollListener() {
_firstAutoscrollExecuted = true;
if (scrollController.hasClients && scrollController.position.pixels == scrollController.position.maxScrollExtent) {
_shouldAutoscroll = true;
} else {
_shouldAutoscroll = false;
}
}
void scrollToBottom() {
//scrollController.jumpTo(scrollController.position.maxScrollExtent + 100 );
scrollController.animateTo(
scrollController.position.maxScrollExtent + 100,
duration: const Duration(milliseconds: 500),
curve: Curves.easeIn,
);
}
// void scrollToMaxExtent() {
// WidgetsBinding.instance.addPostFrameCallback((_) {
// scrollController.animateTo(
// scrollController.position.maxScrollExtent,
// duration: const Duration(milliseconds: 100),
// curve: Curves.easeIn,
// );
// });
// }
} }

@ -1,7 +1,7 @@
class ApiConsts { class ApiConsts {
//static String baseUrl = "http://10.200.204.20:2801/"; // Local server //static String baseUrl = "http://10.200.204.20:2801/"; // Local server
//static String baseUrl = "https://uat.hmgwebservices.com"; // UAT server static String baseUrl = "https://uat.hmgwebservices.com"; // UAT server
static String baseUrl = "https://hmgwebservices.com"; // Live server //static String baseUrl = "https://hmgwebservices.com"; // Live server
static String baseUrlServices = baseUrl + "/Services/"; // server static String baseUrlServices = baseUrl + "/Services/"; // server
// static String baseUrlServices = "https://api.cssynapses.com/tangheem/"; // Live server // static String baseUrlServices = "https://api.cssynapses.com/tangheem/"; // Live server
static String utilitiesRest = baseUrlServices + "Utilities.svc/REST/"; static String utilitiesRest = baseUrlServices + "Utilities.svc/REST/";

@ -89,7 +89,7 @@ class ChatBubble extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end,
mainAxisAlignment: MainAxisAlignment.end, mainAxisAlignment: MainAxisAlignment.end,
children: [ children: [
dateTime.toText12(color: isCurrentUser ? MyColors.grey41Color.withOpacity(.5) : MyColors.white.withOpacity(0.7)), dateTime.toText12(color: isCurrentUser ? MyColors.grey41Color.withOpacity(.5) : MyColors.white.withOpacity(0.7),),
if (isCurrentUser) 5.width, if (isCurrentUser) 5.width,
if (isCurrentUser) if (isCurrentUser)
Icon( Icon(

@ -1,5 +1,4 @@
import 'dart:async'; import 'dart:async';
import 'dart:convert';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -17,23 +16,14 @@ import 'package:provider/provider.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart';
import 'package:swipe_to/swipe_to.dart'; import 'package:swipe_to/swipe_to.dart';
class ChatDetailScreen extends StatefulWidget { class ChatDetailScreen extends StatelessWidget {
// ignore: prefer_const_constructors_in_immutables // ignore: prefer_const_constructors_in_immutables
ChatDetailScreen({Key? key}) : super(key: key); ChatDetailScreen({Key? key}) : super(key: key);
@override
State<ChatDetailScreen> createState() => _ChatDetailScreenState();
}
class _ChatDetailScreenState extends State<ChatDetailScreen> {
dynamic userDetails; dynamic userDetails;
bool _firstAutoscrollExecuted = false;
bool _shouldAutoscroll = false;
late ChatProviderModel data; late ChatProviderModel data;
ScrollController scrollController = ScrollController();
final RefreshController _refreshController = RefreshController(initialRefresh: false); final RefreshController _refreshController = RefreshController(initialRefresh: false);
void getMoreChat() async { void getMoreChat() async {
@ -44,53 +34,13 @@ class _ChatDetailScreenState extends State<ChatDetailScreen> {
await Future.delayed(const Duration(milliseconds: 1000)); await Future.delayed(const Duration(milliseconds: 1000));
_refreshController.refreshCompleted(); _refreshController.refreshCompleted();
} }
//
// void _scrollListener() {
// _firstAutoscrollExecuted = true;
// if (scrollController.hasClients && scrollController.position.pixels == scrollController.position.maxScrollExtent) {
// _shouldAutoscroll = true;
// } else {
// _shouldAutoscroll = false;
// }
// }
//
// void _scrollToBottom() {
// scrollController.jumpTo(scrollController.position.maxScrollExtent);
// }
// void scrollToMaxExtent() {
// WidgetsBinding.instance.addPostFrameCallback((_) {
// scrollController.animateTo(
// scrollController.position.maxScrollExtent,
// duration: const Duration(milliseconds: 100),
// curve: Curves.easeIn,
// );
// });
// }
@override
void initState() {
// TODO: implement initState
super.initState();
//scrollToMaxExtent();
// scrollController.addListener(_scrollListener);
}
@override
void dispose() {
// TODO: implement dispose
//scrollController.removeListener(_scrollListener);
super.dispose();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
userDetails = ModalRoute.of(context)!.settings.arguments; userDetails = ModalRoute.of(context)!.settings.arguments;
data = Provider.of<ChatProviderModel>(context, listen: false); data = Provider.of<ChatProviderModel>(context, listen: false);
if (userDetails != null) data.getSingleUserChatHistory(senderUID: AppState().chatDetails!.response!.id.toString(), receiverUID: userDetails["targetUser"].id, loadMore: false); if (userDetails != null) data.getSingleUserChatHistory(senderUID: AppState().chatDetails!.response!.id.toString(), receiverUID: userDetails["targetUser"].id, loadMore: false);
data.scrollController.addListener(data.scrollListener);
return Scaffold( return Scaffold(
backgroundColor: const Color(0xFFF8F8F8), backgroundColor: const Color(0xFFF8F8F8),
appBar: AppBarWidget(context, title: userDetails["targetUser"].userName.toString().replaceAll(".", " ").capitalizeFirstofEach, showHomeButton: false, image: userDetails["targetUser"].image), appBar: AppBarWidget(context, title: userDetails["targetUser"].userName.toString().replaceAll(".", " ").capitalizeFirstofEach, showHomeButton: false, image: userDetails["targetUser"].image),
@ -111,7 +61,7 @@ class _ChatDetailScreenState extends State<ChatDetailScreen> {
controller: _refreshController, controller: _refreshController,
onRefresh: getMoreChat, onRefresh: getMoreChat,
child: ListView.builder( child: ListView.builder(
controller: scrollController, controller: m.scrollController,
shrinkWrap: true, shrinkWrap: true,
reverse: false, reverse: false,
itemCount: m.userChatHistory.length, itemCount: m.userChatHistory.length,
@ -150,7 +100,9 @@ class _ChatDetailScreenState extends State<ChatDetailScreen> {
height: 80, height: 80,
color: MyColors.black.withOpacity(0.10), color: MyColors.black.withOpacity(0.10),
child: ListTile( child: ListTile(
title: (AppState().chatDetails!.response!.userName == m.repliedMsg.first.currentUserName.toString() ? "You" : m.repliedMsg.first.currentUserName.toString().replaceAll(".", " ")) title: (AppState().chatDetails!.response!.userName == m.repliedMsg.first.currentUserName.toString()
? "You"
: m.repliedMsg.first.currentUserName.toString().replaceAll(".", " "))
.toText14(color: MyColors.lightGreenColor), .toText14(color: MyColors.lightGreenColor),
subtitle: (m.repliedMsg.isNotEmpty ? m.repliedMsg.first.contant! : "").toText12(color: MyColors.white, maxLine: 2), subtitle: (m.repliedMsg.isNotEmpty ? m.repliedMsg.first.contant! : "").toText12(color: MyColors.white, maxLine: 2),
trailing: GestureDetector( trailing: GestureDetector(

@ -1,5 +1,6 @@
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/api/chat/chat_provider_model.dart';
import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/classes/colors.dart';
import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/config/routes.dart';
import 'package:mohem_flutter_app/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/int_extensions.dart';
@ -11,6 +12,7 @@ import 'package:mohem_flutter_app/ui/chat/favorite_users_screen.dart';
import 'package:mohem_flutter_app/ui/screens/items_for_sale/fragments/items_for_sale.dart'; import 'package:mohem_flutter_app/ui/screens/items_for_sale/fragments/items_for_sale.dart';
import 'package:mohem_flutter_app/ui/screens/items_for_sale/fragments/my_posted_ads_fragment.dart'; import 'package:mohem_flutter_app/ui/screens/items_for_sale/fragments/my_posted_ads_fragment.dart';
import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
import 'package:provider/provider.dart';
class ChatHome extends StatefulWidget { class ChatHome extends StatefulWidget {
const ChatHome({Key? key}) : super(key: key); const ChatHome({Key? key}) : super(key: key);
@ -22,9 +24,13 @@ class ChatHome extends StatefulWidget {
class _ChatHomeState extends State<ChatHome> { class _ChatHomeState extends State<ChatHome> {
int tabIndex = 0; int tabIndex = 0;
PageController controller = PageController(); PageController controller = PageController();
late ChatProviderModel data;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
data = Provider.of<ChatProviderModel>(context, listen: false);
data.getUserAutoLoginToken().whenComplete(() => null);
return Scaffold( return Scaffold(
backgroundColor: MyColors.white, backgroundColor: MyColors.white,
appBar: AppBarWidget( appBar: AppBarWidget(

@ -29,9 +29,7 @@ class _ChatHomeScreenState extends State<ChatHomeScreen> {
void initState() { void initState() {
super.initState(); super.initState();
data = Provider.of<ChatProviderModel>(context, listen: false); data = Provider.of<ChatProviderModel>(context, listen: false);
data.getUserAutoLoginToken().whenComplete(() { data.getUserRecentChats();
data.getUserRecentChats();
});
} }
@override @override

@ -56,7 +56,7 @@ class ChatFavoriteUsersScreen extends StatelessWidget {
) )
], ],
), ),
title: (m.searchedChats![index].userName!.replaceFirst(".", " ").capitalizeFirstofEach ?? "").toText14(color: MyColors.darkTextColor), title: (m.favUsersList![index].userName!.replaceFirst(".", " ").capitalizeFirstofEach ?? "").toText14(color: MyColors.darkTextColor),
trailing: IconButton( trailing: IconButton(
alignment: Alignment.centerRight, alignment: Alignment.centerRight,
padding: EdgeInsets.zero, padding: EdgeInsets.zero,

Loading…
Cancel
Save