Giga Push (it is 1:30 am and I am tired)
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?
This commit is contained in:
@@ -0,0 +1,181 @@
|
||||
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)
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user