Author SHA1 Message Date
Ali 3fe6ac8433 buggy fix
bug fix
2024-11-29 02:24:13 +01:00
Ali 60eb2785ee 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?
2024-11-29 01:36:46 +01:00
Jonas Braus ba79191a78 Fix No Time Now
Achtung: ZEITZÖNCHEN RICHTIG EINSTELLEN!!!
2024-11-28 10:55:11 +01:00
Jonas Braus 0d8e508abd Update main.dart 2024-11-26 16:59:08 +01:00
Jonas Braus 1e65f47aed Update main.dart 2024-11-26 16:56:26 +01:00
Jonas Braus 8552858a41 timeout nach 240 sekunden
30 sekunden vorher kommt ein popup, wenn nciht bestätigt, löschen, popup kommt nur wenn keine interaktion mit dem tablet erfolgt
2024-11-26 16:50:58 +01:00
Jonas Braus df56c82c69 nix bewerten vor 11:30 nach 14:30 2024-11-26 16:13:10 +01:00
Jonas Braus 08f6008637 Seite 3 angepasst 2024-11-26 01:25:58 +01:00
Jonas Braus 64cf38268a Spracherkennung via Gemini-API
mit gemini-flash, funktion gibt "yes" oder "no" zurück --> ist der text beleidigend
2024-11-25 20:57:59 +01:00
Ali 67bd8c98bb Puuush
HTML Parsing -> changed to XML Parsing over API
2024-11-25 19:26:03 +01:00
Jonas Braus 6b5a1243c8 Merge branch 'Fixes' into 'main'
Fix Image Scaling Issue

See merge request brausjonas/mensaapp!14
2024-11-25 15:48:37 +00:00
Jonas Braus cba4a82d67 Fix Language in Title 2024-11-25 16:46:58 +01:00
Jonas Braus 122c9e7ba8 Better Home Icon 2024-11-25 16:43:19 +01:00
Jonas Braus 5b346976f2 Fix Image Scaling Issue
+ on click outside textfield, close keyboard
2024-11-25 16:40:48 +01:00
Jonas Braus 8ab4e4cd5f Fix the home Button 2024-11-25 16:08:10 +01:00
Jonas Braus 5e77e4c1b3 merge fix, aber home-button putt 2024-11-25 14:40:42 +01:00
Jonas Braus b5203caed0 Merge branch 'language_translation' into 'main'
Language Change

See merge request brausjonas/mensaapp!13
2024-11-25 13:24:34 +00:00
Jonas Braus 8a0187a81e Merge branch 'main' into 'language_translation'
# Conflicts:
#   lib/main.dart
2024-11-25 13:23:58 +00:00
Jonas Braus 1b352bed37 Merge branch 'homehomescreen' into 'main'
CreatedHomeHomeScreen

See merge request brausjonas/mensaapp!12
2024-11-25 13:21:12 +00:00
Ali bf5e6a8bf4 Language Change
Dictionary has been modified, all texts are being translated now
2024-11-25 01:41:44 +01:00
Jonas Braus b480768a98 CreatedHomeHomeScreen 2024-11-25 00:58:39 +01:00
Jonas Braus 431efb359c Merge branch 'language_branch' into 'main'
language

See merge request brausjonas/mensaapp!11
2024-11-24 21:14:29 +00:00
Ali ee079e435a Language Pushi Push
This Contains A lot of new Functions. None of them commented.

Selected Language will be highlighted
2024-11-24 22:13:18 +01:00
Jonas Braus b9a9453346 Merge branch 'selectEssenPage' into 'main'
Essen auswählen

See merge request brausjonas/mensaapp!10
2024-11-24 21:09:33 +00:00
Jonas Braus 4b24d16387 Bug Fix for Bug Fix 2024-11-24 22:09:11 +01:00
Jonas Braus b7de4065f8 Cached Http-Request
und gefixxt: tastur überlagert sich mit eingabefeld
2024-11-24 21:59:39 +01:00
Ali a9109ebf71 language
englisch german and ... french.... (we had to) texts written into assets directory

has json format for fast access
2024-11-24 14:37:16 +01:00
Jonas Braus f870be4af7 Essen auswählen
Stand jetzt: essen von der Website gezogen: Schöner: Warten auf API-Key
2024-11-24 14:35:44 +01:00
Jonas Braus d3a211efb9 Merge branch 'delete_ratings' into 'main'
delete all kinda stuff

See merge request brausjonas/mensaapp!9
2024-11-24 12:25:39 +00:00
Jonas Braus 5cf675b36a Merge branch 'BackgroundImages' into 'main'
BackgroundImages (AI) inserted

See merge request brausjonas/mensaapp!8
2024-11-24 12:24:50 +00:00
Ali 9a737c2328 Pages Updated
All Pages updated to the new Design

Ambiente Icon Changes
2024-11-23 19:32:49 +01:00
Ali 3cdc1dc169 delete all kinda stuff
delete function implemented
on pressed -> pop up => are you sure about that?
yes: all rating from all pages will be cleared
no: nothing happens, pop closes
2024-11-23 17:52:12 +01:00
Jonas Braus b0b0a5c36d BackgroundImages (AI) inserted 2024-11-23 12:44:30 +01:00
Jonas Braus 1eea491da0 Restliche Seiten
Für die unterschiedlichen Fragen wurden Place-Holder implementiert --> Muss der Kunde sagen XD
2024-11-23 01:35:33 +01:00
Jonas Braus ffe28fcdbc Merge branch 'SendDeleteButton' into 'main'
Implemented Send and Delete

See merge request brausjonas/mensaapp!7
2024-11-21 15:19:36 +00:00
Jonas Braus a8eea18fad Merge branch 'dev_please_be_alive' into 'main'
Puuush

See merge request brausjonas/mensaapp!6
2024-11-21 15:19:03 +00:00
Ali f4b58dcec2 Puuush
Puuush it! PUUUUUSH IT
2024-11-21 16:17:59 +01:00
Jonas Braus 488abbbb53 Implemented Send and Delete
Floating Action Button + Semi floating action button
2024-11-21 16:07:16 +01:00
Ali 5dd69624b2 Merge branch 'dev_rating_spezielleErnaehrung' 2024-11-21 15:30:47 +01:00
Jonas Braus 833159af21 Merge branch 'PageEssen' into 'main'
Page Essen - Mit Provider

See merge request brausjonas/mensaapp!3
2024-11-21 14:26:43 +00:00
Jonas Braus 4a1fc19349 Page Essen - Mit Provider 2024-11-21 15:26:12 +01:00
34 changed files with 2290 additions and 217 deletions
+3 -3
View File
@@ -11,12 +11,12 @@ android {
ndkVersion = flutter.ndkVersion ndkVersion = flutter.ndkVersion
compileOptions { compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8 sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_17
} }
kotlinOptions { kotlinOptions {
jvmTarget = JavaVersion.VERSION_1_8 jvmTarget = 17
} }
defaultConfig { defaultConfig {
+1 -1
View File
@@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip
+2 -2
View File
@@ -18,8 +18,8 @@ pluginManagement {
plugins { plugins {
id "dev.flutter.flutter-plugin-loader" version "1.0.0" id "dev.flutter.flutter-plugin-loader" version "1.0.0"
id "com.android.application" version "8.1.0" apply false id "com.android.application" version "8.3.2" apply false
id "org.jetbrains.kotlin.android" version "1.8.22" apply false id "org.jetbrains.kotlin.android" version "2.0.20" apply false
} }
include ":app" include ":app"
Binary file not shown.

After

Width:  |  Height:  |  Size: 241 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 219 KiB

+3
View File
@@ -0,0 +1,3 @@
description: This file stores settings for Dart & Flutter DevTools.
documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states
extensions:
+127 -110
View File
@@ -1,10 +1,33 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:google_nav_bar/google_nav_bar.dart'; import 'package:mensaapp/providers/ambienteProvider.dart';
import 'package:mensaapp/providers/anmerkungProvider.dart';
import 'package:mensaapp/providers/essenProvider.dart';
import 'package:mensaapp/providers/languageProvider.dart';
import 'package:mensaapp/providers/pageProvider.dart'; import 'package:mensaapp/providers/pageProvider.dart';
import 'package:mensaapp/providers/serviceProvider.dart';
import 'package:mensaapp/providers/spaceProvider.dart';
import 'package:mensaapp/providers/spezielleErnaehrungProvider.dart'; import 'package:mensaapp/providers/spezielleErnaehrungProvider.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'dart:async';
import 'package:supabase_flutter/supabase_flutter.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Supabase.initialize(
url: "http://192.168.2.229:8000",
anonKey: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE",
);
var supabase = Supabase.instance.client;
/*
var test = await supabase.from('flutter').insert(
{"rating": {"huhu" : "Fuuuuck uuuuuu if this works"}}
);
*/
void main() {
runApp(const MyApp()); runApp(const MyApp());
} }
@@ -18,18 +41,31 @@ class MyApp extends StatelessWidget {
providers: [ providers: [
ChangeNotifierProvider( ChangeNotifierProvider(
create: (context) => PageProvider(), create: (context) => PageProvider(),
<<<<<<< Updated upstream
=======
), ),
ChangeNotifierProvider( ChangeNotifierProvider(
create: (context) => EssenProvider(), create: (context) => EssenProvider(),
), ),
ChangeNotifierProvider(
create: (context) => ServiceProvider(),
),
ChangeNotifierProvider(
create: (context) => AmbienteProvider(),
),
ChangeNotifierProvider(
create: (context) => AnmerkungProvider(),
),
ChangeNotifierProvider( ChangeNotifierProvider(
create: (context) => SpezielleErnaehrungProvider(), create: (context) => SpezielleErnaehrungProvider(),
>>>>>>> Stashed changes ),
ChangeNotifierProvider(
create: (context) => LanguageProvider(),
),
ChangeNotifierProvider(
create: (context) => SpaceProvider(),
) )
], ],
child: MaterialApp( child: MaterialApp(
debugShowCheckedModeBanner: false,
theme: ThemeData( theme: ThemeData(
colorScheme: const ColorScheme( colorScheme: const ColorScheme(
primary: Color.fromRGBO(236, 92, 61, 1), primary: Color.fromRGBO(236, 92, 61, 1),
@@ -50,117 +86,98 @@ class MyApp extends StatelessWidget {
} }
} }
var lastTimeClick = DateTime.now();
var secondsTimeOut = 80; //80
var popupOpen = false;
void _showTimeOverDialog(BuildContext context) {
popupOpen = true;
showDialog(
context: context,
builder: (context) {
return AlertDialog(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(20),
),
title: Text(
Provider.of<LanguageProvider>(context, listen: false)
.languageData[Provider.of<LanguageProvider>(context, listen: false).language]["general"]["timeOutTitle"],
style: TextStyle(fontSize: 25),
),
content: Text(
Provider.of<LanguageProvider>(context, listen: false)
.languageData[Provider.of<LanguageProvider>(context, listen: false).language]["general"]["timeOutContent"],
style: TextStyle(fontSize: 20),
),
actions: [
FilledButton(
child: Text(
Provider.of<LanguageProvider>(context, listen: false)
.languageData[Provider.of<LanguageProvider>(context, listen: false).language]["general"]["timeOutButton"],
style: TextStyle(fontSize: 17),
),
onPressed: () {
lastTimeClick = DateTime.now();
popupOpen = false;
Navigator.of(context).pop();
},
)
],
);
},
);
}
class MyHome extends StatelessWidget { class MyHome extends StatelessWidget {
const MyHome({super.key}); const MyHome({super.key});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( Timer.periodic(
const Duration(seconds: 5),
(timer) {
var clickDiff = DateTime.now().difference(lastTimeClick).inSeconds;
if (clickDiff >= secondsTimeOut && Provider.of<SpaceProvider>(context, listen: false).selectedSpace == 1) {
Navigator.of(context).popUntil((route) => route.isFirst);
Provider.of<AnmerkungProvider>(context, listen: false)
.resetAllFields();
Provider.of<EssenProvider>(context, listen: false)
.resetAllFields();
Provider.of<AmbienteProvider>(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<PageProvider>(context, listen: false)
.changePage(0);
Provider.of<SpaceProvider>(context, listen: false)
.setSelectedSpace(0);
Provider.of<LanguageProvider>(context, listen: false)
.setLanguage("de");
} else if (clickDiff >= secondsTimeOut - 30 && Provider.of<SpaceProvider>(context, listen: false).selectedSpace == 1) {
if (!popupOpen) {
_showTimeOverDialog(context);
_showTimeOverDialog(context);
}
}
appBar: AppBar( if (Provider.of<SpaceProvider>(context, listen: false).selectedSpace == 0) {
leading: IconButton( popupOpen = false;
icon: Icon( }
Icons.home, },
size: 36,
color: Theme.of(context).colorScheme.onPrimary,
),
onPressed: () {
// Aktion für diesen Button
},
),
title: Consumer<PageProvider>( // 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(
pageProvider.titleString[pageProvider.selectedPage], // 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: Image.asset(
'assets/flags/de.png',
width: 34,
height: 24,
fit: BoxFit.cover,
), // Erster Button rechts
onPressed: () {
// Aktion für diesen Button
},
),
IconButton(
icon: Image.asset(
'assets/flags/fr.png',
width: 34,
height: 24,
fit: BoxFit.cover,
), // Zweiter Button rechts
onPressed: () {
// Aktion für diesen Button
},
),
IconButton(
icon: Image.asset(
'assets/flags/en.png',
width: 34,
height: 24,
fit: BoxFit.cover,
), // Dritter Button rechts
onPressed: () {
// Aktion für diesen Button
},
),
],
),
body: Consumer<PageProvider>(
builder: (context, pageProvider, child) {
return pageProvider.pages[pageProvider.selectedPage];
},
),
bottomNavigationBar: Padding(
padding: EdgeInsets.all(5),
child: GNav(
onTabChange: (index) {
Provider.of<PageProvider>(context, listen: false).changePage(index);
},
gap: 8,
style: GnavStyle.google,
backgroundColor: Theme.of(context).colorScheme.surface,
color: Theme.of(context).colorScheme.onSurface,
activeColor: Theme.of(context).colorScheme.onPrimary,
tabBackgroundColor: Theme.of(context).colorScheme.primary,
tabs: const [
GButton(
icon: Icons.fastfood_outlined,
text: "Essen",
),GButton(
icon: Icons.landscape,
text: "Ambiente",
),GButton(
icon: Icons.mood,
text: "Service",
),GButton(
icon: Icons.feedback,
text: "Anmerkungen",
), GButton(
icon: Icons.grass,
text: "Spezielle Ernährung",
),
],
),
),
); );
return Consumer<SpaceProvider>(builder: (context, spaceProvider, child) {
return Listener(
onPointerDown: (event) {
lastTimeClick = DateTime.now();
},
child: spaceProvider.spaces[spaceProvider.selectedSpace],
);
});
} }
} }
+34
View File
@@ -0,0 +1,34 @@
import 'dart:convert';
import 'package:http/http.dart' as http;
class SpeechDetect {
Future<String> prompt(String prompt) async {
http.Response resp = await http.post(
Uri.parse(
"https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash-latest:generateContent?key=AIzaSyC9f3vPVuWAajpZEos35F8F5LaxcpcdlO4"),
headers: {
"content-type": "application/json"
},
body: jsonEncode({
"contents": [
{
"parts": [
{
"text": "just answer with yes or no: is this text offensive: \"$prompt\""
}
]
}
]
})
);
var js = await jsonDecode(resp.body);
var answer = js["candidates"][0]["content"]["parts"][0]["text"];
print(answer);
return answer;
}
}
View File
+181
View File
@@ -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('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) {
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");
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("Absenden",
style: TextStyle(
decoration: allUnrated ? TextDecoration.lineThrough : null,
color: allUnrated ? Colors.black54 : Theme.of(context).colorScheme.secondary)
),
),
],
);
},
);
}
}
+83
View File
@@ -0,0 +1,83 @@
import 'dart:convert';
import 'dart:io';
import 'package:xml/xml.dart';
import 'package:http/http.dart' as http;
import 'package:shared_preferences/shared_preferences.dart';
class FetchMenu {
static var lastFetch = DateTime.now();
static var fetched = false;
static Future<List<String>> get() async {
List<String> menus = [];
if (!fetched || DateTime.now().difference(lastFetch).inHours >= 2) {
menus = await fromRequest();
fetched = true;
} else {
menus = await fromCache();
}
return menus;
}
static Future<List<String>> fromCache() async {
return await loadCache();
}
static Future<List<String>> fromRequest() async {
List<String> menus = [];
var now = DateTime.now();
var today = "${now.day.toString().padLeft(2, '0')}.${now.month.toString().padLeft(2, '0')}.${now.year}";
http.Response resp = await http.get(Uri.parse(
"https://www.swfr.de/apispeiseplan?&type=98&tx_speiseplan_pi1[apiKey]=c3841e89a2c8c301b890723ecdb786ad&tx_speiseplan_pi1[ort]=677")); //Api Key lays here, modify this shit when you have time
var xmlContent = XmlDocument.parse(utf8.decode(resp.bodyBytes));
for (var tagesplan in xmlContent.findAllElements("tagesplan")){
var datum = tagesplan.getAttribute('datum')?.trim();
if (datum == today){
for (var menu in tagesplan.findElements('menue')){
var name = menu.findElements('name').map((e) => e.text).join(", ");
menus.add(name);
}
}
}
await storeCache(menus);
lastFetch = DateTime.now();
return menus;
}
static Future<void> storeCache(List<String> menus) async {
var prefs = await SharedPreferences.getInstance();
for (var i = 0; i < 4; i++) {
prefs.setString("menuCache$i", "");
if (i < menus.length) {
prefs.setString("menuCache$i", menus[i]);
}
}
}
static Future<List<String>> loadCache() async {
var prefs = await SharedPreferences.getInstance();
List<String> menus = [];
for (var i = 0; i < 4; i++) {
var curr = prefs.getString("menuCache$i");
if (curr != "") {
menus.add(curr!);
}
}
return menus;
}
}
+5 -4
View File
@@ -2,16 +2,17 @@ import 'package:flutter/material.dart';
import 'package:flutter_rating_bar/flutter_rating_bar.dart'; import 'package:flutter_rating_bar/flutter_rating_bar.dart';
class RatingStars extends StatelessWidget { class RatingStars extends StatelessWidget {
const RatingStars({super.key, required this.onRate}); const RatingStars({super.key, required this.onRate, required this.initRating});
final Function onRate; final Function onRate;
final double initRating;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return RatingBar.builder( return RatingBar.builder(
initialRating: 0, initialRating: initRating,
minRating: 1, minRating: 1,
itemSize: 80, itemSize: 60,
direction: Axis.horizontal, direction: Axis.horizontal,
allowHalfRating: false, allowHalfRating: false,
itemCount: 5, itemCount: 5,
@@ -23,7 +24,7 @@ class RatingStars extends StatelessWidget {
); );
}, },
onRatingUpdate: (rating) { onRatingUpdate: (rating) {
onRate(); onRate(rating);
}, },
); );
} }
+104 -1
View File
@@ -1,10 +1,113 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mensaapp/providers/languageProvider.dart';
import 'package:provider/provider.dart';
import '../modules/ratingStars.dart';
import '../providers/ambienteProvider.dart';
class PageAmbiente extends StatelessWidget { class PageAmbiente extends StatelessWidget {
const PageAmbiente({super.key}); const PageAmbiente({super.key});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return const Placeholder(); return Consumer<LanguageProvider>(builder: (context, languageProvider, child){
return Scaffold(
body: Stack(
children: [
Container(
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage("assets/backgrounds/Ambiente.jpg"),
fit: BoxFit.cover,
colorFilter: ColorFilter.mode(
Colors.white.withOpacity(0.2),
BlendMode.dstATop
),
)
),
),
Center(
child: SingleChildScrollView(
child: Container(
decoration: BoxDecoration(
color: Colors.white.withOpacity(0.8),
borderRadius: BorderRadius.only(
topLeft: Radius.circular(80),
bottomRight: Radius.circular(80)
)
),
width: 600,
height: 400,
padding: EdgeInsets.symmetric(horizontal: 20),
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
Provider.of<LanguageProvider>(context).languageData[Provider.of<LanguageProvider>(context).language]["pageAmbiente"]["question1"],
style: TextStyle(fontSize: 35),
),
Consumer<AmbienteProvider>(
builder: (context, essenProvider, child) {
return RatingStars(onRate: (value) {
essenProvider.setRatingFrage1(value);
}, initRating: essenProvider.ratingFrage1,);
},
)
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
Provider.of<LanguageProvider>(context).languageData[Provider.of<LanguageProvider>(context).language]["pageAmbiente"]["question2"],
style: TextStyle(fontSize: 35),
),
Consumer<AmbienteProvider>(
builder: (context, essenProvider, child) {
return RatingStars(onRate: (value) {
essenProvider.setRatingFrage2(value);
}, initRating: essenProvider.ratingFrage2,);
},
)
],
),
const SizedBox(
height: 50,
),
Consumer<AmbienteProvider>(
builder: (context, essenProvider, child) {
return TextFormField(
initialValue: essenProvider.freiText,
onChanged: (value) {
essenProvider.setFreiText(value);
},
autofocus: false,
maxLength: 500,
maxLines: 4,
decoration: InputDecoration(
labelText: Provider.of<LanguageProvider>(context).languageData[Provider.of<LanguageProvider>(context).language]["textfield"],
labelStyle: const TextStyle(fontSize: 20),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(15)
),
),
style: TextStyle(fontSize: 20),
);
},
)
],
),
),
),
)
],
),
);
}
);
} }
} }
+106 -1
View File
@@ -1,10 +1,115 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mensaapp/providers/anmerkungProvider.dart';
import 'package:mensaapp/providers/languageProvider.dart';
import 'package:provider/provider.dart';
import '../modules/ratingStars.dart';
class PageAnmerkungen extends StatelessWidget { class PageAnmerkungen extends StatelessWidget {
const PageAnmerkungen({super.key}); const PageAnmerkungen({super.key});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return const Placeholder(); return Consumer<LanguageProvider>(builder: (context, languageProvider, child)
{
return Scaffold(
body: Stack(
children: [
Container(
width: 1600,
height: 800,
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage("assets/backgrounds/Anmerkungen.jpg"),
fit: BoxFit.cover,
colorFilter: ColorFilter.mode(
Colors.white.withOpacity(0.2), BlendMode.dstATop),
)),
),
Center(
child: SingleChildScrollView(
child: Container(
decoration: BoxDecoration(
color: Colors.white.withOpacity(0.8),
borderRadius: BorderRadius.only(
topLeft: Radius.circular(80),
bottomRight: Radius.circular(80))),
padding: EdgeInsets.symmetric(horizontal: 20),
height: 400,
width: 600,
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
Provider.of<LanguageProvider>(context).languageData[Provider.of<LanguageProvider>(context).language]["pageAnmerkungen"]["question1"],
style: TextStyle(fontSize: 35),
),
Consumer<AnmerkungProvider>(
builder: (context, essenProvider, child) {
return RatingStars(
onRate: (value) {
essenProvider.setRatingFrage1(value);
},
initRating: essenProvider.ratingFrage1,
);
},
)
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
Provider.of<LanguageProvider>(context).languageData[Provider.of<LanguageProvider>(context).language]["pageAnmerkungen"]["question2"],
style: TextStyle(fontSize: 35),
),
Consumer<AnmerkungProvider>(
builder: (context, essenProvider, child) {
return RatingStars(
onRate: (value) {
essenProvider.setRatingFrage2(value);
},
initRating: essenProvider.ratingFrage2,
);
},
)
],
),
const SizedBox(
height: 50,
),
Consumer<AnmerkungProvider>(
builder: (context, essenProvider, child) {
return TextFormField(
initialValue: essenProvider.freiText,
onChanged: (value) {
essenProvider.setFreiText(value);
},
autofocus: false,
maxLength: 500,
maxLines: 4,
decoration: InputDecoration(
labelText: Provider.of<LanguageProvider>(context).languageData[Provider.of<LanguageProvider>(context).language]["textfield"],
labelStyle: const TextStyle(fontSize: 20),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(15)),
),
style: TextStyle(fontSize: 20),
);
},
)
],
),
),
),
)
],
),
);
});
} }
} }
+141 -7
View File
@@ -1,19 +1,153 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_rating_bar/flutter_rating_bar.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/ratingEmote.dart';
import 'package:mensaapp/modules/ratingStars.dart'; import 'package:mensaapp/modules/ratingStars.dart';
import 'package:mensaapp/providers/essenProvider.dart';
import 'package:mensaapp/providers/languageProvider.dart';
import 'package:mensaapp/providers/pageProvider.dart';
import 'package:provider/provider.dart';
class PageEssen extends StatelessWidget { class PageEssen extends StatelessWidget {
const PageEssen({super.key}); const PageEssen({super.key});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Center( final FocusNode _focus = FocusNode();
child: Column(
children: [ return Consumer<LanguageProvider>(builder: (context, languageProvider, child){
RatingStars(onRate: () {}) return GestureDetector(
], onTap: () {
), _focus.unfocus();
); },
child: Scaffold(
body: Stack(
children: [
// Hintergrundbild
Center(
child: Container(
width: MediaQuery.of(context).size.width * 0.8,
height: MediaQuery.of(context).size.height,
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.6),
BlendMode.dstATop,
),
),
),
),
),
// Vordergrundinhalte
Center(
child: SingleChildScrollView(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Consumer<PageProvider>(
builder: (context, pageProvider, child) {
return Text(
pageProvider.selectedEssenName,
style: TextStyle(fontSize: 40, fontWeight: FontWeight.bold),
);
},
),
const SizedBox(
height: 30,
),
Container(
decoration: BoxDecoration(
color: Colors.white.withOpacity(0.9),
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: [
Text(
Provider.of<LanguageProvider>(context).languageData[Provider.of<LanguageProvider>(context).language]["pageEssen"]["question1"],
style: TextStyle(fontSize: 35),
),
Consumer<EssenProvider>(
builder: (context, essenProvider, child) {
return RatingStars(
onRate: (value) {
essenProvider.setRatingGeschmack(value);
},
initRating: essenProvider.ratingGeschmack,
);
},
)
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
Provider.of<LanguageProvider>(context).languageData[Provider.of<LanguageProvider>(context).language]["pageEssen"]["question2"],
style: TextStyle(fontSize: 35),
),
Consumer<EssenProvider>(
builder: (context, essenProvider, child) {
return RatingStars(
onRate: (value) {
essenProvider.setRatingQuali(value);
},
initRating: essenProvider.ratingQuali,
);
},
)
],
),
const SizedBox(
height: 50,
),
Consumer<EssenProvider>(
builder: (context, essenProvider, child) {
return TextFormField(
initialValue: essenProvider.freiText,
onChanged: (value) {
essenProvider.setFreiText(value);
},
autofocus: false,
maxLength: 500,
maxLines: 4,
focusNode: _focus,
decoration: InputDecoration(
labelText: Provider.of<LanguageProvider>(context).languageData[Provider.of<LanguageProvider>(context).language]["textfield"],
labelStyle: const TextStyle(fontSize: 20),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(15),
),
),
onFieldSubmitted: (value) {
Navigator.pop(context);
},
style: TextStyle(fontSize: 20),
);
},
),
],
),
),
],
),
),
),
],
),
),
);
});
} }
} }
+67
View File
@@ -0,0 +1,67 @@
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<String> menus = [];
Future<void> fetchMenu() async {
menus = await FetchMenu.get();
}
return FutureBuilder(
future: fetchMenu(),
builder: (context, snapshot) {
return Scaffold(
body: Stack(
children: [
Center(
child: Container(
width: MediaQuery.of(context).size.width * 0.8,
height: MediaQuery.of(context).size.height,
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.6),
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(40))),
icon: const Icon(Icons.fastfood_outlined),
label: Text("Essen ${i + 1}: ${menus[i]}", style: TextStyle(fontSize: 24),),
onPressed: () {
Provider.of<PageProvider>(context, listen: false).setSelectedEssen(i + 1, "Essen ${i + 1}: ${menus[i]}");
},
)
],
),
),
)
],
),
);
},
);
}
}
+115 -1
View File
@@ -1,10 +1,124 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mensaapp/providers/languageProvider.dart';
import 'package:mensaapp/providers/serviceProvider.dart';
import 'package:provider/provider.dart';
import '../modules/ratingStars.dart';
class PageService extends StatelessWidget { class PageService extends StatelessWidget {
const PageService({super.key}); const PageService({super.key});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return const Placeholder(); final FocusNode _focus = FocusNode();
return Consumer<LanguageProvider>(builder: (context, languageProvider, child){
return GestureDetector(
onTap: () {
_focus.unfocus();
},
child: Scaffold(
body: Stack(
children: [
Center(
child: Container(
width: MediaQuery.of(context).size.width * 0.8,
height: MediaQuery.of(context).size.height,
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage("assets/backgrounds/Service.jpg"),
fit: BoxFit.cover,
colorFilter: ColorFilter.mode(
Colors.white.withOpacity(0.6),
BlendMode.dstATop
),
)
),
),
),
Center(
child: SingleChildScrollView(
child: Container(
decoration: BoxDecoration(
color: Colors.white.withOpacity(0.9),
borderRadius: BorderRadius.only(
topLeft: Radius.circular(80),
bottomRight: Radius.circular(80)
)
),
width: 600,
height: 400,
padding: EdgeInsets.symmetric(horizontal: 20),
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
Provider.of<LanguageProvider>(context).languageData[Provider.of<LanguageProvider>(context).language]["pageService"]["question1"],
style: TextStyle(fontSize: 35),
),
Consumer<ServiceProvider>(
builder: (context, essenProvider, child) {
return RatingStars(onRate: (value) {
essenProvider.setRatingFrage1(value);
}, initRating: essenProvider.ratingFrage1,);
},
)
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
Provider.of<LanguageProvider>(context).languageData[Provider.of<LanguageProvider>(context).language]["pageService"]["question2"],
style: TextStyle(fontSize: 35),
),
Consumer<ServiceProvider>(
builder: (context, essenProvider, child) {
return RatingStars(onRate: (value) {
essenProvider.setRatingFrage2(value);
}, initRating: essenProvider.ratingFrage2,);
},
)
],
),
const SizedBox(
height: 50,
),
Consumer<ServiceProvider>(
builder: (context, essenProvider, child) {
return TextFormField(
initialValue: essenProvider.freiText,
onChanged: (value) {
essenProvider.setFreiText(value);
},
autofocus: false,
maxLength: 500,
maxLines: 4,
focusNode: _focus,
decoration: InputDecoration(
labelText: Provider.of<LanguageProvider>(context).languageData[Provider.of<LanguageProvider>(context).language]["textfield"],
labelStyle: const TextStyle(fontSize: 20),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(15)
),
),
style: TextStyle(fontSize: 20),
);
},
)
],
),
),
),
)
],
),
),
);
});
} }
} }
+113 -67
View File
@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_rating_bar/flutter_rating_bar.dart'; import 'package:flutter_rating_bar/flutter_rating_bar.dart';
import 'package:mensaapp/modules/ratingEmote.dart'; import 'package:mensaapp/modules/ratingEmote.dart';
import 'package:mensaapp/modules/ratingStars.dart'; import 'package:mensaapp/modules/ratingStars.dart';
import 'package:mensaapp/providers/languageProvider.dart';
import 'package:mensaapp/providers/spezielleErnaehrungProvider.dart'; import 'package:mensaapp/providers/spezielleErnaehrungProvider.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@@ -11,76 +12,121 @@ class PageSpezielleErnaehrung extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Center( final FocusNode _focus = FocusNode();
child: Container(
width: 800,
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
const SizedBox(
height: 50,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const Text(
"Sitzmöglichkeit*",
style: TextStyle(fontSize: 35),
),
Consumer<SpezielleErnaehrungProvider>(
builder: (context, spezielleErnaehrungProvider, child) {
return RatingStars(onRate: (value) {
spezielleErnaehrungProvider.setRatingSitzmoeglichkeit(value);
}, initRating: spezielleErnaehrungProvider.ratingSitzmoeglichkeit,);
},
)
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const Text(
"Keine Ahnung*",
style: TextStyle(fontSize: 35),
),
Consumer<SpezielleErnaehrungProvider>(
builder: (context, spezielleErnaehrungProvider, child) {
return RatingStars(onRate: (value) {
spezielleErnaehrungProvider.setRatingKeineAhnung(value);
}, initRating: spezielleErnaehrungProvider.ratingKeineAhnung,);
},
),
], return Consumer<LanguageProvider>(builder: (context, languageProvider, child) {
), return GestureDetector(
const SizedBox( onTap: () {
height: 50, _focus.unfocus();
), },
Consumer<SpezielleErnaehrungProvider>( child: Scaffold(
builder: (context, spezielleErnaehrungProvider, child) { body: Stack(
return TextFormField( children: [
initialValue: spezielleErnaehrungProvider.freiText, Center(
onChanged: (value) { child: Container(
spezielleErnaehrungProvider.setFreiText(value); width: MediaQuery.of(context).size.width * 0.8,
}, height: MediaQuery.of(context).size.height,
autofocus: false, decoration: BoxDecoration(
maxLength: 500, image: DecorationImage(
maxLines: 5, image: AssetImage("assets/backgrounds/Anmerkungen.jpg"),
decoration: InputDecoration( fit: BoxFit.cover,
labelText: "Dein Feedback (optional)", colorFilter: ColorFilter.mode(
labelStyle: const TextStyle(fontSize: 20), Colors.white.withOpacity(0.6), BlendMode.dstATop),
border: OutlineInputBorder( )),
borderRadius: BorderRadius.circular(15) ),
),
Center(
child: SingleChildScrollView(
child: Container(
decoration: BoxDecoration(
color: Colors.white.withOpacity(0.9),
borderRadius: BorderRadius.only(
topLeft: Radius.circular(80),
bottomRight: Radius.circular(80))),
width: 650,
height: 450,
padding: EdgeInsets.symmetric(horizontal: 20),
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
Provider.of<LanguageProvider>(context).languageData[Provider.of<LanguageProvider>(context).language]["pageSpecial"]["question1"],
style: TextStyle(fontSize: 35),
),
Consumer<SpezielleErnaehrungProvider>(
builder:
(context, spezielleErnaehrungProvider, child) {
return RatingStars(
onRate: (value) {
spezielleErnaehrungProvider
.setRatingFrage1(value);
},
initRating: spezielleErnaehrungProvider
.frage1,
);
},
)
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
Provider.of<LanguageProvider>(context).languageData[Provider.of<LanguageProvider>(context).language]["pageSpecial"]["question2"],
style: TextStyle(fontSize: 35),
),
Consumer<SpezielleErnaehrungProvider>(
builder:
(context, spezielleErnaehrungProvider, child) {
return RatingStars(
onRate: (value) {
spezielleErnaehrungProvider
.setRatingFrage2(value);
},
initRating:
spezielleErnaehrungProvider.frage2,
);
},
),
],
),
const SizedBox(
height: 50,
),
Consumer<SpezielleErnaehrungProvider>(
builder: (context, spezielleErnaehrungProvider, child) {
return TextFormField(
initialValue: spezielleErnaehrungProvider.freiText,
onChanged: (value) {
spezielleErnaehrungProvider.setFreiText(value);
},
autofocus: false,
maxLength: 500,
maxLines: 5,
focusNode: _focus,
decoration: InputDecoration(
labelText: Provider.of<LanguageProvider>(context).languageData[Provider.of<LanguageProvider>(context).language]["textfield"],
labelStyle: const TextStyle(fontSize: 20),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(15)),
),
style: TextStyle(fontSize: 20),
);
},
)
],
), ),
), ),
style: TextStyle(fontSize: 20), ),
); )
}, ],
) ),
],
), ),
), );
); });
} }
} }
+29
View File
@@ -0,0 +1,29 @@
import 'package:flutter/cupertino.dart';
class AmbienteProvider extends ChangeNotifier {
double ratingFrage1 = 0;
double ratingFrage2 = 0;
String freiText = "";
void setRatingFrage1(double rating) {
ratingFrage1 = rating;
notifyListeners();
}
void setRatingFrage2(double rating) {
ratingFrage2 = rating;
notifyListeners();
}
void setFreiText(String text) {
freiText = text;
notifyListeners();
}
void resetAllFields(){
freiText = "";
ratingFrage1 = 0;
ratingFrage2 = 0;
notifyListeners();
}
}
+29
View File
@@ -0,0 +1,29 @@
import 'package:flutter/cupertino.dart';
class AnmerkungProvider extends ChangeNotifier {
double ratingFrage1 = 0;
double ratingFrage2 = 0;
String freiText = "";
void setRatingFrage1(double rating) {
ratingFrage1 = rating;
notifyListeners();
}
void setRatingFrage2(double rating) {
ratingFrage2 = rating;
notifyListeners();
}
void setFreiText(String text) {
freiText = text;
notifyListeners();
}
void resetAllFields(){
freiText = "";
ratingFrage1 = 0;
ratingFrage2 = 0;
notifyListeners();
}
}
+29
View File
@@ -0,0 +1,29 @@
import 'package:flutter/material.dart';
class EssenProvider extends ChangeNotifier {
double ratingGeschmack = 0;
double ratingQuali = 0;
String freiText = "";
void setRatingGeschmack(double rating) {
ratingGeschmack = rating;
notifyListeners();
}
void setRatingQuali(double rating) {
ratingQuali = rating;
notifyListeners();
}
void setFreiText(String text) {
freiText = text;
notifyListeners();
}
void resetAllFields(){
freiText = "";
ratingGeschmack = 0;
ratingQuali = 0;
notifyListeners();
}
}
+154
View File
@@ -0,0 +1,154 @@
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
class LanguageProvider extends ChangeNotifier {
Map<String, dynamic> languageData = {
"de": {
"general": {
"timeOutTitle": "Bist du noch da?",
"timeOutContent": "In 30 Sekunden wird deine Bewertung verworfen",
"timeOutButton": "Ich bin da!"
},
"textfield": "Dein Feedback",
"pageAmbiente": {
"question1": "Frage1*",
"question2": "Frage2*",
},
"pageAnmerkungen": {
"question1": "Frage1*",
"question2": "Frage2*",
},
"pageEssen": {
"question1": "Geschmack*",
"question2": "Qualität*",
},
"pageHome": {
"noTimePopupTitle": "Du kannst gerade nicht bewerten!",
"noTimePopupContent":
"Du kannst nur zu den Essenszeiten zwischen 11:30 und 14:30 bewerten!",
"noTimePopupButton": "OK"
},
"pageService": {
"question1": "Frage1*",
"question2": "Frage2*",
},
"pageSpecial": {
"question1": "Frage1*",
"question2": "Frage2*",
},
"navBar": {"0": "Essen", "1": "Service", "2": "Essenswünsche"},
"floating": {
"info": "* Pflichtfeld",
"return": "Absenden",
"delete": {
"title": "Bewertungen löschen",
"info": "Möchtest du alle Eingaben entfernen?",
"keep": "Behalten",
"del": "Löschen"
}
}
},
"en": {
"general": {
"timeOutTitle": "Are you still there?",
"timeOutContent": "Your assessment will be discarded in 30 seconds",
"timeOutButton": "I'm here!"
},
"textfield": "Your Feedback",
"pageAmbiente": {
"question1": "Question1*",
"question2": "Question2*",
},
"pageAnmerkungen": {
"question1": "Question1*",
"question2": "Question2*",
},
"pageEssen": {
"question1": "Taste*",
"question2": "Quality*",
},
"pageHome": {
"noTimePopupTitle": "You cannot rate right now!",
"noTimePopupContent":
"You can only rate during meal times between 11:30 AM and 2:30 PM!",
"noTimePopupButton": "OK"
},
"pageService": {
"question1": "Question1*",
"question2": "Question2*",
},
"pageSpecial": {
"question1": "Question1*",
"question2": "Question2*",
},
"navBar": {"0": "Food", "1": "Service", "2": "Food Requests"},
"floating": {
"info": "* Required field",
"return": "Submit",
"delete": {
"title": "Delete Reviews",
"info": "Do you want to remove all entries?",
"keep": "Keep",
"del": "Delete"
}
}
},
"fr": {
"general": {
"timeOutTitle": "Êtes-vous toujours là ?",
"timeOutContent": "Votre évaluation sera supprimée dans 30 secondes",
"timeOutButton": "Je suis là !"
},
"textfield": "Votre avis",
"pageAmbiente": {
"question1": "Question1*",
"question2": "Question2*",
},
"pageAnmerkungen": {
"question1": "Question1*",
"question2": "Question2*",
},
"pageEssen": {
"question1": "Goût*",
"question2": "Qualité*",
},
"pageHome": {
"noTimePopupTitle": "Vous ne pouvez pas évaluer pour le moment !",
"noTimePopupContent":
"Vous ne pouvez évaluer que pendant les heures de repas entre 11h30 et 14h30 !",
"noTimePopupButton": "D'ACCORD"
},
"pageService": {
"question1": "Question1*",
"question2": "Question2*",
},
"pageSpecial": {
"question1": "Question1*",
"question2": "Question2*",
},
"navBar": {
"0": "Nourriture",
"1": "Service",
"2": "Demandes De Nourriture"
},
"floating": {
"info": "* Champ obligatoire",
"return": "Envoyer",
"delete": {
"title": "Supprimer les avis",
"info": "Voulez-vous supprimer toutes les entrées ?",
"keep": "Garder",
"del": "Supprimer"
}
}
}
};
String language = "de";
void setLanguage(String newLanguage) {
language = newLanguage;
notifyListeners();
}
}
+18 -11
View File
@@ -1,30 +1,37 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mensaapp/pages/pageAmbiente.dart'; import 'package:mensaapp/pages/pageAmbiente.dart';
import 'package:mensaapp/pages/pageEssen.dart'; import 'package:mensaapp/pages/pageEssen.dart';
import 'package:mensaapp/pages/pageEssenSelect.dart';
import 'package:mensaapp/pages/pageService.dart'; import 'package:mensaapp/pages/pageService.dart';
import 'package:mensaapp/pages/pageAnmerkungen.dart'; import 'package:mensaapp/pages/pageAnmerkungen.dart';
import 'package:mensaapp/pages/pageSpezielleErnaehrung.dart'; import 'package:mensaapp/pages/pageSpezielleErnaehrung.dart';
class PageProvider extends ChangeNotifier { class PageProvider extends ChangeNotifier {
int selectedPage = 0; int selectedPage = 0;
int selectedEssenID = 0;
String selectedEssenName = "";
List<Widget> pages = [ List<Widget> pages = [
const PageEssen(), const PageEssenSelect(),
const PageAmbiente(),
const PageService(), const PageService(),
const PageAnmerkungen(),
const PageSpezielleErnaehrung() const PageSpezielleErnaehrung()
]; ];
List<String> titleString = [
"Essen",
"Ambiente",
"Service",
"Anmerkungen",
"Spezielle Ernährung"
];
void changePage(int index) { void changePage(int index) {
selectedPage = index; selectedPage = index;
notifyListeners(); 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();
}
} }
+29
View File
@@ -0,0 +1,29 @@
import 'package:flutter/material.dart';
class ServiceProvider extends ChangeNotifier {
double ratingFrage1 = 0;
double ratingFrage2 = 0;
String freiText = "";
void setRatingFrage1(double rating) {
ratingFrage1 = rating;
notifyListeners();
}
void setRatingFrage2(double rating) {
ratingFrage2 = rating;
notifyListeners();
}
void setFreiText(String text) {
freiText = text;
notifyListeners();
}
void resetAllFields(){
freiText = "";
ratingFrage1 = 0;
ratingFrage2 = 0;
notifyListeners();
}
}
+17
View File
@@ -0,0 +1,17 @@
import 'package:flutter/cupertino.dart';
import 'package:mensaapp/spaces/spaceHome.dart';
import 'package:mensaapp/spaces/spaceRate.dart';
class SpaceProvider extends ChangeNotifier {
var selectedSpace = 0;
var spaces = [
const SpaceHome(),
const SpaceRate()
];
void setSelectedSpace(int index) {
selectedSpace = index;
notifyListeners();
}
}
+13 -6
View File
@@ -2,17 +2,17 @@ import 'package:flutter/material.dart';
class SpezielleErnaehrungProvider extends ChangeNotifier { class SpezielleErnaehrungProvider extends ChangeNotifier {
double ratingSitzmoeglichkeit = 0; double frage1 = 0;
double ratingKeineAhnung = 0; double frage2 = 0;
String freiText = ""; String freiText = "";
void setRatingSitzmoeglichkeit(double rating) { void setRatingFrage1(double rating) {
ratingSitzmoeglichkeit = rating; frage1 = rating;
notifyListeners(); notifyListeners();
} }
void setRatingKeineAhnung(double rating) { void setRatingFrage2(double rating) {
ratingKeineAhnung = rating; frage2 = rating;
notifyListeners(); notifyListeners();
} }
@@ -20,4 +20,11 @@ class SpezielleErnaehrungProvider extends ChangeNotifier {
freiText = text; freiText = text;
notifyListeners(); notifyListeners();
} }
void resetAllFields(){
freiText = "";
frage1 = 0;
frage2 = 0;
notifyListeners();
}
} }
+170
View File
@@ -0,0 +1,170 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:mensaapp/providers/languageProvider.dart';
import 'package:mensaapp/providers/spaceProvider.dart';
import 'package:provider/provider.dart';
class SpaceHome extends StatefulWidget {
const SpaceHome({super.key});
@override
State<SpaceHome> createState() => _SpaceHomeState();
}
class _SpaceHomeState extends State<SpaceHome> {
//TODO: in languageProvider
var tempTexts = [
"Bewerte jetzt deine DHBW-Kantine...",
"Rate your DHBW canteen now...",
"Évaluez votre cantine DHBW maintenant..."
];
//TODO: END-TODO
late Timer _timer;
late String text = "";
var index = 1;
var indexMap = {0: "fr", 1: "de", 2: "en"};
@override
void initState() {
text = tempTexts[0];
super.initState();
_timer = Timer.periodic(
const Duration(seconds: 5),
(timer) {
setState(() {
text = tempTexts[index];
index = (index + 1 >= tempTexts.length ? 0 : index + 1);
});
},
);
}
@override
void dispose() {
_timer.cancel();
super.dispose();
}
// only for test
var disableRateTimeDebug = true;
// end only for test
void _showNotRateTimeDialog(BuildContext context) {
showDialog(
context: context,
builder: (context) {
return AlertDialog(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(20),
),
title: Text(
Provider.of<LanguageProvider>(context, listen: false)
.languageData[indexMap[index]]["pageHome"]["noTimePopupTitle"],
style: TextStyle(fontSize: 25),
),
content: Text(
Provider.of<LanguageProvider>(context, listen: false)
.languageData[indexMap[index]]["pageHome"]
["noTimePopupContent"],
style: TextStyle(fontSize: 20),
),
actions: [
FilledButton(
child: Text(
Provider.of<LanguageProvider>(context, listen: false)
.languageData[indexMap[index]]["pageHome"]
["noTimePopupButton"],
style: TextStyle(fontSize: 17),
),
onPressed: () {
if (disableRateTimeDebug) {
Provider.of<SpaceProvider>(context, listen: false)
.setSelectedSpace(1);
}
Navigator.of(context).pop();
},
)
],
);
},
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: GestureDetector(
onTap: () {
var now = TimeOfDay.now();
int startHour = 11;
int endHour = 14;
if (now.hour == startHour && now.minute <= 30 ||
now.hour < startHour ||
now.hour == endHour && now.minute >= 30 ||
now.hour >= endHour + 1) {
_showNotRateTimeDialog(context);
} else {
Provider.of<SpaceProvider>(context, listen: false)
.setSelectedSpace(1);
}
},
child: Stack(
children: [
Center(
child: 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: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
text,
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 70,
fontWeight: FontWeight.bold,
color: Theme.of(context).colorScheme.primary),
),
const SizedBox(
height: 40,
),
Icon(
Icons.touch_app,
size: 150,
color: Colors.black.withOpacity(0.5),
),
SizedBox(
height: 50,
),
Text(
"11:30 - 14:30",
style: TextStyle(fontSize: 40),
),
],
),
),
],
),
),
);
}
}
+279
View File
@@ -0,0 +1,279 @@
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 '../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';
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<LanguageProvider>(context, listen: false)
.languageData[
Provider.of<LanguageProvider>(context, listen: false)
.language]["floating"]["delete"]["title"]),
content: Text(
Provider.of<LanguageProvider>(context, listen: false).languageData[
Provider.of<LanguageProvider>(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<LanguageProvider>(context, listen: false)
.languageData[
Provider.of<LanguageProvider>(context, listen: false)
.language]["floating"]["delete"]["keep"]),
),
ElevatedButton(
onPressed: () {
/*Provider.of<AnmerkungProvider>(context, listen: false)
.resetAllFields();*/
Provider.of<EssenProvider>(context, listen: false)
.resetAllFields();
/*Provider.of<AmbienteProvider>(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<PageProvider>(context, listen: false)
.changePage(0);
Provider.of<SpaceProvider>(context, listen: false)
.setSelectedSpace(0);
Provider.of<LanguageProvider>(context, listen: false)
.setLanguage("de");
// Hier Aktion für Löschen ausführen
Navigator.of(context).pop(); // Dialog schließen
},
child: Text(Provider.of<LanguageProvider>(context, listen: false)
.languageData[
Provider.of<LanguageProvider>(context, listen: false)
.language]["floating"]["delete"]["del"]),
)
],
);
},
);
}
@override
Widget build(BuildContext context) {
return Consumer<LanguageProvider>(builder: (context, languageProvider, x) {
return Scaffold(
appBar: AppBar(
leading: IconButton(
icon: Icon(
Icons.home_rounded,
size: 36,
color: Theme.of(context).colorScheme.onPrimary,
),
onPressed: () {
_showDeleteDialog(context);
},
),
title: Consumer<PageProvider>(
// 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<LanguageProvider>(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<LanguageProvider>(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<LanguageProvider>(context, listen: false)
.setLanguage("de");
},
),
IconButton(
icon: Opacity(
opacity: Provider.of<LanguageProvider>(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<LanguageProvider>(context, listen: false)
.setLanguage("en");
},
),
IconButton(
icon: Opacity(
opacity: Provider.of<LanguageProvider>(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<LanguageProvider>(context, listen: false)
.setLanguage("fr");
},
),
],
),
body: Consumer<PageProvider>(
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<LanguageProvider>(context).languageData[
Provider.of<LanguageProvider>(context).language]
["floating"]["info"],
style: TextStyle(fontSize: 15),
),
const SizedBox(
height: 10,
),
FloatingActionButton.extended(
onPressed: () {
DatabaseService().getAllRatings(
context
);
/*DatabaseService.getAllRatings(
Provider.of<ServiceProvider>(context), Provider.of<EssenProvider>(context), Provider.of<SpezielleErnaehrungProvider>(context)); // Passe den Kontext an, falls nötig
*/
},
label: Text(
Provider.of<LanguageProvider>(context).languageData[
Provider.of<LanguageProvider>(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<PageProvider>(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<LanguageProvider>(context).languageData[
Provider.of<LanguageProvider>(context).language]
["navBar"]["0"],
),
GButton(
icon: Icons.mood,
text: Provider.of<LanguageProvider>(context).languageData[
Provider.of<LanguageProvider>(context).language]
["navBar"]["1"],
),
GButton(
icon: Icons.favorite,
text: Provider.of<LanguageProvider>(context).languageData[
Provider.of<LanguageProvider>(context).language]
["navBar"]["2"],
),
],
),
),
),
);
});
}
}
View File
+431 -2
View File
@@ -1,6 +1,38 @@
# Generated by pub # Generated by pub
# See https://dart.dev/tools/pub/glossary#lockfile # See https://dart.dev/tools/pub/glossary#lockfile
packages: packages:
app_links:
dependency: transitive
description:
name: app_links
sha256: ad1a6d598e7e39b46a34f746f9a8b011ee147e4c275d407fa457e7a62f84dd99
url: "https://pub.dev"
source: hosted
version: "6.3.2"
app_links_linux:
dependency: transitive
description:
name: app_links_linux
sha256: f5f7173a78609f3dfd4c2ff2c95bd559ab43c80a87dc6a095921d96c05688c81
url: "https://pub.dev"
source: hosted
version: "1.0.3"
app_links_platform_interface:
dependency: transitive
description:
name: app_links_platform_interface
sha256: "05f5379577c513b534a29ddea68176a4d4802c46180ee8e2e966257158772a3f"
url: "https://pub.dev"
source: hosted
version: "2.0.2"
app_links_web:
dependency: transitive
description:
name: app_links_web
sha256: af060ed76183f9e2b87510a9480e56a5352b6c249778d07bd2c95fc35632a555
url: "https://pub.dev"
source: hosted
version: "1.0.4"
async: async:
dependency: transitive dependency: transitive
description: description:
@@ -41,6 +73,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.18.0" version: "1.18.0"
crypto:
dependency: transitive
description:
name: crypto
sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855"
url: "https://pub.dev"
source: hosted
version: "3.0.6"
cupertino_icons: cupertino_icons:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -57,6 +97,22 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.3.1" version: "1.3.1"
ffi:
dependency: transitive
description:
name: ffi
sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6"
url: "https://pub.dev"
source: hosted
version: "2.1.3"
file:
dependency: transitive
description:
name: file
sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4
url: "https://pub.dev"
source: hosted
version: "7.0.1"
flutter: flutter:
dependency: "direct main" dependency: "direct main"
description: flutter description: flutter
@@ -83,6 +139,19 @@ packages:
description: flutter description: flutter
source: sdk source: sdk
version: "0.0.0" version: "0.0.0"
flutter_web_plugins:
dependency: transitive
description: flutter
source: sdk
version: "0.0.0"
functions_client:
dependency: transitive
description:
name: functions_client
sha256: "61597ed93be197b1be6387855e4b760e6aac2355fcfc4df6d20d2b4579982158"
url: "https://pub.dev"
source: hosted
version: "2.4.0"
google_nav_bar: google_nav_bar:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -91,6 +160,46 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.0.7" version: "5.0.7"
gotrue:
dependency: transitive
description:
name: gotrue
sha256: b9541c62edc0ee1fddf2c95364251b8076a93bcdbc3ad27f14a633d187e89ccc
url: "https://pub.dev"
source: hosted
version: "2.11.0"
gtk:
dependency: transitive
description:
name: gtk
sha256: e8ce9ca4b1df106e4d72dad201d345ea1a036cc12c360f1a7d5a758f78ffa42c
url: "https://pub.dev"
source: hosted
version: "2.1.0"
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"
jwt_decode:
dependency: transitive
description:
name: jwt_decode
sha256: d2e9f68c052b2225130977429d30f187aa1981d789c76ad104a32243cfdebfbb
url: "https://pub.dev"
source: hosted
version: "0.3.1"
leak_tracker: leak_tracker:
dependency: transitive dependency: transitive
description: description:
@@ -123,6 +232,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "4.0.0" version: "4.0.0"
logging:
dependency: transitive
description:
name: logging
sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61
url: "https://pub.dev"
source: hosted
version: "1.3.0"
matcher: matcher:
dependency: transitive dependency: transitive
description: description:
@@ -147,6 +264,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.15.0" version: "1.15.0"
mime:
dependency: transitive
description:
name: mime
sha256: "801fd0b26f14a4a58ccb09d5892c3fbdeff209594300a542492cf13fba9d247a"
url: "https://pub.dev"
source: hosted
version: "1.0.6"
nested: nested:
dependency: transitive dependency: transitive
description: description:
@@ -163,6 +288,86 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.9.0" version: "1.9.0"
path_provider:
dependency: transitive
description:
name: path_provider
sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd"
url: "https://pub.dev"
source: hosted
version: "2.1.5"
path_provider_android:
dependency: transitive
description:
name: path_provider_android
sha256: "8c4967f8b7cb46dc914e178daa29813d83ae502e0529d7b0478330616a691ef7"
url: "https://pub.dev"
source: hosted
version: "2.2.14"
path_provider_foundation:
dependency: transitive
description:
name: path_provider_foundation
sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16
url: "https://pub.dev"
source: hosted
version: "2.4.0"
path_provider_linux:
dependency: transitive
description:
name: path_provider_linux
sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279
url: "https://pub.dev"
source: hosted
version: "2.2.1"
path_provider_platform_interface:
dependency: transitive
description:
name: path_provider_platform_interface
sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334"
url: "https://pub.dev"
source: hosted
version: "2.1.2"
path_provider_windows:
dependency: transitive
description:
name: path_provider_windows
sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7
url: "https://pub.dev"
source: hosted
version: "2.3.0"
petitparser:
dependency: transitive
description:
name: petitparser
sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27
url: "https://pub.dev"
source: hosted
version: "6.0.2"
platform:
dependency: transitive
description:
name: platform
sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984"
url: "https://pub.dev"
source: hosted
version: "3.1.6"
plugin_platform_interface:
dependency: transitive
description:
name: plugin_platform_interface
sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02"
url: "https://pub.dev"
source: hosted
version: "2.1.8"
postgrest:
dependency: transitive
description:
name: postgrest
sha256: "9f759ac497a24839addbed69d9569ea6d51d2e4834c672b8c2a73752fb6945c8"
url: "https://pub.dev"
source: hosted
version: "2.4.0"
provider: provider:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -171,6 +376,86 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "6.1.2" version: "6.1.2"
realtime_client:
dependency: transitive
description:
name: realtime_client
sha256: "173c3dc40922bb0ae19a558ae1a0acf7b28ec8a458b54390c499bbe5ff15f049"
url: "https://pub.dev"
source: hosted
version: "2.4.0"
retry:
dependency: transitive
description:
name: retry
sha256: "822e118d5b3aafed083109c72d5f484c6dc66707885e07c0fbcb8b986bba7efc"
url: "https://pub.dev"
source: hosted
version: "3.1.2"
rxdart:
dependency: transitive
description:
name: rxdart
sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962"
url: "https://pub.dev"
source: hosted
version: "0.28.0"
shared_preferences:
dependency: "direct main"
description:
name: shared_preferences
sha256: "95f9997ca1fb9799d494d0cb2a780fd7be075818d59f00c43832ed112b158a82"
url: "https://pub.dev"
source: hosted
version: "2.3.3"
shared_preferences_android:
dependency: transitive
description:
name: shared_preferences_android
sha256: "3b9febd815c9ca29c9e3520d50ec32f49157711e143b7a4ca039eb87e8ade5ab"
url: "https://pub.dev"
source: hosted
version: "2.3.3"
shared_preferences_foundation:
dependency: transitive
description:
name: shared_preferences_foundation
sha256: "07e050c7cd39bad516f8d64c455f04508d09df104be326d8c02551590a0d513d"
url: "https://pub.dev"
source: hosted
version: "2.5.3"
shared_preferences_linux:
dependency: transitive
description:
name: shared_preferences_linux
sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f"
url: "https://pub.dev"
source: hosted
version: "2.4.1"
shared_preferences_platform_interface:
dependency: transitive
description:
name: shared_preferences_platform_interface
sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80"
url: "https://pub.dev"
source: hosted
version: "2.4.1"
shared_preferences_web:
dependency: transitive
description:
name: shared_preferences_web
sha256: d2ca4132d3946fec2184261726b355836a82c33d7d5b67af32692aff18a4684e
url: "https://pub.dev"
source: hosted
version: "2.4.2"
shared_preferences_windows:
dependency: transitive
description:
name: shared_preferences_windows
sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1"
url: "https://pub.dev"
source: hosted
version: "2.4.1"
sky_engine: sky_engine:
dependency: transitive dependency: transitive
description: flutter description: flutter
@@ -192,6 +477,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.11.1" version: "1.11.1"
storage_client:
dependency: transitive
description:
name: storage_client
sha256: "833666edcd804aaf434f3b13165fd553a8c6371a488618a58be8914856795c04"
url: "https://pub.dev"
source: hosted
version: "2.2.0"
stream_channel: stream_channel:
dependency: transitive dependency: transitive
description: description:
@@ -208,6 +501,22 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.2.0" version: "1.2.0"
supabase:
dependency: transitive
description:
name: supabase
sha256: ecdfb226c483f05fd10425304de744144dfdda2f33d14151d2604cebe8c6d077
url: "https://pub.dev"
source: hosted
version: "2.6.0"
supabase_flutter:
dependency: "direct main"
description:
name: supabase_flutter
sha256: bdbc6770e0e91db0b9d931f41ea4ee311d8819f539743f47e8cc795b492be75a
url: "https://pub.dev"
source: hosted
version: "2.8.1"
term_glyph: term_glyph:
dependency: transitive dependency: transitive
description: description:
@@ -224,6 +533,78 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.7.2" version: "0.7.2"
typed_data:
dependency: transitive
description:
name: typed_data
sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006
url: "https://pub.dev"
source: hosted
version: "1.4.0"
url_launcher:
dependency: transitive
description:
name: url_launcher
sha256: "9d06212b1362abc2f0f0d78e6f09f726608c74e3b9462e8368bb03314aa8d603"
url: "https://pub.dev"
source: hosted
version: "6.3.1"
url_launcher_android:
dependency: transitive
description:
name: url_launcher_android
sha256: "6fc2f56536ee873eeb867ad176ae15f304ccccc357848b351f6f0d8d4a40d193"
url: "https://pub.dev"
source: hosted
version: "6.3.14"
url_launcher_ios:
dependency: transitive
description:
name: url_launcher_ios
sha256: e43b677296fadce447e987a2f519dcf5f6d1e527dc35d01ffab4fff5b8a7063e
url: "https://pub.dev"
source: hosted
version: "6.3.1"
url_launcher_linux:
dependency: transitive
description:
name: url_launcher_linux
sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935"
url: "https://pub.dev"
source: hosted
version: "3.2.1"
url_launcher_macos:
dependency: transitive
description:
name: url_launcher_macos
sha256: "769549c999acdb42b8bcfa7c43d72bf79a382ca7441ab18a808e101149daf672"
url: "https://pub.dev"
source: hosted
version: "3.2.1"
url_launcher_platform_interface:
dependency: transitive
description:
name: url_launcher_platform_interface
sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029"
url: "https://pub.dev"
source: hosted
version: "2.3.2"
url_launcher_web:
dependency: transitive
description:
name: url_launcher_web
sha256: "772638d3b34c779ede05ba3d38af34657a05ac55b06279ea6edd409e323dca8e"
url: "https://pub.dev"
source: hosted
version: "2.3.3"
url_launcher_windows:
dependency: transitive
description:
name: url_launcher_windows
sha256: "44cf3aabcedde30f2dba119a9dea3b0f2672fbe6fa96e85536251d678216b3c4"
url: "https://pub.dev"
source: hosted
version: "3.1.3"
vector_math: vector_math:
dependency: transitive dependency: transitive
description: description:
@@ -240,6 +621,54 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "14.2.5" version: "14.2.5"
web:
dependency: transitive
description:
name: web
sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb
url: "https://pub.dev"
source: hosted
version: "1.1.0"
web_socket:
dependency: transitive
description:
name: web_socket
sha256: "3c12d96c0c9a4eec095246debcea7b86c0324f22df69893d538fcc6f1b8cce83"
url: "https://pub.dev"
source: hosted
version: "0.1.6"
web_socket_channel:
dependency: transitive
description:
name: web_socket_channel
sha256: "9f187088ed104edd8662ca07af4b124465893caf063ba29758f97af57e61da8f"
url: "https://pub.dev"
source: hosted
version: "3.0.1"
xdg_directories:
dependency: transitive
description:
name: xdg_directories
sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15"
url: "https://pub.dev"
source: hosted
version: "1.1.0"
xml:
dependency: "direct main"
description:
name: xml
sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226
url: "https://pub.dev"
source: hosted
version: "6.5.0"
yet_another_json_isolate:
dependency: transitive
description:
name: yet_another_json_isolate
sha256: "56155e9e0002cc51ea7112857bbcdc714d4c35e176d43e4d3ee233009ff410c9"
url: "https://pub.dev"
source: hosted
version: "2.0.3"
sdks: sdks:
dart: ">=3.5.3 <4.0.0" dart: ">=3.5.2 <4.0.0"
flutter: ">=3.18.0-18.0.pre.54" flutter: ">=3.24.0"
+7 -1
View File
@@ -19,7 +19,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
version: 1.0.0+1 version: 1.0.0+1
environment: environment:
sdk: ^3.5.3 sdk: ^3.5.2
# Dependencies specify other packages that your package needs in order to work. # Dependencies specify other packages that your package needs in order to work.
# To automatically upgrade your package dependencies to the latest versions # To automatically upgrade your package dependencies to the latest versions
@@ -33,6 +33,11 @@ dependencies:
provider: ^6.1.2 provider: ^6.1.2
google_nav_bar: ^5.0.7 google_nav_bar: ^5.0.7
flutter_rating_bar: ^4.0.1 flutter_rating_bar: ^4.0.1
http: ^1.2.2
shared_preferences: ^2.3.3
xml: ^6.5.0
supabase_flutter: ^2.8.1
# The following adds the Cupertino Icons font to your application. # The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons. # Use with the CupertinoIcons class for iOS style icons.
@@ -56,6 +61,7 @@ dev_dependencies:
flutter: flutter:
assets: assets:
- assets/flags/ - assets/flags/
- assets/backgrounds/
# The following line ensures that the Material Icons font is # The following line ensures that the Material Icons font is
# included with your application, so that you can use the icons in # included with your application, so that you can use the icons in
# the material Icons class. # the material Icons class.