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 userChatHistory = []; List? 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 getSingleUserChatintoModel(String str) => List.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? 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? 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 onMsgReceived(List? parameters) async { List data = []; for (dynamic msg in parameters!) { data = getSingleUserChatintoModel(jsonEncode(msg)); logger.d(msg); } userChatHistory.add(data.first); notifyListeners(); scrollDown(); } void onUserTyping(List? 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: [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; // } // } }