app release v1.5.0+32 to stores

design_3.0_cx_module
Sikander Saleem 2 months ago
parent e598f3b5ad
commit 45d736a64e

@ -1,16 +1,16 @@
class URLs { class URLs {
URLs._(); URLs._();
static const String appReleaseBuildNumber = "31"; static const String appReleaseBuildNumber = "32";
// static const host1 = "https://atomsm.hmg.com"; // production url static const host1 = "https://atomsm.hmg.com"; // production url
// static const host1 = "https://atomsmdev.hmg.com"; // local DEV url // static const host1 = "https://atomsmdev.hmg.com"; // local DEV url
static const host1 = "https://atomsmuat.hmg.com"; // local UAT url // static const host1 = "https://atomsmuat.hmg.com"; // local UAT url
// static final String _baseUrl = "$_host/mobile"; // host local UAT // static final String _baseUrl = "$_host/mobile"; // host local UAT
static final String _baseUrl = "$_host/v2/mobile"; // new V2 apis // static final String _baseUrl = "$_host/v2/mobile"; // new V2 apis
// static final String _baseUrl = "$_host/mobile"; // host local UAT and for internal audit dev // static final String _baseUrl = "$_host/mobile"; // host local UAT and for internal audit dev
// static final String _baseUrl = "$_host/v3/mobile"; // v3 for production CM,PM,TM static final String _baseUrl = "$_host/v3/mobile"; // v3 for production CM,PM,TM
// static final String _baseUrl = "$_host/v5/mobile"; // v5 for data segregation // static final String _baseUrl = "$_host/v5/mobile"; // v5 for data segregation
static const String chatHubUrl = "https://apiderichat.hmg.com/chathub"; static const String chatHubUrl = "https://apiderichat.hmg.com/chathub";

@ -102,7 +102,7 @@ class _ServiceRequestDetailMainState extends State<ServiceRequestDetailMain> {
(provider.currentWorkOrder?.data?.workOrderContactPerson?.isNotEmpty ?? false)) { (provider.currentWorkOrder?.data?.workOrderContactPerson?.isNotEmpty ?? false)) {
return ChatWidget( return ChatWidget(
moduleId: widget.moduleId, moduleId: widget.moduleId,
isShow: (context.userProvider.isEngineer || context.userProvider.isNurse) && provider.currentWorkOrder?.data?.assignedEmployee != null, isShow: context.settingProvider.isUserFlowMedical && (context.userProvider.isEngineer || context.userProvider.isNurse) && provider.currentWorkOrder?.data?.assignedEmployee != null,
isReadOnly: _requestProvider.isReadOnlyRequest, isReadOnly: _requestProvider.isReadOnlyRequest,
requestId: widget.requestId.toInt(), requestId: widget.requestId.toInt(),
assigneeEmployeeNumber: provider.currentWorkOrder?.data?.assignedEmployee!.employeeId!, assigneeEmployeeNumber: provider.currentWorkOrder?.data?.assignedEmployee!.employeeId!,

@ -1,4 +1,5 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:developer';
import 'dart:io'; import 'dart:io';
import 'package:audio_waveforms/audio_waveforms.dart'; import 'package:audio_waveforms/audio_waveforms.dart';
@ -28,6 +29,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 ... //Need to refactor this ...
enum ChatState { idle, voiceRecordingStarted, voiceRecordingCompleted } enum ChatState { idle, voiceRecordingStarted, voiceRecordingCompleted }
@ -103,7 +105,9 @@ class _ChatPageState extends State<ChatPage> {
: Provider.of<ServiceRequestDetailProvider>(context, listen: false).currentWorkOrder!.data!.workOrderContactPerson.first.employeeId!)) : Provider.of<ServiceRequestDetailProvider>(context, listen: false).currentWorkOrder!.data!.workOrderContactPerson.first.employeeId!))
: ""); : "");
final chatProvider = context.read<ChatProvider>(); final chatProvider = context.read<ChatProvider>();
// final chatProvider = Provider.of<C;
chatProvider.connectToHub(widget.moduleId, widget.requestId, myEmployeeId, receiver, widget.readOnly, isMounted: mounted); 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); bool readStatus = await chatProvider.resetCount(moduleId: widget.moduleId, referenceNo: widget.requestId, userId: context.userProvider.user?.id);
if (readStatus) { if (readStatus) {
chatProvider.chatParticipantModel?.unreadCount = 0; chatProvider.chatParticipantModel?.unreadCount = 0;
@ -239,7 +243,9 @@ class _ChatPageState extends State<ChatPage> {
} }
return Column(mainAxisSize: MainAxisSize.min, children: [ return Column(mainAxisSize: MainAxisSize.min, children: [
if (showDateHeader) dateCard(currentMessage.createdDate?.toString().chatMsgDateWithYear ?? ""), if (showDateHeader) dateCard(currentMessage.createdDate?.toString().chatMsgDateWithYear ?? ""),
isSender ? senderMsgCard(showSenderName, chatProvider.chatResponseList[index]) : recipientMsgCard(showSenderName, chatProvider.chatResponseList[index]) isSender
? senderMsgCard(showSenderName, chatProvider.chatResponseList[index], index: index)
: recipientMsgCard(showSenderName, chatProvider.chatResponseList[index])
]); ]);
}, },
itemCount: chatProvider.chatResponseList.length)) itemCount: chatProvider.chatResponseList.length))
@ -615,7 +621,7 @@ class _ChatPageState extends State<ChatPage> {
.center; .center;
} }
Widget senderMsgCard(bool showHeader, SingleUserChatModel? chatResponse, {bool loading = false, String msg = ""}) { Widget senderMsgCard(bool showHeader, SingleUserChatModel? chatResponse, {bool loading = false, String msg = "", int index = 0}) {
Widget senderHeader = Row( Widget senderHeader = Row(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [

@ -1,5 +1,6 @@
import 'dart:async'; import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'dart:developer';
import 'dart:io'; import 'dart:io';
import 'dart:typed_data'; import 'dart:typed_data';
import 'package:audio_waveforms/audio_waveforms.dart'; import 'package:audio_waveforms/audio_waveforms.dart';
@ -251,6 +252,9 @@ class ChatProvider with ChangeNotifier, DiagnosticableTreeMixin {
chatHubConnection!.on("OnSubmitChatAsync", OnSubmitChatAsync); chatHubConnection!.on("OnSubmitChatAsync", OnSubmitChatAsync);
chatHubConnection!.on("OnTypingAsync", OnTypingAsync); chatHubConnection!.on("OnTypingAsync", OnTypingAsync);
chatHubConnection!.on("OnStopTypingAsync", OnStopTypingAsync); chatHubConnection!.on("OnStopTypingAsync", OnStopTypingAsync);
//Need by Chat Backend for seen and un seen.
chatHubConnection!.on("OnSeenChatUserAsync", onSeenUserChatAsync);
chatHubConnection!.on("OnAckSeenAsync", onAckSeenAsync);
//group On message //group On message
@ -468,6 +472,15 @@ class ChatProvider with ChangeNotifier, DiagnosticableTreeMixin {
print(args); print(args);
} }
Future<void> markMessageAsRead(int messageId) async {
final senderId = sender?.userId;
if (senderId == null) return;
chatHubConnection?.invoke(
"SendMessageReadAsync",
args: [messageId, senderId],
);
}
void onChatSeen(List<Object?>? args) { void onChatSeen(List<Object?>? args) {
dynamic items = args!.toList(); dynamic items = args!.toList();
// for (var user in searchedChats!) { // for (var user in searchedChats!) {
@ -574,6 +587,57 @@ class ChatProvider with ChangeNotifier, DiagnosticableTreeMixin {
notifyListeners(); notifyListeners();
} }
Future<void> onSeenUserChatAsync(List<Object?>? parameters) async {
try {
if (parameters == null || parameters.isEmpty) {
log('onSeenUserChatAsync: parameters are null or empty');
return;
}
final parm = parameters.first;
if (parm is! List || parm.isEmpty) {
log('onSeenUserChatAsync: parm is not a valid list');
return;
}
final firstItem = parm.first;
if (firstItem is! Map<String, dynamic>) {
log('onSeenUserChatAsync: firstItem is not a Map');
return;
}
await chatHubConnection!.invoke(
"AckSeenAsync",
args: [
firstItem['currentUserId'],
[firstItem['userChatHistoryId']],
],
);
} catch (e, stackTrace) {
log('onSeenUserChatAsync error: $e');
log('StackTrace: $stackTrace');
}
}
Future<void> onAckSeenAsync(List<Object?>? parameters) async {
try {
if (parameters == null || parameters.isEmpty) {
log('onAckSeenAsync: parameters are null or empty');
return;
}
final parm = parameters.first;
log('parm onAckSeenAsync $parm');
if (chatResponseList.isEmpty) {
log('onAckSeenAsync: chatResponseList is empty');
return;
}
log('last list item id ${chatResponseList.first.toJson()}');
chatResponseList.first.isSeen = true;
notifyListeners();
} catch (e, stackTrace) {
log('onAckSeenAsync error: $e');
log('StackTrace: $stackTrace');
}
}
// Future<void> OnSubmitChatAsync(List<Object?>? parameters) async { // Future<void> OnSubmitChatAsync(List<Object?>? parameters) async {
// // List data = jsonDecode(parameters!.first!.toString()); // // List data = jsonDecode(parameters!.first!.toString());
// //

@ -80,7 +80,7 @@ class _TaskRequestDetailsViewState extends State<TaskRequestDetailsView> {
(_taskReqModel.taskJobContactPersons?.isNotEmpty ?? false)) { (_taskReqModel.taskJobContactPersons?.isNotEmpty ?? false)) {
return ChatWidget( return ChatWidget(
moduleId: widget.moduleId, moduleId: widget.moduleId,
isShow: _taskReqModel.taskJobStatus!.value! != 1, isShow: context.settingProvider.isUserFlowMedical&& _taskReqModel.taskJobStatus!.value! != 1,
isReadOnly: _taskReqModel.taskJobStatus!.value! != 2, isReadOnly: _taskReqModel.taskJobStatus!.value! != 2,
requestId: widget.taskId.toInt(), requestId: widget.taskId.toInt(),
assigneeEmployeeNumber: _taskReqModel.assignedEngineer?.employeeId!, assigneeEmployeeNumber: _taskReqModel.assignedEngineer?.employeeId!,

@ -110,12 +110,14 @@ class CreateRequestModel {
// list.add(CreateRequestModel(module.module!.name!, "add_icon", CreateTaskView.id)); // list.add(CreateRequestModel(module.module!.name!, "add_icon", CreateTaskView.id));
// } // }
// }); // });
if (context.userProvider.isQualityUser) { if (context.userProvider.isQualityUser && context.settingProvider.isUserFlowMedical) {
list.add(CreateRequestModel("Equipment Internal Audit Checklist".addTranslation, "add_icon", CreateEquipmentInternalAuditForm.id)); list.add(CreateRequestModel("Equipment Internal Audit Checklist".addTranslation, "add_icon", CreateEquipmentInternalAuditForm.id));
list.add(CreateRequestModel("System Internal Audit Checklist".addTranslation, "add_icon", CreateSystemInternalAuditForm.id)); list.add(CreateRequestModel("System Internal Audit Checklist".addTranslation, "add_icon", CreateSystemInternalAuditForm.id));
} else if (context.userProvider.isAssessor) { }
list.add(CreateRequestModel("TRAF".addTranslation, "add_icon", CreateTRAFRequestPage.id)); // else if (context.userProvider.isAssessor) {
} else if (context.userProvider.isEngineer) { // list.add(CreateRequestModel("TRAF".addTranslation, "add_icon", CreateTRAFRequestPage.id));
// }
else if (context.userProvider.isEngineer) {
if (Provider.of<SettingProvider>(context, listen: false).engineerCanCreateCM) { if (Provider.of<SettingProvider>(context, listen: false).engineerCanCreateCM) {
list.add(CreateRequestModel(context.translation.correctiveMaintenance, "add_icon", CreateNewRequest.id)); list.add(CreateRequestModel(context.translation.correctiveMaintenance, "add_icon", CreateNewRequest.id));
} }
@ -127,7 +129,7 @@ class CreateRequestModel {
list.add(CreateRequestModel(context.translation.transferAsset, "add_icon", CreateDeviceTransferRequest.id)); list.add(CreateRequestModel(context.translation.transferAsset, "add_icon", CreateDeviceTransferRequest.id));
//TODO uncommit this to enable task. //TODO uncommit this to enable task.
list.add(CreateRequestModel(context.translation.task, "add_icon", CreateTaskView.id)); list.add(CreateRequestModel(context.translation.task, "add_icon", CreateTaskView.id));
list.add(CreateRequestModel("TRAF".addTranslation, "add_icon", CreateTRAFRequestPage.id)); // list.add(CreateRequestModel("TRAF".addTranslation, "add_icon", CreateTRAFRequestPage.id));
} }
return list; return list;
} }

@ -78,8 +78,8 @@ class _AllRequestsFilterPageState extends State<AllRequestsFilterPage> {
if (isEngineer) { if (isEngineer) {
types[context.translation.recurrentWo] = 5; types[context.translation.recurrentWo] = 5;
types["Equipment Internal Audit".addTranslation] = 10; if (context.settingProvider.isUserFlowMedical) types["Equipment Internal Audit".addTranslation] = 10;
types["System Internal Audit".addTranslation] = 11; if (context.settingProvider.isUserFlowMedical) types["System Internal Audit".addTranslation] = 11;
} }
if (context.settingProvider.isUserFlowMedical && isEngineer) { if (context.settingProvider.isUserFlowMedical && isEngineer) {
@ -92,18 +92,18 @@ class _AllRequestsFilterPageState extends State<AllRequestsFilterPage> {
types[module.module!.name!] = module.module!.value!; types[module.module!.name!] = module.module!.value!;
} }
}); });
//Hide traf
// if (!isEngineer) {
// types['TRAF'] = 9;
// }
if (!isEngineer) { // if (context.userProvider.isAssessor) {
types['TRAF'] = 9; // types = {"TRAF": 9};
} // }
if (context.userProvider.isAssessor) {
types = {"TRAF": 9};
}
if (context.userProvider.isQualityUser) { if (context.userProvider.isQualityUser) {
if (context.settingProvider.isUserFlowMedical) types = {'Recall and Alert': 7}; if (context.settingProvider.isUserFlowMedical) types = {'Recall and Alert': 7};
types['Equipment Internal Audit'] = 10; if (context.settingProvider.isUserFlowMedical) types['Equipment Internal Audit'] = 10;
types['System Internal Audit'] = 11; if (context.settingProvider.isUserFlowMedical) types['System Internal Audit'] = 11;
} }
final statuses = { final statuses = {

@ -61,10 +61,11 @@ class _MyRequestsPageState extends State<MyRequestsPage> {
requestsList.add(Request(module.module!.value!, module.module!.name!.addTranslation)); requestsList.add(Request(module.module!.value!, module.module!.name!.addTranslation));
} }
}); });
if (context.userProvider.user!.type == UsersTypes.normal_user) { //Hide TRAF.
requestsList.add(Request(9, 'TRAF')); // if (context.userProvider.user!.type == UsersTypes.normal_user) {
} // requestsList.add(Request(9, 'TRAF'));
if (context.userProvider.isEngineer) { // }
if (context.userProvider.isEngineer &&context.settingProvider.isUserFlowMedical) {
requestsList.add(Request(10, 'Equipment Internal Audit')); requestsList.add(Request(10, 'Equipment Internal Audit'));
requestsList.add(Request(11, 'System Internal Audit')); requestsList.add(Request(11, 'System Internal Audit'));
} }
@ -72,15 +73,15 @@ class _MyRequestsPageState extends State<MyRequestsPage> {
if (context.userProvider.isAssessor) { if (context.userProvider.isAssessor) {
requestsList = [ requestsList = [
Request(null, context.translation.allWorkOrder), Request(null, context.translation.allWorkOrder),
Request(9, 'TRAF'), // Request(9, 'TRAF'),
]; ];
} }
if (context.userProvider.isQualityUser) { if (context.userProvider.isQualityUser) {
requestsList = [ requestsList = [
Request(null, context.translation.allWorkOrder), Request(null, context.translation.allWorkOrder),
if (context.settingProvider.isUserFlowMedical) Request(7, 'Recall and Alert'), if (context.settingProvider.isUserFlowMedical) Request(7, 'Recall and Alert'),
Request(10, 'Equipment Internal Audit'), if (context.settingProvider.isUserFlowMedical) Request(10, 'Equipment Internal Audit'),
Request(11, 'System Internal Audit'), if (context.settingProvider.isUserFlowMedical) Request(11, 'System Internal Audit'),
]; ];
} }

@ -223,7 +223,7 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
if (context.userProvider.isEngineer || context.userProvider.isNurse) if (context.userProvider.isEngineer || context.userProvider.isNurse)
ChatWidget( ChatWidget(
moduleId: widget.moduleId, moduleId: widget.moduleId,
isShow: _model!.senderMachineStatusValue! != 4, isShow: context.settingProvider.isUserFlowMedical && _model!.senderMachineStatusValue! != 4,
isReadOnly: _model!.senderMachineStatusValue! != 1, isReadOnly: _model!.senderMachineStatusValue! != 1,
requestId: widget.model.id!.toInt(), requestId: widget.model.id!.toInt(),
assigneeEmployeeNumber: _model!.senderAssignedEmployeeNumber, assigneeEmployeeNumber: _model!.senderAssignedEmployeeNumber,
@ -284,7 +284,7 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
if (context.userProvider.isEngineer || context.userProvider.isNurse) if (context.userProvider.isEngineer || context.userProvider.isNurse)
ChatWidget( ChatWidget(
moduleId: widget.moduleId, moduleId: widget.moduleId,
isShow: (isSender ? _deviceTransfer.senderMachineStatusValue! : _deviceTransfer.receiverMachineStatusValue!) != 0, isShow: context.settingProvider.isUserFlowMedical && (isSender ? _deviceTransfer.senderMachineStatusValue! : _deviceTransfer.receiverMachineStatusValue!) != 0,
isReadOnly: (isSender ? _deviceTransfer.senderMachineStatusValue! : _deviceTransfer.receiverMachineStatusValue) != 1, isReadOnly: (isSender ? _deviceTransfer.senderMachineStatusValue! : _deviceTransfer.receiverMachineStatusValue) != 1,
requestId: widget.model.id!.toInt(), requestId: widget.model.id!.toInt(),
assigneeEmployeeNumber: isSender ? _deviceTransfer.senderAssignedEmployeeNumber! : _deviceTransfer.receiverAssignedEmployeeNumber!, assigneeEmployeeNumber: isSender ? _deviceTransfer.senderAssignedEmployeeNumber! : _deviceTransfer.receiverAssignedEmployeeNumber!,

@ -68,7 +68,7 @@ class _GasRefillDetailsPageState extends State<GasRefillDetailsPage> {
return ChatWidget( return ChatWidget(
moduleId: widget.moduleId, moduleId: widget.moduleId,
isShow: _gasRefillModel.status!.value! != 0, isShow: context.settingProvider.isUserFlowMedical && _gasRefillModel.status!.value! != 0,
isReadOnly: _gasRefillModel.status!.value! != 1, isReadOnly: _gasRefillModel.status!.value! != 1,
requestId: widget.model.id!.toInt(), requestId: widget.model.id!.toInt(),
assigneeEmployeeNumber: _gasRefillModel.assignedEmployee?.employeeId!, assigneeEmployeeNumber: _gasRefillModel.assignedEmployee?.employeeId!,

@ -122,7 +122,7 @@ class _AssetDetailPageState extends State<AssetDetailPage> {
"${context.translation.building}: ${assetModel.building?.name?.cleanupWhitespace.capitalizeFirstOfEach ?? "-"}".bodyText(context), "${context.translation.building}: ${assetModel.building?.name?.cleanupWhitespace.capitalizeFirstOfEach ?? "-"}".bodyText(context),
"${context.translation.floor}: ${assetModel.floor?.name?.cleanupWhitespace.capitalizeFirstOfEach ?? "-"}".bodyText(context), "${context.translation.floor}: ${assetModel.floor?.name?.cleanupWhitespace.capitalizeFirstOfEach ?? "-"}".bodyText(context),
"${context.translation.md}: ${assetModel.department?.departmentName?.cleanupWhitespace.capitalizeFirstOfEach ?? "-"}".bodyText(context), "${context.translation.md}: ${assetModel.department?.departmentName?.cleanupWhitespace.capitalizeFirstOfEach ?? "-"}".bodyText(context),
"${context.translation.room}: ${assetModel.room?.value ?? "-"}".bodyText(context), "${context.translation.room}: ${assetModel.room?.name?.cleanupWhitespace.capitalizeFirstOfEach ?? "-"}".bodyText(context),
], ],
).expanded, ).expanded,
], ],

Loading…
Cancel
Save