// import 'dart:async'; // import 'dart:convert'; // import 'dart:developer'; // import 'package:driver/constant/collection_name.dart'; // import 'package:driver/constant/constant.dart'; // import 'package:driver/constant/show_toast_dialog.dart'; // import 'package:driver/themes/app_them_data.dart'; // import 'package:driver/utils/fire_store_utils.dart'; // import 'package:flutter_polyline_points/flutter_polyline_points.dart'; // import 'package:get/get.dart'; // import 'package:google_maps_flutter/google_maps_flutter.dart'; // import 'package:latlong2/latlong.dart' as location; // import 'package:flutter_map/flutter_map.dart' as flutterMap; // import 'package:http/http.dart' as http; // import '../models/parcel_order_model.dart'; // import '../models/user_model.dart'; // import 'package:flutter/material.dart'; // // class ParcelTrackingController extends GetxController { // GoogleMapController? mapController; // final flutterMap.MapController osmMapController = flutterMap.MapController(); // // Rx driverUserModel = UserModel().obs; // Rx orderModel = ParcelOrderModel().obs; // RxBool isLoading = true.obs; // RxString type = "parcelOrder".obs; // // StreamSubscription? orderSubscription; // StreamSubscription? driverSubscription; // // // Google Map markers & polylines // RxMap markers = {}.obs; // RxMap polyLines = {}.obs; // // // OSM map markers & route // RxList osmMarkers = [].obs; // RxList routePoints = [].obs; // // BitmapDescriptor? pickupIcon; // BitmapDescriptor? dropoffIcon; // BitmapDescriptor? driverIcon; // // PolylinePoints polylinePoints = PolylinePoints(apiKey: Constant.mapAPIKey); // // Rx source = location.LatLng(0.0, 0.0).obs; // Rx destination = location.LatLng(0.0, 0.0).obs; // // @override // void onInit() { // super.onInit(); // _loadIcons(); // _initArguments(); // } // // @override // void onClose() { // orderSubscription?.cancel(); // driverSubscription?.cancel(); // ShowToastDialog.closeLoader(); // super.onClose(); // } // // Future _initArguments() async { // final args = Get.arguments; // if (args != null && args['parcelOrder'] != null) { // orderModel.value = args['parcelOrder']; // type.value = args['type'] ?? "parcelOrder"; // _listenToOrder(); // } else { // ShowToastDialog.showToast("Order data not found"); // Get.back(); // } // } // // /// Listen to order and driver updates // void _listenToOrder() { // orderSubscription = FireStoreUtils.fireStore.collection(CollectionName.parcelOrders).doc(orderModel.value.id).snapshots().listen((event) { // if (event.data() != null) { // orderModel.value = ParcelOrderModel.fromJson(event.data()!); // // // listen driver // if (orderModel.value.driverId != null) { // driverSubscription = FireStoreUtils.fireStore.collection(CollectionName.users).doc(orderModel.value.driverId).snapshots().listen((driverSnap) { // if (driverSnap.data() != null) { // driverUserModel.value = UserModel.fromJson(driverSnap.data()!); // _updateTracking(); // } // }); // } // // if (orderModel.value.status == Constant.orderCompleted) { // Get.back(); // } // } // }); // // isLoading.value = false; // } // // void _updateTracking() { // if (Constant.selectedMapType == 'google') { // _updateGoogleMap(); // } else { // _updateOsmMap(); // } // } // // void _updateGoogleMap() async { // final driverLat = driverUserModel.value.location?.latitude?.toDouble(); // final driverLng = driverUserModel.value.location?.longitude?.toDouble(); // if (driverLat == null || driverLng == null) return; // // double? dstLat; // double? dstLng; // // if (orderModel.value.status == Constant.driverAccepted) { // dstLat = orderModel.value.senderLatLong?.latitude?.toDouble(); // dstLng = orderModel.value.senderLatLong?.longitude?.toDouble(); // } else { // dstLat = orderModel.value.receiverLatLong?.latitude?.toDouble(); // dstLng = orderModel.value.receiverLatLong?.longitude?.toDouble(); // } // // if (dstLat == null || dstLng == null) return; // // final result = await polylinePoints.getRouteBetweenCoordinates( // request: PolylineRequest( // origin: PointLatLng(driverLat, driverLng), // destination: PointLatLng(dstLat, dstLng), // mode: TravelMode.driving, // ), // ); // // final List routeCoords = []; // for (var p in result.points) { // routeCoords.add(LatLng(p.latitude, p.longitude)); // } // // markers.clear(); // polyLines.clear(); // // _addGoogleMarker(driverLat, driverLng, "Driver", driverIcon!); // _addGoogleMarker(orderModel.value.senderLatLong?.latitude?.toDouble(), orderModel.value.senderLatLong?.longitude?.toDouble(), "Pickup", pickupIcon!); // _addGoogleMarker(orderModel.value.receiverLatLong?.latitude?.toDouble(), orderModel.value.receiverLatLong?.longitude?.toDouble(), "Dropoff", dropoffIcon!); // // if (routeCoords.isNotEmpty) { // PolylineId id = const PolylineId("route"); // Polyline polyline = Polyline( // polylineId: id, // color: AppThemeData.primary300, // width: 6, // points: routeCoords, // ); // polyLines[id] = polyline; // } // // if (routeCoords.length >= 2) { // await _animateCameraBounds(routeCoords.first, routeCoords.last); // } // // update(); // } // // void _addGoogleMarker(double? lat, double? lng, String id, BitmapDescriptor icon) { // if (lat == null || lng == null) return; // markers[MarkerId(id)] = Marker( // markerId: MarkerId(id), // position: LatLng(lat, lng), // icon: icon, // ); // } // // Future _animateCameraBounds(LatLng src, LatLng dest) async { // if (mapController == null) return; // // LatLngBounds bounds; // if (src.latitude > dest.latitude && src.longitude > dest.longitude) { // bounds = LatLngBounds(southwest: dest, northeast: src); // } else if (src.longitude > dest.longitude) { // bounds = LatLngBounds(southwest: LatLng(src.latitude, dest.longitude), northeast: LatLng(dest.latitude, src.longitude)); // } else if (src.latitude > dest.latitude) { // bounds = LatLngBounds(southwest: LatLng(dest.latitude, src.longitude), northeast: LatLng(src.latitude, dest.longitude)); // } else { // bounds = LatLngBounds(southwest: src, northeast: dest); // } // // CameraUpdate cameraUpdate = CameraUpdate.newLatLngBounds(bounds, 60); // await mapController?.animateCamera(cameraUpdate); // } // // void _updateOsmMap() async { // final driverLat = driverUserModel.value.location?.latitude?.toDouble() ?? 0.0; // final driverLng = driverUserModel.value.location?.longitude?.toDouble() ?? 0.0; // // double? dstLat; // double? dstLng; // // if (orderModel.value.status == Constant.driverAccepted) { // dstLat = orderModel.value.senderLatLong?.latitude?.toDouble(); // dstLng = orderModel.value.senderLatLong?.longitude?.toDouble(); // } else { // dstLat = orderModel.value.receiverLatLong?.latitude?.toDouble(); // dstLng = orderModel.value.receiverLatLong?.longitude?.toDouble(); // } // // if (dstLat == null || dstLng == null) return; // // source.value = location.LatLng(driverLat, driverLng); // destination.value = location.LatLng(dstLat, dstLng); // // await _fetchOsmRoute(source.value, destination.value); // // // Update OSM markers // osmMarkers.clear(); // osmMarkers.addAll([ // flutterMap.Marker( // point: source.value, // width: 40, // height: 40, // child: Image.asset('assets/images/food_delivery.png', width: 40), // ), // flutterMap.Marker( // point: location.LatLng( // orderModel.value.senderLatLong?.latitude?.toDouble() ?? 0.0, // orderModel.value.senderLatLong?.longitude?.toDouble() ?? 0.0, // ), // width: 40, // height: 40, // child: Image.asset('assets/images/pickup.png', width: 40), // ), // flutterMap.Marker( // point: location.LatLng( // orderModel.value.receiverLatLong?.latitude?.toDouble() ?? 0.0, // orderModel.value.receiverLatLong?.longitude?.toDouble() ?? 0.0, // ), // width: 40, // height: 40, // child: Image.asset('assets/images/dropoff.png', width: 40), // ), // ]); // // osmMapController.move(source.value, 14); // update(); // } // // Future _fetchOsmRoute(location.LatLng src, location.LatLng dest) async { // try { // final url = // Uri.parse('https://router.project-osrm.org/route/v1/driving/${src.longitude},${src.latitude};${dest.longitude},${dest.latitude}?overview=full&geometries=geojson'); // final response = await http.get(url); // if (response.statusCode == 200) { // final decoded = json.decode(response.body); // final geometry = decoded['routes'][0]['geometry']['coordinates']; // routePoints.clear(); // for (var coord in geometry) { // final lon = coord[0]; // final lat = coord[1]; // routePoints.add(location.LatLng(lat, lon)); // } // } // } catch (e) { // log("Error fetching OSM route: $e"); // } // } // // Future _loadIcons() async { // if (Constant.selectedMapType == 'google') { // pickupIcon = BitmapDescriptor.fromBytes(await Constant().getBytesFromAsset('assets/images/pickup.png', 100)); // dropoffIcon = BitmapDescriptor.fromBytes(await Constant().getBytesFromAsset('assets/images/dropoff.png', 100)); // driverIcon = BitmapDescriptor.fromBytes(await Constant().getBytesFromAsset('assets/images/food_delivery.png', 80)); // } // } // } import 'dart:async'; import 'dart:convert'; import 'dart:developer'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:driver/constant/collection_name.dart'; import 'package:driver/constant/constant.dart'; import 'package:driver/constant/show_toast_dialog.dart'; import 'package:driver/themes/app_them_data.dart'; import 'package:driver/utils/fire_store_utils.dart'; import 'package:flutter_polyline_points/flutter_polyline_points.dart'; import 'package:get/get.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:latlong2/latlong.dart' as location; import 'package:flutter_map/flutter_map.dart' as flutterMap; import 'package:http/http.dart' as http; import 'package:flutter/material.dart'; import '../models/parcel_order_model.dart'; import '../models/user_model.dart'; class ParcelTrackingController extends GetxController { GoogleMapController? mapController; final flutterMap.MapController osmMapController = flutterMap.MapController(); Rx driverUserModel = UserModel().obs; Rx orderModel = ParcelOrderModel().obs; RxBool isLoading = true.obs; RxString type = "parcelOrder".obs; StreamSubscription? orderSubscription; StreamSubscription? driverSubscription; // Google Maps RxMap markers = {}.obs; RxMap polyLines = {}.obs; // OSM Map RxList osmMarkers = [].obs; RxList routePoints = [].obs; BitmapDescriptor? pickupIcon; BitmapDescriptor? dropoffIcon; BitmapDescriptor? driverIcon; PolylinePoints polylinePoints = PolylinePoints(apiKey: Constant.mapAPIKey); Rx source = location.LatLng(0.0, 0.0).obs; Rx destination = location.LatLng(0.0, 0.0).obs; @override void onInit() { super.onInit(); _initArguments(); } @override void onClose() { orderSubscription?.cancel(); driverSubscription?.cancel(); ShowToastDialog.closeLoader(); super.onClose(); } Future _initArguments() async { await _loadIcons(); final args = Get.arguments; if (args != null && args['parcelOrder'] != null) { orderModel.value = args['parcelOrder']; type.value = args['type'] ?? "parcelOrder"; _listenToOrder(); } else { ShowToastDialog.showToast("Order data not found"); Get.back(); } isLoading.value = false; } void _listenToOrder() { orderSubscription = FireStoreUtils.fireStore.collection(CollectionName.parcelOrders).doc(orderModel.value.id).snapshots().listen((event) { if (event.data() != null) { orderModel.value = ParcelOrderModel.fromJson(event.data()!); // Listen to driver updates if (orderModel.value.driverId != null) { driverSubscription = FireStoreUtils.fireStore.collection(CollectionName.users).doc(orderModel.value.driverId).snapshots().listen((driverSnap) { if (driverSnap.data() != null) { driverUserModel.value = UserModel.fromJson(driverSnap.data()!); _updateTracking(); } }); } if (orderModel.value.status == Constant.orderCompleted) { Get.back(); } } }); } void _updateTracking() { if (Constant.selectedMapType == 'google') { _updateGoogleMap(); } else { _updateOsmMap(); } } void _updateGoogleMap() async { final driverLat = driverUserModel.value.location?.latitude?.toDouble(); final driverLng = driverUserModel.value.location?.longitude?.toDouble(); if (driverLat == null || driverLng == null) return; double? dstLat; double? dstLng; // Decide destination based on order status if (orderModel.value.status == Constant.driverAccepted) { dstLat = orderModel.value.senderLatLong?.latitude?.toDouble(); dstLng = orderModel.value.senderLatLong?.longitude?.toDouble(); } else if ([Constant.orderInTransit].contains(orderModel.value.status)) { dstLat = orderModel.value.receiverLatLong?.latitude?.toDouble(); dstLng = orderModel.value.receiverLatLong?.longitude?.toDouble(); } else { return; } if (dstLat == null || dstLng == null) return; final result = await polylinePoints.getRouteBetweenCoordinates( request: PolylineRequest( origin: PointLatLng(driverLat, driverLng), destination: PointLatLng(dstLat, dstLng), mode: TravelMode.driving, ), ); final List routeCoords = []; for (var p in result.points) { routeCoords.add(LatLng(p.latitude, p.longitude)); } markers.clear(); polyLines.clear(); // Add markers _addGoogleMarker(driverLat, driverLng, "Driver", driverIcon!); if (orderModel.value.status == Constant.driverAccepted) { _addGoogleMarker(orderModel.value.senderLatLong?.latitude?.toDouble(), orderModel.value.senderLatLong?.longitude?.toDouble(), "Pickup", pickupIcon!); } else { _addGoogleMarker(orderModel.value.receiverLatLong?.latitude?.toDouble(), orderModel.value.receiverLatLong?.longitude?.toDouble(), "Dropoff", dropoffIcon!); } // Add polyline if (routeCoords.isNotEmpty) { PolylineId id = const PolylineId("route"); Polyline polyline = Polyline( polylineId: id, color: AppThemeData.primary300, width: 6, points: routeCoords, ); polyLines[id] = polyline; } if (routeCoords.length >= 2) { await _animateCameraBounds(routeCoords.first, routeCoords.last); } update(); } void _addGoogleMarker(double? lat, double? lng, String id, BitmapDescriptor icon) { if (lat == null || lng == null) return; markers[MarkerId(id)] = Marker( markerId: MarkerId(id), position: LatLng(lat, lng), icon: icon, ); } Future _animateCameraBounds(LatLng src, LatLng dest) async { if (mapController == null) return; LatLngBounds bounds; if (src.latitude > dest.latitude && src.longitude > dest.longitude) { bounds = LatLngBounds(southwest: dest, northeast: src); } else if (src.longitude > dest.longitude) { bounds = LatLngBounds(southwest: LatLng(src.latitude, dest.longitude), northeast: LatLng(dest.latitude, src.longitude)); } else if (src.latitude > dest.latitude) { bounds = LatLngBounds(southwest: LatLng(dest.latitude, src.longitude), northeast: LatLng(src.latitude, dest.longitude)); } else { bounds = LatLngBounds(southwest: src, northeast: dest); } CameraUpdate cameraUpdate = CameraUpdate.newLatLngBounds(bounds, 60); await mapController?.animateCamera(cameraUpdate); } void _updateOsmMap() async { final driverLat = driverUserModel.value.location?.latitude?.toDouble() ?? 0.0; final driverLng = driverUserModel.value.location?.longitude?.toDouble() ?? 0.0; double? dstLat; double? dstLng; if (orderModel.value.status == Constant.driverAccepted) { dstLat = orderModel.value.senderLatLong?.latitude?.toDouble(); dstLng = orderModel.value.senderLatLong?.longitude?.toDouble(); } else if ([Constant.orderInTransit].contains(orderModel.value.status)) { dstLat = orderModel.value.receiverLatLong?.latitude?.toDouble(); dstLng = orderModel.value.receiverLatLong?.longitude?.toDouble(); } else { return; } if (dstLat == null || dstLng == null) return; source.value = location.LatLng(driverLat, driverLng); destination.value = location.LatLng(dstLat, dstLng); await _fetchOsmRoute(source.value, destination.value); // Update OSM markers osmMarkers.clear(); osmMarkers.add( flutterMap.Marker( point: source.value, width: 40, height: 40, child: CachedNetworkImage( width: 50, height: 50, imageUrl: Constant.sectionModel!.markerIcon.toString(), placeholder: (context, url) => Constant.loader(), errorWidget: (context, url, error) => SizedBox( width: 30, height: 30, child: CircularProgressIndicator(strokeWidth: 2), ), ), ), ); if (orderModel.value.status == Constant.driverAccepted) { osmMarkers.add( flutterMap.Marker( point: location.LatLng( orderModel.value.senderLatLong?.latitude?.toDouble() ?? 0.0, orderModel.value.senderLatLong?.longitude?.toDouble() ?? 0.0, ), width: 40, height: 40, child: Image.asset('assets/images/pickup.png', width: 40), ), ); } else { osmMarkers.add( flutterMap.Marker( point: location.LatLng( orderModel.value.receiverLatLong?.latitude?.toDouble() ?? 0.0, orderModel.value.receiverLatLong?.longitude?.toDouble() ?? 0.0, ), width: 40, height: 40, child: Image.asset('assets/images/dropoff.png', width: 40), ), ); } osmMapController.move(source.value, 14); update(); } Future _fetchOsmRoute(location.LatLng src, location.LatLng dest) async { try { final url = Uri.parse( 'https://router.project-osrm.org/route/v1/driving/${src.longitude},${src.latitude};${dest.longitude},${dest.latitude}?overview=full&geometries=geojson'); final response = await http.get(url); if (response.statusCode == 200) { final decoded = json.decode(response.body); final geometry = decoded['routes'][0]['geometry']['coordinates']; routePoints.clear(); for (var coord in geometry) { final lon = coord[0]; final lat = coord[1]; routePoints.add(location.LatLng(lat, lon)); } } } catch (e) { log("Error fetching OSM route: $e"); } } Future _loadIcons() async { if (Constant.selectedMapType == 'google') { pickupIcon = BitmapDescriptor.fromBytes(await Constant().getBytesFromAsset('assets/images/pickup.png', 100)); dropoffIcon = BitmapDescriptor.fromBytes(await Constant().getBytesFromAsset('assets/images/dropoff.png', 100)); driverIcon = BitmapDescriptor.fromBytes(Constant.sectionModel!.markerIcon == null || Constant.sectionModel!.markerIcon!.isEmpty ? await Constant().getBytesFromAsset('assets/images/ic_cab.png', 50) : await Constant().getBytesFromUrl(Constant.sectionModel!.markerIcon.toString(), width: 120)); } } } // import 'dart:async'; // import 'dart:convert'; // import 'dart:typed_data'; // import 'package:driver/constant/collection_name.dart'; // import 'package:driver/constant/constant.dart'; // import 'package:driver/constant/show_toast_dialog.dart'; // import 'package:driver/themes/app_them_data.dart'; // import 'package:driver/utils/fire_store_utils.dart'; // import 'package:flutter_polyline_points/flutter_polyline_points.dart'; // import 'package:get/get.dart'; // import 'package:google_maps_flutter/google_maps_flutter.dart'; // import 'package:latlong2/latlong.dart' as location; // import 'package:flutter_map/flutter_map.dart' as flutterMap; // import 'package:http/http.dart' as http; // import '../models/parcel_order_model.dart'; // import '../models/user_model.dart'; // // class ParcelTrackingController extends GetxController { // GoogleMapController? mapController; // // Rx driverUserModel = UserModel().obs; // Rx orderModel = ParcelOrderModel().obs; // // RxBool isLoading = true.obs; // RxString type = "".obs; // // StreamSubscription? orderSubscription; // StreamSubscription? driverSubscription; // // RxMap markers = {}.obs; // RxMap polyLines = {}.obs; // // BitmapDescriptor? departureIcon; // BitmapDescriptor? destinationIcon; // BitmapDescriptor? driverIcon; // // PolylinePoints polylinePoints = PolylinePoints(apiKey: Constant.mapAPIKey); // // // OSM // final flutterMap.MapController osmMapController = flutterMap.MapController(); // Rx source = location.LatLng(0.0, 0.0).obs; // Rx destination = location.LatLng(0.0, 0.0).obs; // RxList routePoints = [].obs; // // @override // void onInit() { // addMarkerSetup(); // getArgument(); // super.onInit(); // } // // @override // void onClose() { // orderSubscription?.cancel(); // driverSubscription?.cancel(); // ShowToastDialog.closeLoader(); // super.onClose(); // } // // Future getArgument() async { // dynamic argumentData = Get.arguments; // if (argumentData != null) { // type.value = argumentData['type'] ?? "parcelOrder"; // if (type.value == "parcelOrder") { // ParcelOrderModel argumentOrderModel = argumentData['parcelOrder']; // // /// Listen to Order // orderSubscription = FireStoreUtils.fireStore.collection(CollectionName.parcelOrders).doc(argumentOrderModel.id).snapshots().listen((event) { // if (event.data() != null) { // orderModel.value = ParcelOrderModel.fromJson(event.data()!); // // /// Listen to Driver Live Location // driverSubscription = FireStoreUtils.fireStore.collection(CollectionName.users).doc(orderModel.value.driverId).snapshots().listen((event) { // if (event.data() != null) { // driverUserModel.value = UserModel.fromJson(event.data()!); // // /// Update Map (Google or OSM) // _updateTracking(); // } // }); // // if (orderModel.value.status == Constant.orderCompleted) { // Get.back(); // } // } // }); // } // } // isLoading.value = false; // update(); // } // // /// Update Tracking depending on order status // void _updateTracking() { // if (Constant.selectedMapType == 'google') { // _updateGoogleMap(); // } else { // _updateOsmMap(); // } // } // // ///Google Map Route // void _updateGoogleMap() async { // double? srcLat = driverUserModel.value.location?.latitude?.toDouble(); // double? srcLng = driverUserModel.value.location?.longitude?.toDouble(); // // double? dstLat; // double? dstLng; // // if (orderModel.value.status == Constant.driverAccepted) { // // Driver → Pickup // dstLat = orderModel.value.senderLatLong?.latitude?.toDouble(); // dstLng = orderModel.value.senderLatLong?.longitude?.toDouble(); // } else { // // Pickup → Destination // dstLat = orderModel.value.receiverLatLong?.latitude?.toDouble(); // dstLng = orderModel.value.receiverLatLong?.longitude?.toDouble(); // } // // if (srcLat == null || srcLng == null || dstLat == null || dstLng == null) return; // // // Get Polyline // List polylineCoordinates = []; // PolylineRequest polylineRequest = PolylineRequest( // origin: PointLatLng(srcLat, srcLng), // destination: PointLatLng(dstLat, dstLng), // mode: TravelMode.driving, // ); // // PolylineResult result = await polylinePoints.getRouteBetweenCoordinates( // request: polylineRequest, // ); // // polylineCoordinates.clear(); // if (result.points.isNotEmpty) { // for (var point in result.points) { // polylineCoordinates.add(LatLng(point.latitude, point.longitude)); // } // } // // // Add Markers // markers.clear(); // addMarker( // latitude: orderModel.value.senderLatLong?.latitude?.toDouble(), // longitude: orderModel.value.senderLatLong?.longitude?.toDouble(), // id: "Pickup", // descriptor: departureIcon!, // rotation: 0.0, // ); // addMarker( // latitude: orderModel.value.receiverLatLong?.latitude?.toDouble(), // longitude: orderModel.value.receiverLatLong?.longitude?.toDouble(), // id: "Dropoff", // descriptor: destinationIcon!, // rotation: 0.0, // ); // addMarker( // latitude: srcLat, // longitude: srcLng, // id: "Driver", // descriptor: driverIcon!, // rotation: driverUserModel.value.rotation?.toDouble() ?? 0.0, // ); // // // Add Polyline // polyLines.clear(); // _addPolyLine(polylineCoordinates); // } // // ///OSM Route // void _updateOsmMap() async { // source.value = location.LatLng( // driverUserModel.value.location?.latitude?.toDouble() ?? 0.0, // driverUserModel.value.location?.longitude?.toDouble() ?? 0.0, // ); // // if (orderModel.value.status == Constant.driverAccepted) { // destination.value = location.LatLng( // orderModel.value.senderLatLong?.latitude?.toDouble() ?? 0.0, // orderModel.value.senderLatLong?.longitude?.toDouble() ?? 0.0, // ); // } else { // destination.value = location.LatLng( // orderModel.value.receiverLatLong?.latitude?.toDouble() ?? 0.0, // orderModel.value.receiverLatLong?.longitude?.toDouble() ?? 0.0, // ); // } // // await fetchRoute(source.value, destination.value); // animateToSource(); // } // // /// Google Add Marker // void addMarker({ // required double? latitude, // required double? longitude, // required String id, // required BitmapDescriptor descriptor, // required double? rotation, // }) { // MarkerId markerId = MarkerId(id); // Marker marker = Marker( // markerId: markerId, // icon: descriptor, // position: LatLng(latitude ?? 0.0, longitude ?? 0.0), // rotation: rotation ?? 0.0, // ); // markers[markerId] = marker; // } // // /// Setup Marker Icons // Future addMarkerSetup() async { // if (Constant.selectedMapType == 'google') { // final Uint8List pickup = await Constant().getBytesFromAsset('assets/images/pickup.png', 100); // final Uint8List dropoff = await Constant().getBytesFromAsset('assets/images/dropoff.png', 100); // final Uint8List driver = await Constant().getBytesFromAsset('assets/images/food_delivery.png', 60); // departureIcon = BitmapDescriptor.fromBytes(pickup); // destinationIcon = BitmapDescriptor.fromBytes(dropoff); // driverIcon = BitmapDescriptor.fromBytes(driver); // } // } // // /// Google Add Polyline // void _addPolyLine(List polylineCoordinates) { // if (polylineCoordinates.isEmpty) return; // PolylineId id = const PolylineId("poly"); // Polyline polyline = Polyline( // polylineId: id, // points: polylineCoordinates, // width: 6, // color: AppThemeData.primary300, // ); // polyLines[id] = polyline; // updateCameraLocation(polylineCoordinates.first, polylineCoordinates.last, mapController); // } // // Future updateCameraLocation( // LatLng source, // LatLng destination, // GoogleMapController? mapController, // ) async { // if (mapController == null) return; // // LatLngBounds bounds; // if (source.latitude > destination.latitude && source.longitude > destination.longitude) { // bounds = LatLngBounds(southwest: destination, northeast: source); // } else if (source.longitude > destination.longitude) { // bounds = LatLngBounds(southwest: LatLng(source.latitude, destination.longitude), northeast: LatLng(destination.latitude, source.longitude)); // } else if (source.latitude > destination.latitude) { // bounds = LatLngBounds(southwest: LatLng(destination.latitude, source.longitude), northeast: LatLng(source.latitude, destination.longitude)); // } else { // bounds = LatLngBounds(southwest: source, northeast: destination); // } // // CameraUpdate cameraUpdate = CameraUpdate.newLatLngBounds(bounds, 50); // await mapController.animateCamera(cameraUpdate); // } // // /// OSM Fetch Route // Future fetchRoute(location.LatLng source, location.LatLng destination) async { // final url = Uri.parse( // 'https://router.project-osrm.org/route/v1/driving/${source.longitude},${source.latitude};${destination.longitude},${destination.latitude}?overview=full&geometries=geojson', // ); // final response = await http.get(url); // if (response.statusCode == 200) { // final decoded = json.decode(response.body); // final geometry = decoded['routes'][0]['geometry']['coordinates']; // routePoints.clear(); // for (var coord in geometry) { // final lon = coord[0]; // final lat = coord[1]; // routePoints.add(location.LatLng(lat, lon)); // } // } // } // // void animateToSource() { // osmMapController.move(source.value, 16); // } // }