notifications implemented

design_3.0_latest
WaseemAbbasi22 1 year ago
parent d3ed7e39c2
commit 501c78dc09

@ -35,9 +35,11 @@ class URLs {
static get nurseDashboardCountUrl=> '$_baseUrl/ServiceRequest/GetDashboardNurseCount'; static get nurseDashboardCountUrl=> '$_baseUrl/ServiceRequest/GetDashboardNurseCount';
static get nurseDashboardDetailsUrl=> '$_baseUrl/ServiceRequest/GetDashboardNurseDetails'; static get nurseDashboardDetailsUrl=> '$_baseUrl/ServiceRequest/GetDashboardNurseDetails';
static get nurseRejectUrl=> '$_baseUrl/ServiceRequest/NurseReject'; static get nurseRejectUrl=> '$_baseUrl/ServiceRequest/NurseReject';
static get nurseAcceptUrl=> '$_baseUrl/ServiceRequest/NurseAccept';
static get engineerStopTimer=> '$_baseUrl/ServiceRequest/EngineerStopTimer'; static get engineerStopTimer=> '$_baseUrl/ServiceRequest/EngineerStopTimer';
static get nurseConfirmEngineerArrivedUrl=> '$_baseUrl/ServiceRequest/NurseConfirm';
static get nurseConfirmUrl=> '$_baseUrl/ServiceRequest/NurseConfirm'; static get nurseConfirmUrl=> '$_baseUrl/ServiceRequest/NurseConfirm';
static get nurseRejectEngineerArrivedUrl=> '$_baseUrl/ServiceRequest/NurseNotArrive';
static get nurseConfirmEngineerArrivalUrl=> '$_baseUrl/ServiceRequest/NurseAccept';
static get engineerDashboardCountUrl=> '$_baseUrl/ServiceRequest/GetDashboardEngineerCount'; static get engineerDashboardCountUrl=> '$_baseUrl/ServiceRequest/GetDashboardEngineerCount';
static get engineerDashboardDetailsUrl=> '$_baseUrl/ServiceRequest/GetDashboardEngineerDetails'; static get engineerDashboardDetailsUrl=> '$_baseUrl/ServiceRequest/GetDashboardEngineerDetails';
static get engineerDashboardNotAssignDetails=> '$_baseUrl/ServiceRequest/GetDashboardEngineerNotAssignDetails'; static get engineerDashboardNotAssignDetails=> '$_baseUrl/ServiceRequest/GetDashboardEngineerNotAssignDetails';

@ -26,6 +26,14 @@ class ServiceRequestDetailProvider extends ChangeNotifier {
DateTime timerStartTime = DateTime(0, 0, 0, 0, 0, 0); // Start from 00:00:00 DateTime timerStartTime = DateTime(0, 0, 0, 0, 0, 0); // Start from 00:00:00
Timer? timer; Timer? timer;
bool isTimerRunning = false; bool isTimerRunning = false;
bool _isNurseVerifiedEngineerArrival = false;
bool get isNurseVerifiedEngineerArrival => _isNurseVerifiedEngineerArrival;
set isNurseVerifiedEngineerArrival(bool value) {
_isNurseVerifiedEngineerArrival = value;
notifyListeners();
}
void startTimer() { void startTimer() {
if (isTimerRunning) return; if (isTimerRunning) return;
@ -201,7 +209,7 @@ class ServiceRequestDetailProvider extends ChangeNotifier {
isLoading = false; isLoading = false;
notifyListeners(); notifyListeners();
} catch (e) { } catch (e) {
log("getSubWorkOrderDetails [error] : $e"); log("getWorkOrder [error] : $e");
isLoading = false; isLoading = false;
notifyListeners(); notifyListeners();
return null; return null;
@ -527,14 +535,36 @@ class ServiceRequestDetailProvider extends ChangeNotifier {
} }
//Nurse confirm arrival //Nurse confirm arrival
Future<int?> nurseConfirmArrival({required int workOrderId}) async { Future<int?> nurseConfirmEngineerArrival({required int workOrderId}) async {
try {
Map<String,dynamic> body = {
"workOrderId": workOrderId
};
isLoading = true;
notifyListeners();
final response = await ApiManager.instance.post(URLs.nurseConfirmEngineerArrivalUrl, body: body);
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body));
}
isLoading = false;
notifyListeners();
return stateCode;
} catch (e) {
log("nurse reject [error] : $e");
isLoading = false;
notifyListeners();
return -1;
}
}//Nurse confirm arrival
Future<int?> nurseRejectEngineerArrival({required int workOrderId}) async {
try { try {
Map<String,dynamic> body = { Map<String,dynamic> body = {
"workOrderId": workOrderId "workOrderId": workOrderId
}; };
isLoading = true; isLoading = true;
notifyListeners(); notifyListeners();
final response = await ApiManager.instance.post(URLs.nurseAcceptUrl, body: body); final response = await ApiManager.instance.post(URLs.nurseRejectEngineerArrivedUrl, body: body);
stateCode = response.statusCode; stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body)); currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body));

@ -1,10 +1,13 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:io';
import 'dart:async';
import 'package:device_calendar/device_calendar.dart'; import 'package:device_calendar/device_calendar.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_timezone/flutter_timezone.dart'; import 'package:flutter_timezone/flutter_timezone.dart';
import 'package:fluttertoast/fluttertoast.dart'; import 'package:fluttertoast/fluttertoast.dart';
import 'package:google_api_availability/google_api_availability.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/controllers/notification/notification_manger.dart'; import 'package:test_sa/controllers/notification/notification_manger.dart';
import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/context_extension.dart';
@ -12,7 +15,7 @@ import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/new_views/common_widgets/app_lazy_loading.dart'; import 'package:test_sa/new_views/common_widgets/app_lazy_loading.dart';
import 'package:test_sa/service_request_latest/service_request_detail_provider.dart'; import 'package:test_sa/service_request_latest/service_request_detail_provider.dart';
import 'package:huawei_push/huawei_push.dart' as h_push;
class ServiceRequestUtils { class ServiceRequestUtils {
static double calculateAndAssignWorkingHours({ static double calculateAndAssignWorkingHours({
required DateTime? startTime, required DateTime? startTime,
@ -126,4 +129,109 @@ class ServiceRequestUtils {
}, },
); );
} }
// Map<String, dynamic> messageData = message.data;
// if (messageData["notificationType"] != null && messageData["accept"] != null) {
// if (messageData["notificationType"] == "arrivalConfirmation") {
// if ((messageData["accept"].toString()) == "False") {
// if(messageData["accept"])
// Navigator.pop(context, true);
// } else {
// Navigator.pop(context, false);
// }
// }
// }
static Future<bool?> listenForApproval() async {
print('listen for approval called..');
bool isVerified = false;
Completer<bool> completer = Completer<bool>();
if (Platform.isAndroid && !(await isGoogleServicesAvailable())) {
// If not using Firebase (i.e., if Google Services is unavailable)
h_push.Push.onMessageReceivedStream.listen((h_push.RemoteMessage remoteMessage) {
ConfirmArrivalNotificationModel notificationModel = ConfirmArrivalNotificationModel.fromJson(remoteMessage.toMap());
if (notificationModel.requestId != null && notificationModel.accept != null) {
if (notificationModel.accept == 'True') {
isVerified = true;
completer.complete(isVerified);
} else if (notificationModel.accept == 'False') {
isVerified = false;
completer.complete(isVerified);
}
}
}, onError: (Object error) {
print("onMessageReceivedStream:${error.toString()}");
completer.complete(false); // Handle any error
});
} else {
// Using Firebase
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
print('message data received: ${message.data}');
ConfirmArrivalNotificationModel notificationModel = ConfirmArrivalNotificationModel.fromJson(message.data);
if (notificationModel.requestId != null && notificationModel.accept != null) {
if (notificationModel.accept == 'True') {
isVerified = true;
if (!completer.isCompleted) {
completer.complete(isVerified);
}
} else if (notificationModel.accept == 'False') {
isVerified = false;
if (!completer.isCompleted) {
completer.complete(isVerified);
}
}
}
});
}
// Wait for the future to complete with the notification response
return completer.future;
}
static Future<bool> isGoogleServicesAvailable() async {
GooglePlayServicesAvailability availability = await GoogleApiAvailability.instance.checkGooglePlayServicesAvailability();
String status = availability.toString().split('.').last;
if (status == "success") {
return true;
}
return false;
}
}
class ConfirmArrivalNotificationModel {
final String? transactionType;
final String? requestId;
final String? notificationType;
final String? userId;
final String? accept;
ConfirmArrivalNotificationModel({
this.transactionType,
this.requestId,
this.notificationType,
this.userId,
this.accept,
});
// Factory constructor to create an instance from a Map (e.g., JSON)
factory ConfirmArrivalNotificationModel.fromJson(Map<String, dynamic> json) {
return ConfirmArrivalNotificationModel(
transactionType: json['transactionType'],
requestId: json['requestId'],
notificationType: json['notificationType'],
userId: json['userId'],
accept: json['accept'],
);
}
// Convert an instance to a Map (e.g., for serialization)
Map<String, dynamic> toJson() {
return {
'transactionType': transactionType,
'requestId': requestId,
'notificationType': notificationType,
'userId': userId,
'accept': accept,
};
}
} }

@ -215,18 +215,15 @@ class FooterActionButton {
)); ));
} }
if (workOrderNextStepStatus == WorkOrderNextStepEnum.waitingForRequesterToConfirm) { if (workOrderNextStepStatus == WorkOrderNextStepEnum.waitingForRequesterToConfirm) {
return SizedBox(); return footerContainer(
// return footerContainer( child: AppFilledButton(
// child: AppFilledButton( label: context.translation.takeAction,
// label: context.translation.confirm, // maxWidth: true,
// // maxWidth: true, buttonColor: AppColor.primary10,
// buttonColor: AppColor.green70, onPressed: () async {
// onPressed: () async { ServiceRequestBottomSheet.nurseVerifyArrivalBottomSheet(context: context);
// ServiceRequestBottomSheet.nurseVerifyArrivalBottomSheet(context: context); },
// // int? status = await requestDetailProvider.nurseConfirmArrival(workOrderId: requestDetailProvider.currentWorkOrder?.data?.requestId ?? 0); ));
// // if (status == 200) {}
// },
// ));
} }
} }
return const SizedBox(); return const SizedBox();

@ -31,11 +31,12 @@ import '../../../../new_views/common_widgets/app_filled_button.dart';
import '../../../../new_views/common_widgets/app_text_form_field.dart'; import '../../../../new_views/common_widgets/app_text_form_field.dart';
class ServiceRequestBottomSheet { class ServiceRequestBottomSheet {
static buildBottomSheetParent({required BuildContext context, required Widget childWidget}) { static buildBottomSheetParent({required BuildContext context, required Widget childWidget,bool ?isDismissible}) {
return showModalBottomSheet( return showModalBottomSheet(
context: context, context: context,
useSafeArea: true, useSafeArea: true,
isScrollControlled: true, isScrollControlled: true,
isDismissible:isDismissible??true,
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
builder: (context) => SingleChildScrollView( builder: (context) => SingleChildScrollView(
child: childWidget, child: childWidget,
@ -1044,120 +1045,9 @@ class ServiceRequestBottomSheet {
], ],
); );
})); }));
//
// return showModalBottomSheet(
// context: context,
// useSafeArea: true,
// isScrollControlled: true,
// backgroundColor: Colors.transparent,
// builder: (context) => Consumer<ServiceRequestsProvider>(builder: (context, serviceRequestProvider, child) {
// return Form(
// key: _formKey,
// child: SingleChildScrollView(
// child: StatefulBuilder(builder: (context, setState) {
// return Column(
// crossAxisAlignment: CrossAxisAlignment.center,
// children: [
// const SizedBox().indicatorWidget(),
// 8.height,
// Align(
// alignment: AlignmentDirectional.centerStart,
// child: context.translation.pleaseConfirmTheIssueHasBeenResolved.bottomSheetHeadingTextStyle(context),
// ),
// 10.height,
// Row(
// children: [
// InkWell(
// child: acknowledge
// ? const Icon(
// Icons.check_box,
// color: AppColor.primary10,
// )
// : const Icon(
// Icons.check_box_outline_blank,
// color: AppColor.neutral120,
// ),
// onTap: () {
// setState(() {
// acknowledge = !acknowledge;
// });
// },
// ),
// 6.width,
// Flexible(child: context.translation.nurseAcknowledge.bodyText(context).custom(color: context.isDark ? AppColor.primary50 : AppColor.neutral120)),
// ],
// ),
// 17.height,
// ESignature(
// title: '',
// oldSignature: '',
// newSignature: newSignature,
// backgroundColor: AppColor.neutral100,
// showShadow: false,
// onSaved: (signature) {
// if (signature == null || signature.isEmpty) return;
// newSignature = signature;
// nurseSignature = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}";
// },
// ),
// 36.height,
// Row(
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
// mainAxisSize: MainAxisSize.min,
// children: [
// AppFilledButton(
// label: context.translation.reject,
// maxWidth: true,
// buttonColor: Colors.white54,
// textColor: AppColor.red30,
// showBorder: true,
// onPressed: () async {
// _formKey.currentState?.save();
// if (newSignature != null && acknowledge) {
// //TODO replace provider with new provider and also check workorder id is not correct.
// Provider.of<RequestDetailProvider>(context, listen: false).nurseReject(
// model: NurseActionModel(
// workOrderId: int.parse(serviceRequestProvider.currentSelectedRequest!.id!),
// signatureNurse: nurseSignature,
// ));
// Navigator.pop(context);
// }
// },
// ).expanded,
// const SizedBox(
// width: 20,
// ),
// AppFilledButton(
// label: context.translation.confirm,
// maxWidth: true,
// buttonColor: AppColor.green70,
// onPressed: () async {
// _formKey.currentState?.save();
// if (newSignature != null && acknowledge) {
// //TODO replace provider with new provider and also check workorder id is not correct.
// Provider.of<RequestDetailProvider>(context, listen: false).nurseConfirm(
// model: NurseActionModel(
// workOrderId: int.parse(serviceRequestProvider.currentSelectedRequest!.id!),
// signatureNurse: nurseSignature,
// ));
// Navigator.pop(context);
// }
// },
// ).expanded,
// ],
// )
// ],
// );
// }),
// ),
// ).bottomSheetContainer(context);
// }));
} }
static Future nurseVerifyArrivalBottomSheet({required BuildContext context}) { static Future nurseVerifyArrivalBottomSheet({required BuildContext context}) {
bool acknowledge = false;
Uint8List? newSignature;
String? nurseSignature;
return buildBottomSheetParent( return buildBottomSheetParent(
context: context, context: context,
childWidget: Consumer<ServiceRequestDetailProvider>(builder: (context, ServiceRequestDetailProvider requestDetailProvider, child) { childWidget: Consumer<ServiceRequestDetailProvider>(builder: (context, ServiceRequestDetailProvider requestDetailProvider, child) {
@ -1187,8 +1077,11 @@ class ServiceRequestBottomSheet {
textColor: AppColor.red30, textColor: AppColor.red30,
showBorder: true, showBorder: true,
onPressed: () async { onPressed: () async {
//TODO call the api ..
Navigator.pop(context); Navigator.pop(context);
int? status = await requestDetailProvider.nurseRejectEngineerArrival(workOrderId: requestDetailProvider.currentWorkOrder?.data?.requestId ?? 0);
if (status == 200) {
requestDetailProvider.getWorkOrderById(id: requestDetailProvider.currentWorkOrder!.data!.requestId!);
}
}, },
).expanded, ).expanded,
const SizedBox( const SizedBox(
@ -1200,8 +1093,11 @@ class ServiceRequestBottomSheet {
loading: requestDetailProvider.isLoading, loading: requestDetailProvider.isLoading,
buttonColor: AppColor.green70, buttonColor: AppColor.green70,
onPressed: () async { onPressed: () async {
// int? status = await requestDetailProvider.nurseConfirmArrival(workOrderId: requestDetailProvider.currentWorkOrder?.data?.requestId ?? 0); Navigator.pop(context);
// if (status == 200) {} int? status = await requestDetailProvider.nurseConfirmEngineerArrival(workOrderId: requestDetailProvider.currentWorkOrder?.data?.requestId ?? 0);
if (status == 200) {
requestDetailProvider.getWorkOrderById(id: requestDetailProvider.currentWorkOrder!.data!.requestId!);
}
}, },
).expanded, ).expanded,
], ],
@ -1210,113 +1106,33 @@ class ServiceRequestBottomSheet {
); );
})); }));
//
// return showModalBottomSheet(
// context: context,
// useSafeArea: true,
// isScrollControlled: true,
// backgroundColor: Colors.transparent,
// builder: (context) => Consumer<ServiceRequestsProvider>(builder: (context, serviceRequestProvider, child) {
// return Form(
// key: _formKey,
// child: SingleChildScrollView(
// child: StatefulBuilder(builder: (context, setState) {
// return Column(
// crossAxisAlignment: CrossAxisAlignment.center,
// children: [
// const SizedBox().indicatorWidget(),
// 8.height,
// Align(
// alignment: AlignmentDirectional.centerStart,
// child: context.translation.pleaseConfirmTheIssueHasBeenResolved.bottomSheetHeadingTextStyle(context),
// ),
// 10.height,
// Row(
// children: [
// InkWell(
// child: acknowledge
// ? const Icon(
// Icons.check_box,
// color: AppColor.primary10,
// )
// : const Icon(
// Icons.check_box_outline_blank,
// color: AppColor.neutral120,
// ),
// onTap: () {
// setState(() {
// acknowledge = !acknowledge;
// });
// },
// ),
// 6.width,
// Flexible(child: context.translation.nurseAcknowledge.bodyText(context).custom(color: context.isDark ? AppColor.primary50 : AppColor.neutral120)),
// ],
// ),
// 17.height,
// ESignature(
// title: '',
// oldSignature: '',
// newSignature: newSignature,
// backgroundColor: AppColor.neutral100,
// showShadow: false,
// onSaved: (signature) {
// if (signature == null || signature.isEmpty) return;
// newSignature = signature;
// nurseSignature = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}";
// },
// ),
// 36.height,
// Row(
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
// mainAxisSize: MainAxisSize.min,
// children: [
// AppFilledButton(
// label: context.translation.reject,
// maxWidth: true,
// buttonColor: Colors.white54,
// textColor: AppColor.red30,
// showBorder: true,
// onPressed: () async {
// _formKey.currentState?.save();
// if (newSignature != null && acknowledge) {
// //TODO replace provider with new provider and also check workorder id is not correct.
// Provider.of<RequestDetailProvider>(context, listen: false).nurseReject(
// model: NurseActionModel(
// workOrderId: int.parse(serviceRequestProvider.currentSelectedRequest!.id!),
// signatureNurse: nurseSignature,
// ));
// Navigator.pop(context);
// }
// },
// ).expanded,
// const SizedBox(
// width: 20,
// ),
// AppFilledButton(
// label: context.translation.confirm,
// maxWidth: true,
// buttonColor: AppColor.green70,
// onPressed: () async {
// _formKey.currentState?.save();
// if (newSignature != null && acknowledge) {
// //TODO replace provider with new provider and also check workorder id is not correct.
// Provider.of<RequestDetailProvider>(context, listen: false).nurseConfirm(
// model: NurseActionModel(
// workOrderId: int.parse(serviceRequestProvider.currentSelectedRequest!.id!),
// signatureNurse: nurseSignature,
// ));
// Navigator.pop(context);
// }
// },
// ).expanded,
// ],
// )
// ],
// );
// }),
// ),
// ).bottomSheetContainer(context);
// }));
} }
static Future waitingForApprovalBottomSheet({required BuildContext context}) {
return buildBottomSheetParent(
context: context,
childWidget: Consumer<ServiceRequestDetailProvider>(builder: (context, ServiceRequestDetailProvider requestDetailProvider, child) {
return Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
"Waiting...".heading4(context),
12.height,
Text(
"Request Sent, Waiting for requester to confirm arrival",
style: TextStyle(
fontSize: 16.toScreenWidth,
fontWeight: FontWeight.w500,
fontStyle: FontStyle.normal,
decoration: TextDecoration.none,
),
),
12.height,
"waiting".toLottieAsset(height: 100).center,
12.height,
],
);
}));
}
} }

@ -13,6 +13,8 @@ import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/app_lazy_loading.dart'; import 'package:test_sa/new_views/common_widgets/app_lazy_loading.dart';
import 'package:test_sa/new_views/common_widgets/default_app_bar.dart'; import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
import 'package:test_sa/service_request_latest/service_request_detail_provider.dart'; import 'package:test_sa/service_request_latest/service_request_detail_provider.dart';
import 'package:test_sa/service_request_latest/utilities/service_request_utils.dart';
import 'package:test_sa/service_request_latest/views/components/bottom_sheets/service_request_bottomsheet.dart';
import 'package:test_sa/service_request_latest/views/components/verify_otp_view.dart'; import 'package:test_sa/service_request_latest/views/components/verify_otp_view.dart';
import 'package:test_sa/views/widgets/bottom_sheets/request_approval_waiting_bottom_sheet.dart'; import 'package:test_sa/views/widgets/bottom_sheets/request_approval_waiting_bottom_sheet.dart';
import 'package:test_sa/views/widgets/loaders/no_data_found.dart'; import 'package:test_sa/views/widgets/loaders/no_data_found.dart';
@ -141,7 +143,7 @@ class _VerifyArrivalViewState extends State<VerifyArrivalView> {
break; break;
case 2: case 2:
try { try {
showWaitingBottomSheet(requestDetailProvider: requestDetailProvider, verificationTypeId: verificationTypeId,parentContext: context); showWaitingBottomSheet(requestDetailProvider: requestDetailProvider, verificationTypeId: verificationTypeId);
} catch (e) { } catch (e) {
"Requester not confirmed you arrival".showToast; "Requester not confirmed you arrival".showToast;
} }
@ -215,30 +217,38 @@ class _VerifyArrivalViewState extends State<VerifyArrivalView> {
return fileImage; return fileImage;
} }
void showWaitingBottomSheet({required ServiceRequestDetailProvider requestDetailProvider, int? verificationTypeId,required BuildContext parentContext}) async { void showWaitingBottomSheet({required ServiceRequestDetailProvider requestDetailProvider, int? verificationTypeId}) async {
await requestDetailProvider.engineerConfirmArrival( await requestDetailProvider.engineerConfirmArrival(
workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!, verificationTypeId: verificationTypeId ?? 2, photoInfo: '', otp: ''); workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!, verificationTypeId: verificationTypeId ?? 2, photoInfo: '', otp: '');
requestDetailProvider.isVerifyArrivalBottomSheetOpen = true; requestDetailProvider.isVerifyArrivalBottomSheetOpen = true;
bool? isArrived = (await showModalBottomSheet( ServiceRequestBottomSheet.waitingForApprovalBottomSheet(context: context).then((value){
context: context, requestDetailProvider.isVerifyArrivalBottomSheetOpen=false;
useSafeArea: true, });
isScrollControlled: true, bool ?isArrived = await ServiceRequestUtils.listenForApproval();
backgroundColor: Colors.transparent, // bool? isArrived = (await showModalBottomSheet(
builder: (context) => RequestApprovalBottomSheet(), // context: context,
)); // useSafeArea: true,
// isScrollControlled: true,
// isDismissible: false,
// backgroundColor: Colors.transparent,
// builder: (context) => RequestApprovalBottomSheet(),
// ));
print('value of arrived i got is ${isArrived}');
// return ;
if (requestDetailProvider.isVerifyArrivalBottomSheetOpen) { if (requestDetailProvider.isVerifyArrivalBottomSheetOpen) {
print('is arrival value is ${isArrived}');
if (isArrived == null) { if (isArrived == null) {
"Requester not confirmed you arrival".showToast; "Requester not confirmed you arrival".showToast;
Navigator.pop(context);
} else if (isArrived) { } else if (isArrived) {
requestDetailProvider.getWorkOrderById(id: requestDetailProvider.currentWorkOrder!.data!.requestId!); requestDetailProvider.getWorkOrderById(id: requestDetailProvider.currentWorkOrder!.data!.requestId!);
Navigator.pop(parentContext); Navigator.pop(context);
Navigator.pop(context);
requestDetailProvider.startTimer(); requestDetailProvider.startTimer();
} else { } else {
requestDetailProvider.getWorkOrderById(id: requestDetailProvider.currentWorkOrder!.data!.requestId!); requestDetailProvider.getWorkOrderById(id: requestDetailProvider.currentWorkOrder!.data!.requestId!);
"Requester not confirmed you arrival".showToast; "Requester not confirmed you arrival".showToast;
Navigator.pop(parentContext); Navigator.pop(context);
Navigator.pop(context);
} }
} }
else{ else{

@ -33,17 +33,23 @@ class _ServiceRequestDetailMainState extends State<ServiceRequestDetailMain> {
@override @override
void initState() { void initState() {
super.initState(); super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) {
bool isNurse = (Provider.of<UserProvider>(context, listen: false).user?.type) == UsersTypes.normal_user; getInitialData();
_requestProvider = Provider.of<ServiceRequestDetailProvider>(context, listen: false);
//workOrderNextStepStatus == WorkOrderNextStepEnum.waitingForRequesterToConfirm
if (isNurse && (_requestProvider.currentWorkOrder?.data?.nextStep?.workOrderNextStepEnum == WorkOrderNextStepEnum.waitingForRequesterToConfirm) && !_requestProvider.isLoading) {
ServiceRequestBottomSheet.nurseVerifyArrivalBottomSheet(context: context);
}
_requestProvider.getWorkOrderById(id: widget.requestId);
}); });
} }
Future<void> getInitialData() async{
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);
print('nextstep i got is ${_requestProvider.currentWorkOrder?.data?.nextStep?.workOrderNextStepEnum}');
print('loading value is ${_requestProvider.isLoading}');
if (isNurse && (_requestProvider.currentWorkOrder?.data?.nextStep?.workOrderNextStepEnum == WorkOrderNextStepEnum.waitingForRequesterToConfirm)) {
ServiceRequestBottomSheet.nurseVerifyArrivalBottomSheet(context: context);
}
}
@override @override
void dispose() { void dispose() {
super.dispose(); super.dispose();

@ -8,10 +8,12 @@ import 'package:provider/provider.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/main.dart';
import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/service_request_latest/service_request_detail_provider.dart'; import 'package:test_sa/service_request_latest/service_request_detail_provider.dart';
class RequestApprovalBottomSheet extends StatefulWidget { class RequestApprovalBottomSheet extends StatefulWidget {
RequestApprovalBottomSheet({Key? key}) : super(key: key); RequestApprovalBottomSheet({Key? key}) : super(key: key);
@override @override
@ -24,30 +26,31 @@ class _RequestApprovalBottomState extends State<RequestApprovalBottomSheet> {
@override @override
void initState() { void initState() {
super.initState(); super.initState();
listenForApproval(); // listenForApproval();
} }
void listenForApproval() async { void listenForApproval() async {
print('listen for approval called..'); print('listen for approval called..');
if (Platform.isAndroid && !(await isGoogleServicesAvailable())) { if (Platform.isAndroid && !(await isGoogleServicesAvailable())) {
h_push.Push.onMessageReceivedStream.listen((h_push.RemoteMessage remoteMessage) { // h_push.Push.onMessageReceivedStream.listen((h_push.RemoteMessage remoteMessage) {
// ConfirmArrivalNotificationModel notificationModel = ConfirmArrivalNotificationModel.fromJson(remoteMessage); // ConfirmArrivalNotificationModel notificationModel = ConfirmArrivalNotificationModel.fromJson(remoteMessage.ex);
// if(notificationModel.requestId!=null&&notificationModel.accept!=null){ // if(notificationModel.requestId!=null&&notificationModel.accept!=null){
// if(notificationModel.accept=='True'){ // if(notificationModel.accept=='True'){
// Navigator.pop(context, true); // Navigator.pop(context, true);
// }else if(notificationModel.accept=='False'){ // }else if(notificationModel.accept=='False'){
// Navigator.pop(context, false); // Navigator.pop(context, false);
// } // }
// } // }
}, onError: (Object error) { // }, onError: (Object error) {
print("onMessageReceivedStream:${error.toString()}"); // print("onMessageReceivedStream:${error.toString()}");
}); // });
} else { } else {
FirebaseMessaging.onMessage.listen((RemoteMessage message) { FirebaseMessaging.onMessage.listen((RemoteMessage message) {
print('message data i got is ${message.toMap()}');
ConfirmArrivalNotificationModel notificationModel = ConfirmArrivalNotificationModel.fromJson(message.data); ConfirmArrivalNotificationModel notificationModel = ConfirmArrivalNotificationModel.fromJson(message.data);
if(notificationModel.requestId!=null&&notificationModel.accept!=null){ if(notificationModel.requestId!=null&&notificationModel.accept!=null){
if(notificationModel.accept=='True'){ if(notificationModel.accept=='True'){
Navigator.pop(context, true); Navigator.pop(context,true);
}else if(notificationModel.accept=='False'){ }else if(notificationModel.accept=='False'){
Navigator.pop(context, false); Navigator.pop(context, false);
} }
@ -79,7 +82,8 @@ class _RequestApprovalBottomState extends State<RequestApprovalBottomSheet> {
@override @override
void dispose() { void dispose() {
print('bottomsheet disposed..'); print('bottomsheet disposed..');
// ServiceRequestDetailProvider serviceRequestDetailProvider =Provider.of<ServiceRequestDetailProvider>(context,listen: false);
// serviceRequestDetailProvider.isVerifyArrivalBottomSheetOpen=false;
super.dispose(); super.dispose();
} }

Loading…
Cancel
Save