Backend Structure implemented All Ratings will be pulled and validated Pop Up notfies user about all his ratings If confirmed, data will be send to the supabase server (if any data was found) No comments were made, who else needs to read this?
182 lines
6.1 KiB
Dart
182 lines
6.1 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('flutter').insert({"rating": 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("Abbrechen"),
|
|
),
|
|
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");
|
|
},
|
|
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)
|
|
),
|
|
),
|
|
],
|
|
);
|
|
},
|
|
);
|
|
}
|
|
}
|
|
|