Merge pull request 'feature/search-by-image' (#6) from feature/search-by-image into main

Reviewed-on: #6
This commit is contained in:
v4l3n71n 2024-07-27 18:30:25 +02:00
commit 6f185d99ce
2 changed files with 83 additions and 12 deletions

View File

@ -1,21 +1,59 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'events.dart';
import '../variable/globals.dart' as globals;
import 'package:http/http.dart' as http;
import 'dart:io';
import 'dart:convert';
import 'package:shared_preferences/shared_preferences.dart';
mixin ShowDescImageAdd<T extends StatefulWidget> on State<T> { mixin ShowDescImageAdd<T extends StatefulWidget> on State<T> {
void showDescImageAddDialog(BuildContext context, String text) { Future<void> addEvents(var events) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
var accessToken = prefs.getString("access_token") ?? "";
List<String> send = ["toto"];
if (accessToken.isNotEmpty) {
var urlPut = Uri.parse("${globals.api}/events");
print("start date : ${events["start_date"]}");
var responsePut = await http.put(urlPut,
headers: {
HttpHeaders.cookieHeader: 'access_token=${accessToken}',
HttpHeaders.acceptHeader: 'application/json, text/plain, */*',
HttpHeaders.contentTypeHeader: 'application/json'
},
body: jsonEncode({
'name': events["name"],
'place': events["place"],
'start_date': events['date'],
'end_date': events['date'],
'organizers': send,
'latitude': '0.0',
'longitude': '0.0',
}));
print("http put code status : ${responsePut.statusCode}");
print("http put body : ${responsePut.body}");
}
}
void showDescImageAddDialog(BuildContext context, var events) {
// Create AlertDialog // Create AlertDialog
String name = events['name'];
AlertDialog dialog = AlertDialog( AlertDialog dialog = AlertDialog(
title: Text("Description image"), title: Text("Ajouter un evenement"),
content: Text(text), content: Text("${name} n'a pas été trouvé. Voulez-vous l'ajouter ? "),
actions: [ actions: [
ElevatedButton( TextButton(
child: Text("OK"), child: Text("Annuler"),
style: ElevatedButton.styleFrom(
padding: EdgeInsets.symmetric(horizontal: 50, vertical: 20),
textStyle:
TextStyle(fontSize: 15, fontWeight: FontWeight.normal)),
onPressed: () { onPressed: () {
Navigator.of(context).pop("Yes, Of course!"); // Return value Navigator.of(context).pop("Yes, Of course!"); // Return value
}), }),
TextButton(
child: Text("Oui"),
onPressed: () {
addEvents(events); // Return value
}),
], ],
); );

View File

@ -4,6 +4,12 @@ import '../classes/descriptionImage.dart';
import '../classes/alert.dart'; import '../classes/alert.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:flutter_gemini/flutter_gemini.dart'; import 'package:flutter_gemini/flutter_gemini.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
import '../variable/globals.dart' as globals;
void main() { void main() {
runApp(MyApp()); runApp(MyApp());
@ -60,6 +66,34 @@ class DisplayPictureScreenState extends State<DisplayPictureScreen>
"L'IA de Google n'a pas su analyser l'image. Recommecer avec une autre"); "L'IA de Google n'a pas su analyser l'image. Recommecer avec une autre");
} }
Future<void> searchEvents(String json) async {
print(json);
SharedPreferences prefs = await SharedPreferences.getInstance();
Map<String, dynamic> jsonData = jsonDecode(json);
var name = jsonData["name"];
var place = jsonData["place"];
var accessToken = prefs.getString("access_token") ?? "";
if (accessToken.isNotEmpty) {
var urlGet = Uri.parse("${globals.api}/events?name=${name}");
var responseGet = await http.get(urlGet,
headers: {HttpHeaders.cookieHeader: 'access_token=${accessToken}'});
if (responseGet.statusCode == 200) {
var events = jsonDecode(utf8.decode(responseGet.bodyBytes));
print("reponse http : ${events.length}");
if (events.length == 0) {
showDescImageAddDialog(context, jsonData);
}
}
} else {
showErrorDialog(context, "Erreur de token");
}
//showDescImageAddDialog(context, message);
}
Future<void> _getEventInfosFromImage() async { Future<void> _getEventInfosFromImage() async {
await dotenv.load(); await dotenv.load();
@ -71,11 +105,10 @@ class DisplayPictureScreenState extends State<DisplayPictureScreen>
gemini gemini
.textAndImage( .textAndImage(
text: text:
"Peux-tu donner le nom, la date et le lieu de l'évènement sous format JSON avec les valeurs suivantes : name, place et date", "Peux-tu donner le nom, la date et le lieu de l'évènement sous format JSON avec les valeurs suivantes : name, place et date avec le format suivant YYYY-MM-ddTTHH:mm, et sans la présence de json dans la chaîne de caractère",
images: [file.readAsBytesSync()], images: [file.readAsBytesSync()],
modelName: "models/gemini-1.5-flash-latest") modelName: "models/gemini-1.5-flash-latest")
.then((value) => showDescImageAddDialog( .then((value) => searchEvents(value?.content?.parts?.last.text ?? ''))
context, value?.content?.parts?.last.text ?? ''))
.catchError((e) => displayError); .catchError((e) => displayError);
} }