|
|
@ -2,15 +2,20 @@ import 'dart:convert';
|
|
|
|
|
|
|
|
|
|
|
|
import 'package:flutter/cupertino.dart';
|
|
|
|
import 'package:flutter/cupertino.dart';
|
|
|
|
import 'package:flutter/foundation.dart';
|
|
|
|
import 'package:flutter/foundation.dart';
|
|
|
|
|
|
|
|
import 'package:fluttertoast/fluttertoast.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/classes/consts.dart';
|
|
|
|
import 'package:mohem_flutter_app/classes/consts.dart';
|
|
|
|
|
|
|
|
import 'package:mohem_flutter_app/classes/utils.dart';
|
|
|
|
import 'package:mohem_flutter_app/models/chat/get_search_user_chat_model.dart';
|
|
|
|
import 'package:mohem_flutter_app/models/chat/get_search_user_chat_model.dart';
|
|
|
|
import 'package:mohem_flutter_app/models/chat/get_single_user_chat_list_Model.dart';
|
|
|
|
import 'package:mohem_flutter_app/models/chat/get_single_user_chat_list_Model.dart';
|
|
|
|
|
|
|
|
import 'package:mohem_flutter_app/models/chat/get_user_login_token_model.dart' as login;
|
|
|
|
|
|
|
|
import 'package:shared_preferences/shared_preferences.dart';
|
|
|
|
import 'package:signalr_netcore/hub_connection.dart';
|
|
|
|
import 'package:signalr_netcore/hub_connection.dart';
|
|
|
|
import 'package:signalr_netcore/signalr_client.dart';
|
|
|
|
import 'package:signalr_netcore/signalr_client.dart';
|
|
|
|
|
|
|
|
import 'package:logger/logger.dart' as L;
|
|
|
|
|
|
|
|
|
|
|
|
class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
|
|
|
|
class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
|
|
|
|
List<SingleUserChatModel> userChatHistory = [];
|
|
|
|
List<SingleUserChatModel> userChatHistory = [];
|
|
|
@ -19,21 +24,33 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
|
|
|
|
L.Logger logger = L.Logger();
|
|
|
|
L.Logger logger = L.Logger();
|
|
|
|
TextEditingController message = TextEditingController();
|
|
|
|
TextEditingController message = TextEditingController();
|
|
|
|
ScrollController scrollController = ScrollController();
|
|
|
|
ScrollController scrollController = ScrollController();
|
|
|
|
static String token =
|
|
|
|
|
|
|
|
"eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJuYW1laWQiOiI0MjA2MiIsImVtYWlsIjoiYWFtaXIubXVoYW1tYWRAY2xvdWRzb2x1dGlvbnMuY29tLnNhIiwiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS93cy8yMDA4LzA2L2lkZW50aXR5L2NsYWltcy91c2VyZGF0YSI6ImFhbWlyLm11aGFtbWFkIiwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvbW9iaWxlcGhvbmUiOiI5NjY1MzA4OTYwMTgiLCJuYmYiOjE2NjU5MjA2NDEsImV4cCI6MTY2NjAwNzA0MSwiaWF0IjoxNjY1OTIwNjQxfQ.70tXWdpXtQ20PNBO3WF9ScWNWSyECpFfrW7_iuOmNfWmA63PCZzlTO0E6I3q3K9Kg2CWvOT9-dSDLjlRuXuC2w";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool isLoading = true;
|
|
|
|
bool isLoading = true;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Future<void> getUserAutoLoginToken() async {
|
|
|
|
|
|
|
|
String userName = AppState().memberInformationList!.eMPLOYEEEMAILADDRESS!.split("@").first.toString();
|
|
|
|
|
|
|
|
Response response =
|
|
|
|
|
|
|
|
await ApiClient().postJsonForResponse("${ApiConsts.chatServerBaseApiUrl}user/desktopuserlogin", {"userName": userName, "password": "FxIu26rWIKoF8n6mpbOmAjDLphzFGmpG", "loginType": 2});
|
|
|
|
|
|
|
|
login.UserAutoLoginModel userLoginResponse = login.userAutoLoginModelFromJson(response.body);
|
|
|
|
|
|
|
|
AppState().setchatUserDetails = userLoginResponse;
|
|
|
|
|
|
|
|
await buildHubConnection();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void getChatMemberFromSearch(String sName, int cUserId) async {
|
|
|
|
void getChatMemberFromSearch(String sName, int cUserId) async {
|
|
|
|
isLoading = true;
|
|
|
|
isLoading = true;
|
|
|
|
notifyListeners();
|
|
|
|
notifyListeners();
|
|
|
|
Response response = await ApiClient().getJsonForResponse("${ApiConsts.chatSearchMember}$sName/$cUserId", token: token);
|
|
|
|
Response response = await ApiClient().getJsonForResponse(
|
|
|
|
|
|
|
|
"${ApiConsts.chatSearchMember}$sName/$cUserId",
|
|
|
|
|
|
|
|
token: AppState().chatDetails!.response!.token,
|
|
|
|
|
|
|
|
);
|
|
|
|
isLoading = false;
|
|
|
|
isLoading = false;
|
|
|
|
notifyListeners();
|
|
|
|
notifyListeners();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void getUserRecentChats() async {
|
|
|
|
void getUserRecentChats() async {
|
|
|
|
Response response = await ApiClient().getJsonForResponse("${ApiConsts.chatServerBaseApiUrl}${ApiConsts.chatRecentUrl}", token: token);
|
|
|
|
Response response = await ApiClient().getJsonForResponse(
|
|
|
|
|
|
|
|
"${ApiConsts.chatServerBaseApiUrl}${ApiConsts.chatRecentUrl}",
|
|
|
|
|
|
|
|
token: AppState().chatDetails!.response!.token,
|
|
|
|
|
|
|
|
);
|
|
|
|
ChatUserModel recentChat = userToList(response.body);
|
|
|
|
ChatUserModel recentChat = userToList(response.body);
|
|
|
|
pChatHistory = recentChat.response;
|
|
|
|
pChatHistory = recentChat.response;
|
|
|
|
searchedChats = pChatHistory;
|
|
|
|
searchedChats = pChatHistory;
|
|
|
@ -45,11 +62,11 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
|
|
|
|
isLoading = true;
|
|
|
|
isLoading = true;
|
|
|
|
Response response = await ApiClient().getJsonForResponse(
|
|
|
|
Response response = await ApiClient().getJsonForResponse(
|
|
|
|
"${ApiConsts.chatServerBaseApiUrl}${ApiConsts.chatSingleUserHistoryUrl}/$senderUID/$receiverUID/$pagination",
|
|
|
|
"${ApiConsts.chatServerBaseApiUrl}${ApiConsts.chatSingleUserHistoryUrl}/$senderUID/$receiverUID/$pagination",
|
|
|
|
token: token,
|
|
|
|
token: AppState().chatDetails!.response!.token,
|
|
|
|
);
|
|
|
|
);
|
|
|
|
|
|
|
|
logger.d(response.body);
|
|
|
|
userChatHistory = getSingleUserChatintoModel(response.body);
|
|
|
|
userChatHistory = getSingleUserChatintoModel(response.body);
|
|
|
|
isLoading = false;
|
|
|
|
isLoading = false;
|
|
|
|
logger.d(jsonEncode(userChatHistory));
|
|
|
|
|
|
|
|
notifyListeners();
|
|
|
|
notifyListeners();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -57,10 +74,10 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
|
|
|
|
|
|
|
|
|
|
|
|
ChatUserModel userToList(String str) => ChatUserModel.fromJson(json.decode(str));
|
|
|
|
ChatUserModel userToList(String str) => ChatUserModel.fromJson(json.decode(str));
|
|
|
|
|
|
|
|
|
|
|
|
void buildHubConnection() async {
|
|
|
|
Future<void> buildHubConnection() async {
|
|
|
|
HttpConnectionOptions httpOp = HttpConnectionOptions(skipNegotiation: false, logMessageContent: true);
|
|
|
|
HttpConnectionOptions httpOp = HttpConnectionOptions(skipNegotiation: false, logMessageContent: true);
|
|
|
|
hubConnection = await HubConnectionBuilder()
|
|
|
|
hubConnection = await HubConnectionBuilder()
|
|
|
|
.withUrl(ApiConsts.chatHubConnectionUrl + "?UserId=42062&source=Web&access_token=$token", options: httpOp)
|
|
|
|
.withUrl(ApiConsts.chatHubConnectionUrl + "?UserId=${AppState().chatDetails!.response!.id}&source=Web&access_token=${AppState().chatDetails!.response!.token}", options: httpOp)
|
|
|
|
.withAutomaticReconnect(retryDelays: [2000, 5000, 10000, 20000])
|
|
|
|
.withAutomaticReconnect(retryDelays: [2000, 5000, 10000, 20000])
|
|
|
|
.configureLogging(Logger("Logs Enabled"))
|
|
|
|
.configureLogging(Logger("Logs Enabled"))
|
|
|
|
.build();
|
|
|
|
.build();
|
|
|
@ -84,20 +101,64 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
|
|
|
|
await hubConnection.start();
|
|
|
|
await hubConnection.start();
|
|
|
|
hubConnection.on("OnUpdateUserStatusAsync", changeStatus);
|
|
|
|
hubConnection.on("OnUpdateUserStatusAsync", changeStatus);
|
|
|
|
hubConnection.on("OnDeliveredChatUserAsync", onMsgReceived);
|
|
|
|
hubConnection.on("OnDeliveredChatUserAsync", onMsgReceived);
|
|
|
|
|
|
|
|
|
|
|
|
// hubConnection.on("OnUserTypingAsync", onUserTyping);
|
|
|
|
// hubConnection.on("OnUserTypingAsync", onUserTyping);
|
|
|
|
//hubConnection.on("OnUserTypingAsync", changeTypingStatus);
|
|
|
|
// hubConnection.on("OnUserCountAsync", userCountAsync);
|
|
|
|
|
|
|
|
// hubConnection.on("OnUpdateUserChatHistoryWindowsAsync", updateChatHistoryWindow);
|
|
|
|
|
|
|
|
// hubConnection.on("OnGetUserChatHistoryNotDeliveredAsync", chatNotDelivered);
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
hubConnection.on("OnUpdateUserStatusAsync", changeStatus);
|
|
|
|
hubConnection.on("OnUpdateUserStatusAsync", changeStatus);
|
|
|
|
hubConnection.on("OnDeliveredChatUserAsync", onMsgReceived);
|
|
|
|
hubConnection.on("OnDeliveredChatUserAsync", onMsgReceived);
|
|
|
|
|
|
|
|
|
|
|
|
// hubConnection.on("OnUserTypingAsync", onUserTyping);
|
|
|
|
// hubConnection.on("OnUserTypingAsync", onUserTyping);
|
|
|
|
//hubConnection.on("OnUserTypingAsync", changeTypingStatus);
|
|
|
|
// hubConnection.on("OnUserCountAsync", userCountAsync);
|
|
|
|
|
|
|
|
// hubConnection.on("OnUpdateUserChatHistoryWindowsAsync", updateChatHistoryWindow);
|
|
|
|
|
|
|
|
// hubConnection.on("OnGetUserChatHistoryNotDeliveredAsync", chatNotDelivered);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
isLoading = false;
|
|
|
|
isLoading = false;
|
|
|
|
notifyListeners();
|
|
|
|
notifyListeners();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void userCountAsync(List<Object?>? args) {
|
|
|
|
|
|
|
|
List items = args!.toList();
|
|
|
|
|
|
|
|
print("---------------------------------User Count Async -------------------------------------");
|
|
|
|
|
|
|
|
logger.d(items);
|
|
|
|
|
|
|
|
// for (var user in searchedChats!) {
|
|
|
|
|
|
|
|
// if (user.id == items.first["id"]) {
|
|
|
|
|
|
|
|
// user.userStatus = items.first["userStatus"];
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
// notifyListeners();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void updateChatHistoryWindow(List<Object?>? args) {
|
|
|
|
|
|
|
|
List items = args!.toList();
|
|
|
|
|
|
|
|
print("---------------------------------Update Chat History Windows Async -------------------------------------");
|
|
|
|
|
|
|
|
logger.d(items);
|
|
|
|
|
|
|
|
// for (var user in searchedChats!) {
|
|
|
|
|
|
|
|
// if (user.id == items.first["id"]) {
|
|
|
|
|
|
|
|
// user.userStatus = items.first["userStatus"];
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
// notifyListeners();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void chatNotDelivered(List<Object?>? args) {
|
|
|
|
|
|
|
|
List items = args!.toList();
|
|
|
|
|
|
|
|
print("--------------------------------- Chat Not Delivered Windows Async -------------------------------------");
|
|
|
|
|
|
|
|
logger.d(items);
|
|
|
|
|
|
|
|
// for (var user in searchedChats!) {
|
|
|
|
|
|
|
|
// if (user.id == items.first["id"]) {
|
|
|
|
|
|
|
|
// user.userStatus = items.first["userStatus"];
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
// notifyListeners();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void changeStatus(List<Object?>? args) {
|
|
|
|
void changeStatus(List<Object?>? args) {
|
|
|
|
|
|
|
|
// print("================= Status Online // Offline ====================");
|
|
|
|
List items = args!.toList();
|
|
|
|
List items = args!.toList();
|
|
|
|
|
|
|
|
logger.d(items);
|
|
|
|
for (var user in searchedChats!) {
|
|
|
|
for (var user in searchedChats!) {
|
|
|
|
if (user.id == items.first["id"]) {
|
|
|
|
if (user.id == items.first["id"]) {
|
|
|
|
user.userStatus = items.first["userStatus"];
|
|
|
|
user.userStatus = items.first["userStatus"];
|
|
|
@ -155,7 +216,7 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
String chatData =
|
|
|
|
String chatData =
|
|
|
|
'{"contant":"$chatMessage","contantNo":"8a129295-36d7-7185-5d34-cc4eec7bcba4","chatEventId":1,"fileTypeId":null,"currentUserId":42062,"chatSource":1,"userChatHistoryLineRequestList":[{"isSeen":false,"isDelivered":false,"targetUserId":$targetUserId,"targetUserStatus":1}],"conversationId":"715f8b13-96ee-cd36-cb07-5a982a219982"}';
|
|
|
|
'{"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: <Object>[json.decode(chatData)]);
|
|
|
|
await hubConnection.invoke("AddChatUserAsync", args: <Object>[json.decode(chatData)]);
|
|
|
|
userChatHistory.add(
|
|
|
|
userChatHistory.add(
|
|
|
|
SingleUserChatModel(
|
|
|
|
SingleUserChatModel(
|
|
|
@ -165,8 +226,8 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
|
|
|
|
contantNo: "8a129295-36d7-7185-5d34-cc4eec7bcba4",
|
|
|
|
contantNo: "8a129295-36d7-7185-5d34-cc4eec7bcba4",
|
|
|
|
conversationId: "715f8b13-96ee-cd36-cb07-5a982a219982",
|
|
|
|
conversationId: "715f8b13-96ee-cd36-cb07-5a982a219982",
|
|
|
|
createdDate: DateTime.now(),
|
|
|
|
createdDate: DateTime.now(),
|
|
|
|
currentUserId: 42062,
|
|
|
|
currentUserId: AppState().chatDetails!.response!.id,
|
|
|
|
currentUserName: "aamir.muhammad",
|
|
|
|
currentUserName: AppState().chatDetails!.response!.userName,
|
|
|
|
targetUserId: targetUserId,
|
|
|
|
targetUserId: targetUserId,
|
|
|
|
targetUserName: targetUserName,
|
|
|
|
targetUserName: targetUserName,
|
|
|
|
),
|
|
|
|
),
|
|
|
@ -182,9 +243,6 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
|
|
|
|
curve: Curves.easeOut,
|
|
|
|
curve: Curves.easeOut,
|
|
|
|
duration: const Duration(milliseconds: 300),
|
|
|
|
duration: const Duration(milliseconds: 300),
|
|
|
|
);
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
// scrollController.animateTo(double.parse(userChatHistory.length.toString()), duration: Duration(milliseconds: 500), curve: Curves.fastOutSlowIn);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
notifyListeners();
|
|
|
|
notifyListeners();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|