diff --git a/lib/main.dart b/lib/main.dart index ab2e6eb..2f2efd9 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -91,6 +91,7 @@ class MyHome extends StatelessWidget { Provider.of(context, listen: false).resetAllFields(); Provider.of(context, listen: false).resetAllFields(); Provider.of(context, listen: false).resetAllFields(); + Provider.of(context, listen: false).resetSelectedEssen(); // Hier Aktion für Löschen ausführen Navigator.of(context).pop(); // Dialog schließen diff --git a/lib/modules/fetchMenu.dart b/lib/modules/fetchMenu.dart new file mode 100644 index 0000000..bed19ce --- /dev/null +++ b/lib/modules/fetchMenu.dart @@ -0,0 +1,22 @@ +import 'package:http/http.dart' as http; + +class FetchMenu { + static Future> get() async { + List menus = []; + + // TODO: Proto: + http.Response resp = await http.get(Uri.parse( + "https://www.swfr.de/essen/mensen-cafes-speiseplaene/mensa-loerrach")); + var content = resp.body.split("

"); + var innerContent = content[1].split("\n"); + for (var s in innerContent) { + if (s.contains("extra-text mb-15px")) { + var name = (s.split("\">")[1].split("", " "); + menus.add(name); + } + } + // End-Proto + + return menus; + } +} diff --git a/lib/pages/pageEssen.dart b/lib/pages/pageEssen.dart index deb1292..db9d015 100644 --- a/lib/pages/pageEssen.dart +++ b/lib/pages/pageEssen.dart @@ -1,8 +1,10 @@ import 'package:flutter/material.dart'; import 'package:flutter_rating_bar/flutter_rating_bar.dart'; +import 'package:mensaapp/modules/fetchMenu.dart'; import 'package:mensaapp/modules/ratingEmote.dart'; import 'package:mensaapp/modules/ratingStars.dart'; import 'package:mensaapp/providers/essenProvider.dart'; +import 'package:mensaapp/providers/pageProvider.dart'; import 'package:provider/provider.dart'; class PageEssen extends StatelessWidget { @@ -14,103 +16,112 @@ class PageEssen extends StatelessWidget { body: Stack( children: [ // Hintergrundbild - Container( - width: 1600, - height: 750, - decoration: BoxDecoration( - image: DecorationImage( - image: AssetImage("assets/backgrounds/Essen.jpg"), - fit: BoxFit.cover, // Deckt den gesamten Bildschirm ab - colorFilter: ColorFilter.mode( - Colors.white.withOpacity(0.2), - BlendMode.dstATop, - ), + Container( + width: 1600, + height: 750, + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage("assets/backgrounds/Essen.jpg"), + fit: BoxFit.cover, // Deckt den gesamten Bildschirm ab + colorFilter: ColorFilter.mode( + Colors.white.withOpacity(0.2), + BlendMode.dstATop, ), ), ), - // Vordergrundinhalte - Center( - child: Container( - decoration: BoxDecoration( - color: Colors.white.withOpacity(0.8), - borderRadius: BorderRadius.only( - topLeft: Radius.circular(80), - bottomRight: Radius.circular(80) - ) - ), - height: 400, - width: 600, - padding: EdgeInsets.symmetric(horizontal: 20), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - const Text( - "Geschmack*", - style: TextStyle(fontSize: 35), - ), - Consumer( - builder: (context, essenProvider, child) { - return RatingStars( - onRate: (value) { - essenProvider.setRatingGeschmack(value); - }, - initRating: essenProvider.ratingGeschmack, - ); - }, - ) - ], - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - const Text( - "Qualität*", - style: TextStyle(fontSize: 35), - ), - Consumer( - builder: (context, essenProvider, child) { - return RatingStars( - onRate: (value) { - essenProvider.setRatingQuali(value); - }, - initRating: essenProvider.ratingQuali, - ); - }, - ) - ], - ), - const SizedBox( - height: 50, - ), - Consumer( - builder: (context, essenProvider, child) { - return TextFormField( - initialValue: essenProvider.freiText, - onChanged: (value) { - essenProvider.setFreiText(value); - }, - autofocus: false, - maxLength: 500, - maxLines: 4, - decoration: InputDecoration( - labelText: "Dein Feedback (optional)", - labelStyle: const TextStyle(fontSize: 20), - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(15), - ), - ), - style: TextStyle(fontSize: 20), - ); - }, - ), - ], - ), - ), ), + // Vordergrundinhalte + + Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Consumer( + builder: (context, pageProvider, child) { + return Text(pageProvider.selectedEssenName, style: const TextStyle(fontSize: 40),); + }, + ), + const SizedBox(height: 30,), + Container( + decoration: BoxDecoration( + color: Colors.white.withOpacity(0.8), + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(80), + bottomRight: Radius.circular(80))), + height: 400, + width: 600, + padding: EdgeInsets.symmetric(horizontal: 20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const Text( + "Geschmack*", + style: TextStyle(fontSize: 35), + ), + Consumer( + builder: (context, essenProvider, child) { + return RatingStars( + onRate: (value) { + essenProvider.setRatingGeschmack(value); + }, + initRating: essenProvider.ratingGeschmack, + ); + }, + ) + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const Text( + "Qualität*", + style: TextStyle(fontSize: 35), + ), + Consumer( + builder: (context, essenProvider, child) { + return RatingStars( + onRate: (value) { + essenProvider.setRatingQuali(value); + }, + initRating: essenProvider.ratingQuali, + ); + }, + ) + ], + ), + const SizedBox( + height: 50, + ), + Consumer( + builder: (context, essenProvider, child) { + return TextFormField( + initialValue: essenProvider.freiText, + onChanged: (value) { + essenProvider.setFreiText(value); + }, + autofocus: false, + maxLength: 500, + maxLines: 4, + decoration: InputDecoration( + labelText: "Dein Feedback (optional)", + labelStyle: const TextStyle(fontSize: 20), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(15), + ), + ), + style: TextStyle(fontSize: 20), + ); + }, + ), + ], + ), + ), + ], + )), ], ), ); diff --git a/lib/pages/pageEssenSelect.dart b/lib/pages/pageEssenSelect.dart new file mode 100644 index 0000000..3ebe0d6 --- /dev/null +++ b/lib/pages/pageEssenSelect.dart @@ -0,0 +1,65 @@ +import 'package:flutter/material.dart'; +import 'package:mensaapp/modules/fetchMenu.dart'; +import 'package:mensaapp/providers/pageProvider.dart'; +import 'package:provider/provider.dart'; + +class PageEssenSelect extends StatelessWidget { + const PageEssenSelect({super.key}); + + @override + Widget build(BuildContext context) { + + List menus = []; + + Future fetchMenu() async { + menus = await FetchMenu.get(); + } + + return FutureBuilder( + future: fetchMenu(), + builder: (context, snapshot) { + return Scaffold( + body: Stack( + children: [ + Container( + width: 1600, + height: 750, + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage("assets/backgrounds/Essen.jpg"), + fit: BoxFit.cover, // Deckt den gesamten Bildschirm ab + colorFilter: ColorFilter.mode( + Colors.white.withOpacity(0.2), + BlendMode.dstATop, + ), + ), + ), + ), + Center( + child: Container( + child: Wrap( + direction: Axis.horizontal, + alignment: WrapAlignment.center, + runSpacing: 50, + spacing: 50, + children: [ + for (int i = 0; i < menus.length; i++) + FilledButton.icon( + style: ButtonStyle(padding: WidgetStatePropertyAll(EdgeInsets.all(60))), + icon: const Icon(Icons.fastfood_outlined), + label: Text("Essen ${i + 1}: ${menus[i]}", style: TextStyle(fontSize: 23),), + onPressed: () { + Provider.of(context, listen: false).setSelectedEssen(i + 1, "Essen ${i + 1}: ${menus[i]}"); + }, + ) + ], + ), + ), + ) + ], + ), + ); + }, + ); + } +} diff --git a/lib/providers/pageProvider.dart b/lib/providers/pageProvider.dart index b7517bb..17bb2a5 100644 --- a/lib/providers/pageProvider.dart +++ b/lib/providers/pageProvider.dart @@ -1,14 +1,17 @@ import 'package:flutter/material.dart'; import 'package:mensaapp/pages/pageAmbiente.dart'; import 'package:mensaapp/pages/pageEssen.dart'; +import 'package:mensaapp/pages/pageEssenSelect.dart'; import 'package:mensaapp/pages/pageService.dart'; import 'package:mensaapp/pages/pageAnmerkungen.dart'; import 'package:mensaapp/pages/pageSpezielleErnaehrung.dart'; class PageProvider extends ChangeNotifier { int selectedPage = 0; + int selectedEssenID = 0; + String selectedEssenName = ""; List pages = [ - const PageEssen(), + const PageEssenSelect(), const PageAmbiente(), const PageService(), const PageAnmerkungen(), @@ -27,4 +30,18 @@ class PageProvider extends ChangeNotifier { selectedPage = index; notifyListeners(); } + + void setSelectedEssen(int id, String name) { + selectedEssenName = name; + selectedEssenID = id; + pages[0] = const PageEssen(); + notifyListeners(); + } + + void resetSelectedEssen() { + selectedEssenName = ""; + selectedEssenID = 0; + pages[0] = const PageEssenSelect(); + notifyListeners(); + } } \ No newline at end of file diff --git a/pubspec.lock b/pubspec.lock index 17b0c46..84abb0b 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -91,6 +91,22 @@ packages: url: "https://pub.dev" source: hosted version: "5.0.7" + http: + dependency: "direct main" + description: + name: http + sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010 + url: "https://pub.dev" + source: hosted + version: "1.2.2" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + url: "https://pub.dev" + source: hosted + version: "4.0.2" leak_tracker: dependency: transitive description: @@ -224,6 +240,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.7.2" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 + url: "https://pub.dev" + source: hosted + version: "1.4.0" vector_math: dependency: transitive description: @@ -240,6 +264,14 @@ packages: url: "https://pub.dev" source: hosted version: "14.2.5" + web: + dependency: transitive + description: + name: web + sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb + url: "https://pub.dev" + source: hosted + version: "1.1.0" sdks: dart: ">=3.5.3 <4.0.0" flutter: ">=3.18.0-18.0.pre.54" diff --git a/pubspec.yaml b/pubspec.yaml index 8c4f18c..f9f4773 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -33,6 +33,7 @@ dependencies: provider: ^6.1.2 google_nav_bar: ^5.0.7 flutter_rating_bar: ^4.0.1 + http: ^1.2.2 # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons.