Merge pull request 'single map screen added to the project for multiple place usage' (#102) from ambulance_listing_and_request into master
Reviewed-on: #102master
commit
9ca0a985a3
@ -0,0 +1,245 @@
|
||||
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/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/emergency_services/emergency_services_view_model.dart';
|
||||
import 'package:hmg_patient_app_new/features/emergency_services/models/AmbulanceCallingPlace.dart';
|
||||
import 'package:hmg_patient_app_new/features/location/GeocodeResponse.dart';
|
||||
import 'package:hmg_patient_app_new/features/location/PlaceDetails.dart';
|
||||
import 'package:hmg_patient_app_new/features/location/PlacePrediction.dart';
|
||||
import 'package:hmg_patient_app_new/features/location/location_view_model.dart';
|
||||
import 'package:hmg_patient_app_new/generated/locale_keys.g.dart';
|
||||
import 'package:hmg_patient_app_new/presentation/appointments/widgets/appointment_doctor_card.dart';
|
||||
import 'package:hmg_patient_app_new/presentation/emergency_services/call_ambulance/widgets/AddressItem.dart';
|
||||
import 'package:hmg_patient_app_new/presentation/emergency_services/call_ambulance/widgets/HospitalBottomSheetBody.dart';
|
||||
import 'package:hmg_patient_app_new/presentation/emergency_services/call_ambulance/widgets/appointment_bottom_sheet.dart' show AppointmentBottomSheet;
|
||||
import 'package:hmg_patient_app_new/presentation/emergency_services/widgets/location_input_bottom_sheet.dart';
|
||||
import 'package:hmg_patient_app_new/theme/colors.dart';
|
||||
import 'package:hmg_patient_app_new/widgets/CustomSwitch.dart';
|
||||
import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart';
|
||||
import 'package:hmg_patient_app_new/widgets/expandable_bottom_sheet/ExpandableBottomSheet.dart';
|
||||
import 'package:hmg_patient_app_new/widgets/expandable_bottom_sheet/model/BottomSheetType.dart';
|
||||
import 'package:hmg_patient_app_new/widgets/input_widget.dart';
|
||||
import 'package:hmg_patient_app_new/widgets/map/HMSMap.dart';
|
||||
import 'package:hmg_patient_app_new/widgets/map/gms_map.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
import '../../../widgets/common_bottom_sheet.dart';
|
||||
|
||||
/// screen to be used to get the location desired by the user
|
||||
/// to place the values in the request.
|
||||
/// [confirmButtonString] button text that will be displayed on the button
|
||||
/// [titleString] bottom sheet title
|
||||
/// [subTitleString] bottom sheet subtitle for details
|
||||
/// [onCrossClicked] if something has to be done if the user close the screen
|
||||
/// [isGmsAvailable] shows if the device that is running the application is GMS or HMS
|
||||
///
|
||||
/// it results [true] if the user clicks on the submit button
|
||||
/// and [false] if the user closes the screen without giving the consent to proceed for the request
|
||||
class MapUtilityScreen extends StatelessWidget {
|
||||
|
||||
final String confirmButtonString;
|
||||
final String titleString;
|
||||
final String subTitleString;
|
||||
final bool isGmsAvailable;
|
||||
final VoidCallback? onCrossClicked;
|
||||
|
||||
const MapUtilityScreen({super.key, required this.confirmButtonString, required this.titleString, required this.subTitleString, required this.isGmsAvailable, this.onCrossClicked});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
floatingActionButton: Padding(
|
||||
padding: EdgeInsetsDirectional.only(end: 8.h, bottom: 68.h),
|
||||
child: DecoratedBox(
|
||||
decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
|
||||
color: AppColors.whiteColor, borderRadius: 12.h),
|
||||
child: Utils.buildSvgWithAssets(
|
||||
icon: AppAssets.locate_me, width: 24.h, height: 24.h)
|
||||
.paddingAll(12.h)
|
||||
.onPress(() {
|
||||
context
|
||||
.read<LocationViewModel>()
|
||||
.moveToCurrentLocation();
|
||||
}),
|
||||
),
|
||||
),
|
||||
bottomSheet: FixedBottomSheet(context),
|
||||
body: Stack(
|
||||
children: [
|
||||
if (isGmsAvailable)
|
||||
GMSMap(
|
||||
currentLocation:
|
||||
context.read<LocationViewModel>().getGMSLocation(),
|
||||
onCameraMoved: (value) => context
|
||||
.read<LocationViewModel>()
|
||||
.handleGMSMapCameraMoved(value),
|
||||
onCameraIdle:
|
||||
context.read<LocationViewModel>().handleOnCameraIdle,
|
||||
myLocationEnabled: true,
|
||||
inputController:
|
||||
context.read<LocationViewModel>().gmsController,
|
||||
showCenterMarker: true,
|
||||
)
|
||||
else
|
||||
HMSMap(
|
||||
currentLocation:
|
||||
context.read<LocationViewModel>().getHMSLocation(),
|
||||
onCameraMoved: (value) => context
|
||||
.read<LocationViewModel>()
|
||||
.handleHMSMapCameraMoved(value),
|
||||
onCameraIdle:
|
||||
context.read<LocationViewModel>().handleOnCameraIdle,
|
||||
myLocationEnabled: false,
|
||||
inputController:
|
||||
context.read<LocationViewModel>().hmsController,
|
||||
showCenterMarker: true,
|
||||
),
|
||||
Align(
|
||||
alignment: AlignmentDirectional.topStart,
|
||||
child: Utils.buildSvgWithAssets(
|
||||
icon: AppAssets.closeBottomNav, width: 32.h, height: 32.h)
|
||||
.onPress(() {
|
||||
onCrossClicked?.call();
|
||||
// context
|
||||
// .read<EmergencyServicesViewModel>()
|
||||
// .flushPickupInformation();
|
||||
|
||||
Navigator.pop(context, false);
|
||||
}),
|
||||
).paddingOnly(top: 51.h, left: 24.h),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget FixedBottomSheet(BuildContext context) {
|
||||
return GestureDetector(
|
||||
onVerticalDragUpdate: (details){
|
||||
},
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
crossAxisAlignment: CrossAxisAlignment.end,
|
||||
children: [
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
spacing: 24.h,
|
||||
children: [
|
||||
inputFields(context).paddingSymmetrical(16.h, 0.h),
|
||||
SizedBox(
|
||||
child: DecoratedBox(
|
||||
decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
|
||||
color: AppColors.scaffoldBgColor,
|
||||
customBorder: BorderRadius.only(
|
||||
topLeft: Radius.circular(24.h),
|
||||
topRight: Radius.circular(24.h),
|
||||
),
|
||||
),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
spacing: 24.h,
|
||||
children: [
|
||||
Column(
|
||||
spacing: 4.h,
|
||||
children: [
|
||||
titleString.toText21(
|
||||
weight: FontWeight.w600,
|
||||
color: AppColors.textColor,
|
||||
),
|
||||
subTitleString.needTranslation.toText12(
|
||||
fontWeight: FontWeight.w500,
|
||||
color: AppColors.greyTextColor,
|
||||
)
|
||||
],
|
||||
),
|
||||
CustomButton(
|
||||
text: confirmButtonString.needTranslation,
|
||||
onPressed: () {
|
||||
///indicates that the screen has resulted success and should be closed
|
||||
Navigator.pop(context,true);
|
||||
},
|
||||
)
|
||||
],
|
||||
).paddingOnly(top: 24.h, bottom: 32.h, left: 24.h, right: 24.h),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
leadingIcon(String leadingIcon) {
|
||||
return Container(
|
||||
height: 40.h,
|
||||
width: 40.h,
|
||||
margin: EdgeInsets.only(right: 10.h),
|
||||
padding: EdgeInsets.all(8.h),
|
||||
decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
|
||||
borderRadius: 12.h,
|
||||
color: AppColors.greyColor,
|
||||
),
|
||||
child: Utils.buildSvgWithAssets(icon: leadingIcon),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
|
||||
textPlaceInput(context) {
|
||||
return Consumer<LocationViewModel>(builder: (_, vm, __) {
|
||||
return SizedBox(
|
||||
width: MediaQuery.sizeOf(context).width,
|
||||
child: TextInputWidget(
|
||||
labelText: "Enter Pickup Location Manually".needTranslation,
|
||||
hintText: "Enter Pickup Location".needTranslation,
|
||||
controller: TextEditingController(
|
||||
text: vm.geocodeResponse?.results.first.formattedAddress ??
|
||||
vm.selectedPrediction?.description,
|
||||
),
|
||||
leadingIcon: AppAssets.location_pickup,
|
||||
isAllowLeadingIcon: true,
|
||||
isEnable: false,
|
||||
prefix: null,
|
||||
autoFocus: false,
|
||||
isBorderAllowed: false,
|
||||
keyboardType: TextInputType.text,
|
||||
padding: EdgeInsets.symmetric(
|
||||
vertical: ResponsiveExtension(10).h,
|
||||
horizontal: ResponsiveExtension(15).h,
|
||||
),
|
||||
).onPress(() {
|
||||
openLocationInputBottomSheet(context);
|
||||
}),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
///decide which field to show first based on the selected calling place
|
||||
Widget inputFields(BuildContext context) {
|
||||
return textPlaceInput(context);
|
||||
}
|
||||
|
||||
openLocationInputBottomSheet(BuildContext context) {
|
||||
context.read<LocationViewModel>().flushSearchPredictions();
|
||||
showCommonBottomSheetWithoutHeight(
|
||||
title: "".needTranslation,
|
||||
context,
|
||||
child: SizedBox(
|
||||
height: MediaQuery.sizeOf(context).height * .8,
|
||||
child: LocationInputBottomSheet(),
|
||||
),
|
||||
isFullScreen: false,
|
||||
isCloseButtonVisible: true,
|
||||
hasBottomPadding: false,
|
||||
backgroundColor: AppColors.bottomSheetBgColor,
|
||||
callBackFunc: () {},
|
||||
);
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue