Merge branch 'master' into haroon_dev

pull/167/head
haroon amjad 1 week ago
commit 20216cd4ae

@ -0,0 +1,5 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M9.25 8C9.25 7.58579 9.58579 7.25 10 7.25H10.0081C10.4223 7.25 10.7581 7.58579 10.7581 8C10.7581 8.41421 10.4223 8.75 10.0081 8.75H10C9.58579 8.75 9.25 8.41421 9.25 8Z" fill="white"/>
<path d="M13.25 8C13.25 7.58579 13.5858 7.25 14 7.25H14.0081C14.4223 7.25 14.7581 7.58579 14.7581 8C14.7581 8.41421 14.4223 8.75 14.0081 8.75H14C13.5858 8.75 13.25 8.41421 13.25 8Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M12.0039 1.25C8.27598 1.25 5.25391 4.27208 5.25391 8C5.25391 9.38824 5.67299 10.6786 6.39155 11.7515C5.6694 12.8779 5.25 14.2322 5.25 15.6847C5.25 19.5503 8.23629 22.7505 12 22.7505C14.6194 22.7505 16.868 21.1942 17.9876 18.9496C16.4713 18.291 14.8272 17.3477 13.3318 16.1767C12.767 15.7344 12.2184 15.2558 11.7036 14.7434C11.8031 14.7478 11.9033 14.75 12.0039 14.75C12.5875 14.75 13.1538 14.6759 13.694 14.5367C13.8779 14.6931 14.0656 14.8462 14.2566 14.9957C15.6278 16.0694 17.1339 16.9362 18.5141 17.5427C18.668 16.9498 18.75 16.3267 18.75 15.6847C18.75 14.2348 18.3321 12.8827 17.6123 11.7574C18.3333 10.6834 18.7539 9.39081 18.7539 8C18.7539 4.27208 15.7318 1.25 12.0039 1.25ZM9.30582 4.0036C8.02465 4.87025 7.18248 6.33678 7.18248 8C7.18248 10.6628 9.3411 12.8214 12.0039 12.8214C14.6667 12.8214 16.8253 10.6628 16.8253 8C16.8253 5.3372 14.6667 3.17857 12.0039 3.17857C11.5521 3.17857 11.2325 3.5278 11.2325 3.90179C11.2325 4.27578 11.5521 4.625 12.0039 4.625C12.2101 4.625 12.3921 4.55043 12.528 4.43216C12.9298 4.08256 13.5389 4.12485 13.8885 4.5266C14.2381 4.92836 14.1958 5.53744 13.794 5.88704C13.3158 6.30318 12.6868 6.55357 12.0039 6.55357C10.5721 6.55357 9.36055 5.44435 9.30582 4.0036Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

@ -890,6 +890,10 @@ class ApiConsts {
static String getProjectsHaveBDClinics = "Services/OUTPs.svc/REST/BD_getProjectsHaveBDClinics";
static String getClinicsBDFreeSlots = "Services/OUTPs.svc/REST/BD_GetFreeSlots";
static String getPatientBloodGroup = "services/PatientVarification.svc/REST/BloodDonation_GetBloodGroupDetails";
static String getPatientBloodAgreement = "Services/PatientVarification.svc/REST/CheckUserAgreementForBloodDonation";
// ************ static values for Api ****************
static final double appVersionID = 50.3;
static final int appChannelId = 3;

@ -183,6 +183,7 @@ class AppAssets {
static const String bulb_icon = '$svgBasePath/bulb_icon.svg';
static const String select_city_icon = '$svgBasePath/select_city_icon.svg';
static const String blood_donation_icon = '$svgBasePath/blood_donation_icon.svg';
static const String my_child_vaccine_icon = '$svgBasePath/my_child_vaccine.svg';
static const String virtual_tour_icon = '$svgBasePath/virtual_tour_icon.svg';
static const String car_parking_icon = '$svgBasePath/car_parking_icon.svg';
static const String latest_news_icon = '$svgBasePath/latest_news_icon.svg';

@ -462,7 +462,7 @@ class AuthenticationViewModel extends ChangeNotifier {
if (isSwitchUser && _appState.getSuperUserID == null) {
nationalIdController.text = responseID.toString();
}else if( isSwitchUser && _appState.getSuperUserID != null){
} else if (isSwitchUser && _appState.getSuperUserID != null) {
nationalIdController.text = _appState.getSuperUserID.toString();
}
@ -1078,4 +1078,30 @@ class AuthenticationViewModel extends ChangeNotifier {
return null;
}
}
Future<void> logout() async {
try {
// Clear user data from AppState
_appState.setAuthenticatedUser(null);
_appState.setAuthenticatedUser(null, isFamily: true);
_appState.setIsAuthenticated = false;
_appState.setAppAuthToken = "";
_appState.setUserBloodGroup = "";
_appState.setSuperUserID = null;
_appState.setIsChildLoggedIn = false;
_appState.setFamilyFileTokenID = "";
_appState.setSelectDeviceByImeiRespModelElement(null);
_appState.setNHICUserData = CheckUserStatusResponseNHIC();
_appState.setUserRegistrationPayload = RegistrationDataModelPayload();
// Clear privilege lists
_appState.setPrivilegeModelList([]);
_appState.setVidaPlusProjectList([]);
_appState.setHMCProjectList([]);
_appState.setProjectsDetailList([]);
await clearDefaultInputValues();
_navigationService.pushAndReplace(AppRoutes.landingScreen);
} catch (e) {
_navigationService.pushAndReplace(AppRoutes.landingScreen);
}
}
}

@ -23,6 +23,8 @@ abstract class BloodDonationRepo {
Future<Either<Failure, GenericApiModel<dynamic>>> getFreeBloodDonationSlots({required Map<String, dynamic> request});
Future<Either<Failure, GenericApiModel<dynamic>>> addUserAgreementForBloodDonation({required Map<String, dynamic> request});
Future<Either<Failure, GenericApiModel<dynamic>>> getUserAgreementForBloodDonation();
}
class BloodDonationRepoImp implements BloodDonationRepo {
@ -76,7 +78,7 @@ class BloodDonationRepoImp implements BloodDonationRepo {
GenericApiModel<List_BloodGroupDetailsModel>? apiResponse;
Failure? failure;
await apiClient.post(
GET_BLOOD_REQUEST,
ApiConsts.getPatientBloodGroup,
body: mapDevice,
isAllowAny: true,
onFailure: (error, statusCode, {messageStatus, failureType}) {
@ -287,4 +289,36 @@ class BloodDonationRepoImp implements BloodDonationRepo {
return Left(UnknownFailure(e.toString()));
}
}
@override
Future<Either<Failure, GenericApiModel<List<dynamic>>>> getUserAgreementForBloodDonation() async {
try {
GenericApiModel<List<dynamic>>? apiResponse;
Failure? failure;
await apiClient.post(
ApiConsts.getPatientBloodAgreement,
body: {},
onFailure: (error, statusCode, {messageStatus, failureType}) {
failure = failureType;
},
onSuccess: (response, statusCode, {messageStatus, errorMessage}) {
try {
apiResponse = GenericApiModel<List<dynamic>>(
messageStatus: messageStatus,
statusCode: statusCode,
errorMessage: null,
data: response,
);
} catch (e) {
failure = DataParsingFailure(e.toString());
}
},
);
if (failure != null) return Left(failure!);
if (apiResponse == null) return Left(ServerFailure("Unknown error"));
return Right(apiResponse!);
} catch (e) {
return Left(UnknownFailure(e.toString()));
}
}
}

@ -4,6 +4,7 @@ import 'package:hmg_patient_app_new/core/app_state.dart';
import 'package:hmg_patient_app_new/core/dependencies.dart';
import 'package:hmg_patient_app_new/core/enums.dart';
import 'package:hmg_patient_app_new/core/utils/doctor_response_mapper.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/features/authentication/authentication_view_model.dart';
import 'package:hmg_patient_app_new/features/blood_donation/blood_donation_repo.dart';
@ -233,7 +234,7 @@ class BloodDonationViewModel extends ChangeNotifier {
return false;
}
if (selectedBloodGroup == null) {
if (selectedGender == null) {
await dialogService.showErrorBottomSheet(
message: "Please choose Gender",
);
@ -258,29 +259,28 @@ class BloodDonationViewModel extends ChangeNotifier {
Future<void> updateBloodGroup() async {
LoaderBottomSheet.showLoader();
// body['City'] = detailsModel.city;
// body['cityCode'] = detailsModel.cityCode;
// body['Gender'] = detailsModel.gender;
// body['BloodGroup'] = detailsModel.bloodGroup;
// body['CellNumber'] = user.mobileNumber;
// body['LanguageID'] = languageID;
// body['NationalID'] = user.nationalityID;
// body['ZipCode'] = user.zipCode ?? "+966";
// body['isDentalAllowedBackend'] = false;
Map<String, dynamic> payload = {
"City": selectedCity?.description,
"cityCode": selectedCity?.iD,
"Gender": selectedGender?.value,
"isDentalAllowedBackend": false
// "Gender": selectedGender?.value,
};
Map<String, dynamic> payload = {"City": selectedCity?.description, "cityCode": selectedCity?.iD, "Gender": selectedGender?.value, "isDentalAllowedBackend": false};
await bloodDonationRepo.updateBloodGroup(request: payload);
await addUserAgreementForBloodDonation();
LoaderBottomSheet.hideLoader();
dialogService.showSuccessBottomSheetWithoutH(message: "Blood Group Updated Successfully", onOkPressed: () {});
}
Future<void> addUserAgreementForBloodDonation() async {
Map<String, dynamic> payload = {"IsAgreed": true};
await bloodDonationRepo.addUserAgreementForBloodDonation(request: payload);
}
Future<void> getUserAgreementForBloodDonation() async {
await bloodDonationRepo.getUserAgreementForBloodDonation();
}
Future<void> fetchAllData() async {
LoaderBottomSheet.showLoader(loadingText: "Fetching Data...");
await getRegionSelectedClinics();
if (isUserAuthanticated()) {
// await getPatientBloodGroupDetails();
}
LoaderBottomSheet.hideLoader();
}
}

@ -15,8 +15,9 @@ import 'package:provider/provider.dart';
class HospitalBottomSheetBodySelection extends StatelessWidget {
final Function(BdGetProjectsHaveBdClinic userSelection) onUserHospitalSelection;
final bool isHideTitle;
const HospitalBottomSheetBodySelection({super.key, required this.onUserHospitalSelection(BdGetProjectsHaveBdClinic userSelection)});
const HospitalBottomSheetBodySelection({super.key, required this.onUserHospitalSelection(BdGetProjectsHaveBdClinic userSelection), this.isHideTitle = false});
@override
Widget build(BuildContext context) {
@ -25,7 +26,7 @@ class HospitalBottomSheetBodySelection extends StatelessWidget {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
LocaleKeys.selectHospital.tr(context: context).toText16(weight: FontWeight.w500, color: AppColors.greyTextColor),
if(!isHideTitle) LocaleKeys.selectHospital.tr(context: context).toText16(weight: FontWeight.w500, color: AppColors.greyTextColor),
SizedBox(height: 16.h),
SizedBox(
height: MediaQuery.sizeOf(context).height * .4,

@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
import 'package:hmg_patient_app_new/core/app_state.dart';
import 'package:hmg_patient_app_new/core/dependencies.dart';
import 'package:hmg_patient_app_new/core/enums.dart';
import 'package:hmg_patient_app_new/core/exceptions/api_failure.dart';
import 'package:hmg_patient_app_new/core/utils/request_utils.dart';
import 'package:hmg_patient_app_new/extensions/string_extensions.dart';
import 'package:hmg_patient_app_new/features/authentication/authentication_view_model.dart';
@ -576,9 +577,18 @@ class MedicalFileViewModel extends ChangeNotifier {
await RequestUtils.getAddFamilyRequest(nationalIDorFile: authVM.nationalIdController.text, mobileNo: authVM.phoneNumberController.text, countryCode: authVM.selectedCountrySignup.countryCode);
final resultEither = await medicalFileRepo.addFamilyFile(request: request.toJson());
resultEither.fold((failure) async => await errorHandlerService.handleError(failure: failure), (apiResponse) async {
resultEither.fold(
(failure) async => await errorHandlerService.handleError(
failure: failure,
onUnHandledFailure: (failure) {
LoaderBottomSheet.hideLoader();
_dialogService.showErrorBottomSheet(
message: failure.message!,
onOkPressed: () {
navigationService.pop();
});
}), (apiResponse) async {
if (apiResponse.messageStatus == 2) {
print("=======");
LoaderBottomSheet.hideLoader();
_dialogService.showErrorBottomSheet(
message: apiResponse.errorMessage!,

@ -28,11 +28,22 @@ import 'package:lottie/lottie.dart';
import 'package:provider/provider.dart';
import 'package:hmg_patient_app_new/presentation/appointments/widgets/hospital_bottom_sheet/hospital_bottom_sheet_body.dart';
class BloodDonationPage extends StatelessWidget {
class BloodDonationPage extends StatefulWidget {
BloodDonationPage({super.key});
@override
State<BloodDonationPage> createState() => _BloodDonationPageState();
}
class _BloodDonationPageState extends State<BloodDonationPage> {
late AppState appState;
@override
void initState() {
super.initState();
Future.microtask(() => getIt.get<BloodDonationViewModel>().fetchAllData());
}
@override
Widget build(BuildContext context) {
appState = getIt<AppState>();
@ -47,70 +58,69 @@ class BloodDonationPage extends StatelessWidget {
trailing: CustomButton(
text: "Book",
onPressed: () {
// if (bloodDonationVM.isUserAuthanticated()) {
bloodDonationVM.fetchHospitalsList().then((value) {
showCommonBottomSheetWithoutHeight(context, title: "Select Hospital", isDismissible: false, child: Consumer<BloodDonationViewModel>(builder: (_, data, __) {
return HospitalBottomSheetBodySelection(
onUserHospitalSelection: (BdGetProjectsHaveBdClinic userChoice) {
print("============User Choice===============");
bloodDonationVM.getFreeBloodDonationSlots(request: {"ClinicID": 134, "ProjectID": userChoice.projectId});
},
);
}), callBackFunc: () {});
});
// } else {
// return showCommonBottomSheetWithoutHeight(
// context,
// title: LocaleKeys.notice.tr(context: context),
// child: Column(
// mainAxisAlignment: MainAxisAlignment.center,
// crossAxisAlignment: CrossAxisAlignment.center,
// children: [
// Lottie.asset(AppAnimations.errorAnimation, repeat: true, reverse: false, frameRate: FrameRate(60), width: 100.h, height: 100.h, fit: BoxFit.fill),
// SizedBox(height: 8.h),
// (LocaleKeys.loginToUseService.tr()).toText16(color: AppColors.blackColor),
// SizedBox(height: 16.h),
// Row(
// children: [
// Expanded(
// child: CustomButton(
// text: LocaleKeys.cancel.tr(),
// onPressed: () {
// Navigator.of(context).pop();
// },
// backgroundColor: AppColors.secondaryLightRedColor,
// borderColor: AppColors.secondaryLightRedColor,
// textColor: AppColors.primaryRedColor,
// icon: AppAssets.cancel,
// iconColor: AppColors.primaryRedColor,
// ),
// ),
// SizedBox(width: 8.h),
// Expanded(
// child: CustomButton(
// text: LocaleKeys.confirm.tr(),
// onPressed: () async {
// Navigator.of(context).pop();
// // Navigator.pushAndRemoveUntil(context, CustomPageRoute(page: LandingNavigation()), (r) => false);
// await getIt<AuthenticationViewModel>().onLoginPressed();
// },
// backgroundColor: AppColors.bgGreenColor,
// borderColor: AppColors.bgGreenColor,
// textColor: Colors.white,
// icon: AppAssets.confirm,
// ),
// ),
// ],
// ),
// SizedBox(height: 16.h),
// ],
// ).center,
// callBackFunc: () {},
// isFullScreen: false,
// isCloseButtonVisible: true,
// );
// }
if (bloodDonationVM.isUserAuthanticated()) {
bloodDonationVM.fetchHospitalsList().then((value) {
showCommonBottomSheetWithoutHeight(context, title: "Select Hospital", isDismissible: false, child: Consumer<BloodDonationViewModel>(builder: (_, data, __) {
return HospitalBottomSheetBodySelection(
isHideTitle: true,
onUserHospitalSelection: (BdGetProjectsHaveBdClinic userChoice) {
bloodDonationVM.getFreeBloodDonationSlots(request: {"ClinicID": 134, "ProjectID": userChoice.projectId});
},
);
}), callBackFunc: () {});
});
} else {
return showCommonBottomSheetWithoutHeight(
context,
title: LocaleKeys.notice.tr(context: context),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Lottie.asset(AppAnimations.errorAnimation, repeat: true, reverse: false, frameRate: FrameRate(60), width: 100.h, height: 100.h, fit: BoxFit.fill),
SizedBox(height: 8.h),
(LocaleKeys.loginToUseService.tr()).toText16(color: AppColors.blackColor),
SizedBox(height: 16.h),
Row(
children: [
Expanded(
child: CustomButton(
text: LocaleKeys.cancel.tr(),
onPressed: () {
Navigator.of(context).pop();
},
backgroundColor: AppColors.secondaryLightRedColor,
borderColor: AppColors.secondaryLightRedColor,
textColor: AppColors.primaryRedColor,
icon: AppAssets.cancel,
iconColor: AppColors.primaryRedColor,
),
),
SizedBox(width: 8.h),
Expanded(
child: CustomButton(
text: LocaleKeys.confirm.tr(),
onPressed: () async {
Navigator.of(context).pop();
// Navigator.pushAndRemoveUntil(context, CustomPageRoute(page: LandingNavigation()), (r) => false);
await getIt<AuthenticationViewModel>().onLoginPressed();
},
backgroundColor: AppColors.bgGreenColor,
borderColor: AppColors.bgGreenColor,
textColor: Colors.white,
icon: AppAssets.confirm,
),
),
],
),
SizedBox(height: 16.h),
],
).center,
callBackFunc: () {},
isFullScreen: false,
isCloseButtonVisible: true,
);
}
},
backgroundColor: AppColors.bgRedLightColor,
borderColor: AppColors.bgRedLightColor,
@ -288,7 +298,60 @@ class BloodDonationPage extends StatelessWidget {
onPressed: () async {
DialogService dialogService = getIt.get<DialogService>();
if (await bloodDonationVM.validateSelections()) {
bloodDonationVM.updateBloodGroup();
if (bloodDonationVM.isUserAuthanticated()) {
bloodDonationVM.updateBloodGroup();
} else {
return showCommonBottomSheetWithoutHeight(
context,
title: LocaleKeys.notice.tr(context: context),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Lottie.asset(AppAnimations.errorAnimation, repeat: true, reverse: false, frameRate: FrameRate(60), width: 100.h, height: 100.h, fit: BoxFit.fill),
SizedBox(height: 8.h),
(LocaleKeys.loginToUseService.tr()).toText16(color: AppColors.blackColor),
SizedBox(height: 16.h),
Row(
children: [
Expanded(
child: CustomButton(
text: LocaleKeys.cancel.tr(),
onPressed: () {
Navigator.of(context).pop();
},
backgroundColor: AppColors.secondaryLightRedColor,
borderColor: AppColors.secondaryLightRedColor,
textColor: AppColors.primaryRedColor,
icon: AppAssets.cancel,
iconColor: AppColors.primaryRedColor,
),
),
SizedBox(width: 8.h),
Expanded(
child: CustomButton(
text: LocaleKeys.confirm.tr(),
onPressed: () async {
Navigator.of(context).pop();
// Navigator.pushAndRemoveUntil(context, CustomPageRoute(page: LandingNavigation()), (r) => false);
await getIt<AuthenticationViewModel>().onLoginPressed();
},
backgroundColor: AppColors.bgGreenColor,
borderColor: AppColors.bgGreenColor,
textColor: Colors.white,
icon: AppAssets.confirm,
),
),
],
),
SizedBox(height: 16.h),
],
).center,
callBackFunc: () {},
isFullScreen: false,
isCloseButtonVisible: true,
);
}
}
},
backgroundColor: AppColors.primaryRedColor,

@ -0,0 +1,376 @@
// 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_state.dart';
// import 'package:hmg_patient_app_new/core/dependencies.dart';
// 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/authentication/authentication_view_model.dart';
// import 'package:hmg_patient_app_new/features/blood_donation/blood_donation_view_model.dart';
// import 'package:hmg_patient_app_new/features/blood_donation/models/blood_group_hospitals_model.dart';
// import 'package:hmg_patient_app_new/features/blood_donation/widgets/hospital_selection.dart';
// import 'package:hmg_patient_app_new/generated/locale_keys.g.dart';
// import 'package:hmg_patient_app_new/presentation/blood_donation/widgets/select_blood_group_widget.dart';
// import 'package:hmg_patient_app_new/presentation/blood_donation/widgets/select_city_widget.dart';
// import 'package:hmg_patient_app_new/presentation/blood_donation/widgets/select_gender_widget.dart';
// import 'package:hmg_patient_app_new/presentation/book_appointment/select_clinic_page.dart';
// import 'package:hmg_patient_app_new/presentation/home/navigation_screen.dart';
// import 'package:hmg_patient_app_new/services/dialog_service.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/common_bottom_sheet.dart';
// import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart';
// import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart';
// import 'package:lottie/lottie.dart';
// import 'package:provider/provider.dart';
// import 'package:hmg_patient_app_new/presentation/appointments/widgets/hospital_bottom_sheet/hospital_bottom_sheet_body.dart';
//
// class MyChildVaccinePage extends StatefulWidget {
// MyChildVaccinePage({super.key});
//
// @override
// State<MyChildVaccinePage> createState() => _MyChildVaccinePageState();
// }
//
// class _MyChildVaccinePageState extends State<MyChildVaccinePage> {
// late AppState appState;
//
// @override
// void initState() {
// super.initState();
// Future.microtask(() => getIt.get<BloodDonationViewModel>().fetchAllData());
// }
//
// @override
// Widget build(BuildContext context) {
// appState = getIt<AppState>();
// return Scaffold(
// backgroundColor: AppColors.bgScaffoldColor,
// body: Consumer<BloodDonationViewModel>(builder: (context, bloodDonationVM, child) {
// return Column(
// children: [
// Expanded(
// child: CollapsingListView(
// title: "Child Vaccines".needTranslation,
// trailing: CustomButton(
// icon: AppAssets.add_icon,
// text: "Add Child",
// onPressed: () {},
// backgroundColor: AppColors.bgRedLightColor,
// borderColor: AppColors.bgRedLightColor,
// textColor: AppColors.primaryRedColor,
// iconColor: AppColors.primaryRedColor,
// padding: EdgeInsetsGeometry.symmetric(vertical: 0.h, horizontal: 10.h)),
// child: Padding(
// padding: EdgeInsets.all(24.w),
// child: SingleChildScrollView(
// child: Container(
// decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r, hasShadow: false),
// child: Padding(
// padding: EdgeInsets.all(16.h),
// child: Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// Row(
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
// children: [
// Row(
// children: [
// Utils.buildSvgWithAssets(icon: AppAssets.select_city_icon, width: 40.h, height: 40.h),
// SizedBox(width: 12.w),
// Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// LocaleKeys.city.tr().toText16(color: AppColors.textColor, weight: FontWeight.w500),
// (appState.isArabic()
// ? (bloodDonationVM.selectedCity?.descriptionN ?? LocaleKeys.select.tr())
// : bloodDonationVM.selectedCity?.description ?? LocaleKeys.select.tr(context: context))
// .toText14(color: AppColors.greyTextColor, weight: FontWeight.w500),
// ],
// ),
// ],
// ),
// Utils.buildSvgWithAssets(icon: AppAssets.arrow_down, width: 25.h, height: 25.h),
// ],
// ).onPress(() async {
// showCommonBottomSheetWithoutHeight(context,
// title: LocaleKeys.selectCity.tr(context: context), isDismissible: true, child: SelectCityWidget(bloodDonationViewModel: bloodDonationVM), callBackFunc: () {});
// }),
// SizedBox(height: 16.h),
// Divider(color: AppColors.borderOnlyColor.withValues(alpha: 0.1), height: 1.h),
// SizedBox(height: 16.h),
// Row(
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
// children: [
// Row(
// children: [
// Utils.buildSvgWithAssets(icon: AppAssets.genderInputIcon, width: 40.h, height: 40.h),
// SizedBox(width: 12.w),
// Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// LocaleKeys.gender.tr().toText16(color: AppColors.textColor, weight: FontWeight.w500),
// (appState.isArabic()
// ? (bloodDonationVM.selectedGender?.typeAr ?? LocaleKeys.select.tr())
// : bloodDonationVM.selectedGender?.type ?? LocaleKeys.select.tr(context: context))
// .toText14(color: AppColors.greyTextColor, weight: FontWeight.w500),
// ],
// ),
// ],
// ),
// Utils.buildSvgWithAssets(icon: AppAssets.arrow_down, width: 25.h, height: 25.h),
// ],
// ).onPress(() {
// showCommonBottomSheetWithoutHeight(context,
// title: LocaleKeys.selectGender.tr(context: context),
// isDismissible: true,
// child: SelectGenderWidget(isArabic: appState.isArabic(), bloodDonationViewModel: bloodDonationVM),
// callBackFunc: () {});
// }),
// SizedBox(height: 16.h),
// Divider(color: AppColors.borderOnlyColor.withValues(alpha: 0.1), height: 1.h),
// SizedBox(height: 16.h),
// Row(
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
// children: [
// Row(
// children: [
// Utils.buildSvgWithAssets(icon: AppAssets.bloodType, width: 40.h, height: 40.h),
// SizedBox(width: 12.w),
// Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// LocaleKeys.bloodType.tr().toText16(color: AppColors.textColor, weight: FontWeight.w500),
// // bloodDonationVM.selectedBloodType?.toText14(color: AppColors.greyTextColor, weight: FontWeight.w500),
// (appState.isArabic()
// ? (bloodDonationVM.selectedBloodType ?? LocaleKeys.select.tr())
// : bloodDonationVM.selectedBloodType ?? LocaleKeys.select.tr(context: context))
// .toText14(color: AppColors.greyTextColor, weight: FontWeight.w500)
// ],
// ),
// ],
// ),
// Utils.buildSvgWithAssets(icon: AppAssets.arrow_down, width: 25.h, height: 25.h),
// ],
// ).onPress(() {
// showCommonBottomSheetWithoutHeight(context,
// title: LocaleKeys.select.tr(context: context),
// isDismissible: true,
// child: SelectBloodGroupWidget(isArabic: appState.isArabic(), bloodDonationViewModel: bloodDonationVM),
// callBackFunc: () {});
// }),
// ],
// ),
// ),
// ),
// ),
// ),
// ),
// ),
// Container(
// decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r, hasShadow: true),
// child: SizedBox(
// child: Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// ],
// ),
// ),
// ),
// ],
// );
// }),
// );
// }
// }
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_state.dart';
import 'package:hmg_patient_app_new/core/dependencies.dart';
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/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';
class MyChildVaccinePage extends StatefulWidget {
const MyChildVaccinePage({super.key});
@override
State<MyChildVaccinePage> createState() => _MyChildVaccinePageState();
}
class _MyChildVaccinePageState extends State<MyChildVaccinePage> {
int selectedChildIndex = 0;
final List<Map<String, dynamic>> children = [
{"name": "Faris", "gender": "Son", "image": AppAssets.babyBoyImg},
{"name": "Zaina", "gender": "Daughter", "image": AppAssets.babyGirlImg},
{"name": "Ahmed", "gender": "Son", "image": AppAssets.babyBoyImg},
];
final List<Map<String, dynamic>> vaccinesData = [
{
"age": "4 months",
"dueDate": "19 Aug, 2025",
"vaccines": ["IPV", "DTap", "Hepatitis B", "HIB", "Pneumococcal Conjugate (PCV)", "Rota"]
},
{
"age": "2 months",
"dueDate": "19 June, 2025",
"vaccines": ["IPV", "DTap", "Hepatitis B", "HIB", "Pneumococcal Conjugate (PCV)", "Rota"]
}
];
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: AppColors.bgScaffoldColor,
body: Column(
children: [
Expanded(
child: CollapsingListView(
title: "Child Vaccines".needTranslation,
trailing: CustomButton(
icon: AppAssets.add_icon,
text: "Add Child",
onPressed: () {},
backgroundColor: AppColors.bgRedLightColor,
borderColor: AppColors.bgRedLightColor,
textColor: AppColors.primaryRedColor,
iconColor: AppColors.primaryRedColor,
padding: EdgeInsets.symmetric(vertical: 0.h, horizontal: 10.w),
),
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(height: 16.h),
_buildChildSelector(),
SizedBox(height: 24.h),
ListView.separated(
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
padding: EdgeInsets.symmetric(horizontal: 24.w),
itemCount: vaccinesData.length,
separatorBuilder: (context, index) => SizedBox(height: 16.h),
itemBuilder: (context, index) {
return _buildVaccineCard(vaccinesData[index]);
},
),
SizedBox(height: 24.h),
],
),
),
),
),
],
),
);
}
Widget _buildChildSelector() {
return SizedBox(
height: 50.h,
child: ListView.separated(
scrollDirection: Axis.horizontal,
padding: EdgeInsets.symmetric(horizontal: 24.w),
itemCount: children.length,
separatorBuilder: (context, index) => SizedBox(width: 12.w),
itemBuilder: (context, index) {
bool isSelected = selectedChildIndex == index;
return GestureDetector(
onTap: () => setState(() => selectedChildIndex = index),
child: Container(
padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 8.h),
decoration: BoxDecoration(
color: isSelected ? AppColors.bgRedLightColor : AppColors.whiteColor,
borderRadius: BorderRadius.circular(12.r),
border: Border.all(
color: isSelected ? AppColors.primaryRedColor : AppColors.borderOnlyColor.withValues(alpha: 0.1),
width: 1,
),
),
child: Row(
children: [
Image.asset(children[index]['image'], width: 24.h, height: 24.h),
SizedBox(width: 8.w),
Text(
"${children[index]['name']} (${children[index]['gender']})",
style: TextStyle(
color: isSelected ? AppColors.primaryRedColor : AppColors.textColor,
fontWeight: isSelected ? FontWeight.w600 : FontWeight.w500,
fontSize: 14.f,
),
),
],
),
),
);
},
),
);
}
Widget _buildVaccineCard(Map<String, dynamic> data) {
return Container(
padding: EdgeInsets.all(20.h),
decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
color: AppColors.whiteColor,
borderRadius: 24.r,
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
data['age'].toString().toText18(weight: FontWeight.bold, color: AppColors.textColor),
SizedBox(height: 12.h),
Container(
padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 8.h),
decoration: BoxDecoration(
color: AppColors.bgScaffoldColor,
borderRadius: BorderRadius.circular(8.r),
),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
Utils.buildSvgWithAssets(icon: AppAssets.calendar, width: 16.h, height: 16.h, iconColor: AppColors.textColor),
SizedBox(width: 8.w),
"Due Date : ${data['dueDate']}".toText12(fontWeight: FontWeight.w500, color: AppColors.textColor),
],
),
),
SizedBox(height: 16.h),
... (data['vaccines'] as List).map((vaccine) => Padding(
padding: EdgeInsets.only(bottom: 12.h),
child: Row(
children: [
Utils.buildSvgWithAssets(icon: AppAssets.tickIcon, width: 20.h, height: 20.h, iconColor: Colors.green),
SizedBox(width: 12.w),
vaccine.toString().toText14(weight: FontWeight.w500, color: AppColors.textColor),
],
),
)),
SizedBox(height: 8.h),
CustomButton(
text: "Send via email",
onPressed: () {},
backgroundColor: AppColors.bgRedLightColor,
borderColor: Colors.transparent,
textColor: AppColors.primaryRedColor,
icon: AppAssets.email,
iconColor: AppColors.primaryRedColor,
width: double.infinity,
),
],
),
);
}
}

@ -147,72 +147,66 @@ class ServicesPage extends StatelessWidget {
}
}),
HmgServicesComponentModel(
3,
LocaleKeys.bloodDonation.tr(),
"",
AppAssets.blood_donation_icon,
bgColor: AppColors.bloodDonationCardColor,
true,
route: null, onTap: () async {
LoaderBottomSheet.showLoader(loadingText: LocaleKeys.pleaseWait.tr());
await bloodDonationViewModel.getRegionSelectedClinics(onSuccess: (val) async {
// await bloodDonationViewModel.getPatientBloodGroupDetails(onSuccess: (val) {
LoaderBottomSheet.hideLoader();
Navigator.of(GetIt.instance<NavigationService>().navigatorKey.currentContext!).push(
CustomPageRoute(
page: BloodDonationPage(),
),
);
// }, onError: (err) {
// LoaderBottomSheet.hideLoader();
// });
}, onError: (err) {
LoaderBottomSheet.hideLoader();
});
}),
// HmgServicesComponentModel(
// 11,
// "Covid 19 Test".needTranslation,
// "".needTranslation,
// AppAssets.covid19icon,
// bgColor: AppColors.covid29Color,
// true,
// route: AppRoutes.covid19Test,
// ),
3,
"Blood Donation".needTranslation,
"".needTranslation,
AppAssets.blood_donation_icon,
bgColor: AppColors.bloodDonationCardColor,
true,
route: AppRoutes.bloodDonationPage,
),
HmgServicesComponentModel(
3,
"My Child Vaccine".needTranslation,
"".needTranslation,
AppAssets.my_child_vaccine_icon,
bgColor: AppColors.myChildVaccineCardColor,
true,
route: AppRoutes.myChildVaccine,
),
// HmgServicesComponentModel(
// 11,
// "Covid 19 Test".needTranslation,
// "".needTranslation,
// AppAssets.covid19icon,
// bgColor: AppColors.covid29Color,
// true,
// route: AppRoutes.covid19Test,
// ),
// HmgServicesComponentModel(
// 11,
// "Vital Sign".needTranslation,
// "".needTranslation,
// AppAssets.covid19icon,
// bgColor: AppColors.covid29Color,
// true,
// route: AppRoutes.vitalSign,
// )
// HmgServicesComponentModel(
// 11,
// "Vital Sign".needTranslation,
// "".needTranslation,
// AppAssets.covid19icon,
// bgColor: AppColors.covid29Color,
// true,
// route: AppRoutes.vitalSign,
// )
// HmgServicesComponentModel(
// 3,
// "Home Health Care".needTranslation,
// "".needTranslation,
// AppAssets.homeBottom,
// bgColor: AppColors.primaryRedColor,
// true,
// route: AppRoutes.homeHealthCarePage,
// ),
// HmgServicesComponentModel(
// 11,
// "Virtual Tour".needTranslation,
// "".needTranslation,
// AppAssets.my_address,
// bgColor: AppColors.quickLoginColor,
// true,
// route: null,
// onTap:(){
// Utils.openWebView(
// url: 'https://hmgwebservices.com/vt_mobile/html/index.html',
// );
// },
// )
// HmgServicesComponentModel(
// 3,
// "Home Health Care".needTranslation,
// "".needTranslation,
// AppAssets.homeBottom,
// bgColor: AppColors.primaryRedColor,
// true,
// route: AppRoutes.homeHealthCarePage,
// ),
// HmgServicesComponentModel(
// 11,
// "Virtual Tour".needTranslation,
// "".needTranslation,
// AppAssets.my_address,
// bgColor: AppColors.quickLoginColor,
// true,
// route: null,
// onTap:(){
// Utils.openWebView(
// url: 'https://hmgwebservices.com/vt_mobile/html/index.html',
// );
// },
// )
];
late final List<HmgServicesComponentModel> hmgHealthToolServices = [

@ -13,6 +13,7 @@ import 'package:hmg_patient_app_new/core/utils/utils.dart';
import 'package:hmg_patient_app_new/extensions/int_extensions.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/habib_wallet/habib_wallet_view_model.dart';
import 'package:hmg_patient_app_new/features/insurance/insurance_view_model.dart';
import 'package:hmg_patient_app_new/features/medical_file/medical_file_view_model.dart';
@ -84,7 +85,9 @@ class ProfileSettingsState extends State<ProfileSettings> {
Widget build(BuildContext context) {
return CollapsingListView(
title: LocaleKeys.profileAndSettings.tr(context: context),
logout: () {},
logout: () {
context.read<AuthenticationViewModel>().logout();
},
isClose: true,
child: SingleChildScrollView(
padding: EdgeInsets.only(top: 24.h, bottom: 24.h),
@ -183,8 +186,7 @@ class ProfileSettingsState extends State<ProfileSettings> {
),
],
),
LocaleKeys.quickActions.tr(context: context).toText18(weight: FontWeight.w600, textOverflow: TextOverflow.ellipsis, maxlines: 1)
.paddingOnly(left: 24.w, right: 24.w),
LocaleKeys.quickActions.tr(context: context).toText18(weight: FontWeight.w600, textOverflow: TextOverflow.ellipsis, maxlines: 1).paddingOnly(left: 24.w, right: 24.w),
Container(
margin: EdgeInsets.only(left: 24.w, right: 24.w, top: 16.h, bottom: 24.h),
padding: EdgeInsets.only(top: 4.h, bottom: 4.h),
@ -279,8 +281,7 @@ class ProfileSettingsState extends State<ProfileSettings> {
children: [
Utils.buildSvgWithAssets(icon: icon, iconColor: AppColors.greyTextColor),
label.toText14(weight: FontWeight.w500, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded,
if (trailingLabel.isNotEmpty)
trailingLabel.toText14(color: AppColors.greyTextColor, weight: FontWeight.w500, textOverflow: TextOverflow.ellipsis, maxlines: 1),
if (trailingLabel.isNotEmpty) trailingLabel.toText14(color: AppColors.greyTextColor, weight: FontWeight.w500, textOverflow: TextOverflow.ellipsis, maxlines: 1),
switchValue != null
? Switch(
value: switchValue,

@ -5,6 +5,7 @@ import 'package:hmg_patient_app_new/presentation/authentication/register.dart';
import 'package:hmg_patient_app_new/presentation/authentication/register_step2.dart';
import 'package:hmg_patient_app_new/presentation/blood_donation/blood_donation_page.dart';
import 'package:hmg_patient_app_new/presentation/book_appointment/book_appointment_page.dart';
import 'package:hmg_patient_app_new/presentation/child_vaccine/my_child_vaccine_page.dart';
import 'package:hmg_patient_app_new/presentation/comprehensive_checkup/comprehensive_checkup_page.dart';
import 'package:hmg_patient_app_new/presentation/covid19test/covid19_landing_page.dart';
import 'package:hmg_patient_app_new/presentation/e_referral/new_e_referral.dart';
@ -54,6 +55,7 @@ class AppRoutes {
static const String homeHealthCarePage = '/homeHealthCarePage';
static const String zoomCallPage = '/zoomCallPage';
static const String bloodDonationPage = '/bloodDonationPage';
static const String myChildVaccine = '/myChildVaccine';
static const String smartWatches = '/smartWatches';
static const String huaweiHealthExample = '/huaweiHealthExample';
static const String covid19Test = '/covid19Test';
@ -104,6 +106,7 @@ class AppRoutes {
possibleConditionsPage: (context) => PossibleConditionsPage(),
triagePage: (context) => TriagePage(),
bloodDonationPage: (context) => BloodDonationPage(),
myChildVaccine: (context) => MyChildVaccinePage(),
bookAppointmentPage: (context) => BookAppointmentPage(),
userInfoSelection: (context) => UserInfoSelectionPage(),
userInfoFlowManager: (context) => UserInfoFlowManager(),

@ -2,6 +2,7 @@ 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/utils/size_utils.dart';
import 'package:hmg_patient_app_new/core/utils/utils.dart';
import 'package:hmg_patient_app_new/extensions/route_extensions.dart';
import 'package:hmg_patient_app_new/extensions/string_extensions.dart';
import 'package:hmg_patient_app_new/features/medical_file/models/family_file_response_model.dart';
@ -23,6 +24,9 @@ abstract class DialogService {
Future<void> showCommonBottomSheetWithoutH({String? label, required String message, required Function() onOkPressed, Function()? onCancelPressed});
Future<void> showSuccessBottomSheetWithoutH({String? label, required String message, required Function() onOkPressed, Function()? onCancelPressed});
Future<void> showFamilyBottomSheetWithoutH(
{String? label,
required String message,
@ -122,6 +126,20 @@ class DialogServiceImp implements DialogService {
);
}
@override
Future<void> showSuccessBottomSheetWithoutH(
{String? label, required String message, required Function() onOkPressed, Function()? onCancelPressed}) async {
final context = navigationService.navigatorKey.currentContext;
if (context == null) return;
showCommonBottomSheetWithoutHeight(
context,
title: label ?? "",
child: Utils.getSuccessWidget(loadingText: message.needTranslation),
callBackFunc: () {},
);
}
@override
Future<void> showFamilyBottomSheetWithoutH(
{String? label,
@ -256,6 +274,8 @@ Widget exceptionBottomSheetWidget(
);
}
Widget showPhoneNumberPickerWidget(
{required BuildContext context, String? message, required Function() onSMSPress, required Function() onWhatsappPress}) {
return StatefulBuilder(builder: (BuildContext context, StateSetter setModalState) {

@ -99,6 +99,7 @@ class AppColors {
// Services Page Colors
static const Color eReferralCardColor = Color(0xFFFF8012); // #FF8012
static const Color bloodDonationCardColor = Color(0xFFFF5662); // #FF5662
static const Color myChildVaccineCardColor = Color(0xFFFF2D78); // #FF5662
static const Color bookAppointment = Color(0xFF415364); // #415364
// Water Monitor

Loading…
Cancel
Save