From 257d915362de611e989d3ea3790c14c82a783f46 Mon Sep 17 00:00:00 2001 From: Yasm1nNasc1mento Date: Wed, 4 Dec 2024 12:16:57 -0300 Subject: [PATCH] Implementa onboard principal Co-authored-by: Dylan Cavalcante --- lib/main.dart | 8 +- lib/ui/login/model/LoginRequest.dart | 18 -- lib/ui/login/model/LoginResponse.dart | 19 -- lib/ui/login/service/LoginService.dart | 20 -- lib/ui/login/view/LoginView.dart | 228 ------------------ lib/ui/login/viewModel/LoginViewModel.dart | 82 ------- lib/ui/welcome/model/WelcomeModel.dart | 10 + lib/ui/welcome/view/WelcomeView.dart | 91 +++++++ .../welcome/viewModel/WelcomeViewModel.dart | 19 ++ 9 files changed, 126 insertions(+), 369 deletions(-) delete mode 100644 lib/ui/login/model/LoginRequest.dart delete mode 100644 lib/ui/login/model/LoginResponse.dart delete mode 100644 lib/ui/login/service/LoginService.dart delete mode 100644 lib/ui/login/view/LoginView.dart delete mode 100644 lib/ui/login/viewModel/LoginViewModel.dart create mode 100644 lib/ui/welcome/model/WelcomeModel.dart create mode 100644 lib/ui/welcome/view/WelcomeView.dart create mode 100644 lib/ui/welcome/viewModel/WelcomeViewModel.dart diff --git a/lib/main.dart b/lib/main.dart index b053769..666ec25 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,6 +1,6 @@ import 'package:aranduapp/config/ThemeApp.dart'; import 'package:flutter/material.dart'; -import 'package:aranduapp/ui/login/view/LoginView.dart'; +import 'package:aranduapp/ui/welcome/view/WelcomeView.dart'; void main() { runApp(const MyApp()); @@ -15,7 +15,11 @@ class MyApp extends StatelessWidget { theme: ThemeApp.themeData(), darkTheme: ThemeApp.darkThemeData(), debugShowCheckedModeBanner: false, - home: Login(), + initialRoute: '/', + routes: { + '/': (context) => WelcomeSreen(), + //'/nextPage': (context) => , //colocar login() ou a pagina a ser guiada + }, ); } } diff --git a/lib/ui/login/model/LoginRequest.dart b/lib/ui/login/model/LoginRequest.dart deleted file mode 100644 index 8e8d47f..0000000 --- a/lib/ui/login/model/LoginRequest.dart +++ /dev/null @@ -1,18 +0,0 @@ -import 'dart:convert'; - -class LoginRequest { - - final String? email; - final String? password; - - LoginRequest(this.email, this.password); - - factory LoginRequest.fromJsonString(String jsonString) { - Map json = jsonDecode(jsonString); - return LoginRequest( - json['email'] as String?, - json['password'] as String?, - ); - } - -} diff --git a/lib/ui/login/model/LoginResponse.dart b/lib/ui/login/model/LoginResponse.dart deleted file mode 100644 index c63fdb0..0000000 --- a/lib/ui/login/model/LoginResponse.dart +++ /dev/null @@ -1,19 +0,0 @@ -import 'dart:convert'; - -class LoginResponse { - - String authToken; - String refreshToken; - - LoginResponse(this.authToken, this.refreshToken); - - - factory LoginResponse.fromJsonString(String jsonString) { - Map json = jsonDecode(jsonString); - return LoginResponse( - json['auth_token'] as String, - json['refresh_token'] as String - ); - } - -} diff --git a/lib/ui/login/service/LoginService.dart b/lib/ui/login/service/LoginService.dart deleted file mode 100644 index 9d24aa5..0000000 --- a/lib/ui/login/service/LoginService.dart +++ /dev/null @@ -1,20 +0,0 @@ -import 'package:aranduapp/ui/login/model/LoginRequest.dart'; -import 'package:dio/dio.dart'; - -class LoginService { - - static Future login(LoginRequest loginRequest) async { - // TODO: implement build - throw UnimplementedError(); - - } - - static Future refreshToken() async { - // TODO: implement build - throw UnimplementedError(); - - } - -} - - diff --git a/lib/ui/login/view/LoginView.dart b/lib/ui/login/view/LoginView.dart deleted file mode 100644 index 2c745bb..0000000 --- a/lib/ui/login/view/LoginView.dart +++ /dev/null @@ -1,228 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; - -import 'package:aranduapp/ui/login/viewModel/LoginViewModel.dart'; - -import 'package:aranduapp/ui/recover_account/view/RecoverAccount.dart'; -import 'package:aranduapp/ui/register_account/view/RegisterAccount.dart'; - -import 'package:aranduapp/ui/shared/TitleSlogan.dart'; -import 'package:aranduapp/ui/shared/TextEmail.dart'; -import 'package:aranduapp/ui/shared/ErrorPopUp.dart'; -import 'package:aranduapp/ui/shared/TextPassword.dart'; - -class Login extends StatelessWidget { - const Login({super.key}); - - @override - Widget build(BuildContext context) { - return ChangeNotifierProvider( - create: (context) => LoginViewModel(context), - child: const _Login(), - ); - } -} - -class _Login extends StatefulWidget { - const _Login({Key? key}) : super(key: key); - - @override - State createState() { - return _LoginState(); - } -} - -class _LoginState extends State<_Login> { - late Future _future; - - @override - void initState() { - super.initState(); - _future = Provider.of(context, listen: false) - .getRefreshTokenFuture(); - } - - @override - Widget build(BuildContext context) { - LoginViewModel viewModel = Provider.of(context); - - return Scaffold( - body: FutureBuilder( - future: _future, - builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { - return _loadingScreen(viewModel); - } else if (!snapshot.hasError) { - viewModel.loginWithDeviceAuth(); - return _authDevice(viewModel); - } else { - return _emailAndPassword(viewModel); - } - })); - } - - Widget _loadingScreen(LoginViewModel viewModel) { - return const Center( - child: CircularProgressIndicator(value: null), - ); - } - - Widget _authDevice(LoginViewModel viewModel) { - return Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Expanded( - child: Center( - child: Icon( - Icons.lock_sharp, - color: Theme.of(context).colorScheme.primary, - size: 120, - ), - ), - ), - Container( - margin: const EdgeInsets.only(bottom: 16), - child: SizedBox( - width: 291, - height: 64, - child: ElevatedButton( - onPressed: () { - viewModel.loginWithDeviceAuth(); - }, - child: const Text('Usar senha do celular'), - ), - ), - ), - ], - ); - } - - Widget _emailAndPassword(LoginViewModel viewModel) { - return SingleChildScrollView( - child: SizedBox( - width: MediaQuery.of(context).size.width, - height: MediaQuery.of(context).size.height, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const Expanded( - child: Center( - child: TitleSlogan(), - ), - ), - Expanded( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [_formSection(viewModel), _forgotPasswordLink(context)], - )), - Expanded( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - _loginButtonSection(context, viewModel), - _createAccountLink(context) - ], - )) - ], - ), - ), - ); - } - - Widget _formSection(LoginViewModel viewModel) { - return Form( - key: viewModel.formKey, - child: Column( - children: [ - TextEmail( - padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 20), - controller: viewModel.emailController, - ), - TextPassWord( - padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 20), - controller: viewModel.passwordController, - ), - ], - ), - ); - } - - Widget _forgotPasswordLink(BuildContext context) { - return GestureDetector( - onTap: () { - Navigator.of(context).push( - MaterialPageRoute( - builder: (context) => const RecoverAccount(), - ), - ); - }, - child: Align( - alignment: Alignment.centerRight, - child: Padding( - padding: const EdgeInsets.only(top: 13, right: 20), - child: Text( - 'esqueceu a senha ?', - textAlign: TextAlign.right, - style: Theme.of(context).textTheme.bodySmall!.apply( - color: Theme.of(context).colorScheme.primary, - ), - ), - ), - ), - ); - } - - Widget _loginButtonSection(BuildContext context, LoginViewModel viewModel) { - return SizedBox( - width: 291, - height: 64, - child: ElevatedButton( - onPressed: () { - viewModel - .loginWithEmailAndPassword() - .catchError((e) => showDialog( - context: context, - builder: (BuildContext context) => - ErrorPopUp(content: Text('$e')), - )); - }, - child: Consumer( - builder: (context, value, child) => value.isLoading - ? const CircularProgressIndicator(value: null) - : const Text('Entrar'), - )), - ); - } - - Widget _createAccountLink(BuildContext context) { - return Padding( - padding: const EdgeInsets.only(top: 13), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - 'É novo por aqui?', - style: Theme.of(context).textTheme.bodySmall, - ), - GestureDetector( - onTap: () { - Navigator.of(context).push( - MaterialPageRoute( - builder: (context) => const RegisterAccount(), - ), - ); - }, - child: SizedBox( - child: Text( - ' Crie a sua conta', - style: Theme.of(context).textTheme.bodySmall!.apply( - color: Theme.of(context).colorScheme.primary, - ), - ), - ), - ), - ], - ), - ); - } -} diff --git a/lib/ui/login/viewModel/LoginViewModel.dart b/lib/ui/login/viewModel/LoginViewModel.dart deleted file mode 100644 index 2be38e8..0000000 --- a/lib/ui/login/viewModel/LoginViewModel.dart +++ /dev/null @@ -1,82 +0,0 @@ - -import 'package:flutter/material.dart'; -import 'package:local_auth/local_auth.dart'; -import 'package:aranduapp/ui/login/service/LoginService.dart'; -import 'package:aranduapp/ui/login/model/LoginRequest.dart'; - -import 'package:aranduapp/ui/home/view/HomeView.dart'; - -class LoginViewModel extends ChangeNotifier { - - final BuildContext context; - - bool isLoading; - - final GlobalKey formKey; - final TextEditingController emailController; - final TextEditingController passwordController; - - LoginViewModel(this.context) : - isLoading = false, - formKey = GlobalKey(), - emailController = TextEditingController(), - passwordController = TextEditingController(); - - - - Future loginWithEmailAndPassword() async { - - // TODO use mutex to make this - if (isLoading){ - return; - } - - try { - isLoading = true; - super.notifyListeners(); - - if (!formKey.currentState!.validate()) { - throw Exception('Valores inválidos'); - } - - - await LoginService.login(LoginRequest(emailController.text, passwordController.text)); - - _moveToHome(); - - } catch (e) { - rethrow; - } finally { - isLoading = false; - notifyListeners(); - } - } - - Future getRefreshTokenFuture() async { - // TODO - //return await LoginService.refreshToken(); - throw UnimplementedError(); - } - - Future loginWithDeviceAuth() async { - bool value = await LocalAuthentication().authenticate( - localizedReason: 'Toque com o dedo no sensor para logar'); - - if (!value) - throw Exception(); - - _moveToHome(); - } - - - void _moveToHome(){ - - Navigator.of(context).pushReplacement( - MaterialPageRoute( - builder: (context) => const HomeView(), - ), - ); - } - -} - diff --git a/lib/ui/welcome/model/WelcomeModel.dart b/lib/ui/welcome/model/WelcomeModel.dart new file mode 100644 index 0000000..458119a --- /dev/null +++ b/lib/ui/welcome/model/WelcomeModel.dart @@ -0,0 +1,10 @@ +//import 'dart:convert'; + +class WelcomeModel { + + final String title; + final String buttonText; + + WelcomeModel(this.title, this.buttonText); + +} diff --git a/lib/ui/welcome/view/WelcomeView.dart b/lib/ui/welcome/view/WelcomeView.dart new file mode 100644 index 0000000..5b0b154 --- /dev/null +++ b/lib/ui/welcome/view/WelcomeView.dart @@ -0,0 +1,91 @@ +import 'package:flutter/material.dart'; +import 'package:aranduapp/ui/welcome/viewModel/WelcomeViewModel.dart'; +import 'package:google_fonts/google_fonts.dart'; + + +class WelcomeSreen extends StatelessWidget { + final WelcomeViewModel viewModel = WelcomeViewModel(); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SizedBox(height: 95), + + //Cículo com gradiente com possível logo sobreposta + Stack( + alignment: Alignment.center, //centraliza logo no cículo + children: [ + Container( + width: 278, + height: 278, + decoration: BoxDecoration( + shape: BoxShape.circle, + gradient: LinearGradient( + colors:[ + Color(0xFFFB923C), + Color(0xFFC2410C), + ], + begin: Alignment.topLeft, + end: Alignment.bottomLeft, + ), + ), + ), + // comentado: Local onde a logo pode ser adicionada no futuro (CircleAvatar todo) + //CircleAvatar( + // radius: 100, + // backgroundImage: AssetImage('//colocar a logo png'), + // ), + ], + ), + SizedBox(height: 20), + + //Titulo "arandú" com fonte amarante + Text( + viewModel.title, + style: GoogleFonts.amarante( + fontSize: 60, + fontWeight: FontWeight.w500, + ), + ), + Spacer(), + + //Botão de começar com gradiente + GestureDetector( + onTap: () => viewModel.navigateToNextPage(context), + child: Container( + padding: EdgeInsets.symmetric(horizontal:120, vertical: 15), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(15), + gradient: LinearGradient( + colors: [ + Color(0xFFFB923C), + Color(0xFFC2410C), + ], + begin: Alignment.topLeft, + end: Alignment.bottomLeft, + ), + ), + child: Text( + viewModel.buttonText, + style: GoogleFonts.comfortaa( + color: Colors.white, + fontSize: 15, + fontWeight: FontWeight.w500, //coloca a fonte certa + + ), + ) + ), + + ), + SizedBox(height:50), + ], + ) + ) + ); + } +} \ No newline at end of file diff --git a/lib/ui/welcome/viewModel/WelcomeViewModel.dart b/lib/ui/welcome/viewModel/WelcomeViewModel.dart new file mode 100644 index 0000000..88cd9eb --- /dev/null +++ b/lib/ui/welcome/viewModel/WelcomeViewModel.dart @@ -0,0 +1,19 @@ + +import 'package:flutter/material.dart'; +//import 'package:local_auth/local_auth.dart'; +import 'package:aranduapp/ui/welcome/model/WelcomeModel.dart'; + +//import 'package:aranduapp/ui/home/view/HomeView.dart'; + +class WelcomeViewModel { + + final WelcomeModel _model = WelcomeModel("Arandú", "Começar"); + + String get title => _model.title; + String get buttonText => _model.buttonText; + + void navigateToNextPage(BuildContext context) { + Navigator.pushNamed(context, '/nextPage'); + } +} +