From d755378672075478e5e30b9074e0de1f1b18ea54 Mon Sep 17 00:00:00 2001 From: rem Date: Mon, 27 Nov 2023 14:04:31 +0100 Subject: [PATCH] :sparkles: add support for password modification --- lib/modele/api/api_wrapper.dart | 17 +++++ .../mobile/mobile_change_password.dart | 65 ++++++++++++----- lib/view/profile/web/web_change_password.dart | 69 ++++++++++++++----- 3 files changed, 113 insertions(+), 38 deletions(-) diff --git a/lib/modele/api/api_wrapper.dart b/lib/modele/api/api_wrapper.dart index 0202fc8..67174a1 100644 --- a/lib/modele/api/api_wrapper.dart +++ b/lib/modele/api/api_wrapper.dart @@ -3,6 +3,8 @@ import 'package:smartfit_app_mobile/modele/api/request_api.dart'; import 'package:smartfit_app_mobile/modele/utile/info_message.dart'; import 'package:email_validator/email_validator.dart'; import 'package:tuple/tuple.dart'; +import 'dart:convert'; +import 'package:crypto/crypto.dart'; class ApiWrapper { IDataStrategy api = RequestApi(); @@ -29,6 +31,21 @@ class ApiWrapper { return false; } } + + Future> login( + String password, String email, InfoMessage infoManager) async { + String hash = sha256.convert(utf8.encode(password)).toString(); + Tuple2 res = await api.connexion(email, hash); + + if (res.item1) { + return Tuple2(true, res.item2); // return token + } else { + infoManager.displayMessage( + "Authentification failed! Enter your actual password carefully.", + true); + return const Tuple2(false, "An error occured during connexion!"); + } // need to be better + } } extension StringExtension on String { diff --git a/lib/view/profile/mobile/mobile_change_password.dart b/lib/view/profile/mobile/mobile_change_password.dart index 2bb37a4..a170eb2 100644 --- a/lib/view/profile/mobile/mobile_change_password.dart +++ b/lib/view/profile/mobile/mobile_change_password.dart @@ -1,25 +1,34 @@ +import 'dart:convert'; +import 'package:crypto/crypto.dart'; +import 'package:smartfit_app_mobile/modele/user.dart'; +import 'package:smartfit_app_mobile/modele/api/api_wrapper.dart'; +import 'package:smartfit_app_mobile/modele/utile/info_message.dart'; +import 'package:tuple/tuple.dart'; +import 'package:provider/provider.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_svg/svg.dart'; import 'package:smartfit_app_mobile/common/colo_extension.dart'; import 'package:smartfit_app_mobile/common_widget/button/round_button.dart'; import 'package:smartfit_app_mobile/common_widget/text_field/round_text_field.dart'; - class MobileChangePasswordView extends StatefulWidget { const MobileChangePasswordView({super.key}); @override - State createState() => _MobileChangePasswordViewState(); + State createState() => + _MobileChangePasswordViewState(); } class _MobileChangePasswordViewState extends State { - final TextEditingController controllerTextEmail = TextEditingController(); - final TextEditingController controllerTextPassword = TextEditingController(); - + final TextEditingController controllerActualPasswd = TextEditingController(); + final TextEditingController controllerNewPasswd = TextEditingController(); + final TextEditingController controllerNewPasswd2 = TextEditingController(); + final InfoMessage infoManager = InfoMessage(); + final ApiWrapper api = ApiWrapper(); @override Widget build(BuildContext context) { var media = MediaQuery.of(context).size; + User providerUser = Provider.of(context, listen: false); return Scaffold( appBar: AppBar( @@ -44,16 +53,14 @@ class _MobileChangePasswordViewState extends State { height: 15, fit: BoxFit.contain, ), - ), - ), - title: Text( + title: Text( "Changer son Mot de passe", style: TextStyle( color: TColor.black, fontSize: 16, fontWeight: FontWeight.w700), ), - ), + ), backgroundColor: TColor.white, body: Column( children: [ @@ -77,29 +84,49 @@ class _MobileChangePasswordViewState extends State { obscureText: true, icon: "assets/img/lock.svg", keyboardType: TextInputType.text, - controller: controllerTextEmail, + controller: controllerActualPasswd, ), SizedBox(height: media.width * 0.07), RoundTextField( - controller: controllerTextPassword, + controller: controllerNewPasswd, hitText: "Nouveau mot de passe", icon: "assets/img/lock.svg", obscureText: true, - ), SizedBox(height: media.width * 0.07), RoundTextField( - controller: controllerTextPassword, + controller: controllerNewPasswd2, hitText: "Confirmer nouveau mot de passe", icon: "assets/img/lock.svg", obscureText: true, - ), SizedBox(height: media.width * 0.07), RoundButton( - title: "Confirmer", - onPressed: () {}), - + title: "Confirmer", + onPressed: () async { + Tuple2 res = await api.login( + controllerActualPasswd.text, + providerUser.email, + infoManager); + if (res.item1) { + if (controllerNewPasswd.text == + controllerNewPasswd2.text) { + await api.modifyUserInfo( + 'password', + sha256 + .convert(utf8 + .encode(controllerNewPasswd.text)) + .toString(), + providerUser.token, + infoManager); + } else { + infoManager.displayMessage( + 'Passwords does not match each other! Enter them carefully.', + true); + } + } + setState(() {}); + }), ], ), ), @@ -110,4 +137,4 @@ class _MobileChangePasswordViewState extends State { ), ); } -} \ No newline at end of file +} diff --git a/lib/view/profile/web/web_change_password.dart b/lib/view/profile/web/web_change_password.dart index bb080e2..00ff54e 100644 --- a/lib/view/profile/web/web_change_password.dart +++ b/lib/view/profile/web/web_change_password.dart @@ -1,9 +1,14 @@ +import 'dart:convert'; +import 'package:crypto/crypto.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_svg/svg.dart'; +import 'package:tuple/tuple.dart'; +import 'package:provider/provider.dart'; +import 'package:smartfit_app_mobile/modele/user.dart'; import 'package:smartfit_app_mobile/common/colo_extension.dart'; -import 'package:smartfit_app_mobile/common_widget/button/round_button.dart'; import 'package:smartfit_app_mobile/common_widget/text_field/round_text_field.dart'; - +import 'package:smartfit_app_mobile/modele/utile/info_message.dart'; +import 'package:smartfit_app_mobile/modele/api/api_wrapper.dart'; +import 'package:smartfit_app_mobile/common_widget/button/round_button.dart'; class WebChangePasswordView extends StatefulWidget { const WebChangePasswordView({super.key}); @@ -13,13 +18,16 @@ class WebChangePasswordView extends StatefulWidget { } class _WebChangePasswordViewState extends State { - final TextEditingController controllerTextEmail = TextEditingController(); - final TextEditingController controllerTextPassword = TextEditingController(); - + final TextEditingController controllerActualPasswd = TextEditingController(); + final TextEditingController controllerNewPasswd = TextEditingController(); + final TextEditingController controllerNewPasswd2 = TextEditingController(); + final InfoMessage infoManager = InfoMessage(); + final ApiWrapper api = ApiWrapper(); @override Widget build(BuildContext context) { var media = MediaQuery.of(context).size; + User providerUser = Provider.of(context, listen: false); return Scaffold( appBar: AppBar( @@ -44,16 +52,14 @@ class _WebChangePasswordViewState extends State { height: 15, fit: BoxFit.contain, ), - ), - ), - title: Text( + title: Text( "Changer son Mot de passe", style: TextStyle( color: TColor.black, fontSize: 16, fontWeight: FontWeight.w700), ), - ), + ), backgroundColor: TColor.white, body: Column( children: [ @@ -76,29 +82,54 @@ class _WebChangePasswordViewState extends State { obscureText: true, icon: "assets/img/lock.svg", keyboardType: TextInputType.text, - controller: controllerTextEmail, + controller: controllerActualPasswd, ), SizedBox(height: media.width * 0.02), RoundTextField( - controller: controllerTextPassword, + controller: controllerNewPasswd, hitText: "Nouveau mot de passe", icon: "assets/img/lock.svg", obscureText: true, - ), SizedBox(height: media.width * 0.02), RoundTextField( - controller: controllerTextPassword, + controller: controllerNewPasswd2, hitText: "Confirmer nouveau mot de passe", icon: "assets/img/lock.svg", obscureText: true, - ), + Visibility( + visible: infoManager.isVisible, + child: Text(infoManager.message, + style: + TextStyle(color: infoManager.messageColor))), SizedBox(height: media.width * 0.04), RoundButton( - title: "Confirmer", - onPressed: () {}), - + title: "Confirmer", + onPressed: () async { + Tuple2 res = await api.login( + controllerActualPasswd.text, + providerUser.email, + infoManager); + if (res.item1) { + if (controllerNewPasswd.text == + controllerNewPasswd2.text) { + await api.modifyUserInfo( + 'password', + sha256 + .convert(utf8 + .encode(controllerNewPasswd.text)) + .toString(), + providerUser.token, + infoManager); + } else { + infoManager.displayMessage( + 'Passwords does not match each other! Enter them carefully.', + true); + } + } + setState(() {}); + }), ], ), ), @@ -109,4 +140,4 @@ class _WebChangePasswordViewState extends State { ), ); } -} \ No newline at end of file +}