SendTrain/lib/services/search/google_places_service.dart

91 lines
2.5 KiB
Dart

import 'dart:async';
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:http/http.dart';
import 'package:sendtrain/models/google_place_model.dart';
import 'package:sendtrain/widgets/generic/elements/form_search_input.dart';
import 'package:uuid/uuid.dart';
class GooglePlacesService {
final sessionToken = Uuid().v4();
final apiKey = "AIzaSyBCjMCEAyyNVpsnVYvZj6VL1mmB98Vd6AE";
final client = Client();
void finish() {
client.close();
}
Future<List<Suggestion>?> fetchSuggestions(String input) async {
var headers = {
'Content-Type': 'application/json',
'X-Goog-Api-Key': apiKey,
"Access-Control-Allow-Origin": "*",
'X-Goog-FieldMask':
'places.displayName,places.id,places.formattedAddress,places.photos'
};
var request = Request('POST',
Uri.parse('https://places.googleapis.com/v1/places:searchText'));
request.body = json.encode({"textQuery": input});
request.headers.addAll(headers);
StreamedResponse response = await request.send();
if (response.statusCode == 200) {
final result = json.decode(await response.stream.bytesToString());
if (result.isNotEmpty) {
return result['places']
.map<Suggestion>((p) => Suggestion<GooglePlaceModel>(
GooglePlaceModel(
placeId: p['id'],
description: p['displayName']['text'],
address: p['formattedAddress'],
imageReferences: p['photos'])))
.toList();
} else {
return null;
}
} else {
throw Exception(response.reasonPhrase);
}
}
Future fetchPhoto(String name) async {
var headers = {
"Access-Control-Allow-Origin": "*",
};
var request = Request(
'GET',
Uri.parse(
'https://places.googleapis.com/v1/$name/media?key=$apiKey&maxWidthPx=800&skipHttpRedirect=true'));
request.headers.addAll(headers);
StreamedResponse response = await request.send();
if (response.statusCode == 200) {
final result = json.decode(await response.stream.bytesToString());
if (result.isNotEmpty) {
return result;
} else {
return null;
}
} else {
throw Exception(response.reasonPhrase);
}
}
Widget resultWidget(GooglePlaceModel place, Function? callback) {
return ListTile(
title: Text(place.description),
onTap: () async {
if (callback != null) {
callback();
}
},
);
}
}