diff --git a/.envExample b/.envExample index eb92d67..42a180c 100644 --- a/.envExample +++ b/.envExample @@ -1,4 +1,6 @@ APPWRITE_PROJECT_ID= APPWRITE_PROJECT_NAME= APPWRITE_PUBLIC_ENDPOINT= -PTV_GEOLINK_API_KEY= \ No newline at end of file +PTV_GEOLINK_API_KEY= +APPWRITE_DATABASE_ID= +APPWRITE_COLLECTION_ID= \ No newline at end of file diff --git a/lib/data/repository/appwrite_repository.dart b/lib/data/repository/appwrite_repository.dart index 62771e2..cea06c0 100644 --- a/lib/data/repository/appwrite_repository.dart +++ b/lib/data/repository/appwrite_repository.dart @@ -92,5 +92,15 @@ class AppwriteRepository { Future get getCurrentUser => _account.get(); - createTankStop(Map map) {} + // Tank Stop CRUD operations + // Create, Update, Get, List Tank Stops + Future createTankStop(Map map) async { + final response = await _databases.createDocument( + databaseId: dotenv.get('APPWRITE_DATABASE_ID'), + collectionId: dotenv.get('APPWRITE_COLLECTION_ID'), + documentId: ID.unique(), + data: map, + ); + return response; + } } diff --git a/lib/pages/login/login_controller.dart b/lib/pages/login/login_controller.dart index c593061..841d211 100644 --- a/lib/pages/login/login_controller.dart +++ b/lib/pages/login/login_controller.dart @@ -2,6 +2,7 @@ import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import 'package:get_storage/get_storage.dart'; import '../../data/repository/appwrite_repository.dart'; import '../../utils/extensions/static_helper.dart'; @@ -15,6 +16,8 @@ class LoginController extends GetxController { final formKey = GlobalKey(); bool isFormValid = false; + final _dataBox = GetStorage('MyUserStorage'); + final emailController = TextEditingController(); final passwordController = TextEditingController(); final nameController = TextEditingController(); @@ -23,6 +26,15 @@ class LoginController extends GetxController { void onInit() { super.onInit(); // Initialize any necessary data or state here + var isSessionId = _dataBox.hasData('sessionId'); + if (isSessionId) { + // If session ID exists, navigate to TankPage + print('Session ID found, navigating to TankPage'); + goToTankPage(); + } else { + // If no session ID, initialize the login controller + print('No session ID found, initializing LoginController'); + } print('LoginController initialized'); } @@ -31,14 +43,6 @@ class LoginController extends GetxController { super.onReady(); // This method is called when the controller is ready print('LoginController is ready'); - if (StaticHelper.hasData()) { - // If session ID exists, navigate to TankPage - print('Session ID found, navigating to TankPage'); - goToTankPage(); - } else { - // If no session ID, initialize the login controller - print('No session ID found, initializing LoginController'); - } } @override @@ -115,9 +119,9 @@ class LoginController extends GetxController { 'User was stored and Loggedin: ${userValue.name}, ${userValue.$id}, ${userValue.email}', ); // Store session ID in GetStorage - StaticHelper.dataBox.write('userId', userValue.$id); - StaticHelper.dataBox.write('userName', userValue.name); - StaticHelper.dataBox.write('userEmail', userValue.email); + _dataBox.write('userId', userValue.$id); + _dataBox.write('userName', userValue.name); + _dataBox.write('userEmail', userValue.email); // Go to TankPage goToTankPage(); message = 'Sie wurden registriert und Angemeldet!!'; @@ -151,6 +155,21 @@ class LoginController extends GetxController { } } + Future _getCurrentLoggedinUser() async { + await _authRepository.getCurrentUser.then((models.User userValue) { + // GetStorage data storage + print( + 'User was stored and Loggedin: ${userValue.name}, ${userValue.$id}, ${userValue.email}', + ); + // Store session ID in GetStorage + _dataBox.write('userId', userValue.$id); + _dataBox.write('userName', userValue.name); + _dataBox.write('userEmail', userValue.email); + }).catchError((error) { + print('Fehler beim Abrufen des Benutzers: $error'); + }); + } + // Login Future login() async { message = 'NoMessage!'; @@ -169,15 +188,17 @@ class LoginController extends GetxController { 'password': passwordController.text, }).then((models.Session session) { // Store session ID in GetStorage - StaticHelper.dataBox.write('userId', session.$id); - print('Session ID stored: ${StaticHelper.dataBox.read('sessinId')}'); + _dataBox.write('sessionId', session.$id); + print('Session ID stored: ${_dataBox.read('sessionId')}'); print( 'Erfolgreich eingeloggt: ${session.$id}\n${session.providerUid}', ); - // Go to TankPage - goToTankPage(); - StaticHelper.getMySnackeBar( - 'Erfolg', 'Sie wurden Angemeldet!!', Colors.green); + _getCurrentLoggedinUser().then((_) { + // Go to TankPage + goToTankPage(); + StaticHelper.getMySnackeBar( + 'Erfolg', 'Sie wurden Angemeldet!!', Colors.green); + }); }).catchError((error) { if (error is AppwriteException) { // Handle specific Appwrite exceptions diff --git a/lib/pages/tank/tank_controller.dart b/lib/pages/tank/tank_controller.dart index 0e0e316..78ad838 100644 --- a/lib/pages/tank/tank_controller.dart +++ b/lib/pages/tank/tank_controller.dart @@ -5,8 +5,7 @@ import 'package:geolocator/geolocator.dart'; import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; import 'package:intl/intl.dart'; -import 'package:tankguru_flutter_app_appwrite/utils/extensions/static_helper.dart'; - +import '../../utils/extensions/static_helper.dart'; import '../../data/repository/location_repository.dart'; import '../../data/repository/appwrite_repository.dart'; import '../login/login_view.dart'; @@ -36,6 +35,7 @@ class TankController extends GetxController { final kilometerStandEdittingController = TextEditingController(); final mengeController = TextEditingController(); final pricePerLiterController = TextEditingController(); + final ortController = TextEditingController(); final FocusNode firstFocusNode = FocusNode(); // Deklariere den FocusNode @@ -70,6 +70,7 @@ class TankController extends GetxController { // den Standort in der UI anzuzeigen oder an einen Server zu senden. var map = {'lat': latitude, 'lng': longitude}; rxOrtString.value = await _locationRepository.getNearbyLocation(map); + ortController.text = rxOrtString.value; // Print Standortinformationen in der Konsole print('Nearby Location: ${rxOrtString.value}'); print('Current Position: Latitude: $latitude, Longitude: $longitude'); @@ -92,6 +93,7 @@ class TankController extends GetxController { kilometerStandEdittingController.clear(); mengeController.clear(); pricePerLiterController.clear(); + ortController.clear(); } String? validateKilometerStand(String? value) { @@ -124,6 +126,13 @@ class TankController extends GetxController { return null; } + String? validateOrt(String? value) { + if (value == null || value.isEmpty) { + return 'Bitte Ort eingeben...'; + } + return null; + } + //Go to Login Page void logoutSessionAndGoToLoginPage() async { // Handle logout logic here @@ -140,8 +149,8 @@ class TankController extends GetxController { @override void onInit() { super.onInit(); - if (_dataBox.hasData('sessinId')) { - rxSessionIdString(_dataBox.read('sessinId').toString()); + if (_dataBox.hasData('sessionId')) { + rxSessionIdString(_dataBox.read('sessionId').toString()); } // Rufe den Standort direkt beim Initialisieren des Controllers ab, falls gewünscht. fetchCurrentLocation(); @@ -171,6 +180,7 @@ class TankController extends GetxController { kilometerStandEdittingController.dispose(); mengeController.dispose(); pricePerLiterController.dispose(); + ortController.dispose(); firstFocusNode.dispose(); // Dispose den FocusNode } @@ -206,18 +216,10 @@ class TankController extends GetxController { await _authRepository.createTankStop({ 'userId': _dataBox.read('userId'), 'date': f.format(DateTime.parse(dateController.text)), - 'odometer': double.parse( - double.parse( - kilometerStandEdittingController.text, - ).toStringAsFixed(0), - ), - 'liters': double.parse( - double.parse(mengeController.text).toStringAsFixed(2), - ), - 'pricePerLiter': double.parse( - double.parse(pricePerLiterController.text).toStringAsFixed(2), - ), - 'location': rxOrtString.value, + 'odometer': kilometerStandEdittingController.text, + 'liters': mengeController.text, + 'pricePerLiter': pricePerLiterController.text, + 'location': ortController.text, }).then((models.Document document) { print('Tankstopp erfolgreich gespeichert: ${document.data}'); messageToUser = 'Tankstopp erfolgreich gespeichert!'; diff --git a/lib/pages/tank/tank_view.dart b/lib/pages/tank/tank_view.dart index 1b0bef2..a97b1a8 100644 --- a/lib/pages/tank/tank_view.dart +++ b/lib/pages/tank/tank_view.dart @@ -181,9 +181,33 @@ class TankPage extends GetView { child: Column( children: [ TextFormField( + validator: (value) => controller.validateOrt(value), focusNode: controller.firstFocusNode, // Setze den FocusNode + //onTap: () => controller.selectDateTime(Get.context!), + controller: controller.ortController, + decoration: InputDecoration( + labelText: 'Ort der Tankstelle', + labelStyle: const TextStyle(color: Colors.white, fontSize: 20), + errorStyle: const TextStyle(color: Colors.red, fontSize: 16), + filled: true, + fillColor: Colors.black.withValues(alpha: 0.9), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(10), + borderSide: const BorderSide(color: Colors.white, width: 2), + ), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(10), + borderSide: BorderSide.none, // Entferne den Rand + ), + ), + style: const TextStyle(color: Colors.white), + ), + SizedBox(height: 20), + TextFormField( + //focusNode: controller.firstFocusNode, // Setze den FocusNode readOnly: true, onTap: () => controller.selectDateTime(Get.context!), + keyboardType: TextInputType.text, controller: controller.dateController, decoration: InputDecoration( labelText: 'Datum',