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(context, listen: false); var essenProvider = Provider.of(context, listen: false); var speziellerProvider = Provider.of(context, listen: false); var pageProvider = Provider.of(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 myJson) { return !myJson.values.any((value) => value == 0); } Future sendDataToSupabase(Map data) async { try { 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 pageData, String title) { String show_title = ""; String show_question = ""; switch (title){ case "Essen": show_title = Provider.of(context, listen: false) .languageData[ Provider.of(context, listen: false) .language]["navBar"]["0"]; show_question = "pageEssen"; break; case "Service": show_title = Provider.of(context, listen: false) .languageData[ Provider.of(context, listen: false) .language]["navBar"]["1"]; show_question = "pageService"; break; case "Spezielle Nahrung": show_title = Provider.of(context, listen: false) .languageData[ Provider.of(context, listen: false) .language]["navBar"]["2"]; show_question = "pageSpecial"; break; } if (pageData['q1'] != 0 && pageData['q2'] != 0) { String foodLine = pageData.containsKey('food') ? "- ${pageData['food']}\n" : ""; return "$show_title:\n" "$foodLine" "- ${Provider.of(context, listen: false).languageData[Provider.of(context, listen: false).language][show_question]["question1"]}: ${pageData['q1'].toInt()}/5 Sterne\n" "- ${Provider.of(context, listen: false).languageData[Provider.of(context, listen: false).language][show_question]["question2"]}: ${pageData['q2'].toInt()}/5 Sterne\n" "- ${Provider.of(context, listen: false).languageData[Provider.of(context, listen: false).language]["textfield"]}: ${pageData['t1']}\n\n"; } return "$show_title: ${Provider.of(context, listen: false) .languageData[ Provider.of(context, listen: false) .language]["send"]["notRated"]}\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(Provider.of(context, listen: false) .languageData[ Provider.of(context, listen: false) .language]["send"]["title"]), 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(Provider.of(context, listen: false) .languageData[ Provider.of(context, listen: false) .language]["send"]["change"]), ), ElevatedButton( onPressed: allUnrated ? null // Button deaktivieren : () async { Navigator.of(dialogContext).pop(); // Dialog schließen await sendDataToSupabase(data); Provider.of(context, listen: false).resetAllFields(); Provider.of(context, listen: false).resetAllFields(); Provider.of(context, listen: false).resetAllFields(); Provider.of(context, listen: false).resetSelectedEssen(); Provider.of(context, listen: false).setSelectedSpace(0); Provider.of(context, listen: false).setLanguage("de"); Provider.of(context, listen: false).changePage(0); }, style: ElevatedButton.styleFrom( backgroundColor: allUnrated ? Colors.grey // Button farblich anzeigen, wenn deaktiviert : Theme.of(context).primaryColor, ), child: Text(Provider.of(context, listen: false) .languageData[ Provider.of(context, listen: false) .language]["send"]["apply"], style: TextStyle( decoration: allUnrated ? TextDecoration.lineThrough : null, color: allUnrated ? Colors.black54 : Theme.of(context).colorScheme.secondary) ), ), ], ); }, ); } }