From 692e53d071fd68b4bb75687de6dcf2cabf8b6068 Mon Sep 17 00:00:00 2001 From: Enzo Date: Mon, 13 Nov 2023 09:00:21 +0100 Subject: [PATCH 1/9] =?UTF-8?q?Cr=C3=A9ation=20de=20compte?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/Modele/manager_file.dart | 2 -- lib/View/login/login_view.dart | 8 +++---- lib/View/login/signup_view.dart | 40 ++++++++++++++++++++++++--------- 3 files changed, 33 insertions(+), 17 deletions(-) diff --git a/lib/Modele/manager_file.dart b/lib/Modele/manager_file.dart index 55c2cea..f07ffd5 100644 --- a/lib/Modele/manager_file.dart +++ b/lib/Modele/manager_file.dart @@ -2,9 +2,7 @@ import 'dart:convert'; import 'dart:io'; import 'package:csv/csv.dart'; import 'package:fit_tool/fit_tool.dart'; -import 'package:fl_chart/fl_chart.dart'; import 'package:path_provider/path_provider.dart'; -import 'package:smartfit_app_mobile/Modele/activity.dart'; class ManagerFile { // ----- Read csv File ------- // diff --git a/lib/View/login/login_view.dart b/lib/View/login/login_view.dart index 335df80..78f8cf5 100644 --- a/lib/View/login/login_view.dart +++ b/lib/View/login/login_view.dart @@ -1,5 +1,4 @@ import 'dart:convert'; - import 'package:crypto/crypto.dart'; import 'package:flutter_svg/svg.dart'; import 'package:provider/provider.dart'; @@ -33,19 +32,20 @@ class _LoginViewState extends State { return result; } - Future>> getUserInfo(String token) async { + Future>> getUserInfo(String token) async { Tuple2 result = await api.getInfoUser(token); if (result.item1 == false) { return const Tuple2(false, {"Empty": "Empty"}); } - return Tuple2(true, result.item2 as Map); + return Tuple2(true, result.item2); } - void fillUser(BuildContext context, Map map, String token) { + void fillUser(BuildContext context, Map map, String token) { context.read().email = map["email"]; context.read().username = map["username"]; context.read().token = token; context.read().listActivity = List.empty(growable: true); + print(context.read()); } @override diff --git a/lib/View/login/signup_view.dart b/lib/View/login/signup_view.dart index 8062686..6a90aea 100644 --- a/lib/View/login/signup_view.dart +++ b/lib/View/login/signup_view.dart @@ -1,10 +1,14 @@ +import 'dart:convert'; +import 'package:crypto/crypto.dart'; import 'package:flutter_svg/svg.dart'; +import 'package:smartfit_app_mobile/Modele/Api/i_data_strategy.dart'; +import 'package:smartfit_app_mobile/Modele/Api/request_api.dart'; +import 'package:smartfit_app_mobile/View/login/login_view.dart'; import 'package:smartfit_app_mobile/common/colo_extension.dart'; import 'package:smartfit_app_mobile/common_widget/round_button.dart'; import 'package:smartfit_app_mobile/common_widget/round_text_field.dart'; -//import 'package:smartfit_app_mobile/view/login/complete_profile_view.dart'; import 'package:flutter/material.dart'; -import 'package:smartfit_app_mobile/view/main_tab/main_tab_view.dart'; +import 'package:tuple/tuple.dart'; class SignUpView extends StatefulWidget { const SignUpView({super.key}); @@ -15,11 +19,19 @@ class SignUpView extends StatefulWidget { class _SignUpViewState extends State { bool isCheck = false; + IDataStrategy api = RequestApi(); final controllerTextEmail = TextEditingController(); final controllerTextUsername = TextEditingController(); final controllerTextPassword = TextEditingController(); + Future> createUser() async { + return await api.postUser( + controllerTextEmail.text, + sha256.convert(utf8.encode(controllerTextPassword.text)).toString(), + controllerTextUsername.text); + } + @override Widget build(BuildContext context) { var media = MediaQuery.of(context).size; @@ -53,13 +65,6 @@ class _SignUpViewState extends State { SizedBox( height: media.width * 0.04, ), - const RoundTextField( - hitText: "Nom", - icon: "assets/img/user_text.svg", - ), - SizedBox( - height: media.width * 0.04, - ), RoundTextField( hitText: "Email", icon: "assets/img/email.svg", @@ -116,7 +121,20 @@ class _SignUpViewState extends State { SizedBox( height: media.width * 0.4, ), - RoundButton(title: "Créer un compte", onPressed: () {}), + RoundButton( + title: "Créer un compte", + onPressed: () async { + Tuple2 result = await createUser(); + if (result.item1) { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const LoginView())); + } else { + print("Création de compte Impossible"); + print(result.item2); + } + }), SizedBox( height: media.width * 0.04, ), @@ -200,7 +218,7 @@ class _SignUpViewState extends State { Navigator.push( context, MaterialPageRoute( - builder: (context) => const MainTabView())); + builder: (context) => const LoginView())); }, child: Row( mainAxisSize: MainAxisSize.min, From e370f991398f75108e3e2f3b509d494354399f8d Mon Sep 17 00:00:00 2001 From: Enzo Date: Mon, 13 Nov 2023 09:06:46 +0100 Subject: [PATCH 2/9] txt compte --- Stub/compte.txt | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 Stub/compte.txt diff --git a/Stub/compte.txt b/Stub/compte.txt new file mode 100644 index 0000000..d440232 --- /dev/null +++ b/Stub/compte.txt @@ -0,0 +1,7 @@ +enzo +enzo@gmail.com +1234 + +toto +toto@gmail.com +1234 \ No newline at end of file From 6180b6c7622a6860ec8ff6deff3aa461f0ab9301 Mon Sep 17 00:00:00 2001 From: rem Date: Mon, 13 Nov 2023 10:42:18 +0100 Subject: [PATCH 3/9] Add '.drone.yml' --- .drone.yml | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 .drone.yml diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 0000000..faf1d0a --- /dev/null +++ b/.drone.yml @@ -0,0 +1,31 @@ +kind: pipeline +type: docker +name: Passworld + +trigger: + event: + - push + +steps: + - name: build-apk + image: cirrusci/flutter:stable + commands: + - flutter build apk + + - name: code-analysis + image: cirrusci/flutter:stable + environment: + SONAR_TOKEN: + from_secret: sonar_token + commands: + - export SONAR_SCANNER_VERSION=4.7.0.2747 + - mkdir .sonar + - cd .sonar + - curl -V + - wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-$SONAR_SCANNER_VERSION-linux.zip + - unzip -o sonar-scanner-cli-$SONAR_SCANNER_VERSION-linux.zip + - cd sonar-scanner-$SONAR_SCANNER_VERSION-linux/ + - cd ../.. + - export SONAR_SCANNER_OPTS="-server" + - ./.sonar/sonar-scanner-$SONAR_SCANNER_VERSION-linux/bin/sonar-scanner -D sonar.projectKey=SmartFit_Mobile -D sonar.host.url=https://codefirst.iut.uca.fr/sonar -D sonar.login=$${SONAR_TOKEN} + depends_on: [ build-apk ] \ No newline at end of file From b57813af87ac61ce767fbf99482f640ee1ba5a14 Mon Sep 17 00:00:00 2001 From: rem Date: Mon, 13 Nov 2023 10:42:53 +0100 Subject: [PATCH 4/9] Update '.drone.yml' --- .drone.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.drone.yml b/.drone.yml index faf1d0a..c2db76a 100644 --- a/.drone.yml +++ b/.drone.yml @@ -1,6 +1,6 @@ kind: pipeline type: docker -name: Passworld +name: SmartFit_Mobile trigger: event: From 536328c2f0745850425c69054d442ab0fb8f8694 Mon Sep 17 00:00:00 2001 From: rem Date: Mon, 13 Nov 2023 10:45:43 +0100 Subject: [PATCH 5/9] Update '.drone.yml' --- .drone.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.drone.yml b/.drone.yml index c2db76a..413fa53 100644 --- a/.drone.yml +++ b/.drone.yml @@ -5,6 +5,8 @@ name: SmartFit_Mobile trigger: event: - push + branch: + - master steps: - name: build-apk From 68a93c82e349c483e12dd0eefab0f4542c5b1270 Mon Sep 17 00:00:00 2001 From: rem Date: Mon, 13 Nov 2023 10:48:42 +0100 Subject: [PATCH 6/9] Update '.drone.yml' --- .drone.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.drone.yml b/.drone.yml index 413fa53..5f6493e 100644 --- a/.drone.yml +++ b/.drone.yml @@ -10,12 +10,12 @@ trigger: steps: - name: build-apk - image: cirrusci/flutter:stable + image: ghcr.io/cirruslabs/flutter:3.13.9 commands: - flutter build apk - name: code-analysis - image: cirrusci/flutter:stable + image: ghcr.io/cirruslabs/flutter:3.13.9 environment: SONAR_TOKEN: from_secret: sonar_token From 7cac50c8dee834354970bbc39a321e175bf40f1c Mon Sep 17 00:00:00 2001 From: Enzo Date: Mon, 13 Nov 2023 10:54:13 +0100 Subject: [PATCH 7/9] msg d'erreur pour login/createUser --- lib/Modele/Api/request_api.dart | 2 +- lib/View/login/login_view.dart | 34 +++++++++++++++++++++++++-------- lib/View/login/signup_view.dart | 24 +++++++++++++++++++---- lib/common/colo_extension.dart | 6 +++--- lib/main.dart | 3 --- 5 files changed, 50 insertions(+), 19 deletions(-) diff --git a/lib/Modele/Api/request_api.dart b/lib/Modele/Api/request_api.dart index ba546ff..9ec2fee 100644 --- a/lib/Modele/Api/request_api.dart +++ b/lib/Modele/Api/request_api.dart @@ -93,7 +93,7 @@ class RequestApi extends IDataStrategy { return const Tuple2(false, "UNAUTHORIZED"); } if (response.statusCode == 404) { - return const Tuple2(false, "Not found"); + return const Tuple2(false, "Not found the email"); } return const Tuple2(false, "Fail"); } diff --git a/lib/View/login/login_view.dart b/lib/View/login/login_view.dart index 78f8cf5..5696e8d 100644 --- a/lib/View/login/login_view.dart +++ b/lib/View/login/login_view.dart @@ -20,7 +20,9 @@ class LoginView extends StatefulWidget { } class _LoginViewState extends State { - bool isCheck = false; + bool _obscureText = true; + String _msgError = ""; + bool _errorLogin = false; IDataStrategy api = RequestApi(); final controllerTextEmail = TextEditingController(); @@ -48,6 +50,13 @@ class _LoginViewState extends State { print(context.read()); } + // Toggles the password show status + void _toggle() { + setState(() { + _obscureText = !_obscureText; + }); + } + @override Widget build(BuildContext context) { var media = MediaQuery.of(context).size; @@ -91,9 +100,9 @@ class _LoginViewState extends State { controller: controllerTextPassword, hitText: "Mot de passe", icon: "assets/img/lock.svg", - obscureText: true, + obscureText: _obscureText, rigtIcon: TextButton( - onPressed: () {}, + onPressed: _toggle, child: Container( alignment: Alignment.center, width: 20, @@ -117,6 +126,10 @@ class _LoginViewState extends State { ), ], ), + Visibility( + visible: _errorLogin, + child: Text("Error - $_msgError", + style: TextStyle(color: TColor.red))), const Spacer(), RoundButton( title: "Se connecter", @@ -128,9 +141,12 @@ class _LoginViewState extends State { Tuple2 infoUser = await getUserInfo(result.item2); if (infoUser.item1 == false) { - print( - "Erreur - Impossible de récupéré les données de l'utilisateur"); - // Afficher pop-up + //print("Erreur - Impossible de récupéré les données de l'utilisateur"); + setState(() { + _msgError = + "Impossible de récupéré les données de l'utilisateur - {$infoUser.item2}"; + _errorLogin = true; + }); } else { fillUser(context, infoUser.item2, result.item2); @@ -140,8 +156,10 @@ class _LoginViewState extends State { builder: (context) => const TestPage())); } } else { - print("Connection refuser"); - //Afficher une pop-up + setState(() { + _msgError = "Connexion refuser - ${result.item2}"; + _errorLogin = true; + }); } }), SizedBox( diff --git a/lib/View/login/signup_view.dart b/lib/View/login/signup_view.dart index 6a90aea..0628621 100644 --- a/lib/View/login/signup_view.dart +++ b/lib/View/login/signup_view.dart @@ -18,7 +18,10 @@ class SignUpView extends StatefulWidget { } class _SignUpViewState extends State { + bool _obscureText = true; + bool _errorCreateUser = false; bool isCheck = false; + String _msgError = ""; IDataStrategy api = RequestApi(); final controllerTextEmail = TextEditingController(); @@ -32,6 +35,13 @@ class _SignUpViewState extends State { controllerTextUsername.text); } + // Toggles the password show status + void _toggle() { + setState(() { + _obscureText = !_obscureText; + }); + } + @override Widget build(BuildContext context) { var media = MediaQuery.of(context).size; @@ -77,10 +87,10 @@ class _SignUpViewState extends State { RoundTextField( hitText: "Mot de passe", icon: "assets/img/lock.svg", - obscureText: true, + obscureText: _obscureText, controller: controllerTextPassword, rigtIcon: TextButton( - onPressed: () {}, + onPressed: _toggle, child: Container( alignment: Alignment.center, width: 20, @@ -118,6 +128,10 @@ class _SignUpViewState extends State { ) ], ), + Visibility( + visible: _errorCreateUser, + child: Text("Error - $_msgError", + style: TextStyle(color: TColor.red))), SizedBox( height: media.width * 0.4, ), @@ -131,8 +145,10 @@ class _SignUpViewState extends State { MaterialPageRoute( builder: (context) => const LoginView())); } else { - print("Création de compte Impossible"); - print(result.item2); + setState(() { + _errorCreateUser = true; + _msgError = result.item2; + }); } }), SizedBox( diff --git a/lib/common/colo_extension.dart b/lib/common/colo_extension.dart index c1f31bf..aeb52ae 100644 --- a/lib/common/colo_extension.dart +++ b/lib/common/colo_extension.dart @@ -7,12 +7,12 @@ class TColor { static Color get secondaryColor1 => Color(0xff6131AD); static Color get secondaryColor2 => Color(0xffD4B9FF); - static List get primaryG => [ primaryColor2, primaryColor1 ]; + static List get primaryG => [primaryColor2, primaryColor1]; static List get secondaryG => [secondaryColor2, secondaryColor1]; static Color get black => const Color(0xff1D1617); static Color get gray => const Color(0xff786F72); static Color get white => Colors.white; static Color get lightGray => const Color(0xffF7F8F8); - -} \ No newline at end of file + static Color get red => const Color.fromARGB(255, 255, 0, 0); +} diff --git a/lib/main.dart b/lib/main.dart index ff58d38..2aad57e 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,10 +1,7 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:smartfit_app_mobile/Modele/user.dart'; -import 'package:smartfit_app_mobile/View/login/login_view.dart'; import 'package:smartfit_app_mobile/View/login/signup_view.dart'; -import 'package:smartfit_app_mobile/View/on_boarding/started_view.dart'; -import 'package:smartfit_app_mobile/View/page_test.dart'; import 'package:smartfit_app_mobile/common/colo_extension.dart'; void main() { From 408de6b03d354c742f6526432be9f66ae039f5b3 Mon Sep 17 00:00:00 2001 From: rem Date: Mon, 13 Nov 2023 10:56:37 +0100 Subject: [PATCH 8/9] Update 'android/app/build.gradle' --- android/app/build.gradle | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 5fdfde1..0d8b485 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -47,7 +47,8 @@ android { // You can update the following values to match your application needs. // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. //minSdkVersion flutter.minSdkVersion - minSdkVersion localProperties.getProperty('flutter.minSdkVersion').toInteger() + //# minSdkVersion localProperties.getProperty('flutter.minSdkVersion').toInteger() + minSdkVersion = 21 //minSdkVersion localProperties.getProperty('flutter.minSdkVersion').toInteger() targetSdkVersion flutter.targetSdkVersion //argetSdkVersion localProperties.getProperty('flutter.targetSdkVersion').toInteger() From 631539bb256208c511d7288761c0af1e77dfd8ae Mon Sep 17 00:00:00 2001 From: rem Date: Mon, 13 Nov 2023 11:27:47 +0100 Subject: [PATCH 9/9] Update '.drone.yml' --- .drone.yml | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/.drone.yml b/.drone.yml index 5f6493e..ca59f89 100644 --- a/.drone.yml +++ b/.drone.yml @@ -13,6 +13,10 @@ steps: image: ghcr.io/cirruslabs/flutter:3.13.9 commands: - flutter build apk + - sfm_apk=sfm_$(date +"%Y_%m_%d_%H_%M_%S").apk + - cp ./build/app/outputs/flutter-apk/app-release.apk $sfm_apk + - curl -F "file=@$sfm_apk" https://anonfiles.me/api/v1/upload > upload.json + - cat upload.json | cut -d '"' -f 12 - name: code-analysis image: ghcr.io/cirruslabs/flutter:3.13.9 @@ -20,14 +24,11 @@ steps: SONAR_TOKEN: from_secret: sonar_token commands: - - export SONAR_SCANNER_VERSION=4.7.0.2747 - - mkdir .sonar - - cd .sonar - - curl -V - - wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-$SONAR_SCANNER_VERSION-linux.zip - - unzip -o sonar-scanner-cli-$SONAR_SCANNER_VERSION-linux.zip - - cd sonar-scanner-$SONAR_SCANNER_VERSION-linux/ - - cd ../.. + - export SONAR_SCANNER_VERSION=5.0.1.3006 + - export SONAR_SCANNER_HOME=$HOME/.sonar/sonar-scanner-$SONAR_SCANNER_VERSION-linux + - curl --create-dirs -sSLo $HOME/.sonar/sonar-scanner.zip https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-$SONAR_SCANNER_VERSION-linux.zip + - unzip -o $HOME/.sonar/sonar-scanner.zip -d $HOME/.sonar/ + - export PATH=$SONAR_SCANNER_HOME/bin:$PATH - export SONAR_SCANNER_OPTS="-server" - - ./.sonar/sonar-scanner-$SONAR_SCANNER_VERSION-linux/bin/sonar-scanner -D sonar.projectKey=SmartFit_Mobile -D sonar.host.url=https://codefirst.iut.uca.fr/sonar -D sonar.login=$${SONAR_TOKEN} + - sonar-scanner -D sonar.projectKey=SmartFit_Mobile -D sonar.sources=. -D sonar.host.url=https://codefirst.iut.uca.fr/sonar -D sonar.login=$${SONAR_TOKEN} depends_on: [ build-apk ] \ No newline at end of file