|
|
|
@ -1,10 +1,12 @@
|
|
|
|
|
import 'dart:async';
|
|
|
|
|
import 'dart:convert';
|
|
|
|
|
import 'dart:io';
|
|
|
|
|
import 'dart:math';
|
|
|
|
|
|
|
|
|
|
import 'package:easy_localization/easy_localization.dart';
|
|
|
|
|
import 'package:flutter/cupertino.dart';
|
|
|
|
|
import 'package:flutter/foundation.dart';
|
|
|
|
|
import 'package:http/http.dart';
|
|
|
|
|
import 'package:logger/logger.dart' as L;
|
|
|
|
|
import 'package:logging/logging.dart';
|
|
|
|
|
import 'package:mohem_flutter_app/api/api_client.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/make_user_favotire_unfavorite_chat_model.dart' as fav;
|
|
|
|
|
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:logger/logger.dart' as L;
|
|
|
|
|
import 'package:uuid/uuid.dart';
|
|
|
|
|
|
|
|
|
|
class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
|
|
|
|
|
ScrollController scrollController = ScrollController();
|
|
|
|
|
TextEditingController message = TextEditingController();
|
|
|
|
|
List<SingleUserChatModel> userChatHistory = [];
|
|
|
|
|
List<ChatUser>? pChatHistory, searchedChats;
|
|
|
|
|
late HubConnection hubConnection;
|
|
|
|
|
L.Logger logger = L.Logger();
|
|
|
|
|
TextEditingController message = TextEditingController();
|
|
|
|
|
|
|
|
|
|
bool isLoading = true;
|
|
|
|
|
bool isChatScreenActive = false;
|
|
|
|
|
late File selectedFile;
|
|
|
|
@ -36,6 +38,10 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
|
|
|
|
|
List<ChatUser> favUsersList = [];
|
|
|
|
|
int paginationVal = 0;
|
|
|
|
|
|
|
|
|
|
//Scroll
|
|
|
|
|
bool _firstAutoscrollExecuted = false;
|
|
|
|
|
bool _shouldAutoscroll = false;
|
|
|
|
|
|
|
|
|
|
Future<void> getUserAutoLoginToken() async {
|
|
|
|
|
String userName = AppState().memberInformationList!.eMPLOYEEEMAILADDRESS!.split("@").first.toString();
|
|
|
|
|
Response response =
|
|
|
|
@ -87,12 +93,20 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
|
|
|
|
|
|
|
|
|
|
void getSingleUserChatHistory({required String senderUID, required int receiverUID, required bool loadMore}) async {
|
|
|
|
|
isLoading = true;
|
|
|
|
|
print(loadMore);
|
|
|
|
|
print(senderUID);
|
|
|
|
|
print(receiverUID);
|
|
|
|
|
if (!loadMore) paginationVal = 0;
|
|
|
|
|
print(paginationVal);
|
|
|
|
|
isChatScreenActive = true;
|
|
|
|
|
Response response = await ApiClient().getJsonForResponse(
|
|
|
|
|
"${ApiConsts.chatServerBaseApiUrl}${ApiConsts.chatSingleUserHistoryUrl}/$senderUID/$receiverUID/$paginationVal",
|
|
|
|
|
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 (!loadMore) userChatHistory = [];
|
|
|
|
|
Utils.showToast("No More Data To Load");
|
|
|
|
@ -105,7 +119,10 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
isLoading = false;
|
|
|
|
|
//Timer(const Duration(milliseconds: 100),() => scrollToBottom());
|
|
|
|
|
notifyListeners();
|
|
|
|
|
|
|
|
|
|
// scrollToBottom();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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) {
|
|
|
|
|
if (kDebugMode) {
|
|
|
|
|
// print("================= Status Online // Offline ====================");
|
|
|
|
|
}
|
|
|
|
|
if (kDebugMode) {
|
|
|
|
|
// print("================= Status Online // Offline ====================");
|
|
|
|
|
}
|
|
|
|
|
dynamic items = args!.toList();
|
|
|
|
|
// logger.d(items);
|
|
|
|
|
for (ChatUser user in searchedChats!) {
|
|
|
|
@ -258,6 +275,7 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
|
|
|
|
|
data.first.currentUserName = temp.first.targetUserName;
|
|
|
|
|
}
|
|
|
|
|
userChatHistory.add(data.first);
|
|
|
|
|
scrollToBottom();
|
|
|
|
|
notifyListeners();
|
|
|
|
|
// if (isChatScreenActive) scrollDown();
|
|
|
|
|
}
|
|
|
|
@ -356,7 +374,7 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
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();
|
|
|
|
|
SingleUserChatModel data = SingleUserChatModel(
|
|
|
|
|
chatEventId: chatEventId,
|
|
|
|
@ -390,6 +408,7 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
|
|
|
|
|
isMsgReply = false;
|
|
|
|
|
sFileType = "";
|
|
|
|
|
message.clear();
|
|
|
|
|
scrollToBottom();
|
|
|
|
|
notifyListeners();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -575,4 +594,33 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
|
|
|
|
|
repliedMsg = [];
|
|
|
|
|
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,
|
|
|
|
|
// );
|
|
|
|
|
// });
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|