import 'dart:convert'; import 'dart:developer'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:customer/models/rental_order_model.dart'; import 'package:customer/models/rental_package_model.dart'; import 'package:customer/models/user_model.dart'; import 'package:customer/models/vendor_model.dart'; import 'package:customer/screen_ui/rental_service/rental_conformation_screen.dart'; import 'package:customer/widget/geoflutterfire/src/geoflutterfire.dart'; import 'package:flutter/material.dart'; import 'package:geolocator/geolocator.dart'; import 'package:get/get.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart' as latlong; import '../constant/constant.dart'; import '../models/payment_model/cod_setting_model.dart'; import '../models/payment_model/flutter_wave_model.dart'; import '../models/payment_model/mercado_pago_model.dart'; import '../models/payment_model/mid_trans.dart'; import '../models/payment_model/orange_money.dart'; import '../models/payment_model/pay_fast_model.dart'; import '../models/payment_model/pay_stack_model.dart'; import '../models/payment_model/paypal_model.dart'; import '../models/payment_model/paytm_model.dart'; import '../models/payment_model/razorpay_model.dart'; import '../models/payment_model/stripe_model.dart'; import '../models/payment_model/wallet_setting_model.dart'; import '../models/payment_model/xendit.dart'; import '../models/rental_vehicle_type.dart'; import '../screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart'; import '../service/fire_store_utils.dart'; import '../themes/show_toast_dialog.dart'; import '../utils/preferences.dart'; import '../utils/utils.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart' as gmaps; class RentalHomeController extends GetxController { RxBool isLoading = false.obs; // Location input final Rx sourceTextEditController = TextEditingController().obs; // Selected date Rx selectedDate = DateTime.now().obs; // Vehicle list + selected vehicle RxList vehicleTypes = [].obs; Rx selectedVehicleType = Rx(null); RxList rentalPackages = [].obs; Rx selectedPackage = Rx(null); Rx userModel = UserModel().obs; final RxString selectedPaymentMethod = ''.obs; final Rx departureLatLong = gmaps.LatLng(0.0, 0.0).obs; final Rx departureLatLongOsm = latlong.LatLng(0.0, 0.0).obs; @override void onInit() { super.onInit(); if (Constant.userModel != null) { userModel.value = Constant.userModel!; } getVehicleType(); fetchCurrentLocation(); } void fetchCurrentLocation() async { try { Position? position = await Utils.getCurrentLocation(); if (position != null) { Constant.currentLocation = position; // Set default coordinates for Google or OSM departureLatLong.value = gmaps.LatLng( position.latitude, position.longitude, ); departureLatLongOsm.value = latlong.LatLng( position.latitude, position.longitude, ); // Get readable address String address = await Utils.getAddressFromCoordinates( position.latitude, position.longitude, ); sourceTextEditController.value.text = address; } } catch (e) { ShowToastDialog.showToast("Unable to fetch current location".tr); } } /// Fetch Vehicle Types Future getVehicleType() async { isLoading.value = true; await FireStoreUtils.getRentalVehicleType().then((value) async { vehicleTypes.value = value; if (vehicleTypes.isNotEmpty) { selectedVehicleType.value = vehicleTypes[0]; await getRentalPackage(); } }); await getPaymentSettings(); isLoading.value = false; } /// Date Picker Future pickDate(BuildContext context) async { final DateTime? picked = await showDatePicker( context: context, initialDate: selectedDate.value, firstDate: DateTime.now(), lastDate: DateTime(2100), ); if (picked != null) { selectedDate.value = picked; } } Future getRentalPackage() async { await FireStoreUtils.getRentalPackage( selectedVehicleType.value!.id.toString(), ).then((value) { rentalPackages.value = value; if (rentalPackages.isNotEmpty) { selectedPackage.value = rentalPackages[0]; } }); } void completeOrder() { DestinationLocation sourceLocation = DestinationLocation( latitude: Constant.selectedMapType == 'osm' ? departureLatLongOsm.value.latitude : departureLatLong.value.latitude, longitude: Constant.selectedMapType == 'osm' ? departureLatLongOsm.value.longitude : departureLatLong.value.longitude, ); print("=====>"); print(sourceTextEditController.value.text); RentalOrderModel rentalOrderModel = RentalOrderModel(); rentalOrderModel.id = Constant.getUuid(); rentalOrderModel.authorID = userModel.value.id; rentalOrderModel.author = userModel.value; rentalOrderModel.rentalVehicleType = selectedVehicleType.value; rentalOrderModel.vehicleId = selectedVehicleType.value!.id; rentalOrderModel.sectionId = Constant.sectionConstantModel!.id; rentalOrderModel.sourceLocationName = sourceTextEditController.value.text; rentalOrderModel.bookingDateTime = Timestamp.fromDate(selectedDate.value); rentalOrderModel.paymentMethod = selectedPaymentMethod.value; rentalOrderModel.paymentStatus = false; rentalOrderModel.status = Constant.orderPlaced; rentalOrderModel.subTotal = selectedPackage.value!.baseFare; rentalOrderModel.rentalPackageModel = selectedPackage.value; rentalOrderModel.taxSetting = Constant.taxList; rentalOrderModel.createdAt = Timestamp.now(); rentalOrderModel.sourceLocation = sourceLocation; rentalOrderModel.adminCommission = Constant.sectionConstantModel!.adminCommision!.amount; rentalOrderModel.adminCommissionType = Constant.sectionConstantModel!.adminCommision!.commissionType; rentalOrderModel.sourcePoint = G( geopoint: GeoPoint( sourceLocation.latitude ?? 0.0, sourceLocation.longitude ?? 0.0, ), geohash: Geoflutterfire() .point( latitude: sourceLocation.latitude ?? 0.0, longitude: sourceLocation.longitude ?? 0.0, ) .hash, ); rentalOrderModel.zoneId = Constant.getZoneId( sourceLocation.latitude ?? 0.0, sourceLocation.longitude ?? 0.0, ); log(rentalOrderModel.toJson().toString()); Get.back(); Get.back(); Get.to( () => RentalConformationScreen(), arguments: {"rentalOrderModel": rentalOrderModel}, ); } void setDepartureMarker(double lat, double lng) { if (Constant.selectedMapType == 'osm') { departureLatLongOsm.value = latlong.LatLng(lat, lng); } else { departureLatLong.value = gmaps.LatLng(lat, lng); } } // final Rx departureLatLong = const LatLng(0.0, 0.0).obs; // final Rx departureLatLongOsm = latlong.LatLng(0.0, 0.0).obs; // void setDepartureMarker(double lat, double long) { // if (Constant.selectedMapType == 'osm') { // departureLatLongOsm.value = latlong.LatLng(lat, long); // } else { // departureLatLong.value = LatLng(lat, long); // } // } Rx walletSettingModel = WalletSettingModel().obs; Rx cashOnDeliverySettingModel = CodSettingModel().obs; Rx payFastModel = PayFastModel().obs; Rx mercadoPagoModel = MercadoPagoModel().obs; Rx payPalModel = PayPalModel().obs; Rx stripeModel = StripeModel().obs; Rx flutterWaveModel = FlutterWaveModel().obs; Rx payStackModel = PayStackModel().obs; Rx paytmModel = PaytmModel().obs; Rx razorPayModel = RazorPayModel().obs; Rx midTransModel = MidTrans().obs; Rx orangeMoneyModel = OrangeMoney().obs; Rx xenditModel = Xendit().obs; Future getPaymentSettings() async { await FireStoreUtils.getPaymentSettingsData().then((value) { stripeModel.value = StripeModel.fromJson( jsonDecode(Preferences.getString(Preferences.stripeSettings)), ); payPalModel.value = PayPalModel.fromJson( jsonDecode(Preferences.getString(Preferences.paypalSettings)), ); payStackModel.value = PayStackModel.fromJson( jsonDecode(Preferences.getString(Preferences.payStack)), ); mercadoPagoModel.value = MercadoPagoModel.fromJson( jsonDecode(Preferences.getString(Preferences.mercadoPago)), ); flutterWaveModel.value = FlutterWaveModel.fromJson( jsonDecode(Preferences.getString(Preferences.flutterWave)), ); paytmModel.value = PaytmModel.fromJson( jsonDecode(Preferences.getString(Preferences.paytmSettings)), ); payFastModel.value = PayFastModel.fromJson( jsonDecode(Preferences.getString(Preferences.payFastSettings)), ); razorPayModel.value = RazorPayModel.fromJson( jsonDecode(Preferences.getString(Preferences.razorpaySettings)), ); midTransModel.value = MidTrans.fromJson( jsonDecode(Preferences.getString(Preferences.midTransSettings)), ); orangeMoneyModel.value = OrangeMoney.fromJson( jsonDecode(Preferences.getString(Preferences.orangeMoneySettings)), ); xenditModel.value = Xendit.fromJson( jsonDecode(Preferences.getString(Preferences.xenditSettings)), ); walletSettingModel.value = WalletSettingModel.fromJson( jsonDecode(Preferences.getString(Preferences.walletSettings)), ); cashOnDeliverySettingModel.value = CodSettingModel.fromJson( jsonDecode(Preferences.getString(Preferences.codSettings)), ); if (walletSettingModel.value.isEnabled == true) { selectedPaymentMethod.value = PaymentGateway.wallet.name; } else if (cashOnDeliverySettingModel.value.isEnabled == true) { selectedPaymentMethod.value = PaymentGateway.cod.name; } else if (stripeModel.value.isEnabled == true) { selectedPaymentMethod.value = PaymentGateway.stripe.name; } else if (payPalModel.value.isEnabled == true) { selectedPaymentMethod.value = PaymentGateway.paypal.name; } else if (payStackModel.value.isEnable == true) { selectedPaymentMethod.value = PaymentGateway.payStack.name; } else if (mercadoPagoModel.value.isEnabled == true) { selectedPaymentMethod.value = PaymentGateway.mercadoPago.name; } else if (flutterWaveModel.value.isEnable == true) { selectedPaymentMethod.value = PaymentGateway.flutterWave.name; } else if (payFastModel.value.isEnable == true) { selectedPaymentMethod.value = PaymentGateway.payFast.name; } else if (razorPayModel.value.isEnabled == true) { selectedPaymentMethod.value = PaymentGateway.razorpay.name; } else if (midTransModel.value.enable == true) { selectedPaymentMethod.value = PaymentGateway.midTrans.name; } else if (orangeMoneyModel.value.enable == true) { selectedPaymentMethod.value = PaymentGateway.orangeMoney.name; } else if (xenditModel.value.enable == true) { selectedPaymentMethod.value = PaymentGateway.xendit.name; } }); } }