import 'package:flutter/material.dart'; import 'package:google_nav_bar/google_nav_bar.dart'; import 'package:mensaapp/modules/databaseService.dart'; import 'package:mensaapp/providers/spaceProvider.dart'; import 'package:provider/provider.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; import '../providers/ambienteProvider.dart'; import '../providers/anmerkungProvider.dart'; import '../providers/essenProvider.dart'; import '../providers/languageProvider.dart'; import '../providers/pageProvider.dart'; import '../providers/serviceProvider.dart'; import '../providers/spezielleErnaehrungProvider.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:restart_app/restart_app.dart'; class SpaceRate extends StatelessWidget { const SpaceRate({super.key}); void _showDeleteDialog(BuildContext context) { showDialog( context: context, builder: (BuildContext context) { return AlertDialog( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(20), ), title: Text(Provider.of(context, listen: false) .languageData[ Provider.of(context, listen: false) .language]["floating"]["delete"]["title"]), content: Text( Provider.of(context, listen: false).languageData[ Provider.of(context, listen: false) .language]["floating"]["delete"]["info"], style: const TextStyle(fontSize: 18), ), actions: [ ElevatedButton( onPressed: () { Navigator.of(context).pop(); }, style: ElevatedButton.styleFrom( backgroundColor: Theme.of(context).colorScheme.secondary), child: Text(Provider.of(context, listen: false) .languageData[ Provider.of(context, listen: false) .language]["floating"]["delete"]["keep"]), ), ElevatedButton( onPressed: () { /*Provider.of(context, listen: false) .resetAllFields();*/ Provider.of(context, listen: false) .resetAllFields(); /*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) .changePage(0); Provider.of(context, listen: false) .setSelectedSpace(0); Provider.of(context, listen: false) .setLanguage("de"); // Hier Aktion für Löschen ausführen Navigator.of(context).pop(); // Dialog schließen }, child: Text(Provider.of(context, listen: false) .languageData[ Provider.of(context, listen: false) .language]["floating"]["delete"]["del"]), ) ], ); }, ); } void change_backend_ip(BuildContext context) { final TextEditingController _ipController = TextEditingController(); showDialog( context: context, builder: (BuildContext context) { return AlertDialog( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(20), ), title: Text("Backend-IP ändern"), content: TextField( controller: _ipController,// IP-Format unterstützen decoration: InputDecoration( border: OutlineInputBorder(), labelText: 'Neue Backend-IP (z. B. 192.168.1.1)', ), ), actions: [ ElevatedButton( onPressed: () async { final newIp = _ipController.text; if (newIp.isEmpty) { // Falls das Feld leer ist, gib eine Warnung aus ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text("Die IP-Adresse darf nicht leer sein!")), ); return; } // Speichere die neue IP in den Shared Preferences final prefs = await SharedPreferences.getInstance(); await prefs.setString('supabase-ip', newIp); // Hole die neue IP und initialisiere die Supabase-Verbindung neu Restart.restartApp(); }, style: ElevatedButton.styleFrom( backgroundColor: Theme.of(context).colorScheme.secondary, ), child: Text("IP Ändern"), ), ElevatedButton( onPressed: () { Navigator.of(context).pop(); // Dialog schließen }, style: ElevatedButton.styleFrom( backgroundColor: Theme.of(context).colorScheme.secondary, ), child: Text("Abbrechen"), ), ], ); }, ); } void enter_pin(BuildContext context) { showDialog( context: context, builder: (BuildContext context) { final TextEditingController _pinController = TextEditingController(); return AlertDialog( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(20), ), content: TextField( controller: _pinController, obscureText: true, // PIN als Passwort maskieren decoration: InputDecoration( border: OutlineInputBorder(), labelText: 'PIN', counterText: '', // Entfernt die Zeichenanzahl-Anzeige ), ), actions: [ ElevatedButton( onPressed: () { if (_pinController.text == '091142069') { // Wenn die PIN korrekt ist Navigator.of(context).pop(); // Dialog schließen change_backend_ip(context); // Aktion ausführen } else { // Wenn die PIN falsch ist, Fehler anzeigen ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text("Falsche PIN!"), backgroundColor: Colors.red, ), ); } }, style: ElevatedButton.styleFrom( backgroundColor: Theme.of(context).colorScheme.secondary, ), child: Text("Absenden"), ), ElevatedButton( onPressed: () { Navigator.of(context).pop(); // Schließt den Dialog }, style: ElevatedButton.styleFrom( backgroundColor: Theme.of(context).colorScheme.secondary, ), child: Text("Schließen"), ), ], ); }, ); } @override Widget build(BuildContext context) { return Consumer(builder: (context, languageProvider, x) { return Scaffold( appBar: AppBar( leading: GestureDetector( onTap: () { _showDeleteDialog(context); // Kurzer Klick }, onLongPress: () async { await Future.delayed(Duration(seconds: 5)); enter_pin(context); // Langer Klick }, child: Icon( Icons.home_rounded, size: 36, color: Theme.of(context).colorScheme.onPrimary, ), ), title: Consumer( // Consumer verwenden, um den dynamischen Titel anzuzeigen builder: (context, pageProvider, child) { return Container( height: 40, decoration: BoxDecoration( color: Theme.of(context).colorScheme.primaryContainer, borderRadius: BorderRadius.circular(15), ), alignment: Alignment.centerLeft, child: Text( languageProvider.languageData[ Provider.of(context).language] ["navBar"][pageProvider.selectedPage.toString()], // Hier wird der dynamische Titel angezeigt style: TextStyle( color: Theme.of(context).colorScheme.onPrimary, fontWeight: FontWeight.bold, ), ), ); }, ), backgroundColor: Theme.of(context).colorScheme.primary, actions: [ IconButton( icon: Opacity( opacity: Provider.of(context).language == "de" ? 1.0 // Voll sichtbar : 0.4, // Halb durchsichtig child: Image.asset( 'assets/flags/de.png', width: 34, height: 24, fit: BoxFit.cover, ), ), onPressed: () { Provider.of(context, listen: false) .setLanguage("de"); }, ), IconButton( icon: Opacity( opacity: Provider.of(context).language == "en" ? 1.0 // Voll sichtbar : 0.4, // Halb durchsichtig child: Image.asset( 'assets/flags/en.png', width: 34, height: 24, fit: BoxFit.cover, ), ), onPressed: () { Provider.of(context, listen: false) .setLanguage("en"); }, ), IconButton( icon: Opacity( opacity: Provider.of(context).language == "fr" ? 1.0 // Voll sichtbar : 0.4, // Halb durchsichtig child: Image.asset( 'assets/flags/fr.png', width: 34, height: 24, fit: BoxFit.cover, ), ), onPressed: () { Provider.of(context, listen: false) .setLanguage("fr"); }, ), ], ), body: Consumer( builder: (context, pageProvider, child) { return Stack( children: [ pageProvider.pages[pageProvider.selectedPage], Positioned( left: 10, bottom: 10, child: IconButton.filled( padding: const EdgeInsets.all(15), onPressed: () { _showDeleteDialog(context); // Dialog anzeigen }, icon: const Icon( Icons.delete, size: 30, ), style: ButtonStyle( shape: WidgetStateProperty.all(RoundedRectangleBorder( borderRadius: BorderRadius.circular(17))), backgroundColor: WidgetStateProperty.all( Theme.of(context).colorScheme.primary, ), ), ), ) ], ); }, ), floatingActionButton: Column( mainAxisSize: MainAxisSize.min, children: [ Text( Provider.of(context).languageData[ Provider.of(context).language] ["floating"]["info"], style: TextStyle(fontSize: 15), ), const SizedBox( height: 10, ), FloatingActionButton.extended( onPressed: () { DatabaseService().getAllRatings( context ); /*DatabaseService.getAllRatings( Provider.of(context), Provider.of(context), Provider.of(context)); // Passe den Kontext an, falls nötig */ }, label: Text( Provider.of(context).languageData[ Provider.of(context).language] ["floating"]["return"], style: TextStyle(fontSize: 20), ), icon: const Icon(Icons.send), ) ], ), bottomNavigationBar: Container( color: Theme.of(context).colorScheme.secondary, child: Padding( padding: const EdgeInsets.all(5), child: GNav( onTabChange: (index) { Provider.of(context, listen: false) .changePage(index); }, gap: 8, style: GnavStyle.google, backgroundColor: Colors.transparent, color: Theme.of(context).colorScheme.onSurface, activeColor: Theme.of(context).colorScheme.onPrimary, tabBackgroundColor: Theme.of(context).colorScheme.primary, tabs: [ GButton( icon: Icons.fastfood_outlined, text: Provider.of(context).languageData[ Provider.of(context).language] ["navBar"]["0"], ), GButton( icon: Icons.mood, text: Provider.of(context).languageData[ Provider.of(context).language] ["navBar"]["1"], ), GButton( icon: Icons.favorite, text: Provider.of(context).languageData[ Provider.of(context).language] ["navBar"]["2"], ), ], ), ), ), ); }); } }