From a14b87012ad7cf062902b44bb20ae54370ff3915 Mon Sep 17 00:00:00 2001 From: itsscb Date: Wed, 25 Oct 2023 00:00:39 +0200 Subject: [PATCH] ft/adds login_screen and initial home_screen --- frontend/app/lib/gapi/client.dart | 46 ++++++++++ frontend/app/lib/main.dart | 7 ++ frontend/app/lib/pages/home_screen.dart | 23 +++++ frontend/app/lib/pages/login_screen.dart | 102 +++++++++++++++++++++++ frontend/app/lib/pages/main_screen.dart | 27 +++--- 5 files changed, 190 insertions(+), 15 deletions(-) create mode 100644 frontend/app/lib/pages/home_screen.dart create mode 100644 frontend/app/lib/pages/login_screen.dart diff --git a/frontend/app/lib/gapi/client.dart b/frontend/app/lib/gapi/client.dart index 91abab8..ccd0006 100644 --- a/frontend/app/lib/gapi/client.dart +++ b/frontend/app/lib/gapi/client.dart @@ -1,6 +1,10 @@ +import 'package:app/main.dart'; import 'package:app/pb/rpc_create_account.pb.dart'; +import 'package:app/pb/rpc_get_account_info.pb.dart'; +import 'package:app/pb/rpc_login.pb.dart'; import 'package:app/pb/service_df.pbgrpc.dart'; import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; import 'package:grpc/grpc.dart'; class Client { @@ -30,4 +34,46 @@ class Client { } return CreateAccountResponse(); } + + // LoginResponse Login(BuildContext context, LoginRequest request ){ + // try { + // final response = stub.login(request); + // return response; + // } catch (e) { + // ScaffoldMessenger.of(context).showSnackBar(SnackBar( + // content: Text('Login fehlgeschlagen: $e'), + // )); + // } + // return LoginResponse(); + + // } + + Future login(LoginRequest request, {Function? onError}) async { + try { + final response = await stub.login(request); + return response; + } on GrpcError catch (e) { + print('caught error: ${e.message}'); + onError!(); + } catch (e) { + print('caught error: $e'); + onError!(); + } + return LoginResponse(); + } + + Future getAccountInfo(GetAccountInfoRequest request, + {Function? onError}) async { + try { + final response = await stub.getAccountInfo(request); + return response; + } on GrpcError catch (e) { + print('caught error: ${e.message}'); + onError!(); + } catch (e) { + print('caught error: $e'); + onError!(); + } + return GetAccountInfoResponse(); + } } diff --git a/frontend/app/lib/main.dart b/frontend/app/lib/main.dart index 19489d1..f2393fa 100644 --- a/frontend/app/lib/main.dart +++ b/frontend/app/lib/main.dart @@ -2,9 +2,16 @@ import 'package:flutter/material.dart'; import 'package:app/pages/main_screen.dart'; +class GlobalVariable { + /// This global key is used in material app for navigation through firebase notifications. + static final GlobalKey navigatorState = + GlobalKey(); +} + void main() async { WidgetsFlutterBinding.ensureInitialized(); runApp(MaterialApp( + navigatorKey: GlobalVariable.navigatorState, home: MainScreen(), )); } diff --git a/frontend/app/lib/pages/home_screen.dart b/frontend/app/lib/pages/home_screen.dart new file mode 100644 index 0000000..a391ab6 --- /dev/null +++ b/frontend/app/lib/pages/home_screen.dart @@ -0,0 +1,23 @@ +import 'package:app/pb/account_info.pb.dart'; +import 'package:flutter/material.dart'; + +class HomeScreen extends StatelessWidget { + HomeScreen({super.key, required this.account_info}); + + AccountInfo account_info; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Text( + 'Willkommen ${account_info.firstname}!', + style: const TextStyle( + fontSize: 30, + fontWeight: FontWeight.bold, + ), + ) + ], + ); + } +} diff --git a/frontend/app/lib/pages/login_screen.dart b/frontend/app/lib/pages/login_screen.dart new file mode 100644 index 0000000..4a035b7 --- /dev/null +++ b/frontend/app/lib/pages/login_screen.dart @@ -0,0 +1,102 @@ +import 'package:app/gapi/client.dart'; +import 'package:app/pages/home_screen.dart'; +import 'package:app/pb/rpc_get_account_info.pb.dart'; +import 'package:app/pb/rpc_login.pb.dart'; +import 'package:flutter/material.dart'; + +class LoginScreen extends StatelessWidget { + LoginScreen({super.key}); + + Client client = Client(); + + final _formKey = GlobalKey(); + final mailController = TextEditingController(); + final passwordController = TextEditingController(); + + @override + Widget build(BuildContext context) { + return Form( + key: _formKey, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + TextFormField( + style: const TextStyle( + color: Colors.white, + ), + controller: mailController, + decoration: const InputDecoration( + fillColor: Color.fromARGB(30, 255, 255, 255), + filled: true, + hintStyle: TextStyle( + color: Colors.white38, + ), + hintText: 'E-Mail Adresse', + ), + keyboardType: TextInputType.emailAddress, + validator: (value) { + if (value == null || value.isEmpty) { + return 'Bitte eine gültige E-Mail Adresse eingeben'; + } + return null; + }, + ), + TextFormField( + style: const TextStyle( + color: Colors.white, + ), + controller: passwordController, + decoration: const InputDecoration( + fillColor: Color.fromARGB(30, 255, 255, 255), + filled: true, + hintStyle: TextStyle( + color: Colors.white38, + ), + hintText: 'Passwort', + ), + keyboardType: TextInputType.visiblePassword, + obscureText: true, + validator: (value) { + if (value == null || value.isEmpty) { + return 'Bitte geben Sie Ihr Passwort ein'; + } + return null; + }, + ), + ElevatedButton( + onPressed: () async { + if (_formKey.currentState!.validate()) { + // final navigator = Navigator.of(context); + LoginResponse response = await client.login( + LoginRequest( + email: mailController.text, + password: passwordController.text, + ), + onError: () { + ScaffoldMessenger.of(context).showSnackBar(const SnackBar( + content: Text('Login fehlgeschlagen'), + )); + }, + ); + + print(response); + + // GetAccountInfoResponse resp = await client.getAccountInfo( + // GetAccountInfoRequest(accountId: response.accountId)); + // Navigator.push( + // context, + // MaterialPageRoute( + // builder: (context) => HomeScreen( + // account_info: resp.accountInfo, + // ), + // ), + // ); + } + }, + child: const Icon(Icons.arrow_forward)) + ], + ), + ); + } +} diff --git a/frontend/app/lib/pages/main_screen.dart b/frontend/app/lib/pages/main_screen.dart index 615e60d..53e18e9 100644 --- a/frontend/app/lib/pages/main_screen.dart +++ b/frontend/app/lib/pages/main_screen.dart @@ -1,16 +1,21 @@ import 'package:app/gapi/client.dart'; -import 'package:app/pb/rpc_create_account.pb.dart'; +import 'package:app/pages/login_screen.dart'; import 'package:flutter/material.dart'; +Map screens = { + // 'main': MainScreen(), + 'login': LoginScreen(), +}; + class MainScreen extends StatelessWidget { MainScreen({super.key}); Client client = Client(); - void test() { - client.stub.createAccount( - CreateAccountRequest(email: "dev@itsscb.de", password: "secret-key123"), - ); + String currentScreen = 'login'; + + setPage(String screen) { + currentScreen = screen; } @override @@ -53,16 +58,8 @@ class MainScreen extends StatelessWidget { // ), ], ), - body: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - TextButton( - onPressed: () { - test(); - }, - child: const Text('Button')) - ], + body: Center( + child: screens[currentScreen], ), ), );