197 lines
6.6 KiB
Dart
197 lines
6.6 KiB
Dart
import 'package:mensaapp/modules/SpeechDetect.dart';
|
|
import 'package:supabase_flutter/supabase_flutter.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:provider/provider.dart';
|
|
import 'package:mensaapp/providers/spezielleErnaehrungProvider.dart';
|
|
import 'package:mensaapp/providers/serviceProvider.dart';
|
|
import 'package:mensaapp/providers/ambienteProvider.dart';
|
|
import 'package:mensaapp/providers/anmerkungProvider.dart';
|
|
import 'package:mensaapp/providers/essenProvider.dart';
|
|
import '../providers/pageProvider.dart';
|
|
import '../providers/languageProvider.dart';
|
|
import 'package:mensaapp/providers/spaceProvider.dart';
|
|
|
|
|
|
class DatabaseService {
|
|
final SupabaseClient supabase = Supabase.instance.client;
|
|
|
|
void getAllRatings(BuildContext context) {
|
|
var serviceProvider = Provider.of<ServiceProvider>(context, listen: false);
|
|
var essenProvider = Provider.of<EssenProvider>(context, listen: false);
|
|
var speziellerProvider = Provider.of<SpezielleErnaehrungProvider>(context, listen: false);
|
|
var pageProvider = Provider.of<PageProvider>(context, listen: false);
|
|
|
|
var essenData = {
|
|
"q1": essenProvider.ratingQuali,
|
|
"q2": essenProvider.ratingGeschmack,
|
|
"t1": essenProvider.freiText,
|
|
"food": pageProvider.selectedEssenName
|
|
};
|
|
|
|
var serviceData = {
|
|
"q1": serviceProvider.ratingFrage1,
|
|
"q2": serviceProvider.ratingFrage2,
|
|
"t1": serviceProvider.freiText
|
|
};
|
|
|
|
var speziellerData = {
|
|
"q1": speziellerProvider.frage1,
|
|
"q2": speziellerProvider.frage2,
|
|
"t1": speziellerProvider.freiText
|
|
};
|
|
|
|
var sendData = {
|
|
"page1": {
|
|
"q1": 0,
|
|
"q2": 0,
|
|
"t1": "",
|
|
"food": ""
|
|
},
|
|
"page2": {
|
|
"q1": 0,
|
|
"q2": 0,
|
|
"t1": ""
|
|
},
|
|
"page3": {
|
|
"q1": 0,
|
|
"q2": 0,
|
|
"t1": ""
|
|
}
|
|
};
|
|
|
|
|
|
var jsonArray = [serviceData, essenData, speziellerData];
|
|
|
|
for (var element in jsonArray) {
|
|
var exists = checkIfRatingExists(element);
|
|
if (exists) {
|
|
if (element == essenData) {
|
|
sendData["page1"] = element;
|
|
} else if (element == serviceData) {
|
|
sendData["page2"] = element;
|
|
} else if (element == speziellerData) {
|
|
sendData["page3"] = element;
|
|
}
|
|
}
|
|
}
|
|
print(sendData);
|
|
_showConfirmationDialog(context, sendData);
|
|
|
|
}
|
|
|
|
bool checkIfRatingExists(Map<String, dynamic> myJson) {
|
|
return !myJson.values.any((value) => value == 0);
|
|
}
|
|
|
|
Future<void> sendDataToSupabase(Map<String, dynamic> data) async {
|
|
try {
|
|
String llmPrompt = data["page1"]["t1"] + data["page2"]["t1"] + data["page3"]["t1"];
|
|
|
|
bool notNice = await SpeechDetect.prompt(llmPrompt);
|
|
|
|
print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!11");
|
|
print(llmPrompt);
|
|
print(notNice);
|
|
|
|
if (notNice) {
|
|
print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
|
|
print("not nice text cancel culturedXD");
|
|
return;
|
|
}
|
|
|
|
final response = await supabase.from('ratings_database').insert({"ratings": data});
|
|
print("Antwort von Supabase: $response");
|
|
|
|
if (response == null) {
|
|
throw Exception("Antwort von Supabase ist null");
|
|
}
|
|
|
|
if (response['error'] != null) {
|
|
throw Exception("Supabase-Fehler: ${response['error']}");
|
|
}
|
|
|
|
print("Daten erfolgreich gesendet: ${response['data']}");
|
|
} catch (error) { //vielleicht überarbeiten? Pop Up mit "Admin verständigen"
|
|
print("Fehler beim Senden der Daten: $error");
|
|
}
|
|
}
|
|
|
|
|
|
void _showConfirmationDialog(BuildContext context, data) {
|
|
String formatData(Map<String, dynamic> pageData, String title) {
|
|
if (pageData['q1'] != 0 && pageData['q2'] != 0) {
|
|
String foodLine = pageData.containsKey('food') ? "- ${pageData['food']}\n" : "";
|
|
return "$title:\n"
|
|
"$foodLine"
|
|
"- Frage 1: ${pageData['q1'].toInt()}/5 Sterne\n"
|
|
"- Frage 2: ${pageData['q2'].toInt()}/5 Sterne\n"
|
|
"- Freitext: ${pageData['t1']}\n\n";
|
|
}
|
|
return "$title: Nicht bewertet\n\n";
|
|
}
|
|
|
|
bool allUnrated = data.values.every((pageData) => pageData['q1'] == 0 && pageData['q2'] == 0 && (pageData['t1'] ?? "").isEmpty);
|
|
|
|
String dialogContent =
|
|
formatData(data["page1"], "Essen") +
|
|
formatData(data["page2"], "Service") +
|
|
formatData(data["page3"], "Spezielle Nahrung");
|
|
|
|
|
|
showDialog(
|
|
context: context,
|
|
builder: (BuildContext dialogContext) {
|
|
return AlertDialog(
|
|
title: Text("Bestätigung"),
|
|
content: SizedBox(
|
|
width: MediaQuery.of(context).size.width * 0.6,
|
|
height: MediaQuery.of(context).size.height * 0.3,
|
|
child: SingleChildScrollView(
|
|
child: Text(
|
|
dialogContent,
|
|
style: TextStyle(fontSize: 18),
|
|
),
|
|
),
|
|
),
|
|
actions: [
|
|
ElevatedButton(
|
|
onPressed: () {
|
|
Navigator.of(dialogContext).pop(); // Abbrechen
|
|
},
|
|
style: ElevatedButton.styleFrom(
|
|
backgroundColor: Theme.of(context).colorScheme.secondary),
|
|
child: Text("Überarbeiten"),
|
|
),
|
|
ElevatedButton(
|
|
onPressed: allUnrated
|
|
? null // Button deaktivieren
|
|
: () async {
|
|
Navigator.of(dialogContext).pop(); // Dialog schließen
|
|
sendDataToSupabase(data);
|
|
Provider.of<EssenProvider>(context, listen: false).resetAllFields();
|
|
Provider.of<ServiceProvider>(context, listen: false).resetAllFields();
|
|
Provider.of<SpezielleErnaehrungProvider>(context, listen: false).resetAllFields();
|
|
Provider.of<PageProvider>(context, listen: false).resetSelectedEssen();
|
|
Provider.of<SpaceProvider>(context, listen: false).setSelectedSpace(0);
|
|
Provider.of<LanguageProvider>(context, listen: false).setLanguage("de");
|
|
Provider.of<PageProvider>(context, listen: false).changePage(0);
|
|
},
|
|
style: ElevatedButton.styleFrom(
|
|
backgroundColor: allUnrated
|
|
? Colors.grey // Button farblich anzeigen, wenn deaktiviert
|
|
: Theme.of(context).primaryColor,
|
|
),
|
|
child: Text("Absenden",
|
|
style: TextStyle(
|
|
decoration: allUnrated ? TextDecoration.lineThrough : null,
|
|
color: allUnrated ? Colors.black54 : Theme.of(context).colorScheme.secondary)
|
|
),
|
|
),
|
|
],
|
|
);
|
|
},
|
|
);
|
|
}
|
|
}
|
|
|