diff --git a/lib/controllers/input_controller.dart b/lib/controllers/input_controller.dart index d5d26f7..d610608 100644 --- a/lib/controllers/input_controller.dart +++ b/lib/controllers/input_controller.dart @@ -1,17 +1,51 @@ +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()); + final LoginController loginCtrl = Get.put(LoginController()); + final _ptvModel = Rxn(); + final _user = (Get.arguments as user_models.User).obs; + final formKey = GlobalKey(); - @override - void onInit() { + PTVModel? get ptvModel => _ptvModel.value; + user_models.User? get currentUser => _user.value; + + @override + void onInit() { + _getLocation(); super.onInit(); - } + } - @override - void onReady() {} + @override + void onReady() {} - @override - void onClose() {} + @override + void onClose() { + geoCtrl.onClose(); + loginCtrl.onClose(); + super.onClose(); + } + void _getLocation() async { + await geoCtrl.getCurrentPosition().then( + (_) => {_ptvModel.value = geoCtrl.ptvModel}, + ); + update(); + } + + void goToListPage() { + //AppNavigation.goToListPage + } + + void logout() { + loginCtrl.logout(); + //AppNavigation.toLogin(); + AppNavigation.offAllToLogin(); + } } diff --git a/lib/controllers/login_controller.dart b/lib/controllers/login_controller.dart index 49f25d9..4dc64da 100644 --- a/lib/controllers/login_controller.dart +++ b/lib/controllers/login_controller.dart @@ -1,16 +1,18 @@ import 'package:appwrite/appwrite.dart' as account_models; import 'package:appwrite/models.dart' as user_models; -import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:appwrite/appwrite.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:flutter/foundation.dart'; +import '../routes/app_routes.dart'; + class LoginController extends GetxController { final _account = Rxn(); - final mailController = TextEditingController(); - final passwordController = TextEditingController(); - final nameController = TextEditingController(); + late TextEditingController mailController; + late TextEditingController passwordController; + late TextEditingController nameController; final _endpoint = dotenv.env['APPWRITE_ENDPOINT_URL'] ?? ''; final _projectId = dotenv.env['APPWRITE_PROJECT_ID'] ?? ''; final bool _selfSigned = @@ -24,6 +26,11 @@ class LoginController extends GetxController { @override void onInit() { + // Initialisiere TextEditingController + mailController = TextEditingController(); + passwordController = TextEditingController(); + nameController = TextEditingController(); + // Initialisiere Client Client client = Client().setEndpoint(_endpoint).setProject(_projectId); // Optional: Unsichere/self-signed Zertifikate im Dev zulassen (nicht im Web wirksam) if (!kIsWeb && _selfSigned) { @@ -62,6 +69,7 @@ class LoginController extends GetxController { } Future login() async { + logout(); try { var result = await _account.value!.createEmailPasswordSession( email: mailController.text, @@ -72,9 +80,10 @@ class LoginController extends GetxController { final user = await _account.value!.get(); _logedInUser.value = user; clearFields(); + goToInput(user); Get.snackbar( 'Erfolg', - 'Anmeldung erfolgreich', + 'Anmeldung erfolgreich ${user.name}, ID: ${user.$id}', snackPosition: SnackPosition.BOTTOM, ); } on AppwriteException catch (e) { @@ -97,7 +106,7 @@ class LoginController extends GetxController { } } - clearFields(){ + clearFields() { mailController.clear(); passwordController.clear(); nameController.clear(); @@ -133,8 +142,14 @@ class LoginController extends GetxController { } Future logout() async { - await _account.value!.deleteSession(sessionId: 'current'); + await _account.value!.deleteSession(sessionId: 'current'); _logedInUser.value = null; + Get.snackbar( + 'Erfolg', + 'Logout erfolgreich', + snackPosition: SnackPosition.BOTTOM, + backgroundColor: Colors.red.shade500, + ); } @override @@ -144,5 +159,8 @@ class LoginController extends GetxController { nameController.dispose(); super.onClose(); } -} + void goToInput(Object args) { + AppNavigation.toInputPageWithArgs(args); + } +} diff --git a/lib/models/input_model.dart b/lib/models/input_model.dart index e69de29..c60d653 100644 --- a/lib/models/input_model.dart +++ b/lib/models/input_model.dart @@ -0,0 +1,38 @@ +class InputModel { + String szDocumentId; + String szUserId; + String szDate; + int nOdometer; + double mnLiters; + double mnPricePerLiter; + String szLocation; + double? mnTotalPrice; + InputModel({required this.szDocumentId, required this.szUserId, required this.szDate, required this.nOdometer, required this.mnLiters, required this.mnPricePerLiter, required this.szLocation, this.mnTotalPrice}); + + factory InputModel.fromJson(Map json) { + return InputModel( + szDocumentId: json['szDocumentId'] as String, + szUserId: json['szUserId'] as String, + szDate: json['szDate'] as String, + nOdometer: json['nOdometer'] as int, + mnLiters: json['mnLiters'] as double, + mnPricePerLiter: json['mnPricePerLiter'] as double, + szLocation: json['szLocation'] as String, + mnTotalPrice: (json['mnLiters'] as double) * (json['mnPricePerLiter'] as double), + ); + } + + Map toJson() { + return { + 'szDocumentId': szDocumentId, + 'szUserId': szUserId, + 'szDate': szDate, + 'nOdometer': nOdometer, + 'mnLiters': mnLiters, + 'mnPricePerLiter': mnPricePerLiter, + 'szLocation': szLocation, + }; + } +} + + diff --git a/lib/pages/input/input_view.dart b/lib/pages/input/input_view.dart index 327f29e..9edb7ce 100644 --- a/lib/pages/input/input_view.dart +++ b/lib/pages/input/input_view.dart @@ -3,12 +3,58 @@ import 'package:get/get.dart'; import '../../controllers/input_controller.dart'; class InputPage extends GetView { - const InputPage({super.key}); + const InputPage({super.key}); - @override - Widget build(BuildContext context) { - return Scaffold( - body: Container(), + @override + Widget build(BuildContext context) { + var inputCtrl = controller; + return SafeArea( + child: PopScope( + canPop: false, + child: Scaffold( + appBar: AppBar( + title: const Text('Tankstop Eingabe'), + leading: IconButton( + onPressed: () {}, + icon: const Icon(Icons.arrow_back), + ), + actions: [ + IconButton( + icon: const Icon(Icons.list), + onPressed: () { + inputCtrl.goToListPage(); + }, + ), + IconButton( + icon: const Icon(Icons.refresh), + onPressed: () { + inputCtrl.onInit(); + }, + ), + IconButton( + icon: const Icon(Icons.exit_to_app), + onPressed: () { + inputCtrl.logout(); + }, + ), + ], + ), + body: Center( + child: SingleChildScrollView( + child: Column( + children: [ + Obx( + () => inputCtrl.ptvModel != null && inputCtrl.currentUser != null + ? Text('UserEmail: ${inputCtrl.currentUser!.email}\nName: ${inputCtrl.currentUser!.name}\nFormattedAddress: ${inputCtrl.ptvModel!.locations!.first.formattedAddress}', + ) + : const Text('Keine Daten gefunden'), + ), + ], + ), + ), + ), + ), + ), ); - } + } } diff --git a/lib/pages/login/login_view.dart b/lib/pages/login/login_view.dart index 9f8f908..72961d0 100644 --- a/lib/pages/login/login_view.dart +++ b/lib/pages/login/login_view.dart @@ -33,9 +33,10 @@ class LoginPage extends GetView { child: Column( mainAxisSize: MainAxisSize.min, children: [ - Icon( - Icons.local_gas_station, - size: 100, + IconButton( + icon: const Icon(Icons.local_gas_station), + iconSize: 100, + onPressed: ()=> logCtrl.logout(), color: Colors.grey.shade300, ), const SizedBox(height: 20), diff --git a/lib/routes/app_routes.dart b/lib/routes/app_routes.dart index 32be94a..70bc0d3 100644 --- a/lib/routes/app_routes.dart +++ b/lib/routes/app_routes.dart @@ -1,28 +1,28 @@ import 'package:get/get.dart'; +import '../bindings/input_binding.dart'; import '../bindings/login_binding.dart'; -import '../pages/examples/geolocation_example.dart'; -import '../bindings/geolocation_binding.dart'; +import '../pages/input/input_view.dart'; import '../pages/login/login_view.dart'; /// App Routes Konfiguration class AppRoutes { - static const String home = '/'; - static const String geolocation = '/geolocation'; static const String login = '/login'; + static const String listPage = '/list-page'; + static const String inputPage = '/input-page'; /// Route Pages Definition static List pages = [ - GetPage( - name: geolocation, - page: () => const GeolocationExample(), - binding: GeolocationBinding(), // Dependency Injection + GetPage( + name: login, + page: () => const LoginPage(), + binding: LoginBinding(), // Dependency Injection transition: Transition.cupertino, transitionDuration: const Duration(milliseconds: 300), ), GetPage( - name: login, - page: () => const LoginPage(), - binding: LoginBinding(), // Dependency Injection + name: inputPage, + page: () => const InputPage(), + binding: InputBinding(), // Dependency Injection transition: Transition.cupertino, transitionDuration: const Duration(milliseconds: 300), ), @@ -34,23 +34,12 @@ class AppRoutes { // static const String geolocationExample = '/geolocation-example'; // } + /// Navigation Helper Klasse class AppNavigation { - /// Navigate to Geolocation Example - static void toGeolocation() { - Get.toNamed(AppRoutes.geolocation); - } - - /// Navigate and replace current route - static void offGeolocation() { - Get.offNamed(AppRoutes.geolocation); - } - - /// Navigate and clear all previous routes - static void offAllToGeolocation() { - Get.offAllNamed(AppRoutes.geolocation); - } + + /// Login Navigation Methods /// Navigate to Login Page static void toLogin() { Get.toNamed(AppRoutes.login); @@ -63,6 +52,17 @@ class AppNavigation { static void offAllToLogin() { Get.offAllNamed(AppRoutes.login); } + + /// Input Navigation Methods + /// Navigate to Input Page + static void toInputPage() { + Get.toNamed(AppRoutes.inputPage); + } + + /// Navigate to Input Page with args + static void toInputPageWithArgs(Object args) { + Get.toNamed(AppRoutes.inputPage, arguments: args); + } diff --git a/pubspec.lock b/pubspec.lock index 5270075..61fd0e8 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -37,10 +37,10 @@ packages: dependency: transitive description: name: characters - sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 + sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.4.1" clock: dependency: transitive description: @@ -332,18 +332,18 @@ packages: dependency: transitive description: name: material_color_utilities - sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" url: "https://pub.dev" source: hosted - version: "0.11.1" + version: "0.13.0" meta: dependency: transitive description: name: meta - sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c + sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" url: "https://pub.dev" source: hosted - version: "1.16.0" + version: "1.17.0" package_info_plus: dependency: transitive description: @@ -497,10 +497,10 @@ packages: dependency: transitive description: name: test_api - sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00" + sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55 url: "https://pub.dev" source: hosted - version: "0.7.6" + version: "0.7.7" typed_data: dependency: transitive description: