ente/lib/ui/viewer/search/location_search_widget.dart

122 lines
3.6 KiB
Dart
Raw Normal View History

2020-06-06 11:38:11 +00:00
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:flutter_typeahead/flutter_typeahead.dart';
import 'package:photos/core/configuration.dart';
2020-11-19 18:22:30 +00:00
import 'package:photos/core/network.dart';
2020-06-06 11:38:11 +00:00
import 'package:photos/models/location.dart';
import 'package:photos/ui/common/loading_widget.dart';
import 'package:photos/ui/viewer/search/location_search_results_page.dart';
2020-06-06 11:38:11 +00:00
class LocationSearchWidget extends StatefulWidget {
const LocationSearchWidget({
Key key,
}) : super(key: key);
@override
2022-07-03 09:45:00 +00:00
State<LocationSearchWidget> createState() => _LocationSearchWidgetState();
2020-06-06 11:38:11 +00:00
}
class _LocationSearchWidgetState extends State<LocationSearchWidget> {
String _searchString;
@override
Widget build(BuildContext context) {
return TypeAheadField(
2022-07-04 06:02:17 +00:00
textFieldConfiguration: const TextFieldConfiguration(
2020-06-06 11:38:11 +00:00
autofocus: true,
decoration: InputDecoration(
border: InputBorder.none,
hintText: 'Eg: Rome, Paris, New York',
2022-07-04 06:02:17 +00:00
contentPadding: EdgeInsets.all(0.0),
2020-06-06 11:38:11 +00:00
),
),
hideOnEmpty: true,
loadingBuilder: (context) {
return const EnteLoadingWidget();
2020-06-06 11:38:11 +00:00
},
suggestionsCallback: (pattern) async {
if (pattern.isEmpty || pattern.length < 2) {
2020-06-06 11:38:11 +00:00
return null;
}
_searchString = pattern;
2020-11-19 18:22:30 +00:00
return Network.instance
.getDio()
.get(
2020-11-19 18:22:30 +00:00
Configuration.instance.getHttpEndpoint() + "/search/location",
queryParameters: {
"query": pattern,
},
options: Options(
2022-06-11 08:23:52 +00:00
headers: {"X-Auth-Token": Configuration.instance.getToken()},
),
2020-11-19 18:22:30 +00:00
)
.then((response) {
2020-06-06 11:38:11 +00:00
if (_searchString == pattern) {
// Query has not changed
return response.data["results"];
}
return null;
});
},
itemBuilder: (context, suggestion) {
return LocationSearchResultWidget(suggestion['name']);
},
onSuggestionSelected: (suggestion) {
Navigator.pop(context);
2022-06-11 08:23:52 +00:00
Navigator.of(context).push(
MaterialPageRoute(
2020-06-06 11:38:11 +00:00
builder: (context) => LocationSearchResultsPage(
2022-06-11 08:23:52 +00:00
ViewPort(
Location(
suggestion['geometry']['viewport']['northeast']['lat'],
suggestion['geometry']['viewport']['northeast']['lng'],
),
Location(
suggestion['geometry']['viewport']['southwest']['lat'],
suggestion['geometry']['viewport']['southwest']['lng'],
),
),
suggestion['name'],
),
),
);
2020-06-06 11:38:11 +00:00
},
);
}
}
class LocationSearchResultWidget extends StatelessWidget {
final String name;
const LocationSearchResultWidget(
this.name, {
Key key,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
2022-07-04 06:02:17 +00:00
padding: const EdgeInsets.symmetric(vertical: 6.0, horizontal: 6.0),
margin: const EdgeInsets.symmetric(vertical: 6.0),
2022-06-11 08:23:52 +00:00
child: Column(
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
2022-07-04 06:02:17 +00:00
const Icon(
2022-06-11 08:23:52 +00:00
Icons.location_on,
),
2022-07-04 06:02:17 +00:00
const Padding(padding: EdgeInsets.only(left: 20.0)),
2022-06-11 08:23:52 +00:00
Flexible(
2022-07-03 10:09:01 +00:00
child: Text(
name,
overflow: TextOverflow.clip,
2020-06-06 11:38:11 +00:00
),
),
2022-06-11 08:23:52 +00:00
],
),
],
),
2020-06-06 11:38:11 +00:00
);
}
}