tankstop save Methode

This commit is contained in:
Josef Seiringer 2025-08-17 22:58:19 +02:00
parent 3df1be39a8
commit 9c73361a2f
5 changed files with 94 additions and 35 deletions

View File

@ -2,3 +2,5 @@ APPWRITE_PROJECT_ID=<APPWRITE_PROJECT_ID>
APPWRITE_PROJECT_NAME=<Flutter Projects Name> APPWRITE_PROJECT_NAME=<Flutter Projects Name>
APPWRITE_PUBLIC_ENDPOINT=<YOUR_API_ENDPOINT/v1> APPWRITE_PUBLIC_ENDPOINT=<YOUR_API_ENDPOINT/v1>
PTV_GEOLINK_API_KEY=<YOUR_GEOLINK_API_KEY> PTV_GEOLINK_API_KEY=<YOUR_GEOLINK_API_KEY>
APPWRITE_DATABASE_ID=<DatabaseID>
APPWRITE_COLLECTION_ID=<Collection_ID>

View File

@ -92,5 +92,15 @@ class AppwriteRepository {
Future<models.User> get getCurrentUser => _account.get(); Future<models.User> get getCurrentUser => _account.get();
createTankStop(Map<String, dynamic> map) {} // Tank Stop CRUD operations
// Create, Update, Get, List Tank Stops
Future<models.Document> 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;
}
} }

View File

@ -2,6 +2,7 @@ import 'package:appwrite/appwrite.dart';
import 'package:appwrite/models.dart' as models; import 'package:appwrite/models.dart' as models;
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';
import '../../data/repository/appwrite_repository.dart'; import '../../data/repository/appwrite_repository.dart';
import '../../utils/extensions/static_helper.dart'; import '../../utils/extensions/static_helper.dart';
@ -15,6 +16,8 @@ class LoginController extends GetxController {
final formKey = GlobalKey<FormState>(); final formKey = GlobalKey<FormState>();
bool isFormValid = false; bool isFormValid = false;
final _dataBox = GetStorage('MyUserStorage');
final emailController = TextEditingController(); final emailController = TextEditingController();
final passwordController = TextEditingController(); final passwordController = TextEditingController();
final nameController = TextEditingController(); final nameController = TextEditingController();
@ -23,6 +26,15 @@ class LoginController extends GetxController {
void onInit() { void onInit() {
super.onInit(); super.onInit();
// Initialize any necessary data or state here // 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'); print('LoginController initialized');
} }
@ -31,14 +43,6 @@ class LoginController extends GetxController {
super.onReady(); super.onReady();
// This method is called when the controller is ready // This method is called when the controller is ready
print('LoginController 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 @override
@ -115,9 +119,9 @@ class LoginController extends GetxController {
'User was stored and Loggedin: ${userValue.name}, ${userValue.$id}, ${userValue.email}', 'User was stored and Loggedin: ${userValue.name}, ${userValue.$id}, ${userValue.email}',
); );
// Store session ID in GetStorage // Store session ID in GetStorage
StaticHelper.dataBox.write('userId', userValue.$id); _dataBox.write('userId', userValue.$id);
StaticHelper.dataBox.write('userName', userValue.name); _dataBox.write('userName', userValue.name);
StaticHelper.dataBox.write('userEmail', userValue.email); _dataBox.write('userEmail', userValue.email);
// Go to TankPage // Go to TankPage
goToTankPage(); goToTankPage();
message = 'Sie wurden registriert und Angemeldet!!'; message = 'Sie wurden registriert und Angemeldet!!';
@ -151,6 +155,21 @@ class LoginController extends GetxController {
} }
} }
Future<void> _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 // Login
Future<void> login() async { Future<void> login() async {
message = 'NoMessage!'; message = 'NoMessage!';
@ -169,15 +188,17 @@ class LoginController extends GetxController {
'password': passwordController.text, 'password': passwordController.text,
}).then((models.Session session) { }).then((models.Session session) {
// Store session ID in GetStorage // Store session ID in GetStorage
StaticHelper.dataBox.write('userId', session.$id); _dataBox.write('sessionId', session.$id);
print('Session ID stored: ${StaticHelper.dataBox.read('sessinId')}'); print('Session ID stored: ${_dataBox.read('sessionId')}');
print( print(
'Erfolgreich eingeloggt: ${session.$id}\n${session.providerUid}', 'Erfolgreich eingeloggt: ${session.$id}\n${session.providerUid}',
); );
// Go to TankPage _getCurrentLoggedinUser().then((_) {
goToTankPage(); // Go to TankPage
StaticHelper.getMySnackeBar( goToTankPage();
'Erfolg', 'Sie wurden Angemeldet!!', Colors.green); StaticHelper.getMySnackeBar(
'Erfolg', 'Sie wurden Angemeldet!!', Colors.green);
});
}).catchError((error) { }).catchError((error) {
if (error is AppwriteException) { if (error is AppwriteException) {
// Handle specific Appwrite exceptions // Handle specific Appwrite exceptions

View File

@ -5,8 +5,7 @@ import 'package:geolocator/geolocator.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart'; import 'package:get_storage/get_storage.dart';
import 'package:intl/intl.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/location_repository.dart';
import '../../data/repository/appwrite_repository.dart'; import '../../data/repository/appwrite_repository.dart';
import '../login/login_view.dart'; import '../login/login_view.dart';
@ -36,6 +35,7 @@ class TankController extends GetxController {
final kilometerStandEdittingController = TextEditingController(); final kilometerStandEdittingController = TextEditingController();
final mengeController = TextEditingController(); final mengeController = TextEditingController();
final pricePerLiterController = TextEditingController(); final pricePerLiterController = TextEditingController();
final ortController = TextEditingController();
final FocusNode firstFocusNode = FocusNode(); // Deklariere den FocusNode 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. // den Standort in der UI anzuzeigen oder an einen Server zu senden.
var map = {'lat': latitude, 'lng': longitude}; var map = {'lat': latitude, 'lng': longitude};
rxOrtString.value = await _locationRepository.getNearbyLocation(map); rxOrtString.value = await _locationRepository.getNearbyLocation(map);
ortController.text = rxOrtString.value;
// Print Standortinformationen in der Konsole // Print Standortinformationen in der Konsole
print('Nearby Location: ${rxOrtString.value}'); print('Nearby Location: ${rxOrtString.value}');
print('Current Position: Latitude: $latitude, Longitude: $longitude'); print('Current Position: Latitude: $latitude, Longitude: $longitude');
@ -92,6 +93,7 @@ class TankController extends GetxController {
kilometerStandEdittingController.clear(); kilometerStandEdittingController.clear();
mengeController.clear(); mengeController.clear();
pricePerLiterController.clear(); pricePerLiterController.clear();
ortController.clear();
} }
String? validateKilometerStand(String? value) { String? validateKilometerStand(String? value) {
@ -124,6 +126,13 @@ class TankController extends GetxController {
return null; return null;
} }
String? validateOrt(String? value) {
if (value == null || value.isEmpty) {
return 'Bitte Ort eingeben...';
}
return null;
}
//Go to Login Page //Go to Login Page
void logoutSessionAndGoToLoginPage() async { void logoutSessionAndGoToLoginPage() async {
// Handle logout logic here // Handle logout logic here
@ -140,8 +149,8 @@ class TankController extends GetxController {
@override @override
void onInit() { void onInit() {
super.onInit(); super.onInit();
if (_dataBox.hasData('sessinId')) { if (_dataBox.hasData('sessionId')) {
rxSessionIdString(_dataBox.read('sessinId').toString()); rxSessionIdString(_dataBox.read('sessionId').toString());
} }
// Rufe den Standort direkt beim Initialisieren des Controllers ab, falls gewünscht. // Rufe den Standort direkt beim Initialisieren des Controllers ab, falls gewünscht.
fetchCurrentLocation(); fetchCurrentLocation();
@ -171,6 +180,7 @@ class TankController extends GetxController {
kilometerStandEdittingController.dispose(); kilometerStandEdittingController.dispose();
mengeController.dispose(); mengeController.dispose();
pricePerLiterController.dispose(); pricePerLiterController.dispose();
ortController.dispose();
firstFocusNode.dispose(); // Dispose den FocusNode firstFocusNode.dispose(); // Dispose den FocusNode
} }
@ -206,18 +216,10 @@ class TankController extends GetxController {
await _authRepository.createTankStop({ await _authRepository.createTankStop({
'userId': _dataBox.read('userId'), 'userId': _dataBox.read('userId'),
'date': f.format(DateTime.parse(dateController.text)), 'date': f.format(DateTime.parse(dateController.text)),
'odometer': double.parse( 'odometer': kilometerStandEdittingController.text,
double.parse( 'liters': mengeController.text,
kilometerStandEdittingController.text, 'pricePerLiter': pricePerLiterController.text,
).toStringAsFixed(0), 'location': ortController.text,
),
'liters': double.parse(
double.parse(mengeController.text).toStringAsFixed(2),
),
'pricePerLiter': double.parse(
double.parse(pricePerLiterController.text).toStringAsFixed(2),
),
'location': rxOrtString.value,
}).then((models.Document document) { }).then((models.Document document) {
print('Tankstopp erfolgreich gespeichert: ${document.data}'); print('Tankstopp erfolgreich gespeichert: ${document.data}');
messageToUser = 'Tankstopp erfolgreich gespeichert!'; messageToUser = 'Tankstopp erfolgreich gespeichert!';

View File

@ -181,9 +181,33 @@ class TankPage extends GetView<TankController> {
child: Column( child: Column(
children: [ children: [
TextFormField( TextFormField(
validator: (value) => controller.validateOrt(value),
focusNode: controller.firstFocusNode, // Setze den FocusNode 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, readOnly: true,
onTap: () => controller.selectDateTime(Get.context!), onTap: () => controller.selectDateTime(Get.context!),
keyboardType: TextInputType.text,
controller: controller.dateController, controller: controller.dateController,
decoration: InputDecoration( decoration: InputDecoration(
labelText: 'Datum', labelText: 'Datum',