notification in progress

design_3.0_sdk_upgrade
WaseemAbbasi22 2 days ago
parent dc9266a0da
commit 7aed41380b

1
.gitignore vendored

@ -50,3 +50,4 @@ android/gradle.properties
/android/app/debug /android/app/debug
/android/app/profile /android/app/profile
/android/app/release /android/app/release
/android/gradle/wrapper/gradle-wrapper.properties

@ -1,4 +1,4 @@
#Tue Oct 15 10:26:35 AST 2024 #Thu Oct 24 09:39:31 AST 2024
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip

@ -78,6 +78,7 @@ class FirebaseNotificationManger {
} }
static void handleMessage(context, Map<String, dynamic> messageData) { static void handleMessage(context, Map<String, dynamic> messageData) {
print('message data i got is ${messageData}');
if (messageData["requestType"] != null && messageData["requestNumber"] != null) { if (messageData["requestType"] != null && messageData["requestNumber"] != null) {
Widget? serviceClass; Widget? serviceClass;
@ -110,6 +111,7 @@ class FirebaseNotificationManger {
static initialized(BuildContext context) async { static initialized(BuildContext context) async {
if (!(await isGoogleServicesAvailable())) { if (!(await isGoogleServicesAvailable())) {
var initialNotification = await h_push.Push.getInitialNotification(); var initialNotification = await h_push.Push.getInitialNotification();
if (initialNotification != null) { if (initialNotification != null) {

@ -288,10 +288,9 @@ class CategoryTabs {
tabs.add(CategoryTabs('Completed', 3)); tabs.add(CategoryTabs('Completed', 3));
return tabs; return tabs;
} }
tabs.add(CategoryTabs('Upcoming', 3));
tabs.add(CategoryTabs('Open Request', 1)); tabs.add(CategoryTabs('Open Request', 1));
tabs.add(CategoryTabs('In Progress', 2)); tabs.add(CategoryTabs('In Progress', 2));
tabs.add(CategoryTabs('Upcoming', 3));
tabs.add(CategoryTabs('Canceled', 6)); tabs.add(CategoryTabs('Canceled', 6));
return tabs; return tabs;
} }

@ -21,7 +21,7 @@ class RequestCategoryList extends StatelessWidget {
return ListView.builder( return ListView.builder(
itemCount: list.length < totalCount ? list.length + 1 : list.length, itemCount: list.length < totalCount ? list.length + 1 : list.length,
shrinkWrap: true, shrinkWrap: true,
padding: EdgeInsets.all(16), padding: const EdgeInsets.all(16),
physics: const NeverScrollableScrollPhysics(), physics: const NeverScrollableScrollPhysics(),
itemBuilder: (context, index) { itemBuilder: (context, index) {
if (index == list.length) { if (index == list.length) {

@ -453,6 +453,8 @@
"waitingForQuotation" : "في انتظار السؤال", "waitingForQuotation" : "في انتظار السؤال",
"gasRequest" : "طلب غاز", "gasRequest" : "طلب غاز",
"createWorkOrder" : "إنشاء طلب عمل", "createWorkOrder" : "إنشاء طلب عمل",
"confirmEngineerArrival": "تأكيد وصول المهندس",
"confirmingEngineerArrivalAction": "من خلال هذا الإجراء، أنت تؤكد وصول المهندس",
"commentHere" : "علق هنا", "commentHere" : "علق هنا",
"nurseSignature" : "توقيع الممرض", "nurseSignature" : "توقيع الممرض",
"actualVisitDate": "تاريخ الزيارة الفعلي", "actualVisitDate": "تاريخ الزيارة الفعلي",

@ -466,6 +466,8 @@
"daily" : "Daily", "daily" : "Daily",
"weekly" : "Weekly", "weekly" : "Weekly",
"monthly" : "Monthly", "monthly" : "Monthly",
"confirmEngineerArrival": "Confirm Engineer Arrival",
"confirmingEngineerArrivalAction": "With this action you are confirming engineer arrival",
"myShift" : "My Shift", "myShift" : "My Shift",
"myTeamRequest" : "My Team Request", "myTeamRequest" : "My Team Request",
"sunToThurs": "Sunday to Thursday", "sunToThurs": "Sunday to Thursday",

@ -56,7 +56,6 @@ class FooterActionButton {
break; break;
// TODO: Handle this case. // TODO: Handle this case.
case WorkOrderNextStepEnum.nTakeAction: case WorkOrderNextStepEnum.nTakeAction:
print('i am here take action ..');
// const SizedBox().flushBar(context: context, title: context.translation.youMarkedThisIssueAsFixedWaitingForTheRequesterToConfirm, message: ''); // const SizedBox().flushBar(context: context, title: context.translation.youMarkedThisIssueAsFixedWaitingForTheRequesterToConfirm, message: '');
return footerContainer( return footerContainer(
child: AppFilledButton( child: AppFilledButton(
@ -216,16 +215,18 @@ class FooterActionButton {
)); ));
} }
if (workOrderNextStepStatus == WorkOrderNextStepEnum.waitingForRequesterToConfirm) { if (workOrderNextStepStatus == WorkOrderNextStepEnum.waitingForRequesterToConfirm) {
return footerContainer( return SizedBox();
child: AppFilledButton( // return footerContainer(
label: context.translation.confirm, // child: AppFilledButton(
// maxWidth: true, // label: context.translation.confirm,
buttonColor: AppColor.green70, // // maxWidth: true,
onPressed: () async { // buttonColor: AppColor.green70,
int? status = await requestDetailProvider.nurseConfirmArrival(workOrderId: requestDetailProvider.currentWorkOrder?.data?.requestId ?? 0); // onPressed: () async {
if (status == 200) {} // ServiceRequestBottomSheet.nurseVerifyArrivalBottomSheet(context: context);
}, // // int? status = await requestDetailProvider.nurseConfirmArrival(workOrderId: requestDetailProvider.currentWorkOrder?.data?.requestId ?? 0);
)); // // if (status == 200) {}
// },
// ));
} }
} }
return const SizedBox(); return const SizedBox();

@ -45,6 +45,7 @@ class ServiceRequestBottomSheet {
static Future fixRemotelyBottomSheet({required BuildContext context}) { static Future fixRemotelyBottomSheet({required BuildContext context}) {
TextEditingController _workingHoursController = TextEditingController(); TextEditingController _workingHoursController = TextEditingController();
TextEditingController _commentController = TextEditingController();
return buildBottomSheetParent( return buildBottomSheetParent(
context: context, context: context,
@ -162,6 +163,8 @@ class ServiceRequestBottomSheet {
8.height, 8.height,
AppTextFormField( AppTextFormField(
labelText: context.translation.comments, labelText: context.translation.comments,
showSpeechToText: true,
controller: _commentController,
textInputType: TextInputType.multiline, textInputType: TextInputType.multiline,
labelStyle: AppTextStyles.textFieldLabelStyle, labelStyle: AppTextStyles.textFieldLabelStyle,
showWithoutDecoration: true, showWithoutDecoration: true,
@ -198,11 +201,14 @@ class ServiceRequestBottomSheet {
buttonColor: AppColor.green70, buttonColor: AppColor.green70,
loading: false, loading: false,
onPressed: () async { onPressed: () async {
if(requestDetailProvider.fixRemotelyHelperModel?.startDate==null&&requestDetailProvider.fixRemotelyHelperModel?.endDate==null){
"Please Select start and end date".showToast;
return;
}
requestDetailProvider.fixRemotelyHelperModel?.workOrderId = requestDetailProvider.currentWorkOrder?.data?.requestId; requestDetailProvider.fixRemotelyHelperModel?.workOrderId = requestDetailProvider.currentWorkOrder?.data?.requestId;
requestDetailProvider.engineerFixRemotely(); requestDetailProvider.engineerFixRemotely();
//TODO context issue to show message..
Navigator.pop(context); Navigator.pop(context);
// const SizedBox().flushBar(context: context, title: '', message: context.translation.youMarkedThisIssueAsFixedWaitingForTheRequesterToConfirm); const SizedBox().flushBar(context: context, title: '', message: context.translation.youMarkedThisIssueAsFixedWaitingForTheRequesterToConfirm);
}, },
), ),
), ),
@ -267,6 +273,7 @@ class ServiceRequestBottomSheet {
backgroundColor: AppColor.neutral100, backgroundColor: AppColor.neutral100,
labelStyle: AppTextStyles.textFieldLabelStyle, labelStyle: AppTextStyles.textFieldLabelStyle,
showShadow: false, showShadow: false,
showSpeechToText: true,
textInputType: TextInputType.multiline, textInputType: TextInputType.multiline,
alignLabelWithHint: true, alignLabelWithHint: true,
onChange: (text) { onChange: (text) {
@ -282,6 +289,10 @@ class ServiceRequestBottomSheet {
buttonColor: AppColor.primary10, buttonColor: AppColor.primary10,
loading: false, loading: false,
onPressed: () async { onPressed: () async {
if(requestDetailProvider.needVisitHelperModel?.visitDate==null){
"Please select visit date".showToast;
return;
}
if (requestDetailProvider.currentWorkOrder?.data?.nextStep!.workOrderNextStepEnum == WorkOrderNextStepEnum.eArrived) { if (requestDetailProvider.currentWorkOrder?.data?.nextStep!.workOrderNextStepEnum == WorkOrderNextStepEnum.eArrived) {
requestDetailProvider.updateNeedVisitHelperModel(NeedVisitHelperModel( requestDetailProvider.updateNeedVisitHelperModel(NeedVisitHelperModel(
workOrderId: requestDetailProvider.needVisitHelperModel?.workOrderId, workOrderId: requestDetailProvider.needVisitHelperModel?.workOrderId,
@ -539,6 +550,7 @@ class ServiceRequestBottomSheet {
static Future rejectRequestBottomSheet({required BuildContext context}) { static Future rejectRequestBottomSheet({required BuildContext context}) {
TextEditingController _commentController = TextEditingController();
return buildBottomSheetParent( return buildBottomSheetParent(
context: context, context: context,
childWidget: Consumer<ServiceRequestDetailProvider>(builder: (context, requestDetailProvider, child) { childWidget: Consumer<ServiceRequestDetailProvider>(builder: (context, requestDetailProvider, child) {
@ -567,8 +579,10 @@ class ServiceRequestBottomSheet {
AppTextFormField( AppTextFormField(
backgroundColor: AppColor.neutral100, backgroundColor: AppColor.neutral100,
labelText: context.translation.comments, labelText: context.translation.comments,
controller: _commentController,
textInputType: TextInputType.multiline, textInputType: TextInputType.multiline,
alignLabelWithHint: true, alignLabelWithHint: true,
showSpeechToText: true,
showShadow: false, showShadow: false,
labelStyle: AppTextStyles.textFieldLabelStyle, labelStyle: AppTextStyles.textFieldLabelStyle,
onChange: (text) { onChange: (text) {
@ -803,6 +817,7 @@ class ServiceRequestBottomSheet {
static Future feedBackBottomSheet({required BuildContext context}) { static Future feedBackBottomSheet({required BuildContext context}) {
String feedback = ''; String feedback = '';
TextEditingController _commentController = TextEditingController();
return buildBottomSheetParent( return buildBottomSheetParent(
context: context, context: context,
childWidget: Consumer<ServiceRequestDetailProvider>(builder: (context, ServiceRequestDetailProvider requestDetailProvider, child) { childWidget: Consumer<ServiceRequestDetailProvider>(builder: (context, ServiceRequestDetailProvider requestDetailProvider, child) {
@ -818,9 +833,11 @@ class ServiceRequestBottomSheet {
21.height, 21.height,
AppTextFormField( AppTextFormField(
labelText: context.translation.comments, labelText: context.translation.comments,
controller: _commentController,
textInputType: TextInputType.multiline, textInputType: TextInputType.multiline,
labelStyle: AppTextStyles.textFieldLabelStyle, labelStyle: AppTextStyles.textFieldLabelStyle,
showWithoutDecoration: true, showWithoutDecoration: true,
showSpeechToText: true,
backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral100, backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral100,
alignLabelWithHint: true, alignLabelWithHint: true,
onChange: (text) { onChange: (text) {
@ -836,6 +853,10 @@ class ServiceRequestBottomSheet {
buttonColor: AppColor.green70, buttonColor: AppColor.green70,
loading: false, loading: false,
onPressed: () { onPressed: () {
if(feedback.isEmpty){
"Please provide feedback".showToast;
return;
}
Navigator.pop(context); Navigator.pop(context);
requestDetailProvider.engineerMarkAsFixed(workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!, feedback: feedback); requestDetailProvider.engineerMarkAsFixed(workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!, feedback: feedback);
}, },
@ -847,6 +868,7 @@ class ServiceRequestBottomSheet {
static Future nurseRejectBackBottomSheet({required BuildContext context}) { static Future nurseRejectBackBottomSheet({required BuildContext context}) {
String feedback = ''; String feedback = '';
TextEditingController _feedBackController = TextEditingController();
return buildBottomSheetParent( return buildBottomSheetParent(
context: context, context: context,
childWidget: Consumer<ServiceRequestDetailProvider>(builder: (context, ServiceRequestDetailProvider requestDetailProvider, child) { childWidget: Consumer<ServiceRequestDetailProvider>(builder: (context, ServiceRequestDetailProvider requestDetailProvider, child) {
@ -862,6 +884,8 @@ class ServiceRequestBottomSheet {
21.height, 21.height,
AppTextFormField( AppTextFormField(
labelText: context.translation.comments, labelText: context.translation.comments,
controller: _feedBackController,
showSpeechToText: true,
textInputType: TextInputType.multiline, textInputType: TextInputType.multiline,
labelStyle: AppTextStyles.textFieldLabelStyle, labelStyle: AppTextStyles.textFieldLabelStyle,
showWithoutDecoration: true, showWithoutDecoration: true,
@ -1141,12 +1165,17 @@ class ServiceRequestBottomSheet {
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
const SizedBox().indicatorWidget(), const SizedBox().indicatorWidget(),
16.height,
Align(
alignment: AlignmentDirectional.centerStart,
child: context.translation.confirmEngineerArrival.bottomSheetHeadingTextStyle(context),
),
8.height, 8.height,
Align( Align(
alignment: AlignmentDirectional.centerStart, alignment: AlignmentDirectional.centerStart,
child: context.translation.pleaseConfirmTheIssueHasBeenResolved.bottomSheetHeadingTextStyle(context), child: context.translation.confirmingEngineerArrivalAction.bodyText(context),
), ),
10.height, 32.height,
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
@ -1158,8 +1187,8 @@ 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);
nurseRejectBackBottomSheet(context: context);
}, },
).expanded, ).expanded,
const SizedBox( const SizedBox(
@ -1171,19 +1200,8 @@ class ServiceRequestBottomSheet {
loading: requestDetailProvider.isLoading, loading: requestDetailProvider.isLoading,
buttonColor: AppColor.green70, buttonColor: AppColor.green70,
onPressed: () async { onPressed: () async {
if (newSignature != null) { // int? status = await requestDetailProvider.nurseConfirmArrival(workOrderId: requestDetailProvider.currentWorkOrder?.data?.requestId ?? 0);
requestDetailProvider.nurseActionHelperModel = NurseActionHelperModel( // if (status == 200) {}
workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!,
signatureNurse: nurseSignature,
);
await requestDetailProvider.nurseConfirm();
if (requestDetailProvider.currentWorkOrder!.data!.requestId != null) {
requestDetailProvider.getWorkOrderById(id: requestDetailProvider.currentWorkOrder!.data!.requestId!);
}
Navigator.pop(context);
} else {
//show some toast...
}
}, },
).expanded, ).expanded,
], ],

@ -60,7 +60,7 @@ class _VerifyArrivalViewState extends State<VerifyArrivalView> {
heading: item.verificationTypes!.name ?? '', heading: item.verificationTypes!.name ?? '',
subHeading: item.description ?? '', subHeading: item.description ?? '',
onTap: () { onTap: () {
onItemTap(requestDetailProvider: requestDetailProvider, index: index, context: context, verificationTypeId: item.verificationTypes?.value); onItemTap(requestDetailProvider: requestDetailProvider, context: context, verificationTypeId: item.verificationTypes?.value);
}); });
}, },
).paddingOnly(start: 16, end: 16, top: 12, bottom: 12), ).paddingOnly(start: 16, end: 16, top: 12, bottom: 12),
@ -111,9 +111,9 @@ class _VerifyArrivalViewState extends State<VerifyArrivalView> {
); );
} }
void onItemTap({required int index, required ServiceRequestDetailProvider requestDetailProvider, required BuildContext context, int? verificationTypeId}) async { void onItemTap({required ServiceRequestDetailProvider requestDetailProvider, required BuildContext context, int? verificationTypeId}) async {
switch (index) { switch (verificationTypeId) {
case 0: case 1:
int? status; int? status;
String? result = await Navigator.of(context).push( String? result = await Navigator.of(context).push(
MaterialPageRoute(builder: (_) => const ScanQr()), MaterialPageRoute(builder: (_) => const ScanQr()),
@ -139,34 +139,21 @@ class _VerifyArrivalViewState extends State<VerifyArrivalView> {
} }
} }
break; break;
case 1: case 2:
try { try {
showWaitingBottomSheet(); showWaitingBottomSheet(requestDetailProvider: requestDetailProvider, verificationTypeId: verificationTypeId);
// int? status;
// showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
// status = await requestDetailProvider.engineerConfirmArrival(
// workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!, verificationTypeId: verificationTypeId ?? 1, photoInfo: '', otp: '');
// if (status == 200) {
// Navigator.pop(context);
// requestDetailProvider.getWorkOrderById(id: requestDetailProvider.currentWorkOrder!.data!.requestId!);
// Navigator.pop(context);
// requestDetailProvider.startTimer();
// } else {
// Navigator.pop(context);
// }
} catch (e) { } catch (e) {
//Navigator.pop(context); "Requester not confirmed you arrival".showToast;
} }
break; break;
case 2: case 3:
requestDetailProvider.sendOtp(workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!); requestDetailProvider.sendOtp(workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!);
Navigator.pushReplacement( Navigator.pushReplacement(
context, context,
MaterialPageRoute(builder: (context) => const VerifyOtpView()), MaterialPageRoute(builder: (context) => const VerifyOtpView()),
); );
break; break;
case 3: case 4:
File? pickedFile = await onFilePicker(); File? pickedFile = await onFilePicker();
if (pickedFile != null) { if (pickedFile != null) {
var fileObj = ("${pickedFile.path.split("/").last}|${base64Encode(File(pickedFile.path).readAsBytesSync())}"); var fileObj = ("${pickedFile.path.split("/").last}|${base64Encode(File(pickedFile.path).readAsBytesSync())}");
@ -188,7 +175,7 @@ class _VerifyArrivalViewState extends State<VerifyArrivalView> {
} }
} }
break; break;
case 4: case 5:
int? status; int? status;
String? result = await Navigator.of(context).push( String? result = await Navigator.of(context).push(
MaterialPageRoute(builder: (_) => const ScanQr()), MaterialPageRoute(builder: (_) => const ScanQr()),
@ -196,9 +183,9 @@ class _VerifyArrivalViewState extends State<VerifyArrivalView> {
if (result != null) { if (result != null) {
try { try {
Map<String, dynamic> resultJson = jsonDecode(result); Map<String, dynamic> resultJson = jsonDecode(result);
print('result i got is ${resultJson}');
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
status = await requestDetailProvider.engineerConfirmArrival(workOrderId: resultJson['WorkOrderId'], verificationTypeId: 5, workOrderCreatedById: resultJson['WorkOrderCreatedById']); status = await requestDetailProvider.engineerConfirmArrival(
workOrderId: resultJson['WorkOrderId'], verificationTypeId: verificationTypeId ?? 5, workOrderCreatedById: resultJson['WorkOrderCreatedById']);
if (status == 200) { if (status == 200) {
requestDetailProvider.getWorkOrderById(id: resultJson['WorkOrderId']); requestDetailProvider.getWorkOrderById(id: resultJson['WorkOrderId']);
Navigator.pop(context); Navigator.pop(context);
@ -228,7 +215,9 @@ class _VerifyArrivalViewState extends State<VerifyArrivalView> {
return fileImage; return fileImage;
} }
void showWaitingBottomSheet() async { void showWaitingBottomSheet({required ServiceRequestDetailProvider requestDetailProvider, int? verificationTypeId}) async {
await requestDetailProvider.engineerConfirmArrival(
workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!, verificationTypeId: verificationTypeId ?? 2, photoInfo: '', otp: '');
bool? isArrived = (await showModalBottomSheet( bool? isArrived = (await showModalBottomSheet(
context: context, context: context,
useSafeArea: true, useSafeArea: true,
@ -236,14 +225,25 @@ class _VerifyArrivalViewState extends State<VerifyArrivalView> {
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
builder: (context) => RequestApprovalBottomSheet(), builder: (context) => RequestApprovalBottomSheet(),
)); ));
if (isArrived==null) { if (isArrived == null) {
//Requester not confirmed you arrival".showToast; //Requester not confirmed you arrival".showToast;
} else if (isArrived) {
} else if(isArrived) { // try {
try { // // todo @waseeem call api to confirm
// todo @waseeem call api to confirm // int? status;
} catch (ex) {} // showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
}else { // status = await requestDetailProvider.engineerConfirmArrival(
// workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!, verificationTypeId: verificationTypeId ?? 1, photoInfo: '', otp: '');
// if (status == 200) {
// Navigator.pop(context);
// requestDetailProvider.getWorkOrderById(id: requestDetailProvider.currentWorkOrder!.data!.requestId!);
// Navigator.pop(context);
// requestDetailProvider.startTimer();
// } else {
// Navigator.pop(context);
// }
// } catch (ex) {}
} else {
"Requester not confirmed you arrival".showToast; "Requester not confirmed you arrival".showToast;
} }
} }

@ -7,6 +7,7 @@ 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/models/enums/user_types.dart'; import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/models/enums/work_order_next_step.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/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';
@ -33,7 +34,12 @@ class _ServiceRequestDetailMainState extends State<ServiceRequestDetailMain> {
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;
_requestProvider = Provider.of<ServiceRequestDetailProvider>(context, listen: false); _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); _requestProvider.getWorkOrderById(id: widget.requestId);
}); });
} }
@ -42,7 +48,8 @@ class _ServiceRequestDetailMainState extends State<ServiceRequestDetailMain> {
void dispose() { void dispose() {
super.dispose(); super.dispose();
} }
Future<void> stopTimer()async{
Future<void> stopTimer() async {
ServiceRequestDetailProvider requestDetailProvider = Provider.of<ServiceRequestDetailProvider>(context, listen: false); ServiceRequestDetailProvider requestDetailProvider = Provider.of<ServiceRequestDetailProvider>(context, listen: false);
if (requestDetailProvider.timer != null && requestDetailProvider.timer!.isActive) { if (requestDetailProvider.timer != null && requestDetailProvider.timer!.isActive) {
requestDetailProvider.stopTimer(); requestDetailProvider.stopTimer();
@ -64,13 +71,15 @@ class _ServiceRequestDetailMainState extends State<ServiceRequestDetailMain> {
}, },
child: Scaffold( child: Scaffold(
backgroundColor: AppColor.neutral100, backgroundColor: AppColor.neutral100,
appBar: DefaultAppBar(title: context.translation.cmDetails, appBar: DefaultAppBar(
onBackPress: (){ title: context.translation.cmDetails,
onBackPress: () {
stopTimer(); stopTimer();
Navigator.pop(context); Navigator.pop(context);
}, },
actions: [ actions: [
isNurse? IconButton( isNurse
? IconButton(
icon: 'qr'.toSvgAsset( icon: 'qr'.toSvgAsset(
height: 24, height: 24,
width: 24, width: 24,
@ -78,7 +87,8 @@ class _ServiceRequestDetailMainState extends State<ServiceRequestDetailMain> {
onPressed: () { onPressed: () {
ServiceRequestBottomSheet.getQRCodeBottomSheet(context: context); ServiceRequestBottomSheet.getQRCodeBottomSheet(context: context);
}, },
):IconButton( )
: IconButton(
icon: const Icon(Icons.home), icon: const Icon(Icons.home),
onPressed: () { onPressed: () {
stopTimer(); stopTimer();
@ -125,6 +135,7 @@ class _ServiceRequestDetailMainState extends State<ServiceRequestDetailMain> {
], ],
), ),
), ),
),); ),
);
} }
} }

@ -4,10 +4,12 @@ import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:google_api_availability/google_api_availability.dart'; import 'package:google_api_availability/google_api_availability.dart';
import 'package:huawei_push/huawei_push.dart' as h_push; import 'package:huawei_push/huawei_push.dart' as h_push;
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/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';
class RequestApprovalBottomSheet extends StatefulWidget { class RequestApprovalBottomSheet extends StatefulWidget {
RequestApprovalBottomSheet({Key? key}) : super(key: key); RequestApprovalBottomSheet({Key? key}) : super(key: key);
@ -26,6 +28,7 @@ class _RequestApprovalBottomState extends State<RequestApprovalBottomSheet> {
} }
void listenForApproval() async { void listenForApproval() async {
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) {
print("onMessageReceivedStream:${remoteMessage.toMap()}"); print("onMessageReceivedStream:${remoteMessage.toMap()}");
@ -34,16 +37,29 @@ class _RequestApprovalBottomState extends State<RequestApprovalBottomSheet> {
}); });
} else { } else {
FirebaseMessaging.onMessage.listen((RemoteMessage message) { FirebaseMessaging.onMessage.listen((RemoteMessage message) {
Map<String, dynamic> messageData = message.data; print('mesage ${message.data}');
if (messageData["notificaitonType"] != null && messageData["arrived"] != null) { ConfirmArrivalNotificationModel notificationModel = ConfirmArrivalNotificationModel.fromJson(message.data);
if (messageData["notificaitonType"] == "arrivalConfirmation") { print('notification model i got is ${notificationModel.toJson()}');
if ((messageData["arrived"].toString()) == "true") { if(notificationModel.requestId!=null&&notificationModel.accept!=null){
print('accept value is ${notificationModel.accept==false}');
if(notificationModel.accept!=null&&!notificationModel.accept!){
ServiceRequestDetailProvider requestDetailProvider = Provider.of<ServiceRequestDetailProvider>(context,listen: false);
requestDetailProvider.getWorkOrderById(id: notificationModel.requestId??0);
Navigator.pop(context, true);
Navigator.pop(context, true); Navigator.pop(context, true);
} else {
Navigator.pop(context, false);
}
} }
} }
// 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);
// }
// }
// }
}); });
} }
} }
@ -97,3 +113,41 @@ class _RequestApprovalBottomState extends State<RequestApprovalBottomSheet> {
; ;
} }
} }
class ConfirmArrivalNotificationModel {
final String? transactionType;
final int? requestId;
final String? notificationType;
final String? userId;
final bool? 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,
};
}
}

Loading…
Cancel
Save