import 'dart:convert'; import 'package:customer/widget/osm_map/place_model.dart'; import 'package:flutter_map/flutter_map.dart'; import 'package:geolocator/geolocator.dart'; import 'package:get/get.dart'; import 'package:http/http.dart' as http; import '../../utils/utils.dart'; import 'package:latlong2/latlong.dart'; class OSMMapController extends GetxController { final mapController = MapController(); // Store only one picked place instead of multiple var pickedPlace = Rxn(); // Use Rxn to hold a nullable value var searchResults = [].obs; Future searchPlace(String query) async { if (query.length < 3) { searchResults.clear(); return; } final url = Uri.parse( 'https://nominatim.openstreetmap.org/search?q=$query&format=json&addressdetails=1&limit=10'); final response = await http.get(url, headers: { 'User-Agent': 'FlutterMapApp/1.0 (menil.siddhiinfosoft@gmail.com)', }); if (response.statusCode == 200) { final data = json.decode(response.body); searchResults.value = data; } } void selectSearchResult(Map place) { final lat = double.parse(place['lat']); final lon = double.parse(place['lon']); final address = place['display_name']; // Store only the selected place pickedPlace.value = PlaceModel( coordinates: LatLng(lat, lon), address: address, ); searchResults.clear(); } void addLatLngOnly(LatLng coords) async { final address = await _getAddressFromLatLng(coords); pickedPlace.value = PlaceModel(coordinates: coords, address: address); } Future _getAddressFromLatLng(LatLng coords) async { final url = Uri.parse( 'https://nominatim.openstreetmap.org/reverse?lat=${coords.latitude}&lon=${coords.longitude}&format=json'); final response = await http.get(url, headers: { 'User-Agent': 'FlutterMapApp/1.0 (menil.siddhiinfosoft@gmail.com)', }); if (response.statusCode == 200) { final data = json.decode(response.body); return data['display_name'] ?? 'Unknown location'; } else { return 'Unknown location'; } } void clearAll() { pickedPlace.value = null; // Clear the selected place } @override void onInit() { // TODO: implement onInit super.onInit(); getCurrentLocation(); } Future getCurrentLocation() async { Position? location = await Utils.getCurrentLocation(); LatLng latlng = LatLng(location?.latitude ?? 0.0, location?.longitude ?? 0.0); addLatLngOnly( LatLng(location?.latitude ?? 0.0, location?.longitude ?? 0.0)); mapController.move(latlng, mapController.camera.zoom); } }