Files
mensaapp/lib/modules/databaseService.dart
T
Ali f89400909b puuuush
push push lülülülülülülüllüüüüü
2025-01-29 20:41:10 +01:00

220 lines
8.2 KiB
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 {
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) {
String show_title = "";
String show_question = "";
switch (title){
case "Essen":
show_title = Provider.of<LanguageProvider>(context, listen: false)
.languageData[
Provider.of<LanguageProvider>(context, listen: false)
.language]["navBar"]["0"];
show_question = "pageEssen";
break;
case "Service":
show_title = Provider.of<LanguageProvider>(context, listen: false)
.languageData[
Provider.of<LanguageProvider>(context, listen: false)
.language]["navBar"]["1"];
show_question = "pageService";
break;
case "Spezielle Nahrung":
show_title = Provider.of<LanguageProvider>(context, listen: false)
.languageData[
Provider.of<LanguageProvider>(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<LanguageProvider>(context, listen: false).languageData[Provider.of<LanguageProvider>(context, listen: false).language][show_question]["question1"]}: ${pageData['q1'].toInt()}/5 Sterne\n"
"- ${Provider.of<LanguageProvider>(context, listen: false).languageData[Provider.of<LanguageProvider>(context, listen: false).language][show_question]["question2"]}: ${pageData['q2'].toInt()}/5 Sterne\n"
"- ${Provider.of<LanguageProvider>(context, listen: false).languageData[Provider.of<LanguageProvider>(context, listen: false).language]["textfield"]}: ${pageData['t1']}\n\n";
}
return "$show_title: ${Provider.of<LanguageProvider>(context, listen: false)
.languageData[
Provider.of<LanguageProvider>(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<LanguageProvider>(context, listen: false)
.languageData[
Provider.of<LanguageProvider>(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<LanguageProvider>(context, listen: false)
.languageData[
Provider.of<LanguageProvider>(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<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(Provider.of<LanguageProvider>(context, listen: false)
.languageData[
Provider.of<LanguageProvider>(context, listen: false)
.language]["send"]["apply"],
style: TextStyle(
decoration: allUnrated ? TextDecoration.lineThrough : null,
color: allUnrated ? Colors.black54 : Theme.of(context).colorScheme.secondary)
),
),
],
);
},
);
}
}