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.
214 lines
7.7 KiB
Dart
214 lines
7.7 KiB
Dart
import 'dart:convert';
|
|
|
|
import 'package:flutter/cupertino.dart';
|
|
import 'package:flutter/foundation.dart';
|
|
import 'package:fluttertoast/fluttertoast.dart';
|
|
import 'package:http/http.dart';
|
|
import 'package:logging/logging.dart';
|
|
import 'package:mohem_flutter_app/api/api_client.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_single_user_chat_list_Model.dart';
|
|
import 'package:signalr_netcore/hub_connection.dart';
|
|
import 'package:signalr_netcore/signalr_client.dart';
|
|
import 'package:logger/logger.dart' as L;
|
|
|
|
class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
|
|
List<SingleUserChatModel> userChatHistory = [];
|
|
List<ChatUser>? pChatHistory, searchedChats;
|
|
late HubConnection hubConnection;
|
|
L.Logger logger = L.Logger();
|
|
TextEditingController message = TextEditingController();
|
|
ScrollController scrollController = ScrollController();
|
|
static String token =
|
|
"eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJuYW1laWQiOiI0MjA2MiIsImVtYWlsIjoiYWFtaXIubXVoYW1tYWRAY2xvdWRzb2x1dGlvbnMuY29tLnNhIiwiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS93cy8yMDA4LzA2L2lkZW50aXR5L2NsYWltcy91c2VyZGF0YSI6ImFhbWlyLm11aGFtbWFkIiwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvbW9iaWxlcGhvbmUiOiI5NjY1MzA4OTYwMTgiLCJuYmYiOjE2NjU2NDE4MTIsImV4cCI6MTY2NTcyODIxMiwiaWF0IjoxNjY1NjQxODEyfQ.dLMt_c0zXYYLvZtvK_5F2NrdgERlVXZSQpjZwMUWl7rsjZWMs03n1lVU_bWxvs5C_4luSlumwFNq1jSV9iunbQ";
|
|
|
|
bool isLoading = true;
|
|
|
|
void getChatMemberFromSearch(String sName, int cUserId) async {
|
|
isLoading = true;
|
|
notifyListeners();
|
|
Response response = await ApiClient().getJsonForResponse(
|
|
"${ApiConsts.chatSearchMember}$sName/$cUserId",
|
|
token: token,
|
|
);
|
|
isLoading = false;
|
|
notifyListeners();
|
|
}
|
|
|
|
void getUserRecentChats() async {
|
|
Response response = await ApiClient().getJsonForResponse(
|
|
"${ApiConsts.chatServerBaseApiUrl}${ApiConsts.chatRecentUrl}",
|
|
token: token,
|
|
);
|
|
ChatUserModel recentChat = userToList(response.body);
|
|
pChatHistory = recentChat.response;
|
|
searchedChats = pChatHistory;
|
|
isLoading = false;
|
|
notifyListeners();
|
|
}
|
|
|
|
void getSingleUserChatHistory({required String senderUID, required int receiverUID, required String pagination}) async {
|
|
isLoading = true;
|
|
Response response = await ApiClient().getJsonForResponse(
|
|
"${ApiConsts.chatServerBaseApiUrl}${ApiConsts.chatSingleUserHistoryUrl}/$senderUID/$receiverUID/$pagination",
|
|
token: token,
|
|
);
|
|
userChatHistory = getSingleUserChatintoModel(response.body);
|
|
isLoading = false;
|
|
logger.d(jsonEncode(userChatHistory));
|
|
notifyListeners();
|
|
}
|
|
|
|
List<SingleUserChatModel> getSingleUserChatintoModel(String str) => List<SingleUserChatModel>.from(json.decode(str).map((x) => SingleUserChatModel.fromJson(x)));
|
|
|
|
ChatUserModel userToList(String str) => ChatUserModel.fromJson(json.decode(str));
|
|
|
|
void buildHubConnection() async {
|
|
HttpConnectionOptions httpOp = HttpConnectionOptions(skipNegotiation: false, logMessageContent: true);
|
|
hubConnection = await HubConnectionBuilder()
|
|
.withUrl(ApiConsts.chatHubConnectionUrl + "?UserId=42062&source=Web&access_token=$token", options: httpOp)
|
|
.withAutomaticReconnect(retryDelays: [2000, 5000, 10000, 20000])
|
|
.configureLogging(Logger("Logs Enabled"))
|
|
.build();
|
|
hubConnection.onclose(
|
|
({Exception? error}) {
|
|
logger.d(error);
|
|
},
|
|
);
|
|
hubConnection.onreconnecting(
|
|
({Exception? error}) {
|
|
logger.d(error);
|
|
logger.d("Reconnecting");
|
|
},
|
|
);
|
|
hubConnection.onreconnected(
|
|
({String? connectionId}) {
|
|
logger.d("Reconnected");
|
|
},
|
|
);
|
|
if (hubConnection.state != HubConnectionState.Connected) {
|
|
await hubConnection.start();
|
|
hubConnection.on("OnUpdateUserStatusAsync", changeStatus);
|
|
hubConnection.on("OnDeliveredChatUserAsync", onMsgReceived);
|
|
// hubConnection.on("OnUserTypingAsync", onUserTyping);
|
|
//hubConnection.on("OnUserTypingAsync", changeTypingStatus);
|
|
} else {
|
|
hubConnection.on("OnUpdateUserStatusAsync", changeStatus);
|
|
hubConnection.on("OnDeliveredChatUserAsync", onMsgReceived);
|
|
// hubConnection.on("OnUserTypingAsync", onUserTyping);
|
|
//hubConnection.on("OnUserTypingAsync", changeTypingStatus);
|
|
}
|
|
isLoading = false;
|
|
notifyListeners();
|
|
}
|
|
|
|
void changeStatus(List<Object?>? args) {
|
|
List items = args!.toList();
|
|
for (var user in searchedChats!) {
|
|
if (user.id == items.first["id"]) {
|
|
user.userStatus = items.first["userStatus"];
|
|
}
|
|
}
|
|
notifyListeners();
|
|
}
|
|
|
|
void filter(String value) async {
|
|
List<ChatUser>? tmp = [];
|
|
if (value.isEmpty || value == "") {
|
|
tmp = pChatHistory;
|
|
} else {
|
|
for (var element in pChatHistory!) {
|
|
if (element.userName!.toLowerCase().contains(value.toLowerCase())) {
|
|
tmp.add(element);
|
|
}
|
|
}
|
|
}
|
|
searchedChats = tmp;
|
|
notifyListeners();
|
|
}
|
|
|
|
Future<void> onMsgReceived(List<Object?>? parameters) async {
|
|
List<SingleUserChatModel> data = [];
|
|
for (dynamic msg in parameters!) {
|
|
data = getSingleUserChatintoModel(jsonEncode(msg));
|
|
logger.d(msg);
|
|
}
|
|
userChatHistory.add(data.first);
|
|
notifyListeners();
|
|
scrollDown();
|
|
}
|
|
|
|
void onUserTyping(List<Object?>? parameters) {
|
|
print("==================== Typing Active ==================");
|
|
logger.d(parameters);
|
|
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),
|
|
() {
|
|
user.isTyping = false;
|
|
},
|
|
);
|
|
}
|
|
}
|
|
notifyListeners();
|
|
}
|
|
|
|
void sendChatMessage(String chatMessage, int targetUserId, String targetUserName) async {
|
|
if (chatMessage == null || chatMessage.isEmpty) {
|
|
return;
|
|
}
|
|
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"}';
|
|
await hubConnection.invoke("AddChatUserAsync", args: <Object>[json.decode(chatData)]);
|
|
userChatHistory.add(
|
|
SingleUserChatModel(
|
|
chatEventId: 1,
|
|
chatSource: 1,
|
|
contant: chatMessage,
|
|
contantNo: "8a129295-36d7-7185-5d34-cc4eec7bcba4",
|
|
conversationId: "715f8b13-96ee-cd36-cb07-5a982a219982",
|
|
createdDate: DateTime.now(),
|
|
currentUserId: 42062,
|
|
currentUserName: "aamir.muhammad",
|
|
targetUserId: targetUserId,
|
|
targetUserName: targetUserName,
|
|
),
|
|
);
|
|
message.clear();
|
|
notifyListeners();
|
|
scrollDown();
|
|
}
|
|
|
|
void scrollDown() {
|
|
scrollController.animateTo(
|
|
scrollController.position.maxScrollExtent + 100,
|
|
curve: Curves.easeOut,
|
|
duration: const Duration(milliseconds: 300),
|
|
);
|
|
|
|
// scrollController.animateTo(double.parse(userChatHistory.length.toString()), duration: Duration(milliseconds: 500), curve: Curves.fastOutSlowIn);
|
|
|
|
notifyListeners();
|
|
}
|
|
|
|
// void _scrollListener() {
|
|
// if (scrollController.position.extentAfter.toInt() <= 0 && canCallApi) {
|
|
// if (userChatHistory.length < _ayatTangheemTypeMapped.totalItemsCount) {
|
|
// currentPageNo++;
|
|
// if (widget.tangheemQuery == null) {
|
|
// getTangheemData();
|
|
// } else {
|
|
// getTangheemDataByKeyword();
|
|
// }
|
|
// }
|
|
// canCallApi = false;
|
|
// }
|
|
// }
|
|
|
|
}
|