haroon_dev #130

Merged
Haroon6138 merged 9 commits from haroon_dev into master 3 weeks ago

@ -66,6 +66,7 @@ class BloodDonationRepoImp implements BloodDonationRepo {
await apiClient.post(
GET_BLOOD_REQUEST,
body: mapDevice,
isAllowAny: true,
onFailure: (error, statusCode, {messageStatus, failureType}) {
failure = failureType;
},

@ -52,6 +52,8 @@ class BookAppointmentsViewModel extends ChangeNotifier {
int initialSlotDuration = 0;
bool isNearestAppointmentSelected = false;
LocationUtils locationUtils;
List<GetClinicsListResponseModel> clinicsList = [];
@ -201,6 +203,18 @@ class BookAppointmentsViewModel extends ChangeNotifier {
notifyListeners();
}
setIsNearestAppointmentSelected(bool isNearestAppointmentSelected) {
this.isNearestAppointmentSelected = isNearestAppointmentSelected;
if (isNearestAppointmentSelected) {
doctorsList.sort((a, b) => DateUtil.convertStringToDate(a.nearestFreeSlot!).compareTo(DateUtil.convertStringToDate(b.nearestFreeSlot!)));
} else {
doctorsList.sort((a, b) => b.decimalDoctorRate!.compareTo(a.decimalDoctorRate!));
}
notifyListeners();
}
setIsWaitingAppointmentSelected(bool isWaitingAppointmentSelected) {
this.isWaitingAppointmentSelected = isWaitingAppointmentSelected;
notifyListeners();
@ -401,6 +415,7 @@ class BookAppointmentsViewModel extends ChangeNotifier {
doctorsList = apiResponse.data!;
filteredDoctorList = doctorsList;
isDoctorsListLoading = false;
doctorsList.sort((a, b) => b.decimalDoctorRate!.compareTo(a.decimalDoctorRate!));
initializeFilteredList();
clearSearchFilters();
getFiltersFromDoctorList();

@ -37,7 +37,9 @@ class LocationViewModel extends ChangeNotifier {
}
GMSMapServices.CameraPosition getGMSLocation() {
return GMSMapServices.CameraPosition(target: GMSMapServices.LatLng(getIt<AppState>().userLat, getIt<AppState>().userLong), zoom: 18);
return GMSMapServices.CameraPosition(
target: GMSMapServices.LatLng(getIt<AppState>().userLat != 0.0 ? getIt<AppState>().userLat : 24.7248316, getIt<AppState>().userLong != 0.0 ? getIt<AppState>().userLong : 46.4928828),
zoom: 18);
}
void placeValueInController() async {

@ -110,7 +110,7 @@ class PayfortViewModel extends ChangeNotifier {
onError!(failure.message);
},
(apiResponse) {
log(apiResponse.data);
log(apiResponse.data.toString());
if (onSuccess != null) {
onSuccess(apiResponse);
}
@ -134,7 +134,7 @@ class PayfortViewModel extends ChangeNotifier {
onError!(failure.message);
},
(apiResponse) {
log(apiResponse.data);
log(apiResponse.data.toString());
if (onSuccess != null) {
onSuccess(apiResponse);
}

@ -58,7 +58,7 @@ class AppointmentCheckinBottomSheet extends StatelessWidget {
double dist = Utils.distance(value.latitude, value.longitude, double.parse(projectDetailListModel.latitude!), double.parse(projectDetailListModel.longitude!)).ceilToDouble() * 1000;
print(dist);
if (dist <= projectDetailListModel.geofenceRadius!) {
sendCheckInRequest(projectDetailListModel.checkInQrCode!, context);
sendCheckInRequest(projectDetailListModel.checkInQrCode!, 3, context);
} else {
showCommonBottomSheetWithoutHeight(context,
title: "Error".needTranslation,
@ -77,7 +77,7 @@ class AppointmentCheckinBottomSheet extends StatelessWidget {
Future.delayed(const Duration(milliseconds: 500), () {
showNfcReader(context, onNcfScan: (String nfcId) {
Future.delayed(const Duration(milliseconds: 100), () {
sendCheckInRequest(nfcId, context);
sendCheckInRequest(nfcId, 1, context);
});
}, onCancel: () {});
});
@ -90,7 +90,7 @@ class AppointmentCheckinBottomSheet extends StatelessWidget {
).onPress(() async {
String onlineCheckInQRCode = (await BarcodeScanner.scan().then((value) => value.rawContent));
if (onlineCheckInQRCode != "") {
sendCheckInRequest(onlineCheckInQRCode, context);
sendCheckInRequest(onlineCheckInQRCode, 2, context);
} else {}
}),
],
@ -138,12 +138,12 @@ class AppointmentCheckinBottomSheet extends StatelessWidget {
);
}
void sendCheckInRequest(String scannedCode, BuildContext context) async {
void sendCheckInRequest(String scannedCode, int checkInType, BuildContext context) async {
LoaderBottomSheet.showLoader(loadingText: "Processing Check-In...".needTranslation);
await myAppointmentsViewModel.sendCheckInNfcRequest(
patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel,
scannedCode: scannedCode,
checkInType: 2,
checkInType: checkInType,
onSuccess: (apiResponse) {
LoaderBottomSheet.hideLoader();
showCommonBottomSheetWithoutHeight(context, title: "Success".needTranslation, child: Utils.getSuccessWidget(loadingText: LocaleKeys.success.tr()), callBackFunc: () async {

@ -1,4 +1,6 @@
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';
@ -321,15 +323,29 @@ class ImmediateLiveCarePaymentDetails extends StatelessWidget {
}
Future<bool> askVideoCallPermission() async {
Map<Permission, PermissionStatus> statuses = await [Permission.camera, Permission.microphone, Permission.notification].request();
bool hasPermission = false;
if (Platform.isIOS) {
Map<Permission, PermissionStatus> statuses = await [Permission.camera, Permission.microphone].request();
if (statuses[Permission.camera] == PermissionStatus.granted && statuses[Permission.microphone] == PermissionStatus.granted && statuses[Permission.notification] == PermissionStatus.granted) {
// Camera permission granted
return true;
if (statuses[Permission.camera] == PermissionStatus.granted && statuses[Permission.microphone] == PermissionStatus.granted) {
// Camera permission granted
hasPermission = true;
} else {
hasPermission = false;
}
} else {
return false;
Map<Permission, PermissionStatus> statuses = await [Permission.camera, Permission.microphone, Permission.notification].request();
if (statuses[Permission.camera] == PermissionStatus.granted && statuses[Permission.microphone] == PermissionStatus.granted && statuses[Permission.notification] == PermissionStatus.granted) {
// Camera permission granted
hasPermission = true;
} else {
hasPermission = false;
}
}
return hasPermission;
// if (!(await Permission.camera.request().isGranted) || !(await Permission.microphone.request().isGranted)) {
// return false;
// }

@ -43,6 +43,7 @@ class _SelectDoctorPageState extends State<SelectDoctorPage> {
@override
void initState() {
scheduleMicrotask(() {
bookAppointmentsViewModel.setIsNearestAppointmentSelected(false);
if (bookAppointmentsViewModel.isLiveCareSchedule) {
bookAppointmentsViewModel.getLiveCareDoctorsList();
} else {
@ -143,8 +144,32 @@ class _SelectDoctorPageState extends State<SelectDoctorPage> {
),
],
).paddingSymmetrical(0.h, 0.h),
SizedBox(height: 16.h),
Row(
mainAxisSize: MainAxisSize.max,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
LocaleKeys.nearestAppo.tr(context: context).toText13(isBold: true),
SizedBox(height: 4.h),
"View nearest available appointments".needTranslation.toText11(color: AppColors.textColorLight, weight: FontWeight.w500),
],
),
const Spacer(),
Switch(
activeThumbColor: AppColors.successColor,
activeTrackColor: AppColors.successColor.withValues(alpha: .15),
value: bookAppointmentsVM.isNearestAppointmentSelected,
onChanged: (newValue) async {
bookAppointmentsVM.setIsNearestAppointmentSelected(newValue);
},
),
],
),
ListView.separated(
padding: EdgeInsets.only(top: 24.h),
padding: EdgeInsets.only(top: 16.h),
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
itemCount: bookAppointmentsVM.isDoctorsListLoading

@ -115,12 +115,14 @@ class DoctorCard extends StatelessWidget {
iconColor: AppColors.ratingColorYellow,
labelText: "Rating: ${isLoading ? 4.78 : doctorsListResponseModel.decimalDoctorRate}".needTranslation,
).toShimmer2(isShow: isLoading) : SizedBox(),
doctorsListResponseModel.nearestFreeSlot != null
bookAppointmentsViewModel.isNearestAppointmentSelected
? doctorsListResponseModel.nearestFreeSlot != null
? AppCustomChipWidget(
labelText: (isLoading ? "Cardiologist" : DateUtil.getDateStringForNearestSlot(doctorsListResponseModel.nearestFreeSlot)).needTranslation,
backgroundColor: AppColors.successColor,
textColor: AppColors.whiteColor,
).toShimmer2(isShow: isLoading)
: SizedBox.shrink()
: SizedBox.shrink(),
],
),

@ -86,14 +86,16 @@ class ServicesPage extends StatelessWidget {
route: null, onTap: () async {
LoaderBottomSheet.showLoader(loadingText: "Fetching Data...");
await bloodDonationViewModel.getRegionSelectedClinics(onSuccess: (val) async {
await bloodDonationViewModel.getPatientBloodGroupDetails(onSuccess: (val) {
// 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();
});

@ -409,15 +409,15 @@ class _LandingPageState extends State<LandingPage> {
SizedBox(height: 10.h),
"Hala ${appState.getAuthenticatedUser()!.firstName}!!!".needTranslation.toText16(isBold: true),
SizedBox(height: 8.h),
"Your turn is after ${immediateLiveCareVM.patientLiveCareHistoryList[0].patCount} patients.".toText14(isBold: true),
SizedBox(height: 8.h),
Column(
"Your turn is after ${immediateLiveCareVM.patientLiveCareHistoryList[0].patCount} patients.".needTranslation.toText14(isBold: true),
SizedBox(height: 8.h),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
"Expected waiting time: ".toText12(isBold: true),
SizedBox(height: 8.h),
ValueListenableBuilder<Duration>(
valueListenable: immediateLiveCareVM.durationNotifier,
"Expected waiting time: ".needTranslation.toText12(isBold: true),
SizedBox(height: 7.h),
ValueListenableBuilder<Duration>(
valueListenable: immediateLiveCareVM.durationNotifier,
builder: (context, duration, child) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
@ -427,9 +427,8 @@ class _LandingPageState extends State<LandingPage> {
);
},
),
SizedBox(height: 12.h),
],
),
],
),
// CustomButton(
// text: "View Details".needTranslation,
// onPressed: () async {

@ -108,7 +108,7 @@ class _PatientSickleavesListPageState extends State<PatientSickleavesListPage> {
? PatientSickLeaveCard(
patientSickLeavesResponseModel: PatientSickLeavesResponseModel(),
isLoading: true,
).paddingSymmetrical(24.h, 0.0)
).paddingSymmetrical(0.h, 12.h)
: model.patientSickLeaveList.isNotEmpty
? AnimationConfiguration.staggeredList(
position: index,

@ -207,8 +207,8 @@ class ScrollAnimatedTitle extends StatefulWidget implements PreferredSizeWidget
}
class _ScrollAnimatedTitleState extends State<ScrollAnimatedTitle> {
static const double _maxFont = 24;
static const double _minFont = 14;
static const double _maxFont = 26;
static const double _minFont = 18;
static const double _maxHeight = 80;
static const double _minHeight = 56;

Loading…
Cancel
Save