From 7ebd01d0121a669230df2dc46e0a4a4640d392f6 Mon Sep 17 00:00:00 2001 From: WaseemAbbasi22 Date: Wed, 23 Oct 2024 14:43:57 +0300 Subject: [PATCH] in progress --- assets/images/calendar_icon.svg | 8 + assets/images/list_icon.svg | 8 + assets/qr_code_icon.svg | 12 + lib/app_strings/app_asset.dart | 3 + lib/dashboard_latest/dashboard_provider.dart | 8 + .../widgets/request_category_fragment.dart | 33 ++- lib/l10n/app_ar.arb | 5 + lib/l10n/app_en.arb | 5 + lib/new_views/app_style/app_color.dart | 1 + .../service_request_bottomsheet.dart | 226 +++++++++++++++++- .../components/weekly_calendar_fragment.dart | 104 +++++--- .../service_request_detail_main_view.dart | 16 +- 12 files changed, 381 insertions(+), 48 deletions(-) create mode 100644 assets/images/calendar_icon.svg create mode 100644 assets/images/list_icon.svg create mode 100644 assets/qr_code_icon.svg diff --git a/assets/images/calendar_icon.svg b/assets/images/calendar_icon.svg new file mode 100644 index 00000000..84ad9758 --- /dev/null +++ b/assets/images/calendar_icon.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/images/list_icon.svg b/assets/images/list_icon.svg new file mode 100644 index 00000000..7c97c23f --- /dev/null +++ b/assets/images/list_icon.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/qr_code_icon.svg b/assets/qr_code_icon.svg new file mode 100644 index 00000000..508afa6d --- /dev/null +++ b/assets/qr_code_icon.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/lib/app_strings/app_asset.dart b/lib/app_strings/app_asset.dart index 139e8185..242f0170 100644 --- a/lib/app_strings/app_asset.dart +++ b/lib/app_strings/app_asset.dart @@ -3,7 +3,10 @@ class AppAsset { static String askOtpIcon = 'ask_otp_icon'; static String askRequesterIcon = 'ask_requester_icon'; static String scanQrIcon = 'scan_qr_icon'; + static String calendarIcon = 'calendar_icon'; + static String listIcon = 'list_icon'; static String takeDevicePhotoIcon = 'take_device_photo_icon'; + static String getQrCodeIcon = 'qr_code_icon'; static String maintenanceIcon = 'maintenance_icon'; static String retiredAssetIcon = 'assets/images/retired_asset_icon.svg'; static String sparePartIcon = 'spare_part_icon'; diff --git a/lib/dashboard_latest/dashboard_provider.dart b/lib/dashboard_latest/dashboard_provider.dart index 33c1fd6b..3c4041b3 100644 --- a/lib/dashboard_latest/dashboard_provider.dart +++ b/lib/dashboard_latest/dashboard_provider.dart @@ -14,6 +14,14 @@ class DashBoardProvider extends ChangeNotifier { bool isAllCountLoading = false; bool isLoading = false; bool _isDetailLoading = false; + bool _isShowDashBoardCalendar = false; + + bool get isShowDashBoardCalendar => _isShowDashBoardCalendar; + + set isShowDashBoardCalendar(bool value) { + _isShowDashBoardCalendar = value; + notifyListeners(); + } int _status = 0; diff --git a/lib/dashboard_latest/widgets/request_category_fragment.dart b/lib/dashboard_latest/widgets/request_category_fragment.dart index b3c1b634..e46c844a 100644 --- a/lib/dashboard_latest/widgets/request_category_fragment.dart +++ b/lib/dashboard_latest/widgets/request_category_fragment.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; +import 'package:test_sa/app_strings/app_asset.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/dashboard_latest/dashboard_provider.dart'; import 'package:test_sa/dashboard_latest/widgets/request_category_list.dart'; @@ -19,11 +20,31 @@ class RequestCategoryFragment extends StatelessWidget { @override Widget build(BuildContext context) { return Consumer(builder: (context, dashboardProvider, child) { + bool isNurse = (Provider.of(context, listen: false).user?.type) == UsersTypes.normal_user; return Column(mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ - context.translation.allWorkOrder.heading4(context).paddingOnly(start: 16, end: 16), - 12.height, - const WeeklyCalendarFragment(), - 12.height, + !isNurse + ? Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + context.translation.allWorkOrder.heading4(context), + GestureDetector( + onTap: () { + dashboardProvider.isShowDashBoardCalendar = !dashboardProvider.isShowDashBoardCalendar; + }, + child: dashboardProvider.isShowDashBoardCalendar ? AppAsset.listIcon.toSvgAsset() : AppAsset.calendarIcon.toSvgAsset()) + ], + ), + dashboardProvider.isShowDashBoardCalendar + ? Padding( + padding: EdgeInsets.only(top: 12.toScreenHeight), + child: const WeeklyCalendarFragment(), + ) + : const SizedBox(), + ], + ).paddingOnly(start: 16, end: 16) + : context.translation.allWorkOrder.heading4(context).paddingOnly(start: 16, end: 16), getTabs( requestsProvider: dashboardProvider, context: context, @@ -46,7 +67,7 @@ class RequestCategoryFragment extends StatelessWidget { } Widget getTabs({required BuildContext context, required DashBoardProvider requestsProvider, required UsersTypes? userType}) { - List tabs = CategoryTabs.getTabs(userType: userType??UsersTypes.normal_user, context: context); + List tabs = CategoryTabs.getTabs(userType: userType ?? UsersTypes.normal_user, context: context); return SizedBox( height: 44 + 16, child: ListView.separated( @@ -62,7 +83,7 @@ class RequestCategoryFragment extends StatelessWidget { onPressed: () async { requestsProvider.currentListIndex = index; requestsProvider.resetRequestDataList(); - requestsProvider.getRequestDetail(usersType: userType??UsersTypes.normal_user, showLoader: true, status: tabs[index].tag); + requestsProvider.getRequestDetail(usersType: userType ?? UsersTypes.normal_user, showLoader: true, status: tabs[index].tag); }, ); }, diff --git a/lib/l10n/app_ar.arb b/lib/l10n/app_ar.arb index c2d09006..2ab3354f 100644 --- a/lib/l10n/app_ar.arb +++ b/lib/l10n/app_ar.arb @@ -483,6 +483,7 @@ "createSubWorkOrder" : "إنشاء أمر عمل فرعي", "mrNumber" : "MR Number", "vendorEng" : "المهندس المزود", + "qrCode": "رمز الاستجابة السريعة", "vendorName" : "اسم المزود", "reset" : "اعادة تعيين", "solution" : "الحل", @@ -497,5 +498,9 @@ "assetScan" : "مسح الجهاز", "pickManually" : "اختر يدويا", "searchAsset" : "ابحث عن جهاز", + "doYouWantToSetReminder": "هل تريد تعيين تذكير؟", + "youCanSetTheReminderInAlarmToRemindYouBeforeVisit": "يمكنك تعيين التذكير في المنبه لتذكيرك قبل الزيارة. الرجاء اختيار الوقت أدناه", + "setReminder": "تعيين التذكير", + "provideQrCodeToEngineer": "قدم رمز الاستجابة السريعة أدناه للمهندس للتحقق من وصوله", "callResponse": "استجابة الاتصال" } \ No newline at end of file diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 397d1ebc..4f0ab30d 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -486,6 +486,8 @@ "technicalComment" : "Technical Comment", "recentActivities" : "Recent Activities", "activities" : "Activities", + "provideQrCodeToEngineer": "Provide the below QR Code to Engineer to verify his arrival", + "qrCode": "QR Code", "createNewActivity" : "Create New Activity", "selectActivityType" : "Select Activity Type", "sparePartRequest" : "Spare Part Request", @@ -500,5 +502,8 @@ "lastPmDate" : "Last PM Date", "assetScan" : "Asset Scan", "pickManually" : "Pick Manually", + "doYouWantToSetReminder": "Do you want to set reminder?", + "youCanSetTheReminderInAlarmToRemindYouBeforeVisit": "You can set the reminder in alarm to remind you before visit. Please select the time below", + "setReminder": "Set Reminder", "searchAsset" : "Search Asset" } \ No newline at end of file diff --git a/lib/new_views/app_style/app_color.dart b/lib/new_views/app_style/app_color.dart index fb4a8f9b..4cea6dae 100644 --- a/lib/new_views/app_style/app_color.dart +++ b/lib/new_views/app_style/app_color.dart @@ -32,6 +32,7 @@ class AppColor { static const Color neutral140 = Color(0xffE6E6E6); static const Color neutral150 = Color(0xffA1A1A1); static const Color neutral160 = Color(0xffE5E5E5); + static const Color neutral170 = Color(0xff6E6E6E); //background static const Color backgroundLight = Color(0xfff7f9fb); diff --git a/lib/service_request_latest/views/components/bottom_sheets/service_request_bottomsheet.dart b/lib/service_request_latest/views/components/bottom_sheets/service_request_bottomsheet.dart index 0754f2bf..c8c4458a 100644 --- a/lib/service_request_latest/views/components/bottom_sheets/service_request_bottomsheet.dart +++ b/lib/service_request_latest/views/components/bottom_sheets/service_request_bottomsheet.dart @@ -14,6 +14,7 @@ import 'package:test_sa/models/helper_data_models/maintenance_request/activity_m import 'package:test_sa/models/helper_data_models/spare_part/activity_spare_part_model.dart'; import 'package:test_sa/models/helper_data_models/workorder/work_order_helper_models.dart'; import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/new_views/common_widgets/app_lazy_loading.dart'; import 'package:test_sa/new_views/common_widgets/single_item_drop_down_menu.dart'; import 'package:test_sa/providers/service_request_providers/reject_reason_provider.dart'; import 'package:test_sa/service_request_latest/service_request_detail_provider.dart'; @@ -280,19 +281,21 @@ class ServiceRequestBottomSheet { buttonColor: AppColor.primary10, loading: false, onPressed: () async { - if (requestDetailProvider.currentWorkOrder?.data?.nextStep!.workOrderNextStepEnum == WorkOrderNextStepEnum.eArrived) { - requestDetailProvider.updateNeedVisitHelperModel(NeedVisitHelperModel( - workOrderId: requestDetailProvider.needVisitHelperModel?.workOrderId, - visitDate: requestDetailProvider.needVisitHelperModel?.visitDate, - comment: requestDetailProvider.needVisitHelperModel?.comment, - )); - requestDetailProvider.engineerUpdateNeedVisit(); - } else { - requestDetailProvider.needVisitHelperModel?.workOrderId = requestDetailProvider.currentWorkOrder!.data!.requestId; - requestDetailProvider.engineerNeedVisit(); - requestDetailProvider.needVisitHelperModel = NeedVisitHelperModel(); - } + // if (requestDetailProvider.currentWorkOrder?.data?.nextStep!.workOrderNextStepEnum == WorkOrderNextStepEnum.eArrived) { + // requestDetailProvider.updateNeedVisitHelperModel(NeedVisitHelperModel( + // workOrderId: requestDetailProvider.needVisitHelperModel?.workOrderId, + // visitDate: requestDetailProvider.needVisitHelperModel?.visitDate, + // comment: requestDetailProvider.needVisitHelperModel?.comment, + // )); + // requestDetailProvider.engineerUpdateNeedVisit(); + // } else { + // requestDetailProvider.needVisitHelperModel?.workOrderId = requestDetailProvider.currentWorkOrder!.data!.requestId; + // requestDetailProvider.engineerNeedVisit(); + // requestDetailProvider.needVisitHelperModel = NeedVisitHelperModel(); + // } Navigator.pop(context); + initialVisitReminderBottomSheet(context: context); + // }, ), 16.height, @@ -301,6 +304,205 @@ class ServiceRequestBottomSheet { })); } + static Future initialVisitReminderBottomSheet({required BuildContext context}) { + String selectedReminderTime = '10 minutes before'; + + Widget reminderTimeWidget({required BuildContext context}) { + List reminderTimeList = ['5 minutes before', '10 minutes before', '15 minutes before']; + + return StatefulBuilder( + builder: (context, setState) { + return Wrap( + direction: Axis.vertical, + runSpacing: 8, + spacing: 8, + children: [ + for (var element in reminderTimeList) + Row( + mainAxisSize: MainAxisSize.min, + children: [ + SizedBox( + width: 24, + height: 24, + child: Radio( + value: element, + activeColor: Colors.red, + fillColor: MaterialStateColor.resolveWith((states) { + if (states.contains(MaterialState.selected)) return AppColor.primary10; + return AppColor.neutral130; + }), + groupValue: selectedReminderTime, + onChanged: (String? value) { + setState(() { + selectedReminderTime = value!; + }); + }, + ), + ), + 8.width, + Text(element, style: AppTextStyles.bodyText.copyWith(color: AppColor.neutral120)), + ], + ) + ], + ); + }, + ); + } + + return buildBottomSheetParent( + context: context, + childWidget: Consumer( + builder: (context, requestDetailProvider, child) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox().indicatorWidget().center, + 8.height, + Align( + alignment: AlignmentDirectional.centerStart, + child: context.translation.doYouWantToSetReminder.bottomSheetHeadingTextStyle(context), + ), + 8.height, + Align( + alignment: AlignmentDirectional.centerStart, + child: context.translation.youCanSetTheReminderInAlarmToRemindYouBeforeVisit.bodyText2(context), + ), + 12.height, + reminderTimeWidget(context: context), + 30.height, + Row( + mainAxisSize: MainAxisSize.min, + children: [ + Expanded( + child: AppFilledButton( + label: context.translation.cancel, + buttonColor: AppColor.white60, + textColor: AppColor.black10, + loading: false, + onPressed: () async { + if (requestDetailProvider.currentWorkOrder?.data?.nextStep!.workOrderNextStepEnum == WorkOrderNextStepEnum.eArrived) { + requestDetailProvider.updateNeedVisitHelperModel( + NeedVisitHelperModel( + workOrderId: requestDetailProvider.needVisitHelperModel?.workOrderId, + visitDate: requestDetailProvider.needVisitHelperModel?.visitDate, + comment: requestDetailProvider.needVisitHelperModel?.comment, + ), + ); + requestDetailProvider.engineerUpdateNeedVisit(); + } else { + requestDetailProvider.needVisitHelperModel?.workOrderId = requestDetailProvider.currentWorkOrder!.data!.requestId; + requestDetailProvider.engineerNeedVisit(); + requestDetailProvider.needVisitHelperModel = NeedVisitHelperModel(); + } + Navigator.pop(context); + }, + ), + ), + 12.width, + Expanded( + child: AppFilledButton( + label: context.translation.setReminder, + buttonColor: AppColor.primary10, + loading: false, + onPressed: () async { + if (requestDetailProvider.currentWorkOrder?.data?.nextStep!.workOrderNextStepEnum == WorkOrderNextStepEnum.eArrived) { + requestDetailProvider.updateNeedVisitHelperModel( + NeedVisitHelperModel( + workOrderId: requestDetailProvider.needVisitHelperModel?.workOrderId, + visitDate: requestDetailProvider.needVisitHelperModel?.visitDate, + comment: requestDetailProvider.needVisitHelperModel?.comment, + ), + ); + requestDetailProvider.engineerUpdateNeedVisit(); + } else { + requestDetailProvider.needVisitHelperModel?.workOrderId = requestDetailProvider.currentWorkOrder!.data!.requestId; + requestDetailProvider.engineerNeedVisit(); + requestDetailProvider.needVisitHelperModel = NeedVisitHelperModel(); + } + Navigator.pop(context); + }, + ), + ), + ], + ), + 16.height, + ], + ); + }, + ), + ); + } +static Future getQRCodeBottomSheet({required BuildContext context}) async{ + showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); + ServiceRequestDetailProvider requestDetailProvider = Provider.of(context,listen:false); + String? base64String = await requestDetailProvider.getQrCode(workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId ?? 0); + Navigator.pop(context); + if (base64String != null) { + // You have the base64 string, now you can display it + Uint8List bytes = base64Decode(base64String); + + return buildBottomSheetParent( + context: context, + childWidget: Consumer( + builder: (context, requestDetailProvider, child) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox().indicatorWidget().center, + 8.height, + Align( + alignment: AlignmentDirectional.centerStart, + child: context.translation.qrCode.bottomSheetHeadingTextStyle(context), + ), + 8.height, + Align( + alignment: AlignmentDirectional.centerStart, + child: context.translation.provideQrCodeToEngineer.bodyText2(context), + ), + 12.height, + Center( + child: Image.memory( + bytes, // Displaying the QR code from base64 + fit: BoxFit.contain, // Ensure the image fits well in the dialog + errorBuilder: (context, error, stackTrace) { + return const Icon(Icons.error, color: Colors.red); + }, + ), + ), + + 16.height, + ], + ); + }, + ), + ); + + showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + backgroundColor: Colors.white, + title:context.translation.scanQr.heading6(context).center, + content: Image.memory( + bytes, // Displaying the QR code from base64 + fit: BoxFit.contain, // Ensure the image fits well in the dialog + errorBuilder: (context, error, stackTrace) { + return const Icon(Icons.error, color: Colors.red); + }, + ), + + ); + }, + ); + } else { + print('Failed to get the QR code'); + } + + + + } + + static Future rejectRequestBottomSheet({required BuildContext context}) { return buildBottomSheetParent( context: context, diff --git a/lib/service_request_latest/views/components/weekly_calendar_fragment.dart b/lib/service_request_latest/views/components/weekly_calendar_fragment.dart index 4ed24ef7..b84fecf2 100644 --- a/lib/service_request_latest/views/components/weekly_calendar_fragment.dart +++ b/lib/service_request_latest/views/components/weekly_calendar_fragment.dart @@ -2,45 +2,57 @@ import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/dashboard_latest/dashboard_provider.dart'; -import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/text_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_text_style.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; -class WeeklyCalendarFragment extends StatelessWidget { +class WeeklyCalendarFragment extends StatefulWidget { const WeeklyCalendarFragment({Key? key}) : super(key: key); + @override + State createState() => _WeeklyCalendarFragmentState(); +} + +class _WeeklyCalendarFragmentState extends State { + DateTime? selectedDate = DateTime.now(); // Initially select today's date + @override Widget build(BuildContext context) { - // Generate the list of dates for the current week (3 days before and 3 days after today) List weekDates = getWeekDates(); return Consumer( builder: (context, snapshot, _) => GridView.builder( - padding: const EdgeInsets.only(left: 16, right: 16), + padding: EdgeInsets.zero, physics: const NeverScrollableScrollPhysics(), shrinkWrap: true, gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 7, - childAspectRatio: 70 / 60, - crossAxisSpacing: 2, - mainAxisSpacing: 12, + childAspectRatio: 60 / 80, + crossAxisSpacing: 4, + mainAxisSpacing: 4, ), - itemCount: weekDates.length, // Now we have 7 items + itemCount: weekDates.length, itemBuilder: (context, index) { - DateTime date = weekDates[index]; - String formattedDate = DateFormat('EEE\ndd').format(date); // EEE: Day name, dd: Day number + DateTime currentDate = weekDates[index]; + String formattedDay = DateFormat('EEE').format(currentDate); + String formattedDate = DateFormat('dd MMM').format(currentDate); + + // Check if the current date is selected + bool isSelected = selectedDate != null && selectedDate!.day == currentDate.day && selectedDate!.month == currentDate.month && selectedDate!.year == currentDate.year; return listItem( - formattedDate, // Pass the formatted date - snapshot.dashboardCount?.data?.countOpen ?? 0, // Adjust as needed - context, - snapshot.isAllCountLoading, - index, - AppColor.primary10, + formattedDate: formattedDate, + formattedDay: formattedDay, + context: context, + isLoading: snapshot.isAllCountLoading, + currentDate: currentDate, + isSelected: isSelected, + onSelect: () { + setState(() { + selectedDate = currentDate; // Update selected date on tap + }); + }, ); }, ), @@ -59,13 +71,17 @@ class WeeklyCalendarFragment extends StatelessWidget { return weekDates; } - Widget listItem(String formattedDate, int value, BuildContext context, bool isLoading, int index, Color iconColor) { + Widget listItem({ + required String formattedDate, + required String formattedDay, + required BuildContext context, + required DateTime currentDate, + required bool isLoading, + required bool isSelected, // To check if this item is selected + required VoidCallback onSelect, // Callback for tap + }) { return GestureDetector( - onTap: isLoading - ? null - : () { - // Action on tapping the date (if required) - }, + onTap: isLoading ? null : onSelect, child: Column( crossAxisAlignment: CrossAxisAlignment.center, mainAxisSize: MainAxisSize.min, @@ -74,13 +90,43 @@ class WeeklyCalendarFragment extends StatelessWidget { Column( children: [ Container( - color: Colors.red, - child: Text( - formattedDate, - style: AppTextStyles.tinyFont2, + padding: EdgeInsets.symmetric(horizontal: 7.toScreenWidth, vertical: 14.toScreenHeight), + width: double.infinity, + decoration: ShapeDecoration( + color: AppColor.background(context), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(14), + side: isSelected + ? const BorderSide(color: AppColor.primary10, width: 2) // Blue border if selected + : BorderSide.none, + ), + shadows: [ + BoxShadow( + color: Colors.black.withOpacity(0.03), + blurRadius: 5, + offset: const Offset(0, 0), + spreadRadius: 0, + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + formattedDay, + style: AppTextStyles.tinyFont2.copyWith( + color: isSelected ? AppColor.black20 : AppColor.neutral170, // Blue text if selected + ), + ), + Text( + formattedDate, + style: AppTextStyles.tinyFont2.copyWith( + color: isSelected ? AppColor.black20 : AppColor.neutral170, // Blue text if selected + ), + ), + ], ), ), - // Any other widgets you want to display (e.g. counts, icons) ], ), ], diff --git a/lib/service_request_latest/views/service_request_detail_main_view.dart b/lib/service_request_latest/views/service_request_detail_main_view.dart index 26569c98..cb9bb107 100644 --- a/lib/service_request_latest/views/service_request_detail_main_view.dart +++ b/lib/service_request_latest/views/service_request_detail_main_view.dart @@ -1,12 +1,17 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; +import 'package:test_sa/app_strings/app_asset.dart'; +import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; +import 'package:test_sa/models/enums/user_types.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/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/history_log_view.dart'; import 'components/service_request_detail_view.dart'; @@ -46,6 +51,7 @@ class _ServiceRequestDetailMainState extends State { @override Widget build(BuildContext context) { + bool isNurse = (Provider.of(context, listen: false).user?.type) == UsersTypes.normal_user; return WillPopScope( onWillPop: () async { // Implement custom back button handling logic here @@ -64,7 +70,15 @@ class _ServiceRequestDetailMainState extends State { Navigator.pop(context); }, actions: [ - IconButton( + isNurse? IconButton( + icon: 'qr'.toSvgAsset( + height: 24, + width: 24, + ), + onPressed: () { + ServiceRequestBottomSheet.getQRCodeBottomSheet(context: context); + }, + ):IconButton( icon: const Icon(Icons.home), onPressed: () { stopTimer();