129 lines
3.8 KiB
Dart
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,
|
|
);
|
|
}
|
|
}
|
|
}
|