Compare commits

...

3 Commits

@ -17,6 +17,7 @@ class URLs {
static const String chatHubUrlApi = "$chatHubUrl/api"; // new V2 apis static const String chatHubUrlApi = "$chatHubUrl/api"; // new V2 apis
static const String chatHubUrlChat = "$chatHubUrl/hubs/chat"; // new V2 apis static const String chatHubUrlChat = "$chatHubUrl/hubs/chat"; // new V2 apis
static const String resetMessageCount = "$chatHubUrlApi/userChatHistory/AckMessages"; // new V2 apis
static const String chatApiKey = "f53a98286f82798d588f67a7f0db19f7aebc839e"; // new V2 apis static const String chatApiKey = "f53a98286f82798d588f67a7f0db19f7aebc839e"; // new V2 apis
static String _host = host1; static String _host = host1;

@ -1,4 +1,5 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:developer';
import 'dart:io'; import 'dart:io';
import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:firebase_messaging/firebase_messaging.dart';
@ -84,6 +85,7 @@ class FirebaseNotificationManger {
} }
static void handleMessage(context, Map<String, dynamic> messageData) { static void handleMessage(context, Map<String, dynamic> messageData) {
log('message data is ${messageData}');
if (messageData["requestType"] != null && messageData["requestNumber"] != null) { if (messageData["requestType"] != null && messageData["requestNumber"] != null) {
Widget? serviceClass; Widget? serviceClass;
@ -116,7 +118,7 @@ class FirebaseNotificationManger {
moduleId: moduleId, moduleId: moduleId,
// requestDetails: RequestsDetails(nameOfType: requestData?.nameOfType, status: requestData?.statusName, priority: requestData?.priorityName, date: requestData?.transactionDate, ), // requestDetails: RequestsDetails(nameOfType: requestData?.nameOfType, status: requestData?.statusName, priority: requestData?.priorityName, date: requestData?.transactionDate, ),
); );
ServiceRequestDetailMain(requestId: int.parse(messageData["requestNumber"].toString()), moduleId: 1); // ServiceRequestDetailMain(requestId: int.parse(messageData["requestNumber"].toString()), moduleId: 1);
break; break;
default: default:

@ -41,6 +41,7 @@ class _ServiceRequestDetailMainState extends State<ServiceRequestDetailMain> {
@override @override
void initState() { void initState() {
super.initState(); super.initState();
_requestProvider = Provider.of<ServiceRequestDetailProvider>(context, listen: false);
WidgetsBinding.instance.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) {
Provider.of<ChatProvider>(context, listen: false).reset(); Provider.of<ChatProvider>(context, listen: false).reset();
getInitialData(); getInitialData();
@ -49,7 +50,6 @@ class _ServiceRequestDetailMainState extends State<ServiceRequestDetailMain> {
Future<void> getInitialData() async { Future<void> getInitialData() async {
bool isNurse = (Provider.of<UserProvider>(context, listen: false).user?.type) == UsersTypes.normal_user; bool isNurse = (Provider.of<UserProvider>(context, listen: false).user?.type) == UsersTypes.normal_user;
_requestProvider = Provider.of<ServiceRequestDetailProvider>(context, listen: false);
await _requestProvider.getWorkOrderById(id: widget.requestId); await _requestProvider.getWorkOrderById(id: widget.requestId);
if (isNurse && (_requestProvider.currentWorkOrder?.data?.nextStep?.workOrderNextStepEnum == WorkOrderNextStepEnum.waitingForRequesterToConfirm)) { if (isNurse && (_requestProvider.currentWorkOrder?.data?.nextStep?.workOrderNextStepEnum == WorkOrderNextStepEnum.waitingForRequesterToConfirm)) {
ServiceRequestBottomSheet.nurseVerifyArrivalBottomSheet(context: context); ServiceRequestBottomSheet.nurseVerifyArrivalBottomSheet(context: context);

@ -35,6 +35,7 @@ import 'model/user_chat_history_model.dart';
// import 'package:mohem_flutter_app/models/chat/get_user_login_token_model.dart' as user; // import 'package:mohem_flutter_app/models/chat/get_user_login_token_model.dart' as user;
// 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;
//Need to refector this remove unused code.
class ChatApiClient { class ChatApiClient {
static final ChatApiClient _instance = ChatApiClient._internal(); static final ChatApiClient _instance = ChatApiClient._internal();
@ -95,6 +96,20 @@ class ChatApiClient {
} }
} }
Future<bool> resetCountApi(int moduleCode, int referenceNumber, String? employeeNumber) async {
final Map<String, dynamic> payload = {
'moduleCode': "$moduleCode",
'ReferenceNumber': "$referenceNumber",
};
final Response response = await ApiClient().postJsonForResponse(
URLs.resetMessageCount,
payload,
token: chatLoginResponse!.token,
);
return response.statusCode == 200;
}
Future<List<ChatAttachment>> viewAllDocuments(int moduleId, int referenceId) async { Future<List<ChatAttachment>> viewAllDocuments(int moduleId, int referenceId) async {
Response response = await ApiClient().getJsonForResponse("${URLs.chatHubUrlApi}/attachments/conversation?referenceId=$referenceId&moduleCode=$moduleId", token: chatLoginResponse!.token); Response response = await ApiClient().getJsonForResponse("${URLs.chatHubUrlApi}/attachments/conversation?referenceId=$referenceId&moduleCode=$moduleId", token: chatLoginResponse!.token);

@ -28,7 +28,7 @@ import 'helper/chat_file_picker.dart';
import 'helper/chat_file_viewer.dart'; import 'helper/chat_file_viewer.dart';
import 'model/get_single_user_chat_list_model.dart'; import 'model/get_single_user_chat_list_model.dart';
import 'model/user_chat_history_model.dart'; import 'model/user_chat_history_model.dart';
//Need to refactor this ...
enum ChatState { idle, voiceRecordingStarted, voiceRecordingCompleted } enum ChatState { idle, voiceRecordingStarted, voiceRecordingCompleted }
class ChatPage extends StatefulWidget { class ChatPage extends StatefulWidget {
@ -66,7 +66,10 @@ class _ChatPageState extends State<ChatPage> {
@override @override
void initState() { void initState() {
super.initState(); super.initState();
loadChatHistory(); WidgetsBinding.instance.addPostFrameCallback((_) {
loadChatHistory();
});
playerController.addListener(() async { playerController.addListener(() async {
// if (playerController.playerState == PlayerState.playing && playerController.maxDuration == await playerController.getDuration()) { // if (playerController.playerState == PlayerState.playing && playerController.maxDuration == await playerController.getDuration()) {
// await playerController.stopPlayer(); // await playerController.stopPlayer();
@ -75,7 +78,7 @@ class _ChatPageState extends State<ChatPage> {
}); });
} }
void loadChatHistory() { void loadChatHistory() async {
// // String assigneeEmployeeNumber = Provider.of<ServiceRequestDetailProvider>(context, listen: false).currentWorkOrder?.data?.assignedEmployee?.employeeId ?? ""; // // String assigneeEmployeeNumber = Provider.of<ServiceRequestDetailProvider>(context, listen: false).currentWorkOrder?.data?.assignedEmployee?.employeeId ?? "";
// // String myEmployeeId = context.userProvider.user!.username!; // // String myEmployeeId = context.userProvider.user!.username!;
// // // //
@ -99,7 +102,12 @@ class _ChatPageState extends State<ChatPage> {
? Provider.of<ServiceRequestDetailProvider>(context, listen: false).currentWorkOrder!.data!.workOrderCreatedBy!.employeeId! ? Provider.of<ServiceRequestDetailProvider>(context, listen: false).currentWorkOrder!.data!.workOrderCreatedBy!.employeeId!
: Provider.of<ServiceRequestDetailProvider>(context, listen: false).currentWorkOrder!.data!.workOrderContactPerson.first.employeeId!)) : Provider.of<ServiceRequestDetailProvider>(context, listen: false).currentWorkOrder!.data!.workOrderContactPerson.first.employeeId!))
: ""); : "");
Provider.of<ChatProvider>(context, listen: false).connectToHub(widget.moduleId, widget.requestId, myEmployeeId, receiver, widget.readOnly, isMounted: mounted); final chatProvider = context.read<ChatProvider>();
chatProvider.connectToHub(widget.moduleId, widget.requestId, myEmployeeId, receiver, widget.readOnly, isMounted: mounted);
bool readStatus = await chatProvider.resetCount(moduleId: widget.moduleId, referenceNo: widget.requestId, userId: context.userProvider.user?.id);
if (readStatus) {
chatProvider.chatParticipantModel?.unreadCount = 0;
}
} }
@override @override

@ -40,6 +40,7 @@ import 'package:path_provider/path_provider.dart';
import 'package:permission_handler/permission_handler.dart'; import 'package:permission_handler/permission_handler.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:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/modules/cx_module/chat/model/chat_login_response_model.dart'; import 'package:test_sa/modules/cx_module/chat/model/chat_login_response_model.dart';
@ -54,6 +55,8 @@ import 'model/get_single_user_chat_list_model.dart';
import 'model/user_chat_history_model.dart'; import 'model/user_chat_history_model.dart';
// import 'get_single_user_chat_list_model.dart'; // import 'get_single_user_chat_list_model.dart';
//Need to refactor this remove unused code.
HubConnection? chatHubConnection; HubConnection? chatHubConnection;
class ChatProvider with ChangeNotifier, DiagnosticableTreeMixin { class ChatProvider with ChangeNotifier, DiagnosticableTreeMixin {
@ -370,7 +373,19 @@ class ChatProvider with ChangeNotifier, DiagnosticableTreeMixin {
// } // }
} }
} }
// notifyListeners(); }
Future<bool> resetCount({
required int moduleId,
required int referenceNo,
String ?userId ,
}) async {
try {
return await ChatApiClient().resetCountApi(moduleId, referenceNo,userId);
} catch (e, stack) {
debugPrint('resetCount error: $e');
rethrow;
}
} }
void updateUserChatHistoryStatusAsync(List data) { void updateUserChatHistoryStatusAsync(List data) {

@ -1,4 +1,4 @@
import 'dart:developer';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -43,8 +43,10 @@ class _ChatWidgetState extends State<ChatWidget> {
@override @override
void initState() { void initState() {
super.initState(); super.initState();
Provider.of<ChatProvider>(context, listen: false).reset(); WidgetsBinding.instance.addPostFrameCallback((_) {
getChatToken(); Provider.of<ChatProvider>(context, listen: false).reset();
getChatToken();
});
} }
void getChatToken() { void getChatToken() {

@ -46,6 +46,7 @@ class ChatFilePicker extends StatelessWidget {
fromMediaPicker(BuildContext context, ImageSource imageSource) async { fromMediaPicker(BuildContext context, ImageSource imageSource) async {
XFile? pickedFile = await ImagePicker().pickImage(source: imageSource, imageQuality: 70, maxWidth: 800, maxHeight: 800); XFile? pickedFile = await ImagePicker().pickImage(source: imageSource, imageQuality: 70, maxWidth: 800, maxHeight: 800);
if (pickedFile != null) { if (pickedFile != null) {
//Has UI issues here top buttons not clickable smoothly
CroppedFile? croppedFile = await ImageCropper().cropImage( CroppedFile? croppedFile = await ImageCropper().cropImage(
sourcePath: pickedFile.path, sourcePath: pickedFile.path,
// aspectRatio: CropAspectRatio(ratioX: 1, ratioY: 1), // aspectRatio: CropAspectRatio(ratioX: 1, ratioY: 1),

@ -24,6 +24,7 @@ class ChatFileViewer extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return FutureBuilder<File?>( return FutureBuilder<File?>(
future: checkFileInLocalStorage(), future: checkFileInLocalStorage(),
builder: (BuildContext context, AsyncSnapshot<File?> snapshot) { builder: (BuildContext context, AsyncSnapshot<File?> snapshot) {

@ -5,7 +5,7 @@ class ChatParticipantModel {
String? title; String? title;
String? conversationType; String? conversationType;
List<Participants>? participants; List<Participants>? participants;
// String? lastMessage; dynamic lastMessage;
String? createdAt; String? createdAt;
int? unreadCount; int? unreadCount;
@ -21,7 +21,7 @@ class ChatParticipantModel {
participants!.add(new Participants.fromJson(v)); participants!.add(new Participants.fromJson(v));
}); });
} }
// lastMessage = json['lastMessage']; lastMessage = json['lastMessage'];
createdAt = json['createdAt']; createdAt = json['createdAt'];
unreadCount = json['unreadCount']; unreadCount = json['unreadCount'];
} }
@ -34,7 +34,7 @@ class ChatParticipantModel {
if (participants != null) { if (participants != null) {
data['participants'] = participants!.map((v) => v.toJson()).toList(); data['participants'] = participants!.map((v) => v.toJson()).toList();
} }
// data['lastMessage'] = lastMessage; data['lastMessage'] = lastMessage;
data['createdAt'] = createdAt; data['createdAt'] = createdAt;
data['unreadCount'] = unreadCount; data['unreadCount'] = unreadCount;
return data; return data;

Loading…
Cancel
Save