Updates & fixes

pull/213/head
haroon amjad 1 day ago
parent 7abee6bb5e
commit 71030c0fe9

@ -400,9 +400,13 @@ class BookAppointmentsViewModel extends ChangeNotifier {
notifyListeners();
}
refreshDoctorsList() {
setIsDoctorsListLoading(true);
getDoctorsList(isNearest: isNearestAppointmentSelected);
}
setIsNearestAppointmentSelected(bool isNearestAppointmentSelected) {
this.isNearestAppointmentSelected = isNearestAppointmentSelected;
if (isNearestAppointmentSelected) {
for (var group in doctorsListGrouped) {
group.sort((a, b) {
@ -646,7 +650,7 @@ class BookAppointmentsViewModel extends ChangeNotifier {
}
//TODO: Make the API dynamic with parameters for ProjectID, isNearest, languageID, doctorId, doctorName
Future<void> getDoctorsList({int projectID = 0, bool isNearest = true, int doctorId = 0, String doctorName = "", Function(dynamic)? onSuccess, Function(String)? onError}) async {
Future<void> getDoctorsList({int projectID = 0, bool isNearest = false, int doctorId = 0, String doctorName = "", Function(dynamic)? onSuccess, Function(String)? onError}) async {
doctorsList.clear();
filteredDoctorList.clear();
doctorsListGrouped.clear();
@ -674,7 +678,7 @@ class BookAppointmentsViewModel extends ChangeNotifier {
clearSearchFilters();
getFiltersFromDoctorList();
_groupDoctorsList();
setIsNearestAppointmentSelected(true);
setIsNearestAppointmentSelected(isNearest);
notifyListeners();
if (onSuccess != null) {
onSuccess(apiResponse);

@ -51,6 +51,7 @@ class PatientAppointmentHistoryResponseModel {
bool? isExecludeDoctor;
dynamic isFollowup;
bool? isLiveCareAppointment;
bool? isLiveCareClinic;
bool? isInOutPatient;
bool? isMedicalReportRequested;
bool? isOnlineCheckedIN;
@ -128,6 +129,7 @@ class PatientAppointmentHistoryResponseModel {
this.isExecludeDoctor,
this.isFollowup,
this.isLiveCareAppointment,
this.isLiveCareClinic,
this.isMedicalReportRequested,
this.isOnlineCheckedIN,
this.latitude,
@ -205,6 +207,7 @@ class PatientAppointmentHistoryResponseModel {
isExecludeDoctor = json['IsExecludeDoctor'];
isFollowup = json['IsFollowup'];
isLiveCareAppointment = json['IsLiveCareAppointment'];
isLiveCareClinic = json['IsLiveCareClinic'];
isInOutPatient = json['IsInOutPatient'];
isMedicalReportRequested = json['IsMedicalReportRequested'];
isOnlineCheckedIN = json['IsOnlineCheckedIN'];

@ -318,7 +318,7 @@ class _MyDoctorsPageState extends State<MyDoctorsPage> {
LoaderBottomSheet.hideLoader();
Navigator.of(context).push(
CustomPageRoute(
page: DoctorProfilePage(),
page: DoctorProfilePage(isDoctorAllowedToBook: !doctor?.isLiveCareClinic),
),
);
}, onError: (err) {

@ -161,7 +161,9 @@ class AppointmentDoctorCard extends StatelessWidget {
LoaderBottomSheet.hideLoader();
Navigator.of(context).push(
CustomPageRoute(
page: DoctorProfilePage(),
page: DoctorProfilePage(
isDoctorAllowedToBook: !(patientAppointmentHistoryResponseModel.isLiveCareAppointment ?? false),
),
),
);
}, onError: (err) {

@ -217,7 +217,7 @@ class _BookAppointmentPageState extends State<BookAppointmentPage> {
LoaderBottomSheet.hideLoader();
Navigator.of(context).push(
CustomPageRoute(
page: DoctorProfilePage(),
page: DoctorProfilePage(isDoctorAllowedToBook: !(myAppointmentsVM.patientMyDoctorsList[index].isLiveCareClinic ?? false)),
),
);
}, onError: (err) {
@ -406,7 +406,7 @@ class _BookAppointmentPageState extends State<BookAppointmentPage> {
LoaderBottomSheet.hideLoader();
Navigator.of(context).push(
CustomPageRoute(
page: DoctorProfilePage(),
page: DoctorProfilePage(isDoctorAllowedToBook: true),
),
);
}, onError: (err) {

@ -22,7 +22,9 @@ import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart';
import 'package:provider/provider.dart';
class DoctorProfilePage extends StatelessWidget {
const DoctorProfilePage({super.key});
const DoctorProfilePage({super.key, required this.isDoctorAllowedToBook});
final bool isDoctorAllowedToBook;
@override
Widget build(BuildContext context) {
@ -187,7 +189,7 @@ class DoctorProfilePage extends StatelessWidget {
),
),
),
Container(
isDoctorAllowedToBook ? Container(
decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
color: AppColors.whiteColor,
borderRadius: 24.h,
@ -265,7 +267,7 @@ class DoctorProfilePage extends StatelessWidget {
iconColor: Colors.white,
iconSize: 20.h,
).paddingSymmetrical(24.h, 24.h),
),
) : SizedBox.shrink(),
],
),
);

@ -214,7 +214,7 @@ class ImmediateLiveCarePaymentDetails extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
LocaleKeys.amountBeforeTax.tr(context: context).toText14(isBold: true),
Utils.getPaymentAmountWithSymbol(immediateLiveCareVM.liveCareImmediateAppointmentFeesList.amount!.toText16(isBold: true, isEnglishOnly: true), AppColors.blackColor, 13,
Utils.getPaymentAmountWithSymbol((immediateLiveCareVM.liveCareImmediateAppointmentFeesList.amount ?? "").toText16(isBold: true, isEnglishOnly: true), AppColors.blackColor, 13,
isSaudiCurrency: immediateLiveCareVM.liveCareImmediateAppointmentFeesList.currency!.toLowerCase() == "sar" ||
immediateLiveCareVM.liveCareImmediateAppointmentFeesList.currency!.toLowerCase() == "ريال"),
],

@ -218,7 +218,7 @@ class _SearchDoctorByNameState extends State<SearchDoctorByName> {
LoaderBottomSheet.hideLoader();
Navigator.of(context).push(
CustomPageRoute(
page: DoctorProfilePage(),
page: DoctorProfilePage(isDoctorAllowedToBook: true),
),
);
},

@ -239,6 +239,9 @@ class _SelectDoctorPageState extends State<SelectDoctorPage> {
value: bookAppointmentsVM.isNearestAppointmentSelected,
onChanged: (newValue) async {
bookAppointmentsVM.setIsNearestAppointmentSelected(newValue);
if(newValue) {
bookAppointmentsVM.refreshDoctorsList();
}
},
),
],
@ -346,7 +349,7 @@ class _SelectDoctorPageState extends State<SelectDoctorPage> {
LoaderBottomSheet.hideLoader();
Navigator.of(context).push(
CustomPageRoute(
page: DoctorProfilePage(),
page: DoctorProfilePage(isDoctorAllowedToBook: true,),
),
);
}, onError: (err) {

@ -1,3 +1,5 @@
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';
@ -67,7 +69,7 @@ class CallAmbulancePage extends StatelessWidget {
myLocationEnabled: true,
inputController: context.read<EmergencyServicesViewModel>().gmsController,
showCenterMarker: true,
bottomPaddingHeight: MediaQuery.of(context).size.height * 0.42,
bottomPaddingHeight: 400.h,
)
else
HMSMap(

@ -1019,7 +1019,7 @@ class _MedicalFilePageState extends State<MedicalFilePage> {
LoaderBottomSheet.hideLoader();
Navigator.of(context).push(
CustomPageRoute(
page: DoctorProfilePage(),
page: DoctorProfilePage(isDoctorAllowedToBook: !(myAppointmentsVM.patientMyDoctorsList[index].isLiveCareClinic ?? false)),
),
);
}, onError: (err) {

@ -54,10 +54,16 @@
// }
import 'dart:async';
import 'dart:io';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.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/location_util.dart';
import 'package:hmg_patient_app_new/core/utils/utils.dart';
import 'package:hmg_patient_app_new/core/utils/size_utils.dart';
import 'package:hmg_patient_app_new/extensions/widget_extensions.dart';
import 'package:hmg_patient_app_new/generated/locale_keys.g.dart';
@ -72,7 +78,7 @@ class GMSMap extends StatefulWidget {
final bool myLocationEnabled;
final bool showCenterMarker;
final Completer<GoogleMapController>? inputController;
final num bottomPaddingHeight;
final double bottomPaddingHeight;
const GMSMap({
super.key,
@ -93,6 +99,7 @@ class GMSMap extends StatefulWidget {
class _GMSMapState extends State<GMSMap> {
late Completer<GoogleMapController> _controller;
GoogleMapController? _activeController;
late MapType _selectedMapType;
bool _showMapTypeSelector = false;
num bottomPaddingHeight = 0;
@ -139,6 +146,37 @@ class _GMSMapState extends State<GMSMap> {
setState(() => _showMapTypeSelector = !_showMapTypeSelector);
}
Future<void> _animateToMyLocation() async {
final appState = getIt.get<AppState>();
final locationUtils = getIt.get<LocationUtils>();
void _moveToLocation() {
if (appState.userLat != 0.0 && appState.userLong != 0.0 && _activeController != null) {
_activeController!.animateCamera(
CameraUpdate.newCameraPosition(
CameraPosition(
target: LatLng(appState.userLat, appState.userLong),
zoom: 16,
),
),
);
}
}
if (appState.userLat != 0.0 && appState.userLong != 0.0) {
_moveToLocation();
} else {
locationUtils.getLocation(
isShowConfirmDialog: true,
onSuccess: (latLng) {
_moveToLocation();
},
onFailure: () {},
onLocationDeniedForever: () {},
);
}
}
@override
Widget build(BuildContext context) {
return Stack(
@ -146,16 +184,21 @@ class _GMSMapState extends State<GMSMap> {
// Google Map
GoogleMap(
mapType: _selectedMapType,
zoomControlsEnabled: true,
myLocationEnabled: widget.myLocationEnabled,
myLocationButtonEnabled: true,
padding: EdgeInsets.only(bottom: double.parse(widget.bottomPaddingHeight.toString())),
zoomControlsEnabled: false,
// myLocationEnabled: widget.myLocationEnabled,
myLocationEnabled: true,
myLocationButtonEnabled: false,
// padding: EdgeInsets.only(bottom: double.parse(widget.bottomPaddingHeight.toString())),
// padding: EdgeInsets.only(top: Platform.isAndroid ? double.parse(widget.bottomPaddingHeight.toString()) : 0, bottom: Platform.isIOS ? double.parse(widget.bottomPaddingHeight.toString()) : 0),
compassEnabled: widget.compassEnabled,
initialCameraPosition: widget.currentLocation,
onCameraMove: widget.onCameraMoved,
onCameraIdle: widget.onCameraIdle,
onMapCreated: (GoogleMapController controller) {
_controller.complete(controller);
_activeController = controller;
if (!_controller.isCompleted) {
_controller.complete(controller);
}
},
),
@ -167,9 +210,33 @@ class _GMSMapState extends State<GMSMap> {
Icons.location_pin,
size: 36.h,
color: AppColors.primaryRedColor,
).paddingOnly(bottom: double.parse((widget.bottomPaddingHeight + 25.h).toString())),
).paddingOnly(bottom: Platform.isAndroid ? 30.h : double.parse((widget.bottomPaddingHeight + 25.h).toString())),
),
// My Location button
PositionedDirectional(
// bottom: 300.h,
// bottom: 400.h,
bottom: widget.bottomPaddingHeight,
start: 16.w,
child: GestureDetector(
onTap: _animateToMyLocation,
child: Container(
width: 42.w,
height: 42.h,
decoration: BoxDecoration(
color: AppColors.whiteColor,
borderRadius: BorderRadius.circular(8.r),
),
child: Icon(
Icons.my_location,
size: 22.h,
color: AppColors.blackBgColor,
),
),
),
),
// Map-type toggle button
PositionedDirectional(
top: 48.h,

@ -68,7 +68,7 @@ class MapUtilityScreen extends StatelessWidget {
myLocationEnabled: true,
inputController: context.read<LocationViewModel>().gmsController,
showCenterMarker: true,
bottomPaddingHeight: MediaQuery.of(context).size.height * 0.2,
bottomPaddingHeight: 300.h,
)
else
HMSMap(

Loading…
Cancel
Save