// A search bar that allow the user to enter a city name import 'package:anyway/structs/landmark.dart'; import 'package:geocoding/geocoding.dart'; import 'dart:developer'; import 'package:anyway/structs/trip.dart'; import 'package:flutter/material.dart'; import 'package:geolocator/geolocator.dart'; import 'package:shared_preferences/shared_preferences.dart'; const Map debugLocations = { 'paris': [48.8575, 2.3514], 'london': [51.5074, -0.1278], 'new york': [40.7128, -74.0060], 'tokyo': [35.6895, 139.6917], }; class NewTripLocationSearch extends StatefulWidget { Future prefs = SharedPreferences.getInstance(); Trip trip; NewTripLocationSearch( this.trip, ); @override State createState() => _NewTripLocationSearchState(); } class _NewTripLocationSearchState extends State { final TextEditingController _controller = TextEditingController(); setTripLocation (String query) async { List locations = []; Location startLocation; log('Searching for: $query'); if (GeocodingPlatform.instance != null) { locations.addAll(await locationFromAddress(query)); } if (locations.isNotEmpty) { startLocation = locations.first; } else { log('No results found for: $query. Is geocoding available?'); log('Setting Fallback location'); List coordinates = debugLocations[query.toLowerCase()] ?? [48.8575, 2.3514]; startLocation = Location( latitude: coordinates[0], longitude: coordinates[1], timestamp: DateTime.now(), ); } widget.trip.landmarks.clear(); widget.trip.addLandmark( Landmark( uuid: 'pending', name: query, location: [startLocation.latitude, startLocation.longitude], type: typeStart ) ); } late Widget locationSearchBar = SearchBar( hintText: 'Enter a city name or long press on the map.', onSubmitted: setTripLocation, controller: _controller, leading: Icon(Icons.search), trailing: [ ElevatedButton( onPressed: () { setTripLocation(_controller.text); }, child: Text('Search'), ) ] ); late Widget useCurrentLocationButton = ElevatedButton( onPressed: () async { // this widget is only shown if the user has already granted location permissions Position position = await Geolocator.getCurrentPosition(); widget.trip.landmarks.clear(); widget.trip.addLandmark( Landmark( uuid: 'pending', name: 'start', location: [position.latitude, position.longitude], type: typeStart ) ); }, child: Text('Use current location'), ); @override Widget build(BuildContext context) { return FutureBuilder( future: widget.prefs, builder: (context, snapshot) { if (snapshot.hasData) { final useLocation = snapshot.data!.getBool('useLocation') ?? false; if (useLocation) { return Column( children: [ locationSearchBar, useCurrentLocationButton, ], ); } else { return locationSearchBar; } } else { return locationSearchBar; } }, ); } }