diff --git a/lib/core/api_consts.dart b/lib/core/api_consts.dart index b21d329..943ecf3 100644 --- a/lib/core/api_consts.dart +++ b/lib/core/api_consts.dart @@ -14,8 +14,8 @@ var PACKAGES_ORDERS = '/api/orders'; var PACKAGES_ORDER_HISTORY = '/api/orders/items'; var PACKAGES_TAMARA_OPT = '/api/orders/paymentoptions/tamara'; // var BASE_URL = 'http://10.50.100.198:2018/'; -var BASE_URL = 'https://uat.hmgwebservices.com/'; -// var BASE_URL = 'https://hmgwebservices.com/'; +// var BASE_URL = 'https://uat.hmgwebservices.com/'; +var BASE_URL = 'https://hmgwebservices.com/'; // var BASE_URL = 'http://10.201.204.103/'; // var BASE_URL = 'https://orash.cloudsolutions.com.sa/'; // var BASE_URL = 'https://vidauat.cloudsolutions.com.sa/'; @@ -719,7 +719,7 @@ var GET_PRESCRIPTION_INSTRUCTIONS_PDF = 'Services/ChatBot_Service.svc/REST/Chatb class ApiConsts { static const maxSmallScreen = 660; - static AppEnvironmentTypeEnum appEnvironmentType = AppEnvironmentTypeEnum.uat; + static AppEnvironmentTypeEnum appEnvironmentType = AppEnvironmentTypeEnum.prod; // static String baseUrl = 'https://uat.hmgwebservices.com/'; // HIS API URL UAT diff --git a/lib/features/hmg_services/models/create_e_referral_model.dart b/lib/features/hmg_services/models/create_e_referral_model.dart new file mode 100644 index 0000000..0672fe6 --- /dev/null +++ b/lib/features/hmg_services/models/create_e_referral_model.dart @@ -0,0 +1,150 @@ +class CreateEReferralRequestModel { + bool? isInsuredPatient; + String? cityCode; + String? cityName; + String? requesterName; + String? requesterContactNo; + int? requesterRelationship; + String? otherRelationship; + String? fullName; + int? identificationNo; + String? patientMobileNumber; + int? preferredBranchCode; + String? preferredBranchName; + List? medicalReportAttachment; + dynamic insuranceCardAttachment; + double? versionID; + int? channel; + int? languageID; + String? iPAdress; + String? generalid; + int? patientOutSA; + String? sessionID; + bool? isDentalAllowedBackend; + int? deviceTypeID; + int? patientID; + String? tokenID; + int? patientTypeID; + int? patientType; + + CreateEReferralRequestModel( + {this.isInsuredPatient, + this.cityCode, + this.cityName, + this.requesterName, + this.requesterContactNo, + this.requesterRelationship, + this.otherRelationship, + this.fullName, + this.identificationNo, + this.patientMobileNumber, + this.preferredBranchCode, + this.preferredBranchName, + this.medicalReportAttachment, + this.insuranceCardAttachment, + this.versionID, + this.channel, + this.languageID, + this.iPAdress, + this.generalid, + this.patientOutSA, + this.sessionID, + this.isDentalAllowedBackend, + this.deviceTypeID, + this.patientID, + this.tokenID, + this.patientTypeID, + this.patientType}); + + CreateEReferralRequestModel.fromJson(Map json) { + isInsuredPatient = json['IsInsuredPatient']; + cityCode = json['CityCode']; + cityName = json['CityName']; + requesterName = json['RequesterName']; + requesterContactNo = json['RequesterContactNo']; + requesterRelationship = json['RequesterRelationship']; + otherRelationship = json['OtherRelationship']; + fullName = json['FullName']; + identificationNo = json['IdentificationNo']; + patientMobileNumber = json['PatientMobileNumber']; + preferredBranchCode = json['PreferredBranchCode']; + preferredBranchName = json['PreferredBranchName']; + if (json['MedicalReportAttachment'] != null) { + medicalReportAttachment = []; + json['MedicalReportAttachment'].forEach((v) { + medicalReportAttachment!.add(EReferralAttachment.fromJson(v)); + }); + } + insuranceCardAttachment = json['InsuranceCardAttachment'] != null ? EReferralAttachment.fromJson(json['InsuranceCardAttachment']) : null; + versionID = json['VersionID']; + channel = json['Channel']; + languageID = json['LanguageID']; + iPAdress = json['IPAdress']; + generalid = json['generalid']; + patientOutSA = json['PatientOutSA']; + sessionID = json['SessionID']; + isDentalAllowedBackend = json['isDentalAllowedBackend']; + deviceTypeID = json['DeviceTypeID']; + patientID = json['PatientID']; + tokenID = json['TokenID']; + patientTypeID = json['PatientTypeID']; + patientType = json['PatientType']; + } + + Map toJson() { + final Map data = new Map(); + data['IsInsuredPatient'] = this.isInsuredPatient; + data['CityCode'] = this.cityCode; + data['CityName'] = this.cityName; + data['RequesterName'] = this.requesterName; + data['RequesterContactNo'] = this.requesterContactNo; + data['RequesterRelationship'] = this.requesterRelationship; + data['OtherRelationship'] = this.otherRelationship; + data['FullName'] = this.fullName; + data['IdentificationNo'] = this.identificationNo; + data['PatientMobileNumber'] = this.patientMobileNumber; + data['PreferredBranchCode'] = this.preferredBranchCode; + data['PreferredBranchName'] = this.preferredBranchName; + if (this.medicalReportAttachment != null) { + data['MedicalReportAttachment'] = this.medicalReportAttachment!.map((v) => v.toJson()).toList(); + } + if (this.insuranceCardAttachment == null) { + data['InsuranceCardAttachment'] = {}; + } else + data['InsuranceCardAttachment'] = this.insuranceCardAttachment.toJson(); + + data['VersionID'] = this.versionID; + data['Channel'] = this.channel; + data['LanguageID'] = this.languageID; + data['IPAdress'] = this.iPAdress; + data['generalid'] = this.generalid; + data['PatientOutSA'] = this.patientOutSA; + data['SessionID'] = this.sessionID; + data['isDentalAllowedBackend'] = this.isDentalAllowedBackend; + data['DeviceTypeID'] = this.deviceTypeID; + data['PatientID'] = this.patientID; + data['TokenID'] = this.tokenID; + data['PatientTypeID'] = this.patientTypeID; + data['PatientType'] = this.patientType; + return data; + } +} + +class EReferralAttachment { + String? fileName; + String? base64String; + + EReferralAttachment({this.fileName, this.base64String}); + + EReferralAttachment.fromJson(Map json) { + fileName = json['FileName']; + base64String = json['Base64String']; + } + + Map toJson() { + final Map data = new Map(); + data['FileName'] = this.fileName; + data['Base64String'] = this.base64String; + return data; + } +} diff --git a/lib/presentation/e_referral/e_referral_page_home.dart b/lib/presentation/e_referral/e_referral_page_home.dart index bacca47..3eb1255 100644 --- a/lib/presentation/e_referral/e_referral_page_home.dart +++ b/lib/presentation/e_referral/e_referral_page_home.dart @@ -1,15 +1,19 @@ import 'dart:ui'; - +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/app_export.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/contact_us/contact_us_view_model.dart'; import 'package:hmg_patient_app_new/features/prescriptions/prescriptions_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/presentation/e_referral/new_referral.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/custom_tab_bar.dart'; import 'package:provider/provider.dart'; class EReferralPage extends StatefulWidget { @@ -19,10 +23,7 @@ class EReferralPage extends StatefulWidget { _EReferralPageState createState() => _EReferralPageState(); } -class _EReferralPageState extends State - { - - +class _EReferralPageState extends State { @override void initState() { super.initState(); @@ -32,66 +33,52 @@ class _EReferralPageState extends State void dispose() { super.dispose(); } + bool isNewReferral = true; + VoidCallback? onNextStep; @override Widget build(BuildContext context) { - return Scaffold( - backgroundColor: AppColors.bgScaffoldColor, - body: CollapsingListView( - title:"E Referral".needTranslation, - child: SingleChildScrollView( - child: Consumer(builder: (context, model, child) { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox(height: 16.h), - Row( - children: [ - CustomButton( - text: "New Referral".needTranslation, - onPressed: () { - isNewReferral =true; - setState(() { - - }); - }, - backgroundColor: model.isSortByClinic ? AppColors.bgRedLightColor : AppColors.whiteColor, - borderColor: model.isSortByClinic ? AppColors.primaryRedColor : AppColors.textColor.withOpacity(0.2), - textColor: model.isSortByClinic ? AppColors.primaryRedColor : AppColors.blackColor, - fontSize: 12, - fontWeight: FontWeight.w500, - borderRadius: 10, - padding: EdgeInsets.fromLTRB(10, 0, 10, 0), - height: 40.h, - ), - SizedBox(width: 8.h), - CustomButton( - text: "Search Referral".needTranslation, - onPressed: () { - isNewReferral =false; - }, - backgroundColor: model.isSortByClinic ? AppColors.whiteColor : AppColors.bgRedLightColor, - borderColor: model.isSortByClinic ? AppColors.textColor.withOpacity(0.2) : AppColors.primaryRedColor, - textColor: model.isSortByClinic ? AppColors.blackColor : AppColors.primaryRedColor, - fontSize: 12, - fontWeight: FontWeight.w500, - borderRadius: 10, - padding: EdgeInsets.fromLTRB(10, 0, 10, 0), - height: 40.h, - ), - ], - ).paddingSymmetrical(24.h, 0.h), - SizedBox(height: 20.h), - isNewReferral ? NewEReferral() : SizedBox(), - ], - ); - }), - ), - ), - ); - - - - + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: CollapsingListView( + title: "E Referral".needTranslation, + child: Consumer(builder: (context, contactUsVM, child) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: 16.h), + contactUsVM.isHMGLocationsListLoading + ? SizedBox.shrink() + : CustomTabBar( + activeTextColor: AppColors.primaryRedColor, + activeBackgroundColor: AppColors.primaryRedColor.withValues(alpha: .1), + tabs: [ + CustomTabBarModel(null, "New Referral".needTranslation), + CustomTabBarModel(null, "Search Referral".needTranslation), + ], + onTabChange: (index) {}, + ).paddingSymmetrical(24.h, 0.h), + SizedBox(height: 24.h), + NewReferralPage(onNextStep: (nextStep) { + WidgetsBinding.instance.addPostFrameCallback((_) { + setState(() { + onNextStep = nextStep; + }); + }); + }) + ], + ); + }), + ), + bottomNavigationBar: Padding( + padding: EdgeInsets.all(16.h), + child: CustomButton( + text: LocaleKeys.next.tr(), + onPressed:onNextStep ?? () {}, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedColor, + textColor: AppColors.whiteColor, + )), + ); } } diff --git a/lib/presentation/e_referral/new_referral.dart b/lib/presentation/e_referral/new_referral.dart index 4ed9b8e..73c4f5c 100644 --- a/lib/presentation/e_referral/new_referral.dart +++ b/lib/presentation/e_referral/new_referral.dart @@ -1,172 +1,432 @@ +// dart +// File: lib/presentation/e_referral/new_referral_page.dart + +import 'dart:io'; + +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/common_models/nationality_country_model.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/authentication/authentication_view_model.dart'; +import 'package:hmg_patient_app_new/features/hmg_services/models/create_e_referral_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/dropdown/dropdown_widget.dart'; +import 'package:hmg_patient_app_new/widgets/image_picker.dart'; +import 'package:hmg_patient_app_new/widgets/input_widget.dart'; +import 'package:provider/provider.dart'; -class NewEReferral extends StatefulWidget { - NewEReferral(); +class NewReferralPage extends StatefulWidget { + final Function(VoidCallback) onNextStep; + const NewReferralPage({super.key, required this.onNextStep}); @override - _NewEReferralState createState() => _NewEReferralState(); + State createState() => NewReferralPageState(); } -class _NewEReferralState extends State with TickerProviderStateMixin { - late PageController _controller; - int _currentIndex = 0; - int pageSelected = 2; - - // CreateEReferralRequestModel createEReferralRequestModel = new CreateEReferralRequestModel(); +class NewReferralPageState extends State { + final PageController _pageController = PageController(); + int pageIndex = 0; + int _tabIndex = 0; + bool isPatientInsured =false; + final TextEditingController _nameController = TextEditingController(); + final TextEditingController _phoneController = TextEditingController(); + String _country = 'Saudi Arabia'; + String? _relationship; + List medicalReportImages = []; + List insuredPatientImages = []; + void nextPressed() { + if (pageIndex < 2) { + _pageController.nextPage(duration: const Duration(milliseconds: 300), curve: Curves.easeInOut); + } else { + // submit logic + } + } @override - void initState() { + initState() { super.initState(); - _controller = new PageController(); + widget.onNextStep((){ + nextPressed(); + }); + } - @override - void dispose() { - super.dispose(); + Widget _progressStep({required String title, required bool active, bool showDivider = true}) { + final Color activeColor = active ? AppColors.primaryRedColor : Colors.grey.shade400; + return Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + + children: [ + CircleAvatar( + radius: 13, + backgroundColor: active ? activeColor : Colors.grey.shade300, + child: Icon(Icons.check, size: 14, color: Colors.white), + ), + if (showDivider) + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Divider(thickness: 1), + ), + + ], + ), + const SizedBox(height: 6), + Text(title, style: const TextStyle(fontSize: 11, fontWeight: FontWeight.w600)), + const SizedBox(height: 6), + Container( + padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 4), + decoration: BoxDecoration( + color: active ? activeColor.withOpacity(0.15) : Colors.grey.shade100, + borderRadius: BorderRadius.circular(6), + ), + child: Text(active ? 'Active' : 'Inactive', + style: TextStyle(fontSize: 9, color: active ? activeColor : Colors.grey)), + ), + ], + ), + ); + } + + Widget _requesterForm() { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 24.0), + child: ListView( + physics: const BouncingScrollPhysics(), + children: [ + const SizedBox(height: 12), + const Text('Referral requester information', + style: TextStyle(fontWeight: FontWeight.w700, fontSize: 16)).paddingSymmetrical(4.h, 0.h), + const SizedBox(height: 12), + TextInputWidget( + controller: _nameController, + padding: const EdgeInsets.symmetric(horizontal: 16.0), + hintText: 'Enter Referral Requester Name*', labelText: 'Requester Name', + ).paddingSymmetrical(0.h, 4.h), + + Selector? countriesList, NationalityCountries? selectedCountry, bool isArabic})>( + selector: (context, authViewModel) { + final appState = getIt.get(); + return ( + countriesList: authViewModel.countriesList, + selectedCountry: authViewModel.pickedCountryByUAEUser, + isArabic: appState.isArabic(), + ); + }, + shouldRebuild: (previous, next) => previous.countriesList != next.countriesList || previous.selectedCountry != next.selectedCountry || previous.isArabic != next.isArabic, + builder: (context, data, child) { + final authVM = context.read(); + return DropdownWidget( + labelText: LocaleKeys.country.tr(), + hintText:_country, + isEnable: true, + dropdownItems: (data.countriesList ?? []).map((e) => data.isArabic ? e.nameN ?? "" : e.name ?? "").toList(), + selectedValue: data.selectedCountry != null + ? data.isArabic + ? data.selectedCountry!.nameN ?? "" + : data.selectedCountry!.name ?? "" + : "", + onChange: authVM.onUAEUserCountrySelection, + hasSelectionCustomIcon: true, + labelColor: AppColors.textColor, + padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 16), + selectionCustomIcon: AppAssets.arrow_down, + leadingIcon: AppAssets.globe, + ).withVerticalPadding(8); + }, + ).paddingSymmetrical(0.h, 4.h), + + TextInputWidget( + labelText: LocaleKeys.mobileNumber.tr(), + hintText: LocaleKeys.mobileNumber.tr(), + controller: null, + isEnable: true, + prefix: null, + isAllowLeadingIcon: true, + labelColor: AppColors.textColor, padding: const EdgeInsets.symmetric(horizontal: 16.0), + isReadOnly: true, + leadingIcon: AppAssets.call).paddingSymmetrical(0.h, 4.h), + + Selector? countriesList, NationalityCountries? selectedCountry, bool isArabic})>( + selector: (context, authViewModel) { + final appState = getIt.get(); + return ( + countriesList: authViewModel.countriesList, + selectedCountry: authViewModel.pickedCountryByUAEUser, + isArabic: appState.isArabic(), + ); + }, + shouldRebuild: (previous, next) => previous.countriesList != next.countriesList || previous.selectedCountry != next.selectedCountry || previous.isArabic != next.isArabic, + builder: (context, data, child) { + final authVM = context.read(); + return DropdownWidget( + labelText: "Relationship", + hintText: "Relationship*".needTranslation, + isEnable: true, + dropdownItems: (data.countriesList ?? []).map((e) => data.isArabic ? e.nameN ?? "" : e.name ?? "").toList(), + selectedValue: data.selectedCountry != null + ? data.isArabic + ? data.selectedCountry!.nameN ?? "" + : data.selectedCountry!.name ?? "" + : "", + onChange: authVM.onUAEUserCountrySelection, + hasSelectionCustomIcon: true, + labelColor: AppColors.textColor, + padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 16), + selectionCustomIcon: AppAssets.arrow_down, + leadingIcon: AppAssets.globe, + ).withVerticalPadding(8); + }, + ).paddingSymmetrical(0.h, 4.h), + + const SizedBox(height: 120), + ], + ), + ); } - changePageViewIndex(pageIndex) { - _controller.jumpToPage(pageIndex); + Widget _patientInformation(){ + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: ListView( + physics: const BouncingScrollPhysics(), + children: [ + const SizedBox(height: 12), + 'Patient information'.toText16(weight: FontWeight.bold).paddingSymmetrical(4.h, 0.h), + const SizedBox(height: 12), + TextInputWidget( + controller: _nameController, + padding: const EdgeInsets.symmetric(horizontal: 16.0), + hintText: 'Enter Identification Number*', labelText: 'Identification Number ', + ).paddingSymmetrical(0.h, 4.h), + + TextInputWidget( + controller: _nameController, + padding: const EdgeInsets.symmetric(horizontal: 16.0), + hintText: 'Patient Name*', labelText: 'Name', + ).paddingSymmetrical(0.h, 4.h), + + Selector? countriesList, NationalityCountries? selectedCountry, bool isArabic})>( + selector: (context, authViewModel) { + final appState = getIt.get(); + return ( + countriesList: authViewModel.countriesList, + selectedCountry: authViewModel.pickedCountryByUAEUser, + isArabic: appState.isArabic(), + ); + }, + shouldRebuild: (previous, next) => previous.countriesList != next.countriesList || previous.selectedCountry != next.selectedCountry || previous.isArabic != next.isArabic, + builder: (context, data, child) { + final authVM = context.read(); + return DropdownWidget( + labelText: LocaleKeys.country.tr(), + hintText:_country, + isEnable: true, + dropdownItems: (data.countriesList ?? []).map((e) => data.isArabic ? e.nameN ?? "" : e.name ?? "").toList(), + selectedValue: data.selectedCountry != null + ? data.isArabic + ? data.selectedCountry!.nameN ?? "" + : data.selectedCountry!.name ?? "" + : "", + onChange: authVM.onUAEUserCountrySelection, + hasSelectionCustomIcon: true, + labelColor: AppColors.textColor, + padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 16), + selectionCustomIcon: AppAssets.arrow_down, + leadingIcon: AppAssets.globe, + ).withVerticalPadding(8); + }, + ).paddingSymmetrical(0.h, 4.h), + + + 'Where the patient located'.needTranslation.toText16(weight: FontWeight.bold).paddingSymmetrical(4.h, 0.h), + + Selector? countriesList, NationalityCountries? selectedCountry, bool isArabic})>( + selector: (context, authViewModel) { + final appState = getIt.get(); + return ( + countriesList: authViewModel.countriesList, + selectedCountry: authViewModel.pickedCountryByUAEUser, + isArabic: appState.isArabic(), + ); + }, + shouldRebuild: (previous, next) => previous.countriesList != next.countriesList || previous.selectedCountry != next.selectedCountry || previous.isArabic != next.isArabic, + builder: (context, data, child) { + final authVM = context.read(); + return DropdownWidget( + labelText: LocaleKeys.country.tr(), + hintText:_country, + isEnable: true, + dropdownItems: (data.countriesList ?? []).map((e) => data.isArabic ? e.nameN ?? "" : e.name ?? "").toList(), + selectedValue: data.selectedCountry != null + ? data.isArabic + ? data.selectedCountry!.nameN ?? "" + : data.selectedCountry!.name ?? "" + : "", + onChange: authVM.onUAEUserCountrySelection, + hasSelectionCustomIcon: true, + labelColor: AppColors.textColor, + padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 16), + selectionCustomIcon: AppAssets.arrow_down, + leadingIcon: AppAssets.globe, + ).withVerticalPadding(8); + }, + ).paddingSymmetrical(0.h, 4.h), + + ])); } - @override - Widget build(BuildContext context) { - return Scaffold( - body: Container( - height: double.infinity, + Widget _otherDetails() { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: ListView( + physics: const BouncingScrollPhysics(), + children: [ + const SizedBox(height: 12), + 'Other Details'.toText16(weight: FontWeight.bold).paddingSymmetrical(4.h, 0.h), + const SizedBox(height: 12), + + InkWell(child: TextInputWidget( + controller: _nameController, + padding: const EdgeInsets.symmetric(horizontal: 16.0), + hintText: 'Medical Report', labelText: 'Select Attachment', + suffix: Icon(Icons.attachment), + isReadOnly: true, + + ), + onTap: (){ + ImageOptions.showImageOptionsNew( + context, + true, + (String image, File file) { + setState(() { + EReferralAttachment eReferralAttachment = new EReferralAttachment(fileName: 'image ${medicalReportImages.length + 1}.png', base64String: image); + medicalReportImages.add(eReferralAttachment); + }); + }, + ); + }, + ).paddingSymmetrical(0.h, 4.h), + + Selector? countriesList, NationalityCountries? selectedCountry, bool isArabic})>( + selector: (context, authViewModel) { + final appState = getIt.get(); + return ( + countriesList: authViewModel.countriesList, + selectedCountry: authViewModel.pickedCountryByUAEUser, + isArabic: appState.isArabic(), + ); + }, + shouldRebuild: (previous, next) => previous.countriesList != next.countriesList || previous.selectedCountry != next.selectedCountry || previous.isArabic != next.isArabic, + builder: (context, data, child) { + final authVM = context.read(); + return DropdownWidget( + labelText: LocaleKeys.branch.tr(), + hintText:_country, + isEnable: true, + dropdownItems: (data.countriesList ?? []).map((e) => data.isArabic ? e.nameN ?? "" : e.name ?? "").toList(), + selectedValue: data.selectedCountry != null + ? data.isArabic + ? data.selectedCountry!.nameN ?? "" + : data.selectedCountry!.name ?? "" + : "", + onChange: authVM.onUAEUserCountrySelection, + hasSelectionCustomIcon: true, + labelColor: AppColors.textColor, + padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 16), + selectionCustomIcon: AppAssets.arrow_down, + leadingIcon: AppAssets.hospital, + ).withVerticalPadding(8); + }, + ).paddingSymmetrical(0.h, 4.h), + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Row( + children: [ + Checkbox( + value: isPatientInsured, + activeColor: AppColors.primaryRedColor, + onChanged: (bool? newValue) { + setState(() { + isPatientInsured = newValue!; + }); + }), + Padding( + padding: const EdgeInsets.all(5.0), + child: Text( + "Patient is Insured".needTranslation, + style: TextStyle(fontSize: 14, fontWeight: FontWeight.w600), + ), + ), + ], + ), + ], + ).paddingSymmetrical(0.h, 4.h), + + isPatientInsured? InkWell(child: TextInputWidget( + controller: _nameController, + padding: const EdgeInsets.symmetric(horizontal: 16.0), + hintText: 'Insurance Document', labelText: 'Select Attachment', + suffix: Icon(Icons.attachment), + isReadOnly: true, + + )) : SizedBox(), + ])); + } + @override + Widget build(BuildContext context) { + final bool step0Active = pageIndex == 0; + final bool step1Active = pageIndex == 1; + final bool step2Active = pageIndex == 2; + + return SizedBox( + height: MediaQuery + .of(context) + .size + .height, // constrain height child: Column( children: [ - Container( - width: double.infinity, - padding: EdgeInsets.only(left: 12,right: 12,top: 12), + const SizedBox(height: 8), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 24.0), child: Row( + mainAxisAlignment: MainAxisAlignment.center, children: [ - Expanded( - child: showProgress( - title: "Requester Info".needTranslation, - status: _currentIndex == 0 - ? "InProgress".needTranslation - : _currentIndex > 0 - ? "Completed".needTranslation - : "Locked".needTranslation, - color: _currentIndex == 0 ? AppColors.infoColor : AppColors.successColor, - ), - ), - Expanded( - child: showProgress( - title:"Patient Info".needTranslation, - status: _currentIndex == 1 - ? "InProgress".needTranslation - : _currentIndex > 1 - ? "Completed".needTranslation - : "Locked".needTranslation, - color: _currentIndex == 1 - ? AppColors.infoColor - : _currentIndex > 1 - ? AppColors.successColor - : AppColors.greyColor, - ), - ), - showProgress( - title: "Other Info".needTranslation, - status: _currentIndex == 2 ? "InProgress".needTranslation :"Locked".needTranslation, - color: _currentIndex == 2 - ? AppColors.infoColor - : _currentIndex > 3 - ? AppColors.successColor - : AppColors.greyColor, - isNeedBorder: false, - ), + _progressStep(title: 'Requester Info', active: step0Active), + _progressStep(title: 'Patient Information', active: step1Active), + _progressStep( + title: 'Other details', active: step2Active, showDivider: false), + ], ), ), Expanded( child: PageView( - physics: NeverScrollableScrollPhysics(), - controller: _controller, - onPageChanged: (index) { - setState(() { - _currentIndex = index; - }); - }, - scrollDirection: Axis.horizontal, - children: [ - // NewEReferralStepOnePage( - // changePageViewIndex: changePageViewIndex, - // createEReferralRequestModel: createEReferralRequestModel, - // ), - // NewEReferralStepTowPage( - // changePageViewIndex: changePageViewIndex, - // createEReferralRequestModel: createEReferralRequestModel, - // ), - // NewEReferralStepThreePage( - // changePageViewIndex: changePageViewIndex, - // createEReferralRequestModel: createEReferralRequestModel, - // ), + controller: _pageController, + physics: const NeverScrollableScrollPhysics(), + onPageChanged: (i) => setState(() => pageIndex = i), + children: [ + _requesterForm(), + _patientInformation(), + // const Center(child: Text('Patient Info - step 2 (placeholder)')), + _otherDetails(), ], ), ), - ], - ), - ), - ); - } - Widget showProgress({required String title, required String status, required Color color, bool isNeedBorder = true}) { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - Container( - width: 26, - height: 26, - // decoration: containerRadius(color, 200), - child: Icon( - Icons.done, - color: Colors.white, - size: 16, - ), - ), - if (isNeedBorder) - Expanded( - child: Padding( - padding: const EdgeInsets.all(8.0), - child:Divider(), - )), - ], - ), - // mHeight(8), - Text( - title, - style: TextStyle( - fontSize: 11, - fontWeight: FontWeight.w600, - letterSpacing: -0.44, - ), - ), - // mHeight(2), - Container( - padding: EdgeInsets.all(5), - // decoration: containerRadius(color.withOpacity(0.2), 4), - child: Text( - status, - style: TextStyle( - fontSize: 8, - fontWeight: FontWeight.w600, - letterSpacing: -0.32, - color: color, - ), - ), - ), + ], - ) - ], - ); + ), + ); + } } -} diff --git a/lib/presentation/emergency_services/call_ambulance/widgets/pickup_location.dart b/lib/presentation/emergency_services/call_ambulance/widgets/pickup_location.dart index 5d073d4..2363644 100644 --- a/lib/presentation/emergency_services/call_ambulance/widgets/pickup_location.dart +++ b/lib/presentation/emergency_services/call_ambulance/widgets/pickup_location.dart @@ -39,54 +39,56 @@ class PickupLocation extends StatelessWidget { return Column( spacing: 12.h, children: [ - RadioGroup( - groupValue: value, - onChanged: (value) { - context - .read() - .updateCallingPlace(value); - }, - child: Row( - mainAxisAlignment: MainAxisAlignment.start, - spacing: 24.h, - children: [ - Row( - children: [ - Radio( - value: AmbulanceCallingPlace.TO_HOSPITAL, - groupValue: value, - activeColor: AppColors.primaryRedColor, - - fillColor: MaterialStateProperty.all(AppColors.primaryRedColor), - ), - "To Hospital" - .needTranslation - .toText12(color: AppColors.textColor) - ], - ).onPress((){ - context - .read() - .updateCallingPlace(AmbulanceCallingPlace.TO_HOSPITAL); - }), - Row( - children: [ - Radio( - value: AmbulanceCallingPlace.FROM_HOSPITAL, - activeColor: AppColors.primaryRedColor, - - fillColor: MaterialStateProperty.all(AppColors.primaryRedColor), - ), - "From Hospital" - .needTranslation - .toText12(color: AppColors.textColor) - ], - ).onPress((){ - context - .read() - .updateCallingPlace(AmbulanceCallingPlace.FROM_HOSPITAL); - }), - ], - ), + // Use a plain Row with Radios and provide required groupValue and onChanged + Row( + mainAxisAlignment: MainAxisAlignment.start, + spacing: 24.h, + children: [ + Row( + children: [ + Radio( + value: AmbulanceCallingPlace.TO_HOSPITAL, + groupValue: value, + onChanged: (AmbulanceCallingPlace? v) { + if (v != null) { + context.read().updateCallingPlace(v); + } + }, + activeColor: AppColors.primaryRedColor, + fillColor: MaterialStateProperty.all(AppColors.primaryRedColor), + ), + "To Hospital" + .needTranslation + .toText12(color: AppColors.textColor) + ], + ).onPress(() { + context + .read() + .updateCallingPlace(AmbulanceCallingPlace.TO_HOSPITAL); + }), + Row( + children: [ + Radio( + value: AmbulanceCallingPlace.FROM_HOSPITAL, + groupValue: value, + onChanged: (AmbulanceCallingPlace? v) { + if (v != null) { + context.read().updateCallingPlace(v); + } + }, + activeColor: AppColors.primaryRedColor, + fillColor: MaterialStateProperty.all(AppColors.primaryRedColor), + ), + "From Hospital" + .needTranslation + .toText12(color: AppColors.textColor) + ], + ).onPress(() { + context + .read() + .updateCallingPlace(AmbulanceCallingPlace.FROM_HOSPITAL); + }), + ], ), Visibility( visible: value == AmbulanceCallingPlace.TO_HOSPITAL, @@ -100,53 +102,55 @@ class PickupLocation extends StatelessWidget { "Select Way" .needTranslation .toText14(color: AppColors.textColor, weight: FontWeight.w600), - RadioGroup( - groupValue: directionValue, - onChanged: (value) { - context - .read() - .updateDirection(value); - }, - child: Row( - mainAxisAlignment: MainAxisAlignment.start, - spacing: 24.h, - children: [ - Row( - children: [ - Radio( - value: AmbulanceDirection.ONE_WAY, - activeColor: AppColors.primaryRedColor, - - fillColor: MaterialStateProperty.all(AppColors.primaryRedColor), - ), - "One Way" - .needTranslation - .toText12(color: AppColors.textColor) - ], - ).onPress((){ - context - .read() - .updateDirection(AmbulanceDirection.ONE_WAY); - }), - Row( - children: [ - Radio( - value: AmbulanceDirection.TWO_WAY, - // activeColor: AppColors.primaryRedColor, - - fillColor: MaterialStateProperty.all(AppColors.primaryRedColor), - ), - "Two Way" - .needTranslation - .toText12(color: AppColors.textColor) - ], - ).onPress((){ - context - .read() - .updateDirection(AmbulanceDirection.TWO_WAY); - }), - ], - ), + // Use a Row and assign groupValue/onChanged to each Radio + Row( + mainAxisAlignment: MainAxisAlignment.start, + spacing: 24.h, + children: [ + Row( + children: [ + Radio( + value: AmbulanceDirection.ONE_WAY, + groupValue: directionValue, + onChanged: (AmbulanceDirection? v) { + if (v != null) { + context.read().updateDirection(v); + } + }, + activeColor: AppColors.primaryRedColor, + fillColor: MaterialStateProperty.all(AppColors.primaryRedColor), + ), + "One Way" + .needTranslation + .toText12(color: AppColors.textColor) + ], + ).onPress(() { + context + .read() + .updateDirection(AmbulanceDirection.ONE_WAY); + }), + Row( + children: [ + Radio( + value: AmbulanceDirection.TWO_WAY, + groupValue: directionValue, + onChanged: (AmbulanceDirection? v) { + if (v != null) { + context.read().updateDirection(v); + } + }, + fillColor: MaterialStateProperty.all(AppColors.primaryRedColor), + ), + "Two Way" + .needTranslation + .toText12(color: AppColors.textColor) + ], + ).onPress(() { + context + .read() + .updateDirection(AmbulanceDirection.TWO_WAY); + }), + ], ), ], ); diff --git a/lib/presentation/radiology/radiology_orders_page.dart b/lib/presentation/radiology/radiology_orders_page.dart index 1d7dfe2..1c3cad4 100644 --- a/lib/presentation/radiology/radiology_orders_page.dart +++ b/lib/presentation/radiology/radiology_orders_page.dart @@ -10,6 +10,7 @@ import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/lab/lab_view_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/presentation/lab/lab_result_item_view.dart'; import 'package:hmg_patient_app_new/presentation/radiology/search_radiology.dart';