2025-10-28 14:01:34 +01:00

129 lines
3.8 KiB
Dart

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:appwrite/models.dart' as user_models;
import '../controllers/login_controller.dart';
import '../controllers/geolocation_controller.dart';
import '../models/ptv_logistic_model.dart';
import '../routes/app_routes.dart';
class InputController extends GetxController {
final GeolocationController geoCtrl = Get.put(GeolocationController());
// Lazy-get für LoginController - wird nur erstellt wenn benötigt
LoginController get loginCtrl => Get.find<LoginController>();
final _ptvModel = Rxn<PTVModel>();
final _user = (Get.arguments as user_models.User).obs;
final formKey = GlobalKey<FormState>();
late TextEditingController dateController;
late TextEditingController odometerController;
late TextEditingController litersController;
late TextEditingController pricePerLiterController;
late TextEditingController locationController;
late TextEditingController sumPriceController;
PTVModel? get ptvModel => _ptvModel.value;
user_models.User? get currentUser => _user.value;
// Sichere Getter für Controller-Text
String get safeDate => _isControllerValid(dateController) ? dateController.text : '';
String get safeLocation => _isControllerValid(locationController) ? locationController.text : '';
// Hilfsmethode zur Controller-Validierung
bool _isControllerValid(TextEditingController? controller) {
try {
return controller != null && controller.text.isNotEmpty;
} catch (e) {
return false;
}
}
@override
void onInit() {
_initController();
_getLocation();
super.onInit();
}
void _initController() {
dateController = TextEditingController();
odometerController = TextEditingController();
litersController = TextEditingController();
pricePerLiterController = TextEditingController();
locationController = TextEditingController();
sumPriceController = TextEditingController();
// init Date today to dateController
dateController.text = DateTime.now().toString().split(' ').first;
}
@override
void onReady() {}
@override
void onClose() {
// Dispose aller TextEditingController
dateController.dispose();
odometerController.dispose();
litersController.dispose();
pricePerLiterController.dispose();
locationController.dispose();
sumPriceController.dispose();
geoCtrl.onClose();
// LoginController nicht schließen da er permanent sein könnte
super.onClose();
}
void _getLocation() async {
await geoCtrl.getCurrentPosition().then(
(_) => {
_ptvModel.value = geoCtrl.ptvModel,
locationController.text = geoCtrl.ptvModel?.locations?.first.formattedAddress ?? '',
},
);
update();
}
void goToListPage() {
//AppNavigation.goToListPage
}
void logout() async {
// Zeige Loading um weitere Interaktionen zu verhindern
Get.dialog(
const Center(
child: CircularProgressIndicator(),
),
barrierDismissible: false,
);
try {
// Kurze Verzögerung um sicherzustellen dass UI Updates verarbeitet werden
await Future.delayed(const Duration(milliseconds: 100));
// Logout ausführen
await loginCtrl.logout();
// Dialog schließen
if (Get.isDialogOpen == true) {
Get.back();
}
// Navigation nach kurzer Verzögerung
await Future.delayed(const Duration(milliseconds: 100));
AppNavigation.offAllToLogin();
} catch (e) {
// Dialog schließen bei Fehler
if (Get.isDialogOpen == true) {
Get.back();
}
Get.snackbar(
'Fehler',
'Logout fehlgeschlagen: $e',
snackPosition: SnackPosition.BOTTOM,
backgroundColor: Colors.red.shade500,
);
}
}
}