diff --git a/lib/ui/login/view/LoginView.dart b/lib/ui/login/view/LoginView.dart index 8ae71f6..ae86c56 100644 --- a/lib/ui/login/view/LoginView.dart +++ b/lib/ui/login/view/LoginView.dart @@ -154,7 +154,7 @@ class _LoginState extends State<_Login> { onTap: () { Navigator.of(context).push( MaterialPageRoute( - builder: (context) => const RecoverAccount(), + builder: (context) => RecoverAccount(), ), ); }, diff --git a/lib/ui/recover_account/model/RecoverAccountRequest.dart b/lib/ui/recover_account/model/RecoverAccountRequest.dart new file mode 100644 index 0000000..240a184 --- /dev/null +++ b/lib/ui/recover_account/model/RecoverAccountRequest.dart @@ -0,0 +1,16 @@ +import 'dart:convert'; + +class RecoverAccountRequest { + + final String email; + + RecoverAccountRequest(this.email); + + factory RecoverAccountRequest.fromJsonString(String jsonString) { + Map json = jsonDecode(jsonString); + return RecoverAccountRequest( + json['email'] as String, + ); + } + +} diff --git a/lib/ui/recover_account/service/RecoverAccountService.dart b/lib/ui/recover_account/service/RecoverAccountService.dart new file mode 100644 index 0000000..3afc7a2 --- /dev/null +++ b/lib/ui/recover_account/service/RecoverAccountService.dart @@ -0,0 +1,17 @@ +import 'package:aranduapp/core/network/BaseApi.dart'; +import 'package:aranduapp/ui/recover_account/model/RecoverAccountRequest.dart'; + +class RecoverAccountService { + + + static Future forgetPassword(RecoverAccountRequest recoverAccountRequest) async { + + await BaseApi.getInstance().post( + path: '/auth/forgot-password', + data: { + 'email' : recoverAccountRequest.email, + } + ); + } + +} diff --git a/lib/ui/recover_account/view/RecoverAccount.dart b/lib/ui/recover_account/view/RecoverAccount.dart index d157dc9..3aa73f3 100644 --- a/lib/ui/recover_account/view/RecoverAccount.dart +++ b/lib/ui/recover_account/view/RecoverAccount.dart @@ -1,12 +1,82 @@ +import 'package:aranduapp/core/log/Log.dart'; +import 'package:aranduapp/ui/recover_account/viewModel/recoverAccountViewModel.dart'; +import 'package:aranduapp/ui/shared/ErrorPopUp.dart'; +import 'package:aranduapp/ui/shared/TextAndLink.dart'; +import 'package:aranduapp/ui/shared/TextEmail.dart'; +import 'package:aranduapp/ui/shared/TitleSlogan.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; -class RecoverAccount extends StatelessWidget{ +class RecoverAccount extends StatelessWidget { const RecoverAccount({super.key}); @override Widget build(BuildContext context) { - // TODO: implement build - throw UnimplementedError(); + return Scaffold( + body: ChangeNotifierProvider( + create: (context) => RecoverAccountViewModel(context), + builder: (context, child) { + return page(context); + }), + ); } +} + +Widget page(BuildContext context) { + RecoverAccountViewModel viewModel = + Provider.of(context); + return SingleChildScrollView( + child: Center( + child: Column( + children: [ + const SizedBox(height: 80), + const TitleSlogan(), + const Padding( + padding: EdgeInsets.only(top: 70, left: 20, right: 20), + child: Text( + 'Coloque o seu e-mail no campo abaixo e clique em enviar. Logo em seguida, você receberá no seu e-mail as instruções para trocar a sua senha.', + ), + ), + Form( + key: viewModel.formKey, + child: Column(children: [ + TextEmail( + padding: + const EdgeInsets.only(top: 24, left: 20, right: 20), + controller: viewModel.emailController), + ])), + Padding( + padding: const EdgeInsets.only(top: 80), + child: SizedBox( + width: 291, + height: 64, + child: ElevatedButton( + onPressed: () { + viewModel.forgetPassword().then((value) { + Log.d("Deu certo!"); + }).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('Enviar'), + )), + ), + ), + TextAndLink( + text: 'Já tem uma conta?', + link: 'Faça login', + action: () { + Navigator.of(context).pop(); + }, + ) + ], + ), + ), + ); } diff --git a/lib/ui/recover_account/viewModel/recoverAccountViewModel.dart b/lib/ui/recover_account/viewModel/recoverAccountViewModel.dart new file mode 100644 index 0000000..2f6f261 --- /dev/null +++ b/lib/ui/recover_account/viewModel/recoverAccountViewModel.dart @@ -0,0 +1,52 @@ +import 'package:aranduapp/core/log/Log.dart'; +import 'package:aranduapp/ui/recover_account/model/RecoverAccountRequest.dart'; +import 'package:aranduapp/ui/recover_account/service/RecoverAccountService.dart'; +import 'package:flutter/material.dart'; + +class RecoverAccountViewModel extends ChangeNotifier { + final BuildContext context; + + final formKey; + + final emailController; + + + bool isLoading; + + RecoverAccountViewModel(this.context) + : formKey = GlobalKey(), + emailController = TextEditingController(), + isLoading = false; + + + + Future forgetPassword() 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 RecoverAccountService.forgetPassword(RecoverAccountRequest(emailController.text)); + + } catch (e) { + rethrow; + } finally { + isLoading = false; + super.notifyListeners(); + } + + + + + + } +}