From a6ad5a4964ac833dd819a865f13d0f17240d9236 Mon Sep 17 00:00:00 2001 From: Enzo Date: Mon, 13 Nov 2023 14:54:38 +0100 Subject: [PATCH 01/11] correction visuel --- lib/View/login/login_view.dart | 3 +++ lib/View/login/signup_view.dart | 3 +++ 2 files changed, 6 insertions(+) diff --git a/lib/View/login/login_view.dart b/lib/View/login/login_view.dart index 5696e8d..39240cf 100644 --- a/lib/View/login/login_view.dart +++ b/lib/View/login/login_view.dart @@ -126,6 +126,9 @@ class _LoginViewState extends State { ), ], ), + SizedBox( + height: media.width * 0.04, + ), Visibility( visible: _errorLogin, child: Text("Error - $_msgError", diff --git a/lib/View/login/signup_view.dart b/lib/View/login/signup_view.dart index 0628621..7d0aab5 100644 --- a/lib/View/login/signup_view.dart +++ b/lib/View/login/signup_view.dart @@ -128,6 +128,9 @@ class _SignUpViewState extends State { ) ], ), + SizedBox( + height: media.width * 0.05, + ), Visibility( visible: _errorCreateUser, child: Text("Error - $_msgError", From 3faa4520aafcb3eb5a5e3d2fa558588bd9906d91 Mon Sep 17 00:00:00 2001 From: Enzo Date: Mon, 13 Nov 2023 15:55:28 +0100 Subject: [PATCH 02/11] info file --- lib/Modele/Api/request_api.dart | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/Modele/Api/request_api.dart b/lib/Modele/Api/request_api.dart index 9ec2fee..294d2b3 100644 --- a/lib/Modele/Api/request_api.dart +++ b/lib/Modele/Api/request_api.dart @@ -176,13 +176,21 @@ class RequestApi extends IDataStrategy { @override Future> uploadFile(String token, File file) async { + String filename = file.path.split('/').last; + String typeActivity = filename.split("_").first; + String dateActivity = filename.split("_")[1].split("T").first; + final uri = Uri.parse('$urlApi/user/files'); - Map headers = {'Authorization': token}; + Map headers = { + 'Authorization': token, + 'SmartFit_Type': typeActivity, + 'SmartFit_Date': dateActivity + }; var request = http.MultipartRequest('POST', uri); final httpImage = http.MultipartFile.fromBytes( 'file', await file.readAsBytes(), - filename: file.path.split('/').last); + filename: filename); request.files.add(httpImage); request.headers.addAll(headers); From 58546c65dc11254ed4e707322aa50e901dd71378 Mon Sep 17 00:00:00 2001 From: Enzo Date: Tue, 14 Nov 2023 09:09:37 +0100 Subject: [PATCH 03/11] test platforme --- lib/View/login/login_view.dart | 3 ++- lib/View/page_test.dart | 22 +++++++++++++++++++++- lib/main.dart | 1 + 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/lib/View/login/login_view.dart b/lib/View/login/login_view.dart index 39240cf..08404ef 100644 --- a/lib/View/login/login_view.dart +++ b/lib/View/login/login_view.dart @@ -5,6 +5,7 @@ import 'package:provider/provider.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/Modele/user.dart'; +import 'package:smartfit_app_mobile/View/main_tab/main_tab_view.dart'; import 'package:smartfit_app_mobile/View/page_test.dart'; import 'package:smartfit_app_mobile/common/colo_extension.dart'; import 'package:smartfit_app_mobile/common_widget/round_button.dart'; @@ -156,7 +157,7 @@ class _LoginViewState extends State { Navigator.push( context, MaterialPageRoute( - builder: (context) => const TestPage())); + builder: (context) => const MainTabView())); } } else { setState(() { diff --git a/lib/View/page_test.dart b/lib/View/page_test.dart index ac26eab..eee76d4 100644 --- a/lib/View/page_test.dart +++ b/lib/View/page_test.dart @@ -1,7 +1,9 @@ import 'dart:convert'; import 'package:crypto/crypto.dart'; +import 'package:flutter/foundation.dart' show kIsWeb; import 'package:flutter/material.dart'; +import 'package:http/http.dart'; import 'package:path_provider/path_provider.dart'; import 'package:file_picker/file_picker.dart'; import 'dart:io'; @@ -48,6 +50,22 @@ Future readCounter() async { } } +String getPlatforme() { + if (kIsWeb) { + return "Web"; + } + if (Platform.isAndroid) { + return "Android"; + } + if (Platform.isWindows) { + return "Windows"; + } + if (Platform.isMacOS) { + return "MacOS"; + } + return "Null"; +} + // File picker // ------------------------------------------------- // @@ -63,6 +81,7 @@ class _TestPage extends State { // Lire un fichier avec picker FilePickerResult? result; IDataStrategy strategy = RequestApi(); + String platforme = getPlatforme(); //late File x = File(file.path); Future readFile() async { @@ -213,7 +232,8 @@ class _TestPage extends State { ElevatedButton( onPressed: getOneFile, child: const Text("Get One File")), ElevatedButton( - onPressed: getInfoUser, child: const Text("Get info User")) + onPressed: getInfoUser, child: const Text("Get info User")), + Text(platforme) ], ), ); diff --git a/lib/main.dart b/lib/main.dart index 2aad57e..8a98b33 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -2,6 +2,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/signup_view.dart'; +import 'package:smartfit_app_mobile/View/page_test.dart'; import 'package:smartfit_app_mobile/common/colo_extension.dart'; void main() { From 2271e1242236bbb2712ae80c312149ee86fe89e2 Mon Sep 17 00:00:00 2001 From: Enzo Date: Tue, 14 Nov 2023 11:31:11 +0100 Subject: [PATCH 04/11] View change by platform + category/date for file --- lib/Modele/Api/request_api.dart | 16 +- lib/View/login/Mobile/android_login_view.dart | 252 +++++++++++++++++ lib/View/login/login_view.dart | 266 +++--------------- lib/View/login/web/web_login_view.dart | 252 +++++++++++++++++ lib/View/main_tab/select_view.dart | 18 +- lib/View/page_test.dart | 14 +- lib/View/widget_android_test.dart | 10 + lib/View/widget_web_test.dart | 10 + lib/main.dart | 1 - 9 files changed, 583 insertions(+), 256 deletions(-) create mode 100644 lib/View/login/Mobile/android_login_view.dart create mode 100644 lib/View/login/web/web_login_view.dart create mode 100644 lib/View/widget_android_test.dart create mode 100644 lib/View/widget_web_test.dart diff --git a/lib/Modele/Api/request_api.dart b/lib/Modele/Api/request_api.dart index 294d2b3..6e12901 100644 --- a/lib/Modele/Api/request_api.dart +++ b/lib/Modele/Api/request_api.dart @@ -177,22 +177,22 @@ class RequestApi extends IDataStrategy { @override Future> uploadFile(String token, File file) async { String filename = file.path.split('/').last; - String typeActivity = filename.split("_").first; + String categoryActivity = filename.split("_").first.toLowerCase(); String dateActivity = filename.split("_")[1].split("T").first; final uri = Uri.parse('$urlApi/user/files'); - Map headers = { - 'Authorization': token, - 'SmartFit_Type': typeActivity, - 'SmartFit_Date': dateActivity - }; + Map headers = {'Authorization': token}; var request = http.MultipartRequest('POST', uri); final httpImage = http.MultipartFile.fromBytes( - 'file', await file.readAsBytes(), - filename: filename); + 'file', + await file.readAsBytes(), + filename: filename, + ); request.files.add(httpImage); request.headers.addAll(headers); + request.fields["SmartFit_Category"] = categoryActivity; + request.fields["SmartFit_Date"] = dateActivity; final response = await request.send(); diff --git a/lib/View/login/Mobile/android_login_view.dart b/lib/View/login/Mobile/android_login_view.dart new file mode 100644 index 0000000..c624567 --- /dev/null +++ b/lib/View/login/Mobile/android_login_view.dart @@ -0,0 +1,252 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; +import 'package:smartfit_app_mobile/View/main_tab/main_tab_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:tuple/tuple.dart'; + +class AndroidLoginView extends StatelessWidget { + AndroidLoginView( + this._obscureText, + this._errorLogin, + this._msgError, + this._toggle, + this._printMsgError, + this.getUserInfo, + this.checkLoginAndPassword, + this.fillUser, + {super.key}); + + bool _obscureText; + bool _errorLogin; + final String _msgError; + + final controllerTextEmail = TextEditingController(); + final controllerTextPassword = TextEditingController(); + + // ---- Fonction --- // + final void Function() _toggle; + final Future> Function(String email, String password) + checkLoginAndPassword; + final Future Function(String token) getUserInfo; + final void Function(String msgError) _printMsgError; + final void Function( + BuildContext context, Map map, String token) fillUser; + + @override + Widget build(BuildContext context) { + var media = MediaQuery.of(context).size; + return Scaffold( + backgroundColor: TColor.white, + body: SingleChildScrollView( + child: SafeArea( + child: Container( + height: media.height * 0.9, + padding: const EdgeInsets.symmetric(horizontal: 20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + "Bienvenue, Android", + style: TextStyle(color: TColor.gray, fontSize: 16), + ), + Text( + "Se connecter", + style: TextStyle( + color: TColor.black, + fontSize: 20, + fontWeight: FontWeight.w700), + ), + SizedBox( + height: media.width * 0.05, + ), + SizedBox( + height: media.width * 0.04, + ), + RoundTextField( + hitText: "Email", + icon: "assets/img/email.svg", + keyboardType: TextInputType.emailAddress, + controller: controllerTextEmail, + ), + SizedBox( + height: media.width * 0.04, + ), + RoundTextField( + controller: controllerTextPassword, + hitText: "Mot de passe", + icon: "assets/img/lock.svg", + obscureText: _obscureText, + rigtIcon: TextButton( + onPressed: _toggle, + child: Container( + alignment: Alignment.center, + width: 20, + height: 20, + child: SvgPicture.asset( + "assets/img/show_password.svg", + width: 20, + height: 20, + fit: BoxFit.contain, + ))), + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + "Mot de passe oublié ?", + style: TextStyle( + color: TColor.gray, + fontSize: 15, + decoration: TextDecoration.underline), + ), + ], + ), + SizedBox( + height: media.width * 0.04, + ), + Visibility( + visible: _errorLogin, + child: Text("Error - $_msgError", + style: TextStyle(color: TColor.red))), + const Spacer(), + RoundButton( + title: "Se connecter", + onPressed: () async { + Tuple2 result = await checkLoginAndPassword( + controllerTextEmail.text, + controllerTextPassword.text); + + if (result.item1 == true) { + Tuple2 infoUser = await getUserInfo(result.item2); + + if (infoUser.item1 == false) { + //print("Erreur - Impossible de récupéré les données de l'utilisateur"); + _printMsgError( + "Impossible de récupéré les données de l'utilisateur - {$infoUser.item2}"); + } else { + fillUser(context, infoUser.item2, result.item2); + + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const MainTabView())); + } + } else { + _printMsgError("Connexion refuser - ${result.item2}"); + } + }), + SizedBox( + height: media.width * 0.04, + ), + Row( + // crossAxisAlignment: CrossAxisAlignment., + children: [ + Expanded( + child: Container( + height: 1, + color: TColor.gray.withOpacity(0.5), + )), + Text( + " Or ", + style: TextStyle(color: TColor.black, fontSize: 12), + ), + Expanded( + child: Container( + height: 1, + color: TColor.gray.withOpacity(0.5), + )), + ], + ), + SizedBox( + height: media.width * 0.04, + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + GestureDetector( + onTap: () {}, + child: Container( + width: 50, + height: 50, + alignment: Alignment.center, + decoration: BoxDecoration( + color: TColor.white, + border: Border.all( + width: 1, + color: TColor.gray.withOpacity(0.4), + ), + borderRadius: BorderRadius.circular(15), + ), + child: Image.asset( + "assets/img/google.png", + width: 20, + height: 20, + ), + ), + ), + SizedBox( + width: media.width * 0.04, + ), + GestureDetector( + onTap: () {}, + child: Container( + width: 50, + height: 50, + alignment: Alignment.center, + decoration: BoxDecoration( + color: TColor.white, + border: Border.all( + width: 1, + color: TColor.gray.withOpacity(0.4), + ), + borderRadius: BorderRadius.circular(15), + ), + child: Image.asset( + "assets/img/suunto.png", + width: 35, + height: 35, + ), + ), + ) + ], + ), + SizedBox( + height: media.width * 0.04, + ), + TextButton( + onPressed: () { + Navigator.pop(context); + }, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + "Vous n'avez pas toujours pas de compte ? ", + style: TextStyle( + color: TColor.black, + fontSize: 14, + ), + ), + Text( + "Créer un compte", + style: TextStyle( + color: TColor.black, + fontSize: 14, + fontWeight: FontWeight.w700), + ) + ], + ), + ), + SizedBox( + height: media.width * 0.04, + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/View/login/login_view.dart b/lib/View/login/login_view.dart index 08404ef..1563917 100644 --- a/lib/View/login/login_view.dart +++ b/lib/View/login/login_view.dart @@ -1,18 +1,33 @@ import 'dart:convert'; +import 'dart:io'; import 'package:crypto/crypto.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter_svg/svg.dart'; import 'package:provider/provider.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/Modele/user.dart'; -import 'package:smartfit_app_mobile/View/main_tab/main_tab_view.dart'; -import 'package:smartfit_app_mobile/View/page_test.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/Mobile/android_login_view.dart'; +import 'package:smartfit_app_mobile/View/login/web/web_login_view.dart'; import 'package:flutter/material.dart'; import 'package:tuple/tuple.dart'; +String getPlatforme() { + if (kIsWeb) { + return "Web"; + } + if (Platform.isAndroid) { + return "Android"; + } + if (Platform.isWindows) { + return "Windows"; + } + if (Platform.isMacOS) { + return "MacOS"; + } + return "Null"; +} + class LoginView extends StatefulWidget { const LoginView({super.key}); @@ -25,13 +40,12 @@ class _LoginViewState extends State { String _msgError = ""; bool _errorLogin = false; IDataStrategy api = RequestApi(); + String platforme = getPlatforme(); - final controllerTextEmail = TextEditingController(); - final controllerTextPassword = TextEditingController(); - - Future> checkLoginAndPassword() async { - Tuple2 result = await api.connexion(controllerTextEmail.text, - sha256.convert(utf8.encode(controllerTextPassword.text)).toString()); + Future> checkLoginAndPassword( + String email, String password) async { + Tuple2 result = await api.connexion( + email, sha256.convert(utf8.encode(password)).toString()); return result; } @@ -48,7 +62,6 @@ class _LoginViewState extends State { context.read().username = map["username"]; context.read().token = token; context.read().listActivity = List.empty(growable: true); - print(context.read()); } // Toggles the password show status @@ -58,224 +71,19 @@ class _LoginViewState extends State { }); } + void _printMsgError(String msgError) { + _msgError = msgError; + _errorLogin = true; + } + @override Widget build(BuildContext context) { - var media = MediaQuery.of(context).size; - return Scaffold( - backgroundColor: TColor.white, - body: SingleChildScrollView( - child: SafeArea( - child: Container( - height: media.height * 0.9, - padding: const EdgeInsets.symmetric(horizontal: 20), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - "Bienvenue,", - style: TextStyle(color: TColor.gray, fontSize: 16), - ), - Text( - "Se connecter", - style: TextStyle( - color: TColor.black, - fontSize: 20, - fontWeight: FontWeight.w700), - ), - SizedBox( - height: media.width * 0.05, - ), - SizedBox( - height: media.width * 0.04, - ), - RoundTextField( - hitText: "Email", - icon: "assets/img/email.svg", - keyboardType: TextInputType.emailAddress, - controller: controllerTextEmail, - ), - SizedBox( - height: media.width * 0.04, - ), - RoundTextField( - controller: controllerTextPassword, - hitText: "Mot de passe", - icon: "assets/img/lock.svg", - obscureText: _obscureText, - rigtIcon: TextButton( - onPressed: _toggle, - child: Container( - alignment: Alignment.center, - width: 20, - height: 20, - child: SvgPicture.asset( - "assets/img/show_password.svg", - width: 20, - height: 20, - fit: BoxFit.contain, - ))), - ), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - "Mot de passe oublié ?", - style: TextStyle( - color: TColor.gray, - fontSize: 15, - decoration: TextDecoration.underline), - ), - ], - ), - SizedBox( - height: media.width * 0.04, - ), - Visibility( - visible: _errorLogin, - child: Text("Error - $_msgError", - style: TextStyle(color: TColor.red))), - const Spacer(), - RoundButton( - title: "Se connecter", - onPressed: () async { - Tuple2 result = - await checkLoginAndPassword(); - - if (result.item1 == true) { - Tuple2 infoUser = await getUserInfo(result.item2); - - if (infoUser.item1 == false) { - //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); - - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => const MainTabView())); - } - } else { - setState(() { - _msgError = "Connexion refuser - ${result.item2}"; - _errorLogin = true; - }); - } - }), - SizedBox( - height: media.width * 0.04, - ), - Row( - // crossAxisAlignment: CrossAxisAlignment., - children: [ - Expanded( - child: Container( - height: 1, - color: TColor.gray.withOpacity(0.5), - )), - Text( - " Or ", - style: TextStyle(color: TColor.black, fontSize: 12), - ), - Expanded( - child: Container( - height: 1, - color: TColor.gray.withOpacity(0.5), - )), - ], - ), - SizedBox( - height: media.width * 0.04, - ), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - GestureDetector( - onTap: () {}, - child: Container( - width: 50, - height: 50, - alignment: Alignment.center, - decoration: BoxDecoration( - color: TColor.white, - border: Border.all( - width: 1, - color: TColor.gray.withOpacity(0.4), - ), - borderRadius: BorderRadius.circular(15), - ), - child: Image.asset( - "assets/img/google.png", - width: 20, - height: 20, - ), - ), - ), - SizedBox( - width: media.width * 0.04, - ), - GestureDetector( - onTap: () {}, - child: Container( - width: 50, - height: 50, - alignment: Alignment.center, - decoration: BoxDecoration( - color: TColor.white, - border: Border.all( - width: 1, - color: TColor.gray.withOpacity(0.4), - ), - borderRadius: BorderRadius.circular(15), - ), - child: Image.asset( - "assets/img/suunto.png", - width: 35, - height: 35, - ), - ), - ) - ], - ), - SizedBox( - height: media.width * 0.04, - ), - TextButton( - onPressed: () { - Navigator.pop(context); - }, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Text( - "Vous n'avez pas toujours pas de compte ? ", - style: TextStyle( - color: TColor.black, - fontSize: 14, - ), - ), - Text( - "Créer un compte", - style: TextStyle( - color: TColor.black, - fontSize: 14, - fontWeight: FontWeight.w700), - ) - ], - ), - ), - SizedBox( - height: media.width * 0.04, - ), - ], - ), - ), - ), - ), - ); + if (platforme == "Android") { + return AndroidLoginView(_obscureText, _errorLogin, _msgError, _toggle, + _printMsgError, getUserInfo, checkLoginAndPassword, fillUser); + } else { + return WebLoginView(_obscureText, _errorLogin, _msgError, _toggle, + _printMsgError, getUserInfo, checkLoginAndPassword, fillUser); + } } } diff --git a/lib/View/login/web/web_login_view.dart b/lib/View/login/web/web_login_view.dart new file mode 100644 index 0000000..d5eedf6 --- /dev/null +++ b/lib/View/login/web/web_login_view.dart @@ -0,0 +1,252 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; +import 'package:smartfit_app_mobile/View/main_tab/main_tab_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:tuple/tuple.dart'; + +class WebLoginView extends StatelessWidget { + WebLoginView( + this._obscureText, + this._errorLogin, + this._msgError, + this._toggle, + this._printMsgError, + this.getUserInfo, + this.checkLoginAndPassword, + this.fillUser, + {super.key}); + + bool _obscureText; + bool _errorLogin; + final String _msgError; + + final controllerTextEmail = TextEditingController(); + final controllerTextPassword = TextEditingController(); + + // ---- Fonction --- // + final void Function() _toggle; + final Future> Function(String email, String password) + checkLoginAndPassword; + final Future Function(String token) getUserInfo; + final void Function(String msgError) _printMsgError; + final void Function( + BuildContext context, Map map, String token) fillUser; + + @override + Widget build(BuildContext context) { + var media = MediaQuery.of(context).size; + return Scaffold( + backgroundColor: TColor.white, + body: SingleChildScrollView( + child: SafeArea( + child: Container( + height: media.height * 0.9, + padding: const EdgeInsets.symmetric(horizontal: 20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + "Bienvenue, Web", + style: TextStyle(color: TColor.gray, fontSize: 16), + ), + Text( + "Se connecter", + style: TextStyle( + color: TColor.black, + fontSize: 20, + fontWeight: FontWeight.w700), + ), + SizedBox( + height: media.width * 0.05, + ), + SizedBox( + height: media.width * 0.04, + ), + RoundTextField( + hitText: "Email", + icon: "assets/img/email.svg", + keyboardType: TextInputType.emailAddress, + controller: controllerTextEmail, + ), + SizedBox( + height: media.width * 0.04, + ), + RoundTextField( + controller: controllerTextPassword, + hitText: "Mot de passe", + icon: "assets/img/lock.svg", + obscureText: _obscureText, + rigtIcon: TextButton( + onPressed: _toggle, + child: Container( + alignment: Alignment.center, + width: 20, + height: 20, + child: SvgPicture.asset( + "assets/img/show_password.svg", + width: 20, + height: 20, + fit: BoxFit.contain, + ))), + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + "Mot de passe oublié ?", + style: TextStyle( + color: TColor.gray, + fontSize: 15, + decoration: TextDecoration.underline), + ), + ], + ), + SizedBox( + height: media.width * 0.04, + ), + Visibility( + visible: _errorLogin, + child: Text("Error - $_msgError", + style: TextStyle(color: TColor.red))), + const Spacer(), + RoundButton( + title: "Se connecter", + onPressed: () async { + Tuple2 result = await checkLoginAndPassword( + controllerTextEmail.text, + controllerTextPassword.text); + + if (result.item1 == true) { + Tuple2 infoUser = await getUserInfo(result.item2); + + if (infoUser.item1 == false) { + //print("Erreur - Impossible de récupéré les données de l'utilisateur"); + _printMsgError( + "Impossible de récupéré les données de l'utilisateur - {$infoUser.item2}"); + } else { + fillUser(context, infoUser.item2, result.item2); + + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const MainTabView())); + } + } else { + _printMsgError("Connexion refuser - ${result.item2}"); + } + }), + SizedBox( + height: media.width * 0.04, + ), + Row( + // crossAxisAlignment: CrossAxisAlignment., + children: [ + Expanded( + child: Container( + height: 1, + color: TColor.gray.withOpacity(0.5), + )), + Text( + " Or ", + style: TextStyle(color: TColor.black, fontSize: 12), + ), + Expanded( + child: Container( + height: 1, + color: TColor.gray.withOpacity(0.5), + )), + ], + ), + SizedBox( + height: media.width * 0.04, + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + GestureDetector( + onTap: () {}, + child: Container( + width: 50, + height: 50, + alignment: Alignment.center, + decoration: BoxDecoration( + color: TColor.white, + border: Border.all( + width: 1, + color: TColor.gray.withOpacity(0.4), + ), + borderRadius: BorderRadius.circular(15), + ), + child: Image.asset( + "assets/img/google.png", + width: 20, + height: 20, + ), + ), + ), + SizedBox( + width: media.width * 0.04, + ), + GestureDetector( + onTap: () {}, + child: Container( + width: 50, + height: 50, + alignment: Alignment.center, + decoration: BoxDecoration( + color: TColor.white, + border: Border.all( + width: 1, + color: TColor.gray.withOpacity(0.4), + ), + borderRadius: BorderRadius.circular(15), + ), + child: Image.asset( + "assets/img/suunto.png", + width: 35, + height: 35, + ), + ), + ) + ], + ), + SizedBox( + height: media.width * 0.04, + ), + TextButton( + onPressed: () { + Navigator.pop(context); + }, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + "Vous n'avez pas toujours pas de compte ? ", + style: TextStyle( + color: TColor.black, + fontSize: 14, + ), + ), + Text( + "Créer un compte", + style: TextStyle( + color: TColor.black, + fontSize: 14, + fontWeight: FontWeight.w700), + ) + ], + ), + ), + SizedBox( + height: media.width * 0.04, + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/View/main_tab/select_view.dart b/lib/View/main_tab/select_view.dart index fcd5bbc..02c70c1 100644 --- a/lib/View/main_tab/select_view.dart +++ b/lib/View/main_tab/select_view.dart @@ -29,10 +29,10 @@ class SelectView extends StatelessWidget { ), ); }), - - const SizedBox(height: 15,), - - RoundButton( + const SizedBox( + height: 15, + ), + RoundButton( title: "Meal Planner", onPressed: () { Navigator.push( @@ -42,10 +42,10 @@ class SelectView extends StatelessWidget { ), ); }), - - const SizedBox(height: 15,), - - RoundButton( + const SizedBox( + height: 15, + ), + RoundButton( title: "Sleep Tracker", onPressed: () { Navigator.push( @@ -60,4 +60,4 @@ class SelectView extends StatelessWidget { ), ); } -} \ No newline at end of file +} diff --git a/lib/View/page_test.dart b/lib/View/page_test.dart index eee76d4..4ed6b01 100644 --- a/lib/View/page_test.dart +++ b/lib/View/page_test.dart @@ -7,13 +7,10 @@ import 'package:http/http.dart'; import 'package:path_provider/path_provider.dart'; import 'package:file_picker/file_picker.dart'; import 'dart:io'; - -import 'package:provider/provider.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/Modele/activity.dart'; import 'package:smartfit_app_mobile/Modele/manager_file.dart'; -import 'package:smartfit_app_mobile/Modele/user.dart'; +import 'package:smartfit_app_mobile/View/login/signup_view.dart'; import 'package:tuple/tuple.dart'; // ----------- File --------------- // @@ -119,7 +116,7 @@ class _TestPage extends State { print(digest.toString()); print("Appel"); Tuple2 res = - await strategy.connexion("toto@gmail.com", digest.toString()); + await strategy.connexion("1234", digest.toString()); print(res.item1); print(res.item2); } @@ -135,7 +132,7 @@ class _TestPage extends State { Future getFiles() async { String token = - "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1dWlkIjoiOGUyYWVmMTItN2ZiNC0xMWVlLWJhZmQtMDI0MjBhNWEwMDFmIiwiZXhwIjoxNzA0ODgyNzk3fQ.b_zsOHj2C-Y28CrcozbSjEz8BUWL8kgjjx5CDhES8PI"; + "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1dWlkIjoiOGJiNDdmMDAtODJkNi0xMWVlLTkzMTMtMDI0MjBhNWEwMDFmIiwiZXhwIjoxNzA1MjI4MTUyfQ.9ADC65f2rNI_llytvhA6tX0NM9_O3-2RlwPXqV0yYcI"; print("Appel"); Tuple2 res = await strategy.getFiles(token); print(res.item1); @@ -156,7 +153,7 @@ class _TestPage extends State { Future uploadFile() async { PlatformFile t = result!.files.single; String token = - "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1dWlkIjoiOGUyYWVmMTItN2ZiNC0xMWVlLWJhZmQtMDI0MjBhNWEwMDFmIiwiZXhwIjoxNzA0ODgzNjM5fQ.0TmfJ9eYnszw4_RkNwPkMzkJxvsIFs5BI9uhQ7qYb0g"; + "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1dWlkIjoiOGJiNDdmMDAtODJkNi0xMWVlLTkzMTMtMDI0MjBhNWEwMDFmIiwiZXhwIjoxNzA1MjI4MTUyfQ.9ADC65f2rNI_llytvhA6tX0NM9_O3-2RlwPXqV0yYcI"; String? lol = t.path!; print("Appel"); Tuple2 res = await strategy.uploadFile(token, File(lol)); @@ -399,5 +396,4 @@ class _MyHomePageState extends State { ), ); } -} -*/ \ No newline at end of file +}*/ diff --git a/lib/View/widget_android_test.dart b/lib/View/widget_android_test.dart new file mode 100644 index 0000000..713473a --- /dev/null +++ b/lib/View/widget_android_test.dart @@ -0,0 +1,10 @@ +import 'package:flutter/material.dart'; + +class AndroidWidgetTest extends StatelessWidget { + const AndroidWidgetTest({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return const Text("Android oupy"); + } +} diff --git a/lib/View/widget_web_test.dart b/lib/View/widget_web_test.dart new file mode 100644 index 0000000..c9e8fa9 --- /dev/null +++ b/lib/View/widget_web_test.dart @@ -0,0 +1,10 @@ +import 'package:flutter/material.dart'; + +class WebWidgetTest extends StatelessWidget { + const WebWidgetTest({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return const Text("Web oupy"); + } +} diff --git a/lib/main.dart b/lib/main.dart index 8a98b33..2aad57e 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -2,7 +2,6 @@ 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/signup_view.dart'; -import 'package:smartfit_app_mobile/View/page_test.dart'; import 'package:smartfit_app_mobile/common/colo_extension.dart'; void main() { From 2d8992478f78e306bd79e8210b934870cd312fe6 Mon Sep 17 00:00:00 2001 From: Enzo Date: Tue, 14 Nov 2023 11:36:37 +0100 Subject: [PATCH 05/11] nettoyage --- lib/View/{ => test}/page_test.dart | 0 lib/View/widget_android_test.dart | 10 ---------- lib/View/widget_web_test.dart | 10 ---------- 3 files changed, 20 deletions(-) rename lib/View/{ => test}/page_test.dart (100%) delete mode 100644 lib/View/widget_android_test.dart delete mode 100644 lib/View/widget_web_test.dart diff --git a/lib/View/page_test.dart b/lib/View/test/page_test.dart similarity index 100% rename from lib/View/page_test.dart rename to lib/View/test/page_test.dart diff --git a/lib/View/widget_android_test.dart b/lib/View/widget_android_test.dart deleted file mode 100644 index 713473a..0000000 --- a/lib/View/widget_android_test.dart +++ /dev/null @@ -1,10 +0,0 @@ -import 'package:flutter/material.dart'; - -class AndroidWidgetTest extends StatelessWidget { - const AndroidWidgetTest({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return const Text("Android oupy"); - } -} diff --git a/lib/View/widget_web_test.dart b/lib/View/widget_web_test.dart deleted file mode 100644 index c9e8fa9..0000000 --- a/lib/View/widget_web_test.dart +++ /dev/null @@ -1,10 +0,0 @@ -import 'package:flutter/material.dart'; - -class WebWidgetTest extends StatelessWidget { - const WebWidgetTest({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return const Text("Web oupy"); - } -} From fdad41c5e5b99a2eb30a1311929f9e4c74e72e5b Mon Sep 17 00:00:00 2001 From: Enzo Date: Tue, 14 Nov 2023 16:21:54 +0100 Subject: [PATCH 06/11] avancement --- lib/Modele/user.dart | 6 +- lib/Modele/utile/login_user.dart | 35 + lib/Modele/utile/signup_user.dart | 16 + lib/View/home/home_view.dart | 1061 +--------------- lib/View/home/mobile/mobile_homeview.dart | 1070 +++++++++++++++++ lib/View/home/web/web_homeview.dart | 1070 +++++++++++++++++ lib/View/login/Mobile/android_login_view.dart | 61 +- .../login/Mobile/android_signup_view.dart | 275 +++++ lib/View/login/login_view.dart | 77 +- lib/View/login/signup_view.dart | 263 +--- lib/View/login/web/web_login_view.dart | 63 +- lib/View/login/web/web_signup_view.dart | 275 +++++ lib/View/main_tab/main_tab_view.dart | 2 +- lib/View/main_tab/select_view.dart | 3 +- lib/View/test/page_test.dart | 9 +- pubspec.yaml | 1 + 16 files changed, 2839 insertions(+), 1448 deletions(-) create mode 100644 lib/Modele/utile/login_user.dart create mode 100644 lib/Modele/utile/signup_user.dart create mode 100644 lib/View/home/mobile/mobile_homeview.dart create mode 100644 lib/View/home/web/web_homeview.dart create mode 100644 lib/View/login/Mobile/android_signup_view.dart create mode 100644 lib/View/login/web/web_signup_view.dart diff --git a/lib/Modele/user.dart b/lib/Modele/user.dart index e0adfcf..289622d 100644 --- a/lib/Modele/user.dart +++ b/lib/Modele/user.dart @@ -2,8 +2,8 @@ import 'package:flutter/material.dart'; import 'package:smartfit_app_mobile/Modele/activity.dart'; class User extends ChangeNotifier { - String? username; - String? email; - String? token; + String username = "VOID"; + String email = "VOID"; + String token = "VOID"; List? listActivity; } diff --git a/lib/Modele/utile/login_user.dart b/lib/Modele/utile/login_user.dart new file mode 100644 index 0000000..d07ce10 --- /dev/null +++ b/lib/Modele/utile/login_user.dart @@ -0,0 +1,35 @@ +import 'dart:convert'; + +import 'package:crypto/crypto.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.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/Modele/user.dart'; +import 'package:tuple/tuple.dart'; + +class Login { + final IDataStrategy api = RequestApi(); + + Future> checkLoginAndPassword( + String email, String password) async { + Tuple2 result = await api.connexion( + email, sha256.convert(utf8.encode(password)).toString()); + return result; + } + + 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); + } + + 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); + } +} diff --git a/lib/Modele/utile/signup_user.dart b/lib/Modele/utile/signup_user.dart new file mode 100644 index 0000000..b9d26f4 --- /dev/null +++ b/lib/Modele/utile/signup_user.dart @@ -0,0 +1,16 @@ +import 'dart:convert'; + +import 'package:crypto/crypto.dart'; +import 'package:smartfit_app_mobile/Modele/Api/i_data_strategy.dart'; +import 'package:smartfit_app_mobile/Modele/Api/request_api.dart'; +import 'package:tuple/tuple.dart'; + +class SignUp { + final IDataStrategy api = RequestApi(); + + Future> createUser( + String email, String username, String password) async { + return await api.postUser( + email, sha256.convert(utf8.encode(password)).toString(), username); + } +} diff --git a/lib/View/home/home_view.dart b/lib/View/home/home_view.dart index ea65d98..3779dbd 100644 --- a/lib/View/home/home_view.dart +++ b/lib/View/home/home_view.dart @@ -1,15 +1,7 @@ -import 'package:dotted_dashed_line/dotted_dashed_line.dart'; -import 'package:smartfit_app_mobile/common_widget/round_button.dart'; -import 'package:fl_chart/fl_chart.dart'; import 'package:flutter/material.dart'; -import 'package:simple_animation_progress_bar/simple_animation_progress_bar.dart'; -import 'package:simple_circular_progress_bar/simple_circular_progress_bar.dart'; -import 'package:smartfit_app_mobile/view/home/activity_tracker.dart'; -import 'package:smartfit_app_mobile/view/home/notification_view.dart'; -import '../../common/colo_extension.dart'; -//import 'activity_tracker_view.dart'; -//import 'finished_workout_view.dart'; -//import 'notification_view.dart'; +import 'package:responsive_builder/responsive_builder.dart'; +import 'package:smartfit_app_mobile/View/home/mobile/mobile_homeview.dart'; +import 'package:smartfit_app_mobile/View/home/web/web_homeview.dart'; class HomeView extends StatefulWidget { const HomeView({super.key}); @@ -19,1052 +11,11 @@ class HomeView extends StatefulWidget { } class _HomeViewState extends State { - List lastWorkoutArr = [ - { - "name": "Full Body Workout", - "image": "assets/img/Workout1.png", - "kcal": "180", - "time": "20", - "progress": 0.3 - }, - { - "name": "Lower Body Workout", - "image": "assets/img/Workout2.png", - "kcal": "200", - "time": "30", - "progress": 0.4 - }, - { - "name": "Ab Workout", - "image": "assets/img/Workout3.png", - "kcal": "300", - "time": "40", - "progress": 0.7 - }, - ]; - List showingTooltipOnSpots = [0]; - - List allSpots = [FlSpot(0, 20)]; - - List waterArr = [ - {"title": "6am - 8am", "subtitle": "600ml"}, - {"title": "9am - 11am", "subtitle": "500ml"}, - {"title": "11am - 2pm", "subtitle": "1000ml"}, - {"title": "2pm - 4pm", "subtitle": "700ml"}, - {"title": "4pm - now", "subtitle": "900ml"}, - ]; - @override Widget build(BuildContext context) { - var media = MediaQuery.of(context).size; - - final lineBarsData = [ - LineChartBarData( - showingIndicators: showingTooltipOnSpots, - spots: allSpots, - isCurved: false, - barWidth: 2, - belowBarData: BarAreaData( - show: true, - gradient: LinearGradient(colors: [ - TColor.secondaryColor1.withOpacity(0.4), - TColor.secondaryColor2.withOpacity(0.1), - ], begin: Alignment.topCenter, end: Alignment.bottomCenter), - ), - dotData: FlDotData(show: false), - gradient: LinearGradient( - colors: TColor.secondaryG, - ), - ), - ]; - - final tooltipsOnBar = lineBarsData[0]; - - return Scaffold( - backgroundColor: TColor.white, - body: SingleChildScrollView( - child: SafeArea( - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 15), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - "Bienvenue,", - style: TextStyle(color: TColor.gray, fontSize: 12), - ), - Text( - "Benjelloun Othmane", - style: TextStyle( - color: TColor.black, - fontSize: 20, - fontWeight: FontWeight.w700), - ), - ], - ), - IconButton( - onPressed: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => const NotificationView(), - ), - ); - }, - icon: Image.asset( - "assets/img/notification_active.png", - width: 25, - height: 25, - fit: BoxFit.fitHeight, - )) - ], - ), - SizedBox( - height: media.width * 0.05, - ), - Container( - height: media.width * 0.4, - decoration: BoxDecoration( - gradient: LinearGradient(colors: TColor.primaryG), - borderRadius: BorderRadius.circular(media.width * 0.075)), - child: Stack(alignment: Alignment.center, children: [ - Image.asset( - "assets/img/bg_dots.png", - height: media.width * 0.4, - width: double.maxFinite, - fit: BoxFit.fitHeight, - ), - Padding( - padding: const EdgeInsets.symmetric( - vertical: 25, horizontal: 25), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - "Graph 1", - style: TextStyle( - color: TColor.white, - fontSize: 14, - fontWeight: FontWeight.w700), - ), - Text( - "Sous titre 1", - style: TextStyle( - color: TColor.white.withOpacity(0.7), - fontSize: 12), - ), - SizedBox( - height: media.width * 0.05, - ), - SizedBox( - width: 120, - height: 35, - child: RoundButton( - title: "Voir plus", - type: RoundButtonType.bgSGradient, - fontSize: 12, - fontWeight: FontWeight.w400, - onPressed: () {})) - ], - ), - AspectRatio( - aspectRatio: 1, - child: PieChart( - PieChartData( - pieTouchData: PieTouchData( - touchCallback: - (FlTouchEvent event, pieTouchResponse) {}, - ), - startDegreeOffset: 250, - borderData: FlBorderData( - show: false, - ), - sectionsSpace: 1, - centerSpaceRadius: 0, - sections: showingSections(), - ), - ), - ), - ], - ), - ) - ]), - ), - SizedBox( - height: media.width * 0.05, - ), - Container( - padding: - const EdgeInsets.symmetric(vertical: 15, horizontal: 15), - decoration: BoxDecoration( - color: TColor.primaryColor2.withOpacity(0.3), - borderRadius: BorderRadius.circular(15), - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - "Suivi d'activité", - style: TextStyle( - color: TColor.black, - fontSize: 14, - fontWeight: FontWeight.w700), - ), - SizedBox( - width: 70, - height: 25, - child: RoundButton( - title: "Voir", - type: RoundButtonType.bgGradient, - fontSize: 12, - fontWeight: FontWeight.w400, - onPressed: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => - const ActivityTrackerView(), - ), - ); - }, - ), - ) - ], - ), - ), - SizedBox( - height: media.width * 0.05, - ), - Text( - "Status d'activité", - style: TextStyle( - color: TColor.black, - fontSize: 16, - fontWeight: FontWeight.w700), - ), - SizedBox( - height: media.width * 0.02, - ), - ClipRRect( - borderRadius: BorderRadius.circular(25), - child: Container( - height: media.width * 0.4, - width: double.maxFinite, - decoration: BoxDecoration( - color: TColor.primaryColor2.withOpacity(0.3), - borderRadius: BorderRadius.circular(25), - ), - child: Stack( - alignment: Alignment.topLeft, - children: [ - Padding( - padding: const EdgeInsets.symmetric( - vertical: 20, horizontal: 20), - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - "Graph 2 ( rhythme cardiaque )", - style: TextStyle( - color: TColor.black, - fontSize: 16, - fontWeight: FontWeight.w700), - ), - ShaderMask( - blendMode: BlendMode.srcIn, - shaderCallback: (bounds) { - return LinearGradient( - colors: TColor.primaryG, - begin: Alignment.centerLeft, - end: Alignment.centerRight) - .createShader(Rect.fromLTRB( - 0, 0, bounds.width, bounds.height)); - }, - child: Text( - "78 BPM", - style: TextStyle( - color: - TColor.primaryColor1.withOpacity(0.7), - fontWeight: FontWeight.w700, - fontSize: 18), - ), - ), - ], - ), - ), - LineChart( - LineChartData( - showingTooltipIndicators: - showingTooltipOnSpots.map((index) { - return ShowingTooltipIndicators([ - LineBarSpot( - tooltipsOnBar, - lineBarsData.indexOf(tooltipsOnBar), - tooltipsOnBar.spots[index], - ), - ]); - }).toList(), - lineTouchData: LineTouchData( - enabled: true, - handleBuiltInTouches: false, - touchCallback: (FlTouchEvent event, - LineTouchResponse? response) { - if (response == null || - response.lineBarSpots == null) { - return; - } - if (event is FlTapUpEvent) { - final spotIndex = - response.lineBarSpots!.first.spotIndex; - showingTooltipOnSpots.clear(); - setState(() { - showingTooltipOnSpots.add(spotIndex); - }); - } - }, - mouseCursorResolver: (FlTouchEvent event, - LineTouchResponse? response) { - if (response == null || - response.lineBarSpots == null) { - return SystemMouseCursors.basic; - } - return SystemMouseCursors.click; - }, - getTouchedSpotIndicator: - (LineChartBarData barData, - List spotIndexes) { - return spotIndexes.map((index) { - return TouchedSpotIndicatorData( - FlLine( - color: TColor.secondaryColor1, - ), - FlDotData( - show: true, - getDotPainter: - (spot, percent, barData, index) => - FlDotCirclePainter( - radius: 3, - color: Colors.white, - strokeWidth: 3, - strokeColor: TColor.secondaryColor1, - ), - ), - ); - }).toList(); - }, - touchTooltipData: LineTouchTooltipData( - tooltipBgColor: TColor.secondaryColor1, - tooltipRoundedRadius: 20, - getTooltipItems: - (List lineBarsSpot) { - return lineBarsSpot.map((lineBarSpot) { - return LineTooltipItem( - "il y a ${lineBarSpot.x.toInt()} minutes", - const TextStyle( - color: Colors.white, - fontSize: 10, - fontWeight: FontWeight.bold, - ), - ); - }).toList(); - }, - ), - ), - lineBarsData: lineBarsData, - minY: 0, - maxY: 130, - titlesData: FlTitlesData( - show: false, - ), - gridData: FlGridData(show: false), - borderData: FlBorderData( - show: true, - border: Border.all( - color: Colors.transparent, - ), - ), - ), - ) - ], - ), - ), - ), - SizedBox( - height: media.width * 0.05, - ), - Row( - children: [ - Expanded( - child: Container( - height: media.width * 0.95, - padding: const EdgeInsets.symmetric( - vertical: 25, horizontal: 20), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(25), - boxShadow: const [ - BoxShadow(color: Colors.black12, blurRadius: 2) - ]), - child: Row( - children: [ - SimpleAnimationProgressBar( - height: media.width * 0.85, - width: media.width * 0.07, - backgroundColor: Colors.grey.shade100, - foregrondColor: Colors.purple, - ratio: 0.5, - direction: Axis.vertical, - curve: Curves.fastLinearToSlowEaseIn, - duration: const Duration(seconds: 3), - borderRadius: BorderRadius.circular(15), - gradientColor: LinearGradient( - colors: TColor.primaryG, - begin: Alignment.bottomCenter, - end: Alignment.topCenter), - ), - const SizedBox( - width: 10, - ), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - "Graph 3", - style: TextStyle( - color: TColor.black, - fontSize: 12, - fontWeight: FontWeight.w700), - ), - ShaderMask( - blendMode: BlendMode.srcIn, - shaderCallback: (bounds) { - return LinearGradient( - colors: TColor.primaryG, - begin: Alignment.centerLeft, - end: Alignment.centerRight) - .createShader(Rect.fromLTRB( - 0, 0, bounds.width, bounds.height)); - }, - child: Text( - "ex : objectif", - style: TextStyle( - color: TColor.white.withOpacity(0.7), - fontWeight: FontWeight.w700, - fontSize: 14), - ), - ), - const SizedBox( - height: 10, - ), - Text( - "Mis à jour en temps réel", - style: TextStyle( - color: TColor.gray, - fontSize: 12, - ), - ), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: waterArr.map((wObj) { - var isLast = wObj == waterArr.last; - return Row( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Column( - mainAxisAlignment: - MainAxisAlignment.start, - crossAxisAlignment: - CrossAxisAlignment.center, - children: [ - Container( - margin: - const EdgeInsets.symmetric( - vertical: 4), - width: 10, - height: 10, - decoration: BoxDecoration( - color: TColor.secondaryColor1 - .withOpacity(0.5), - borderRadius: - BorderRadius.circular(5), - ), - ), - if (!isLast) - DottedDashedLine( - height: media.width * 0.078, - width: 0, - dashColor: TColor - .secondaryColor1 - .withOpacity(0.5), - axis: Axis.vertical) - ], - ), - const SizedBox( - width: 10, - ), - Column( - mainAxisAlignment: - MainAxisAlignment.start, - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Text( - wObj["title"].toString(), - style: TextStyle( - color: TColor.gray, - fontSize: 10, - ), - ), - ShaderMask( - blendMode: BlendMode.srcIn, - shaderCallback: (bounds) { - return LinearGradient( - colors: - TColor.secondaryG, - begin: Alignment - .centerLeft, - end: Alignment - .centerRight) - .createShader(Rect.fromLTRB( - 0, - 0, - bounds.width, - bounds.height)); - }, - child: Text( - wObj["subtitle"].toString(), - style: TextStyle( - color: TColor.white - .withOpacity(0.7), - fontSize: 12), - ), - ), - ], - ) - ], - ); - }).toList(), - ) - ], - )) - ], - ), - ), - ), - SizedBox( - width: media.width * 0.05, - ), - Expanded( - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - Container( - width: double.maxFinite, - height: media.width * 0.45, - padding: const EdgeInsets.symmetric( - vertical: 25, horizontal: 20), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(25), - boxShadow: const [ - BoxShadow(color: Colors.black12, blurRadius: 2) - ]), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - "Graph 4", - style: TextStyle( - color: TColor.black, - fontSize: 12, - fontWeight: FontWeight.w700), - ), - ShaderMask( - blendMode: BlendMode.srcIn, - shaderCallback: (bounds) { - return LinearGradient( - colors: TColor.primaryG, - begin: Alignment.centerLeft, - end: Alignment.centerRight) - .createShader(Rect.fromLTRB( - 0, 0, bounds.width, bounds.height)); - }, - child: Text( - "durée", - style: TextStyle( - color: TColor.white.withOpacity(0.7), - fontWeight: FontWeight.w700, - fontSize: 14), - ), - ), - const Spacer(), - Image.asset("assets/img/sleep_graph.png", - width: double.maxFinite, - height: 80, - fit: BoxFit.fitWidth) - ]), - ), - SizedBox( - height: media.width * 0.05, - ), - Container( - width: double.maxFinite, - height: media.width * 0.45, - padding: const EdgeInsets.symmetric( - vertical: 25, horizontal: 20), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(25), - boxShadow: const [ - BoxShadow(color: Colors.black12, blurRadius: 2) - ]), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - "Calories", - style: TextStyle( - color: TColor.black, - fontSize: 12, - fontWeight: FontWeight.w700), - ), - ShaderMask( - blendMode: BlendMode.srcIn, - shaderCallback: (bounds) { - return LinearGradient( - colors: TColor.primaryG, - begin: Alignment.centerLeft, - end: Alignment.centerRight) - .createShader(Rect.fromLTRB( - 0, 0, bounds.width, bounds.height)); - }, - child: Text( - "760 kCal", - style: TextStyle( - color: TColor.white.withOpacity(0.7), - fontWeight: FontWeight.w700, - fontSize: 14), - ), - ), - const Spacer(), - Container( - alignment: Alignment.center, - child: SizedBox( - width: media.width * 0.2, - height: media.width * 0.2, - child: Stack( - alignment: Alignment.center, - children: [ - Container( - width: media.width * 0.15, - height: media.width * 0.15, - alignment: Alignment.center, - decoration: BoxDecoration( - gradient: LinearGradient( - colors: TColor.primaryG), - borderRadius: BorderRadius.circular( - media.width * 0.075), - ), - child: FittedBox( - child: Text( - "230kCal\nrestantes", - textAlign: TextAlign.center, - style: TextStyle( - color: TColor.white, - fontSize: 11), - ), - ), - ), - SimpleCircularProgressBar( - progressStrokeWidth: 10, - backStrokeWidth: 10, - progressColors: TColor.primaryG, - backColor: Colors.grey.shade100, - valueNotifier: ValueNotifier(50), - startAngle: -180, - ), - ], - ), - ), - ) - ]), - ), - ], - )) - ], - ), - SizedBox( - height: media.width * 0.1, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - "graph 5", - style: TextStyle( - color: TColor.black, - fontSize: 16, - fontWeight: FontWeight.w700), - ), - Container( - height: 30, - padding: const EdgeInsets.symmetric(horizontal: 8), - decoration: BoxDecoration( - gradient: LinearGradient(colors: TColor.primaryG), - borderRadius: BorderRadius.circular(15), - ), - child: DropdownButtonHideUnderline( - child: DropdownButton( - items: ["Semaine", "Mois"] - .map((name) => DropdownMenuItem( - value: name, - child: Text( - name, - style: TextStyle( - color: TColor.gray, fontSize: 14), - ), - )) - .toList(), - onChanged: (value) {}, - icon: Icon(Icons.expand_more, color: TColor.white), - hint: Text( - "Semaine", - textAlign: TextAlign.center, - style: - TextStyle(color: TColor.white, fontSize: 12), - ), - ), - )), - ], - ), - SizedBox( - height: media.width * 0.05, - ), - Container( - padding: const EdgeInsets.only(left: 15), - height: media.width * 0.5, - width: double.maxFinite, - child: LineChart( - LineChartData( - showingTooltipIndicators: - showingTooltipOnSpots.map((index) { - return ShowingTooltipIndicators([ - LineBarSpot( - tooltipsOnBar, - lineBarsData.indexOf(tooltipsOnBar), - tooltipsOnBar.spots[index], - ), - ]); - }).toList(), - lineTouchData: LineTouchData( - enabled: true, - handleBuiltInTouches: false, - touchCallback: (FlTouchEvent event, - LineTouchResponse? response) { - if (response == null || - response.lineBarSpots == null) { - return; - } - if (event is FlTapUpEvent) { - final spotIndex = - response.lineBarSpots!.first.spotIndex; - showingTooltipOnSpots.clear(); - setState(() { - showingTooltipOnSpots.add(spotIndex); - }); - } - }, - mouseCursorResolver: (FlTouchEvent event, - LineTouchResponse? response) { - if (response == null || - response.lineBarSpots == null) { - return SystemMouseCursors.basic; - } - return SystemMouseCursors.click; - }, - getTouchedSpotIndicator: (LineChartBarData barData, - List spotIndexes) { - return spotIndexes.map((index) { - return TouchedSpotIndicatorData( - FlLine( - color: Colors.transparent, - ), - FlDotData( - show: true, - getDotPainter: - (spot, percent, barData, index) => - FlDotCirclePainter( - radius: 3, - color: Colors.white, - strokeWidth: 3, - strokeColor: TColor.secondaryColor1, - ), - ), - ); - }).toList(); - }, - touchTooltipData: LineTouchTooltipData( - tooltipBgColor: TColor.secondaryColor1, - tooltipRoundedRadius: 20, - getTooltipItems: (List lineBarsSpot) { - return lineBarsSpot.map((lineBarSpot) { - return LineTooltipItem( - "il y a ${lineBarSpot.x.toInt()} minutes", - const TextStyle( - color: Colors.white, - fontSize: 10, - fontWeight: FontWeight.bold, - ), - ); - }).toList(); - }, - ), - ), - lineBarsData: lineBarsData1, - minY: -0.5, - maxY: 110, - titlesData: FlTitlesData( - show: true, - leftTitles: AxisTitles(), - topTitles: AxisTitles(), - bottomTitles: AxisTitles( - sideTitles: bottomTitles, - ), - rightTitles: AxisTitles( - sideTitles: rightTitles, - )), - gridData: FlGridData( - show: true, - drawHorizontalLine: true, - horizontalInterval: 25, - drawVerticalLine: false, - getDrawingHorizontalLine: (value) { - return FlLine( - color: TColor.gray.withOpacity(0.15), - strokeWidth: 2, - ); - }, - ), - borderData: FlBorderData( - show: true, - border: Border.all( - color: Colors.transparent, - ), - ), - ), - )), - SizedBox( - height: media.width * 0.05, - ), - SizedBox( - height: media.width * 0.1, - ), - ], - ), - ), - ), - ), - ); - } - - void updateChartData(List newData) { - setState(() { - allSpots = newData; - }); - } - - List showingSections() { - return List.generate( - 2, - (i) { - var color0 = TColor.secondaryColor1; - - switch (i) { - case 0: - return PieChartSectionData( - color: color0, - value: 33, - title: '', - radius: 55, - titlePositionPercentageOffset: 0.55, - badgeWidget: const Text( - "20,1", - style: TextStyle( - color: Colors.white, - fontSize: 12, - fontWeight: FontWeight.w700), - )); - case 1: - return PieChartSectionData( - color: Colors.white, - value: 75, - title: '', - radius: 45, - titlePositionPercentageOffset: 0.55, - ); - - default: - throw Error(); - } - }, - ); - } - - LineTouchData get lineTouchData1 => LineTouchData( - handleBuiltInTouches: true, - touchTooltipData: LineTouchTooltipData( - tooltipBgColor: Colors.blueGrey.withOpacity(0.8), - ), - ); - - List get lineBarsData1 => [ - lineChartBarData1_1, - lineChartBarData1_2, - ]; - - LineChartBarData get lineChartBarData1_1 => LineChartBarData( - isCurved: true, - gradient: LinearGradient(colors: [ - TColor.primaryColor2.withOpacity(0.5), - TColor.primaryColor1.withOpacity(0.5), - ]), - barWidth: 4, - isStrokeCapRound: true, - dotData: FlDotData(show: false), - belowBarData: BarAreaData(show: false), - spots: const [ - FlSpot(1, 35), - FlSpot(2, 70), - FlSpot(3, 40), - FlSpot(4, 80), - FlSpot(5, 25), - FlSpot(6, 70), - FlSpot(7, 35), - ], - ); - - LineChartBarData get lineChartBarData1_2 => LineChartBarData( - isCurved: true, - gradient: LinearGradient(colors: [ - TColor.secondaryColor2.withOpacity(0.5), - TColor.secondaryColor1.withOpacity(0.5), - ]), - barWidth: 2, - isStrokeCapRound: true, - dotData: FlDotData(show: false), - belowBarData: BarAreaData( - show: false, - ), - spots: const [ - FlSpot(1, 80), - FlSpot(2, 50), - FlSpot(3, 90), - FlSpot(4, 40), - FlSpot(5, 80), - FlSpot(6, 35), - FlSpot(7, 60), - ], - ); - - SideTitles get rightTitles => SideTitles( - getTitlesWidget: rightTitleWidgets, - showTitles: true, - interval: 20, - reservedSize: 40, - ); - - Widget rightTitleWidgets(double value, TitleMeta meta) { - String text; - switch (value.toInt()) { - case 0: - text = '0%'; - break; - case 20: - text = '20%'; - break; - case 40: - text = '40%'; - break; - case 60: - text = '60%'; - break; - case 80: - text = '80%'; - break; - case 100: - text = '100%'; - break; - default: - return Container(); - } - - return Text(text, - style: TextStyle( - color: TColor.gray, - fontSize: 12, - ), - textAlign: TextAlign.center); - } - - SideTitles get bottomTitles => SideTitles( - showTitles: true, - reservedSize: 32, - interval: 1, - getTitlesWidget: bottomTitleWidgets, - ); - - Widget bottomTitleWidgets(double value, TitleMeta meta) { - var style = TextStyle( - color: TColor.gray, - fontSize: 12, - ); - Widget text; - switch (value.toInt()) { - case 1: - text = Text('Dim', style: style); - break; - case 2: - text = Text('Lun', style: style); - break; - case 3: - text = Text('Mar', style: style); - break; - case 4: - text = Text('Mer', style: style); - break; - case 5: - text = Text('Jeu', style: style); - break; - case 6: - text = Text('Ven', style: style); - break; - case 7: - text = Text('Sam', style: style); - break; - default: - text = Text('', style: style); - break; - } - - return SideTitleWidget( - axisSide: meta.axisSide, - space: 10, - child: text, + return ScreenTypeLayout.builder( + mobile: (_) => const MobileHomeView(), + desktop: (_) => const WebHomeView(), ); } } diff --git a/lib/View/home/mobile/mobile_homeview.dart b/lib/View/home/mobile/mobile_homeview.dart new file mode 100644 index 0000000..2c836c1 --- /dev/null +++ b/lib/View/home/mobile/mobile_homeview.dart @@ -0,0 +1,1070 @@ +import 'package:dotted_dashed_line/dotted_dashed_line.dart'; +import 'package:fl_chart/fl_chart.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:simple_animation_progress_bar/simple_animation_progress_bar.dart'; +import 'package:simple_circular_progress_bar/simple_circular_progress_bar.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/round_button.dart'; +import 'package:smartfit_app_mobile/view/home/activity_tracker.dart'; +import 'package:smartfit_app_mobile/view/home/notification_view.dart'; + +class MobileHomeView extends StatefulWidget { + const MobileHomeView({super.key}); + + @override + State createState() => _MobileHomeView(); +} + +class _MobileHomeView extends State { + List lastWorkoutArr = [ + { + "name": "Full Body Workout", + "image": "assets/img/Workout1.png", + "kcal": "180", + "time": "20", + "progress": 0.3 + }, + { + "name": "Lower Body Workout", + "image": "assets/img/Workout2.png", + "kcal": "200", + "time": "30", + "progress": 0.4 + }, + { + "name": "Ab Workout", + "image": "assets/img/Workout3.png", + "kcal": "300", + "time": "40", + "progress": 0.7 + }, + ]; + List showingTooltipOnSpots = [0]; + + List allSpots = [FlSpot(0, 20)]; + + List waterArr = [ + {"title": "6am - 8am", "subtitle": "600ml"}, + {"title": "9am - 11am", "subtitle": "500ml"}, + {"title": "11am - 2pm", "subtitle": "1000ml"}, + {"title": "2pm - 4pm", "subtitle": "700ml"}, + {"title": "4pm - now", "subtitle": "900ml"}, + ]; + + @override + Widget build(BuildContext context) { + var media = MediaQuery.of(context).size; + User user = context.watch(); + + final lineBarsData = [ + LineChartBarData( + showingIndicators: showingTooltipOnSpots, + spots: allSpots, + isCurved: false, + barWidth: 2, + belowBarData: BarAreaData( + show: true, + gradient: LinearGradient(colors: [ + TColor.secondaryColor1.withOpacity(0.4), + TColor.secondaryColor2.withOpacity(0.1), + ], begin: Alignment.topCenter, end: Alignment.bottomCenter), + ), + dotData: FlDotData(show: false), + gradient: LinearGradient( + colors: TColor.secondaryG, + ), + ), + ]; + + final tooltipsOnBar = lineBarsData[0]; + + return Scaffold( + backgroundColor: TColor.white, + body: SingleChildScrollView( + child: SafeArea( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 15), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Bienvenue,", + style: TextStyle(color: TColor.gray, fontSize: 12), + ), + Text( + user.username, + style: TextStyle( + color: TColor.black, + fontSize: 20, + fontWeight: FontWeight.w700), + ), + ], + ), + IconButton( + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const NotificationView(), + ), + ); + }, + icon: Image.asset( + "assets/img/notification_active.png", + width: 25, + height: 25, + fit: BoxFit.fitHeight, + )) + ], + ), + SizedBox( + height: media.width * 0.05, + ), + Container( + height: media.width * 0.4, + decoration: BoxDecoration( + gradient: LinearGradient(colors: TColor.primaryG), + borderRadius: BorderRadius.circular(media.width * 0.075)), + child: Stack(alignment: Alignment.center, children: [ + Image.asset( + "assets/img/bg_dots.png", + height: media.width * 0.4, + width: double.maxFinite, + fit: BoxFit.fitHeight, + ), + Padding( + padding: const EdgeInsets.symmetric( + vertical: 25, horizontal: 25), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Graph 1", + style: TextStyle( + color: TColor.white, + fontSize: 14, + fontWeight: FontWeight.w700), + ), + Text( + "Sous titre 1", + style: TextStyle( + color: TColor.white.withOpacity(0.7), + fontSize: 12), + ), + SizedBox( + height: media.width * 0.05, + ), + SizedBox( + width: 120, + height: 35, + child: RoundButton( + title: "Voir plus", + type: RoundButtonType.bgSGradient, + fontSize: 12, + fontWeight: FontWeight.w400, + onPressed: () {})) + ], + ), + AspectRatio( + aspectRatio: 1, + child: PieChart( + PieChartData( + pieTouchData: PieTouchData( + touchCallback: + (FlTouchEvent event, pieTouchResponse) {}, + ), + startDegreeOffset: 250, + borderData: FlBorderData( + show: false, + ), + sectionsSpace: 1, + centerSpaceRadius: 0, + sections: showingSections(), + ), + ), + ), + ], + ), + ) + ]), + ), + SizedBox( + height: media.width * 0.05, + ), + Container( + padding: + const EdgeInsets.symmetric(vertical: 15, horizontal: 15), + decoration: BoxDecoration( + color: TColor.primaryColor2.withOpacity(0.3), + borderRadius: BorderRadius.circular(15), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "Suivi d'activité", + style: TextStyle( + color: TColor.black, + fontSize: 14, + fontWeight: FontWeight.w700), + ), + SizedBox( + width: 70, + height: 25, + child: RoundButton( + title: "Voir", + type: RoundButtonType.bgGradient, + fontSize: 12, + fontWeight: FontWeight.w400, + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + const ActivityTrackerView(), + ), + ); + }, + ), + ) + ], + ), + ), + SizedBox( + height: media.width * 0.05, + ), + Text( + "Status d'activité", + style: TextStyle( + color: TColor.black, + fontSize: 16, + fontWeight: FontWeight.w700), + ), + SizedBox( + height: media.width * 0.02, + ), + ClipRRect( + borderRadius: BorderRadius.circular(25), + child: Container( + height: media.width * 0.4, + width: double.maxFinite, + decoration: BoxDecoration( + color: TColor.primaryColor2.withOpacity(0.3), + borderRadius: BorderRadius.circular(25), + ), + child: Stack( + alignment: Alignment.topLeft, + children: [ + Padding( + padding: const EdgeInsets.symmetric( + vertical: 20, horizontal: 20), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Graph 2 ( rhythme cardiaque )", + style: TextStyle( + color: TColor.black, + fontSize: 16, + fontWeight: FontWeight.w700), + ), + ShaderMask( + blendMode: BlendMode.srcIn, + shaderCallback: (bounds) { + return LinearGradient( + colors: TColor.primaryG, + begin: Alignment.centerLeft, + end: Alignment.centerRight) + .createShader(Rect.fromLTRB( + 0, 0, bounds.width, bounds.height)); + }, + child: Text( + "78 BPM", + style: TextStyle( + color: + TColor.primaryColor1.withOpacity(0.7), + fontWeight: FontWeight.w700, + fontSize: 18), + ), + ), + ], + ), + ), + LineChart( + LineChartData( + showingTooltipIndicators: + showingTooltipOnSpots.map((index) { + return ShowingTooltipIndicators([ + LineBarSpot( + tooltipsOnBar, + lineBarsData.indexOf(tooltipsOnBar), + tooltipsOnBar.spots[index], + ), + ]); + }).toList(), + lineTouchData: LineTouchData( + enabled: true, + handleBuiltInTouches: false, + touchCallback: (FlTouchEvent event, + LineTouchResponse? response) { + if (response == null || + response.lineBarSpots == null) { + return; + } + if (event is FlTapUpEvent) { + final spotIndex = + response.lineBarSpots!.first.spotIndex; + showingTooltipOnSpots.clear(); + setState(() { + showingTooltipOnSpots.add(spotIndex); + }); + } + }, + mouseCursorResolver: (FlTouchEvent event, + LineTouchResponse? response) { + if (response == null || + response.lineBarSpots == null) { + return SystemMouseCursors.basic; + } + return SystemMouseCursors.click; + }, + getTouchedSpotIndicator: + (LineChartBarData barData, + List spotIndexes) { + return spotIndexes.map((index) { + return TouchedSpotIndicatorData( + FlLine( + color: TColor.secondaryColor1, + ), + FlDotData( + show: true, + getDotPainter: + (spot, percent, barData, index) => + FlDotCirclePainter( + radius: 3, + color: Colors.white, + strokeWidth: 3, + strokeColor: TColor.secondaryColor1, + ), + ), + ); + }).toList(); + }, + touchTooltipData: LineTouchTooltipData( + tooltipBgColor: TColor.secondaryColor1, + tooltipRoundedRadius: 20, + getTooltipItems: + (List lineBarsSpot) { + return lineBarsSpot.map((lineBarSpot) { + return LineTooltipItem( + "il y a ${lineBarSpot.x.toInt()} minutes", + const TextStyle( + color: Colors.white, + fontSize: 10, + fontWeight: FontWeight.bold, + ), + ); + }).toList(); + }, + ), + ), + lineBarsData: lineBarsData, + minY: 0, + maxY: 130, + titlesData: FlTitlesData( + show: false, + ), + gridData: FlGridData(show: false), + borderData: FlBorderData( + show: true, + border: Border.all( + color: Colors.transparent, + ), + ), + ), + ) + ], + ), + ), + ), + SizedBox( + height: media.width * 0.05, + ), + Row( + children: [ + Expanded( + child: Container( + height: media.width * 0.95, + padding: const EdgeInsets.symmetric( + vertical: 25, horizontal: 20), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(25), + boxShadow: const [ + BoxShadow(color: Colors.black12, blurRadius: 2) + ]), + child: Row( + children: [ + SimpleAnimationProgressBar( + height: media.width * 0.85, + width: media.width * 0.07, + backgroundColor: Colors.grey.shade100, + foregrondColor: Colors.purple, + ratio: 0.5, + direction: Axis.vertical, + curve: Curves.fastLinearToSlowEaseIn, + duration: const Duration(seconds: 3), + borderRadius: BorderRadius.circular(15), + gradientColor: LinearGradient( + colors: TColor.primaryG, + begin: Alignment.bottomCenter, + end: Alignment.topCenter), + ), + const SizedBox( + width: 10, + ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Graph 3", + style: TextStyle( + color: TColor.black, + fontSize: 12, + fontWeight: FontWeight.w700), + ), + ShaderMask( + blendMode: BlendMode.srcIn, + shaderCallback: (bounds) { + return LinearGradient( + colors: TColor.primaryG, + begin: Alignment.centerLeft, + end: Alignment.centerRight) + .createShader(Rect.fromLTRB( + 0, 0, bounds.width, bounds.height)); + }, + child: Text( + "ex : objectif", + style: TextStyle( + color: TColor.white.withOpacity(0.7), + fontWeight: FontWeight.w700, + fontSize: 14), + ), + ), + const SizedBox( + height: 10, + ), + Text( + "Mis à jour en temps réel", + style: TextStyle( + color: TColor.gray, + fontSize: 12, + ), + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: waterArr.map((wObj) { + var isLast = wObj == waterArr.last; + return Row( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Column( + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.center, + children: [ + Container( + margin: + const EdgeInsets.symmetric( + vertical: 4), + width: 10, + height: 10, + decoration: BoxDecoration( + color: TColor.secondaryColor1 + .withOpacity(0.5), + borderRadius: + BorderRadius.circular(5), + ), + ), + if (!isLast) + DottedDashedLine( + height: media.width * 0.078, + width: 0, + dashColor: TColor + .secondaryColor1 + .withOpacity(0.5), + axis: Axis.vertical) + ], + ), + const SizedBox( + width: 10, + ), + Column( + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Text( + wObj["title"].toString(), + style: TextStyle( + color: TColor.gray, + fontSize: 10, + ), + ), + ShaderMask( + blendMode: BlendMode.srcIn, + shaderCallback: (bounds) { + return LinearGradient( + colors: + TColor.secondaryG, + begin: Alignment + .centerLeft, + end: Alignment + .centerRight) + .createShader(Rect.fromLTRB( + 0, + 0, + bounds.width, + bounds.height)); + }, + child: Text( + wObj["subtitle"].toString(), + style: TextStyle( + color: TColor.white + .withOpacity(0.7), + fontSize: 12), + ), + ), + ], + ) + ], + ); + }).toList(), + ) + ], + )) + ], + ), + ), + ), + SizedBox( + width: media.width * 0.05, + ), + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Container( + width: double.maxFinite, + height: media.width * 0.45, + padding: const EdgeInsets.symmetric( + vertical: 25, horizontal: 20), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(25), + boxShadow: const [ + BoxShadow(color: Colors.black12, blurRadius: 2) + ]), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Graph 4", + style: TextStyle( + color: TColor.black, + fontSize: 12, + fontWeight: FontWeight.w700), + ), + ShaderMask( + blendMode: BlendMode.srcIn, + shaderCallback: (bounds) { + return LinearGradient( + colors: TColor.primaryG, + begin: Alignment.centerLeft, + end: Alignment.centerRight) + .createShader(Rect.fromLTRB( + 0, 0, bounds.width, bounds.height)); + }, + child: Text( + "durée", + style: TextStyle( + color: TColor.white.withOpacity(0.7), + fontWeight: FontWeight.w700, + fontSize: 14), + ), + ), + const Spacer(), + Image.asset("assets/img/sleep_graph.png", + width: double.maxFinite, + height: 80, + fit: BoxFit.fitWidth) + ]), + ), + SizedBox( + height: media.width * 0.05, + ), + Container( + width: double.maxFinite, + height: media.width * 0.45, + padding: const EdgeInsets.symmetric( + vertical: 25, horizontal: 20), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(25), + boxShadow: const [ + BoxShadow(color: Colors.black12, blurRadius: 2) + ]), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Calories", + style: TextStyle( + color: TColor.black, + fontSize: 12, + fontWeight: FontWeight.w700), + ), + ShaderMask( + blendMode: BlendMode.srcIn, + shaderCallback: (bounds) { + return LinearGradient( + colors: TColor.primaryG, + begin: Alignment.centerLeft, + end: Alignment.centerRight) + .createShader(Rect.fromLTRB( + 0, 0, bounds.width, bounds.height)); + }, + child: Text( + "760 kCal", + style: TextStyle( + color: TColor.white.withOpacity(0.7), + fontWeight: FontWeight.w700, + fontSize: 14), + ), + ), + const Spacer(), + Container( + alignment: Alignment.center, + child: SizedBox( + width: media.width * 0.2, + height: media.width * 0.2, + child: Stack( + alignment: Alignment.center, + children: [ + Container( + width: media.width * 0.15, + height: media.width * 0.15, + alignment: Alignment.center, + decoration: BoxDecoration( + gradient: LinearGradient( + colors: TColor.primaryG), + borderRadius: BorderRadius.circular( + media.width * 0.075), + ), + child: FittedBox( + child: Text( + "230kCal\nrestantes", + textAlign: TextAlign.center, + style: TextStyle( + color: TColor.white, + fontSize: 11), + ), + ), + ), + SimpleCircularProgressBar( + progressStrokeWidth: 10, + backStrokeWidth: 10, + progressColors: TColor.primaryG, + backColor: Colors.grey.shade100, + valueNotifier: ValueNotifier(50), + startAngle: -180, + ), + ], + ), + ), + ) + ]), + ), + ], + )) + ], + ), + SizedBox( + height: media.width * 0.1, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "graph 5", + style: TextStyle( + color: TColor.black, + fontSize: 16, + fontWeight: FontWeight.w700), + ), + Container( + height: 30, + padding: const EdgeInsets.symmetric(horizontal: 8), + decoration: BoxDecoration( + gradient: LinearGradient(colors: TColor.primaryG), + borderRadius: BorderRadius.circular(15), + ), + child: DropdownButtonHideUnderline( + child: DropdownButton( + items: ["Semaine", "Mois"] + .map((name) => DropdownMenuItem( + value: name, + child: Text( + name, + style: TextStyle( + color: TColor.gray, fontSize: 14), + ), + )) + .toList(), + onChanged: (value) {}, + icon: Icon(Icons.expand_more, color: TColor.white), + hint: Text( + "Semaine", + textAlign: TextAlign.center, + style: + TextStyle(color: TColor.white, fontSize: 12), + ), + ), + )), + ], + ), + SizedBox( + height: media.width * 0.05, + ), + Container( + padding: const EdgeInsets.only(left: 15), + height: media.width * 0.5, + width: double.maxFinite, + child: LineChart( + LineChartData( + showingTooltipIndicators: + showingTooltipOnSpots.map((index) { + return ShowingTooltipIndicators([ + LineBarSpot( + tooltipsOnBar, + lineBarsData.indexOf(tooltipsOnBar), + tooltipsOnBar.spots[index], + ), + ]); + }).toList(), + lineTouchData: LineTouchData( + enabled: true, + handleBuiltInTouches: false, + touchCallback: (FlTouchEvent event, + LineTouchResponse? response) { + if (response == null || + response.lineBarSpots == null) { + return; + } + if (event is FlTapUpEvent) { + final spotIndex = + response.lineBarSpots!.first.spotIndex; + showingTooltipOnSpots.clear(); + setState(() { + showingTooltipOnSpots.add(spotIndex); + }); + } + }, + mouseCursorResolver: (FlTouchEvent event, + LineTouchResponse? response) { + if (response == null || + response.lineBarSpots == null) { + return SystemMouseCursors.basic; + } + return SystemMouseCursors.click; + }, + getTouchedSpotIndicator: (LineChartBarData barData, + List spotIndexes) { + return spotIndexes.map((index) { + return TouchedSpotIndicatorData( + FlLine( + color: Colors.transparent, + ), + FlDotData( + show: true, + getDotPainter: + (spot, percent, barData, index) => + FlDotCirclePainter( + radius: 3, + color: Colors.white, + strokeWidth: 3, + strokeColor: TColor.secondaryColor1, + ), + ), + ); + }).toList(); + }, + touchTooltipData: LineTouchTooltipData( + tooltipBgColor: TColor.secondaryColor1, + tooltipRoundedRadius: 20, + getTooltipItems: (List lineBarsSpot) { + return lineBarsSpot.map((lineBarSpot) { + return LineTooltipItem( + "il y a ${lineBarSpot.x.toInt()} minutes", + const TextStyle( + color: Colors.white, + fontSize: 10, + fontWeight: FontWeight.bold, + ), + ); + }).toList(); + }, + ), + ), + lineBarsData: lineBarsData1, + minY: -0.5, + maxY: 110, + titlesData: FlTitlesData( + show: true, + leftTitles: AxisTitles(), + topTitles: AxisTitles(), + bottomTitles: AxisTitles( + sideTitles: bottomTitles, + ), + rightTitles: AxisTitles( + sideTitles: rightTitles, + )), + gridData: FlGridData( + show: true, + drawHorizontalLine: true, + horizontalInterval: 25, + drawVerticalLine: false, + getDrawingHorizontalLine: (value) { + return FlLine( + color: TColor.gray.withOpacity(0.15), + strokeWidth: 2, + ); + }, + ), + borderData: FlBorderData( + show: true, + border: Border.all( + color: Colors.transparent, + ), + ), + ), + )), + SizedBox( + height: media.width * 0.05, + ), + SizedBox( + height: media.width * 0.1, + ), + ], + ), + ), + ), + ), + ); + } + + void updateChartData(List newData) { + setState(() { + allSpots = newData; + }); + } + + List showingSections() { + return List.generate( + 2, + (i) { + var color0 = TColor.secondaryColor1; + + switch (i) { + case 0: + return PieChartSectionData( + color: color0, + value: 33, + title: '', + radius: 55, + titlePositionPercentageOffset: 0.55, + badgeWidget: const Text( + "20,1", + style: TextStyle( + color: Colors.white, + fontSize: 12, + fontWeight: FontWeight.w700), + )); + case 1: + return PieChartSectionData( + color: Colors.white, + value: 75, + title: '', + radius: 45, + titlePositionPercentageOffset: 0.55, + ); + + default: + throw Error(); + } + }, + ); + } + + LineTouchData get lineTouchData1 => LineTouchData( + handleBuiltInTouches: true, + touchTooltipData: LineTouchTooltipData( + tooltipBgColor: Colors.blueGrey.withOpacity(0.8), + ), + ); + + List get lineBarsData1 => [ + lineChartBarData1_1, + lineChartBarData1_2, + ]; + + LineChartBarData get lineChartBarData1_1 => LineChartBarData( + isCurved: true, + gradient: LinearGradient(colors: [ + TColor.primaryColor2.withOpacity(0.5), + TColor.primaryColor1.withOpacity(0.5), + ]), + barWidth: 4, + isStrokeCapRound: true, + dotData: FlDotData(show: false), + belowBarData: BarAreaData(show: false), + spots: const [ + FlSpot(1, 35), + FlSpot(2, 70), + FlSpot(3, 40), + FlSpot(4, 80), + FlSpot(5, 25), + FlSpot(6, 70), + FlSpot(7, 35), + ], + ); + + LineChartBarData get lineChartBarData1_2 => LineChartBarData( + isCurved: true, + gradient: LinearGradient(colors: [ + TColor.secondaryColor2.withOpacity(0.5), + TColor.secondaryColor1.withOpacity(0.5), + ]), + barWidth: 2, + isStrokeCapRound: true, + dotData: FlDotData(show: false), + belowBarData: BarAreaData( + show: false, + ), + spots: const [ + FlSpot(1, 80), + FlSpot(2, 50), + FlSpot(3, 90), + FlSpot(4, 40), + FlSpot(5, 80), + FlSpot(6, 35), + FlSpot(7, 60), + ], + ); + + SideTitles get rightTitles => SideTitles( + getTitlesWidget: rightTitleWidgets, + showTitles: true, + interval: 20, + reservedSize: 40, + ); + + Widget rightTitleWidgets(double value, TitleMeta meta) { + String text; + switch (value.toInt()) { + case 0: + text = '0%'; + break; + case 20: + text = '20%'; + break; + case 40: + text = '40%'; + break; + case 60: + text = '60%'; + break; + case 80: + text = '80%'; + break; + case 100: + text = '100%'; + break; + default: + return Container(); + } + + return Text(text, + style: TextStyle( + color: TColor.gray, + fontSize: 12, + ), + textAlign: TextAlign.center); + } + + SideTitles get bottomTitles => SideTitles( + showTitles: true, + reservedSize: 32, + interval: 1, + getTitlesWidget: bottomTitleWidgets, + ); + + Widget bottomTitleWidgets(double value, TitleMeta meta) { + var style = TextStyle( + color: TColor.gray, + fontSize: 12, + ); + Widget text; + switch (value.toInt()) { + case 1: + text = Text('Dim', style: style); + break; + case 2: + text = Text('Lun', style: style); + break; + case 3: + text = Text('Mar', style: style); + break; + case 4: + text = Text('Mer', style: style); + break; + case 5: + text = Text('Jeu', style: style); + break; + case 6: + text = Text('Ven', style: style); + break; + case 7: + text = Text('Sam', style: style); + break; + default: + text = Text('', style: style); + break; + } + + return SideTitleWidget( + axisSide: meta.axisSide, + space: 10, + child: text, + ); + } +} diff --git a/lib/View/home/web/web_homeview.dart b/lib/View/home/web/web_homeview.dart new file mode 100644 index 0000000..85f360c --- /dev/null +++ b/lib/View/home/web/web_homeview.dart @@ -0,0 +1,1070 @@ +import 'package:dotted_dashed_line/dotted_dashed_line.dart'; +import 'package:fl_chart/fl_chart.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:simple_animation_progress_bar/simple_animation_progress_bar.dart'; +import 'package:simple_circular_progress_bar/simple_circular_progress_bar.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/round_button.dart'; +import 'package:smartfit_app_mobile/view/home/activity_tracker.dart'; +import 'package:smartfit_app_mobile/view/home/notification_view.dart'; + +class WebHomeView extends StatefulWidget { + const WebHomeView({super.key}); + + @override + State createState() => _WebHomeView(); +} + +class _WebHomeView extends State { + List lastWorkoutArr = [ + { + "name": "Full Body Workout", + "image": "assets/img/Workout1.png", + "kcal": "180", + "time": "20", + "progress": 0.3 + }, + { + "name": "Lower Body Workout", + "image": "assets/img/Workout2.png", + "kcal": "200", + "time": "30", + "progress": 0.4 + }, + { + "name": "Ab Workout", + "image": "assets/img/Workout3.png", + "kcal": "300", + "time": "40", + "progress": 0.7 + }, + ]; + List showingTooltipOnSpots = [0]; + + List allSpots = [FlSpot(0, 20)]; + + List waterArr = [ + {"title": "6am - 8am", "subtitle": "600ml"}, + {"title": "9am - 11am", "subtitle": "500ml"}, + {"title": "11am - 2pm", "subtitle": "1000ml"}, + {"title": "2pm - 4pm", "subtitle": "700ml"}, + {"title": "4pm - now", "subtitle": "900ml"}, + ]; + + @override + Widget build(BuildContext context) { + var media = MediaQuery.of(context).size; + User user = context.watch(); + + final lineBarsData = [ + LineChartBarData( + showingIndicators: showingTooltipOnSpots, + spots: allSpots, + isCurved: false, + barWidth: 2, + belowBarData: BarAreaData( + show: true, + gradient: LinearGradient(colors: [ + TColor.secondaryColor1.withOpacity(0.4), + TColor.secondaryColor2.withOpacity(0.1), + ], begin: Alignment.topCenter, end: Alignment.bottomCenter), + ), + dotData: FlDotData(show: false), + gradient: LinearGradient( + colors: TColor.secondaryG, + ), + ), + ]; + + final tooltipsOnBar = lineBarsData[0]; + + return Scaffold( + backgroundColor: TColor.white, + body: SingleChildScrollView( + child: SafeArea( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 15), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Bienvenue,", + style: TextStyle(color: TColor.gray, fontSize: 12), + ), + Text( + user.email, + style: TextStyle( + color: TColor.black, + fontSize: 20, + fontWeight: FontWeight.w700), + ), + ], + ), + IconButton( + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const NotificationView(), + ), + ); + }, + icon: Image.asset( + "assets/img/notification_active.png", + width: 25, + height: 25, + fit: BoxFit.fitHeight, + )) + ], + ), + SizedBox( + height: media.width * 0.05, + ), + Container( + height: media.width * 0.4, + decoration: BoxDecoration( + gradient: LinearGradient(colors: TColor.primaryG), + borderRadius: BorderRadius.circular(media.width * 0.075)), + child: Stack(alignment: Alignment.center, children: [ + Image.asset( + "assets/img/bg_dots.png", + height: media.width * 0.4, + width: double.maxFinite, + fit: BoxFit.fitHeight, + ), + Padding( + padding: const EdgeInsets.symmetric( + vertical: 25, horizontal: 25), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Graph 1", + style: TextStyle( + color: TColor.white, + fontSize: 14, + fontWeight: FontWeight.w700), + ), + Text( + "Sous titre 1", + style: TextStyle( + color: TColor.white.withOpacity(0.7), + fontSize: 12), + ), + SizedBox( + height: media.width * 0.05, + ), + SizedBox( + width: 120, + height: 35, + child: RoundButton( + title: "Voir plus", + type: RoundButtonType.bgSGradient, + fontSize: 12, + fontWeight: FontWeight.w400, + onPressed: () {})) + ], + ), + AspectRatio( + aspectRatio: 1, + child: PieChart( + PieChartData( + pieTouchData: PieTouchData( + touchCallback: + (FlTouchEvent event, pieTouchResponse) {}, + ), + startDegreeOffset: 250, + borderData: FlBorderData( + show: false, + ), + sectionsSpace: 1, + centerSpaceRadius: 0, + sections: showingSections(), + ), + ), + ), + ], + ), + ) + ]), + ), + SizedBox( + height: media.width * 0.05, + ), + Container( + padding: + const EdgeInsets.symmetric(vertical: 15, horizontal: 15), + decoration: BoxDecoration( + color: TColor.primaryColor2.withOpacity(0.3), + borderRadius: BorderRadius.circular(15), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "Suivi d'activité", + style: TextStyle( + color: TColor.black, + fontSize: 14, + fontWeight: FontWeight.w700), + ), + SizedBox( + width: 70, + height: 25, + child: RoundButton( + title: "Voir", + type: RoundButtonType.bgGradient, + fontSize: 12, + fontWeight: FontWeight.w400, + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + const ActivityTrackerView(), + ), + ); + }, + ), + ) + ], + ), + ), + SizedBox( + height: media.width * 0.05, + ), + Text( + "Status d'activité", + style: TextStyle( + color: TColor.black, + fontSize: 16, + fontWeight: FontWeight.w700), + ), + SizedBox( + height: media.width * 0.02, + ), + ClipRRect( + borderRadius: BorderRadius.circular(25), + child: Container( + height: media.width * 0.4, + width: double.maxFinite, + decoration: BoxDecoration( + color: TColor.primaryColor2.withOpacity(0.3), + borderRadius: BorderRadius.circular(25), + ), + child: Stack( + alignment: Alignment.topLeft, + children: [ + Padding( + padding: const EdgeInsets.symmetric( + vertical: 20, horizontal: 20), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Graph 2 ( rhythme cardiaque )", + style: TextStyle( + color: TColor.black, + fontSize: 16, + fontWeight: FontWeight.w700), + ), + ShaderMask( + blendMode: BlendMode.srcIn, + shaderCallback: (bounds) { + return LinearGradient( + colors: TColor.primaryG, + begin: Alignment.centerLeft, + end: Alignment.centerRight) + .createShader(Rect.fromLTRB( + 0, 0, bounds.width, bounds.height)); + }, + child: Text( + "78 BPM", + style: TextStyle( + color: + TColor.primaryColor1.withOpacity(0.7), + fontWeight: FontWeight.w700, + fontSize: 18), + ), + ), + ], + ), + ), + LineChart( + LineChartData( + showingTooltipIndicators: + showingTooltipOnSpots.map((index) { + return ShowingTooltipIndicators([ + LineBarSpot( + tooltipsOnBar, + lineBarsData.indexOf(tooltipsOnBar), + tooltipsOnBar.spots[index], + ), + ]); + }).toList(), + lineTouchData: LineTouchData( + enabled: true, + handleBuiltInTouches: false, + touchCallback: (FlTouchEvent event, + LineTouchResponse? response) { + if (response == null || + response.lineBarSpots == null) { + return; + } + if (event is FlTapUpEvent) { + final spotIndex = + response.lineBarSpots!.first.spotIndex; + showingTooltipOnSpots.clear(); + setState(() { + showingTooltipOnSpots.add(spotIndex); + }); + } + }, + mouseCursorResolver: (FlTouchEvent event, + LineTouchResponse? response) { + if (response == null || + response.lineBarSpots == null) { + return SystemMouseCursors.basic; + } + return SystemMouseCursors.click; + }, + getTouchedSpotIndicator: + (LineChartBarData barData, + List spotIndexes) { + return spotIndexes.map((index) { + return TouchedSpotIndicatorData( + FlLine( + color: TColor.secondaryColor1, + ), + FlDotData( + show: true, + getDotPainter: + (spot, percent, barData, index) => + FlDotCirclePainter( + radius: 3, + color: Colors.white, + strokeWidth: 3, + strokeColor: TColor.secondaryColor1, + ), + ), + ); + }).toList(); + }, + touchTooltipData: LineTouchTooltipData( + tooltipBgColor: TColor.secondaryColor1, + tooltipRoundedRadius: 20, + getTooltipItems: + (List lineBarsSpot) { + return lineBarsSpot.map((lineBarSpot) { + return LineTooltipItem( + "il y a ${lineBarSpot.x.toInt()} minutes", + const TextStyle( + color: Colors.white, + fontSize: 10, + fontWeight: FontWeight.bold, + ), + ); + }).toList(); + }, + ), + ), + lineBarsData: lineBarsData, + minY: 0, + maxY: 130, + titlesData: FlTitlesData( + show: false, + ), + gridData: FlGridData(show: false), + borderData: FlBorderData( + show: true, + border: Border.all( + color: Colors.transparent, + ), + ), + ), + ) + ], + ), + ), + ), + SizedBox( + height: media.width * 0.05, + ), + Row( + children: [ + Expanded( + child: Container( + height: media.width * 0.95, + padding: const EdgeInsets.symmetric( + vertical: 25, horizontal: 20), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(25), + boxShadow: const [ + BoxShadow(color: Colors.black12, blurRadius: 2) + ]), + child: Row( + children: [ + SimpleAnimationProgressBar( + height: media.width * 0.85, + width: media.width * 0.07, + backgroundColor: Colors.grey.shade100, + foregrondColor: Colors.purple, + ratio: 0.5, + direction: Axis.vertical, + curve: Curves.fastLinearToSlowEaseIn, + duration: const Duration(seconds: 3), + borderRadius: BorderRadius.circular(15), + gradientColor: LinearGradient( + colors: TColor.primaryG, + begin: Alignment.bottomCenter, + end: Alignment.topCenter), + ), + const SizedBox( + width: 10, + ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Graph 3", + style: TextStyle( + color: TColor.black, + fontSize: 12, + fontWeight: FontWeight.w700), + ), + ShaderMask( + blendMode: BlendMode.srcIn, + shaderCallback: (bounds) { + return LinearGradient( + colors: TColor.primaryG, + begin: Alignment.centerLeft, + end: Alignment.centerRight) + .createShader(Rect.fromLTRB( + 0, 0, bounds.width, bounds.height)); + }, + child: Text( + "ex : objectif", + style: TextStyle( + color: TColor.white.withOpacity(0.7), + fontWeight: FontWeight.w700, + fontSize: 14), + ), + ), + const SizedBox( + height: 10, + ), + Text( + "Mis à jour en temps réel", + style: TextStyle( + color: TColor.gray, + fontSize: 12, + ), + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: waterArr.map((wObj) { + var isLast = wObj == waterArr.last; + return Row( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Column( + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.center, + children: [ + Container( + margin: + const EdgeInsets.symmetric( + vertical: 4), + width: 10, + height: 10, + decoration: BoxDecoration( + color: TColor.secondaryColor1 + .withOpacity(0.5), + borderRadius: + BorderRadius.circular(5), + ), + ), + if (!isLast) + DottedDashedLine( + height: media.width * 0.078, + width: 0, + dashColor: TColor + .secondaryColor1 + .withOpacity(0.5), + axis: Axis.vertical) + ], + ), + const SizedBox( + width: 10, + ), + Column( + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Text( + wObj["title"].toString(), + style: TextStyle( + color: TColor.gray, + fontSize: 10, + ), + ), + ShaderMask( + blendMode: BlendMode.srcIn, + shaderCallback: (bounds) { + return LinearGradient( + colors: + TColor.secondaryG, + begin: Alignment + .centerLeft, + end: Alignment + .centerRight) + .createShader(Rect.fromLTRB( + 0, + 0, + bounds.width, + bounds.height)); + }, + child: Text( + wObj["subtitle"].toString(), + style: TextStyle( + color: TColor.white + .withOpacity(0.7), + fontSize: 12), + ), + ), + ], + ) + ], + ); + }).toList(), + ) + ], + )) + ], + ), + ), + ), + SizedBox( + width: media.width * 0.05, + ), + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Container( + width: double.maxFinite, + height: media.width * 0.45, + padding: const EdgeInsets.symmetric( + vertical: 25, horizontal: 20), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(25), + boxShadow: const [ + BoxShadow(color: Colors.black12, blurRadius: 2) + ]), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Graph 4", + style: TextStyle( + color: TColor.black, + fontSize: 12, + fontWeight: FontWeight.w700), + ), + ShaderMask( + blendMode: BlendMode.srcIn, + shaderCallback: (bounds) { + return LinearGradient( + colors: TColor.primaryG, + begin: Alignment.centerLeft, + end: Alignment.centerRight) + .createShader(Rect.fromLTRB( + 0, 0, bounds.width, bounds.height)); + }, + child: Text( + "durée", + style: TextStyle( + color: TColor.white.withOpacity(0.7), + fontWeight: FontWeight.w700, + fontSize: 14), + ), + ), + const Spacer(), + Image.asset("assets/img/sleep_graph.png", + width: double.maxFinite, + height: 80, + fit: BoxFit.fitWidth) + ]), + ), + SizedBox( + height: media.width * 0.05, + ), + Container( + width: double.maxFinite, + height: media.width * 0.45, + padding: const EdgeInsets.symmetric( + vertical: 25, horizontal: 20), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(25), + boxShadow: const [ + BoxShadow(color: Colors.black12, blurRadius: 2) + ]), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Calories", + style: TextStyle( + color: TColor.black, + fontSize: 12, + fontWeight: FontWeight.w700), + ), + ShaderMask( + blendMode: BlendMode.srcIn, + shaderCallback: (bounds) { + return LinearGradient( + colors: TColor.primaryG, + begin: Alignment.centerLeft, + end: Alignment.centerRight) + .createShader(Rect.fromLTRB( + 0, 0, bounds.width, bounds.height)); + }, + child: Text( + "760 kCal", + style: TextStyle( + color: TColor.white.withOpacity(0.7), + fontWeight: FontWeight.w700, + fontSize: 14), + ), + ), + const Spacer(), + Container( + alignment: Alignment.center, + child: SizedBox( + width: media.width * 0.2, + height: media.width * 0.2, + child: Stack( + alignment: Alignment.center, + children: [ + Container( + width: media.width * 0.15, + height: media.width * 0.15, + alignment: Alignment.center, + decoration: BoxDecoration( + gradient: LinearGradient( + colors: TColor.primaryG), + borderRadius: BorderRadius.circular( + media.width * 0.075), + ), + child: FittedBox( + child: Text( + "230kCal\nrestantes", + textAlign: TextAlign.center, + style: TextStyle( + color: TColor.white, + fontSize: 11), + ), + ), + ), + SimpleCircularProgressBar( + progressStrokeWidth: 10, + backStrokeWidth: 10, + progressColors: TColor.primaryG, + backColor: Colors.grey.shade100, + valueNotifier: ValueNotifier(50), + startAngle: -180, + ), + ], + ), + ), + ) + ]), + ), + ], + )) + ], + ), + SizedBox( + height: media.width * 0.1, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "graph 5", + style: TextStyle( + color: TColor.black, + fontSize: 16, + fontWeight: FontWeight.w700), + ), + Container( + height: 30, + padding: const EdgeInsets.symmetric(horizontal: 8), + decoration: BoxDecoration( + gradient: LinearGradient(colors: TColor.primaryG), + borderRadius: BorderRadius.circular(15), + ), + child: DropdownButtonHideUnderline( + child: DropdownButton( + items: ["Semaine", "Mois"] + .map((name) => DropdownMenuItem( + value: name, + child: Text( + name, + style: TextStyle( + color: TColor.gray, fontSize: 14), + ), + )) + .toList(), + onChanged: (value) {}, + icon: Icon(Icons.expand_more, color: TColor.white), + hint: Text( + "Semaine", + textAlign: TextAlign.center, + style: + TextStyle(color: TColor.white, fontSize: 12), + ), + ), + )), + ], + ), + SizedBox( + height: media.width * 0.05, + ), + Container( + padding: const EdgeInsets.only(left: 15), + height: media.width * 0.5, + width: double.maxFinite, + child: LineChart( + LineChartData( + showingTooltipIndicators: + showingTooltipOnSpots.map((index) { + return ShowingTooltipIndicators([ + LineBarSpot( + tooltipsOnBar, + lineBarsData.indexOf(tooltipsOnBar), + tooltipsOnBar.spots[index], + ), + ]); + }).toList(), + lineTouchData: LineTouchData( + enabled: true, + handleBuiltInTouches: false, + touchCallback: (FlTouchEvent event, + LineTouchResponse? response) { + if (response == null || + response.lineBarSpots == null) { + return; + } + if (event is FlTapUpEvent) { + final spotIndex = + response.lineBarSpots!.first.spotIndex; + showingTooltipOnSpots.clear(); + setState(() { + showingTooltipOnSpots.add(spotIndex); + }); + } + }, + mouseCursorResolver: (FlTouchEvent event, + LineTouchResponse? response) { + if (response == null || + response.lineBarSpots == null) { + return SystemMouseCursors.basic; + } + return SystemMouseCursors.click; + }, + getTouchedSpotIndicator: (LineChartBarData barData, + List spotIndexes) { + return spotIndexes.map((index) { + return TouchedSpotIndicatorData( + FlLine( + color: Colors.transparent, + ), + FlDotData( + show: true, + getDotPainter: + (spot, percent, barData, index) => + FlDotCirclePainter( + radius: 3, + color: Colors.white, + strokeWidth: 3, + strokeColor: TColor.secondaryColor1, + ), + ), + ); + }).toList(); + }, + touchTooltipData: LineTouchTooltipData( + tooltipBgColor: TColor.secondaryColor1, + tooltipRoundedRadius: 20, + getTooltipItems: (List lineBarsSpot) { + return lineBarsSpot.map((lineBarSpot) { + return LineTooltipItem( + "il y a ${lineBarSpot.x.toInt()} minutes", + const TextStyle( + color: Colors.white, + fontSize: 10, + fontWeight: FontWeight.bold, + ), + ); + }).toList(); + }, + ), + ), + lineBarsData: lineBarsData1, + minY: -0.5, + maxY: 110, + titlesData: FlTitlesData( + show: true, + leftTitles: AxisTitles(), + topTitles: AxisTitles(), + bottomTitles: AxisTitles( + sideTitles: bottomTitles, + ), + rightTitles: AxisTitles( + sideTitles: rightTitles, + )), + gridData: FlGridData( + show: true, + drawHorizontalLine: true, + horizontalInterval: 25, + drawVerticalLine: false, + getDrawingHorizontalLine: (value) { + return FlLine( + color: TColor.gray.withOpacity(0.15), + strokeWidth: 2, + ); + }, + ), + borderData: FlBorderData( + show: true, + border: Border.all( + color: Colors.transparent, + ), + ), + ), + )), + SizedBox( + height: media.width * 0.05, + ), + SizedBox( + height: media.width * 0.1, + ), + ], + ), + ), + ), + ), + ); + } + + void updateChartData(List newData) { + setState(() { + allSpots = newData; + }); + } + + List showingSections() { + return List.generate( + 2, + (i) { + var color0 = TColor.secondaryColor1; + + switch (i) { + case 0: + return PieChartSectionData( + color: color0, + value: 33, + title: '', + radius: 55, + titlePositionPercentageOffset: 0.55, + badgeWidget: const Text( + "20,1", + style: TextStyle( + color: Colors.white, + fontSize: 12, + fontWeight: FontWeight.w700), + )); + case 1: + return PieChartSectionData( + color: Colors.white, + value: 75, + title: '', + radius: 45, + titlePositionPercentageOffset: 0.55, + ); + + default: + throw Error(); + } + }, + ); + } + + LineTouchData get lineTouchData1 => LineTouchData( + handleBuiltInTouches: true, + touchTooltipData: LineTouchTooltipData( + tooltipBgColor: Colors.blueGrey.withOpacity(0.8), + ), + ); + + List get lineBarsData1 => [ + lineChartBarData1_1, + lineChartBarData1_2, + ]; + + LineChartBarData get lineChartBarData1_1 => LineChartBarData( + isCurved: true, + gradient: LinearGradient(colors: [ + TColor.primaryColor2.withOpacity(0.5), + TColor.primaryColor1.withOpacity(0.5), + ]), + barWidth: 4, + isStrokeCapRound: true, + dotData: FlDotData(show: false), + belowBarData: BarAreaData(show: false), + spots: const [ + FlSpot(1, 35), + FlSpot(2, 70), + FlSpot(3, 40), + FlSpot(4, 80), + FlSpot(5, 25), + FlSpot(6, 70), + FlSpot(7, 35), + ], + ); + + LineChartBarData get lineChartBarData1_2 => LineChartBarData( + isCurved: true, + gradient: LinearGradient(colors: [ + TColor.secondaryColor2.withOpacity(0.5), + TColor.secondaryColor1.withOpacity(0.5), + ]), + barWidth: 2, + isStrokeCapRound: true, + dotData: FlDotData(show: false), + belowBarData: BarAreaData( + show: false, + ), + spots: const [ + FlSpot(1, 80), + FlSpot(2, 50), + FlSpot(3, 90), + FlSpot(4, 40), + FlSpot(5, 80), + FlSpot(6, 35), + FlSpot(7, 60), + ], + ); + + SideTitles get rightTitles => SideTitles( + getTitlesWidget: rightTitleWidgets, + showTitles: true, + interval: 20, + reservedSize: 40, + ); + + Widget rightTitleWidgets(double value, TitleMeta meta) { + String text; + switch (value.toInt()) { + case 0: + text = '0%'; + break; + case 20: + text = '20%'; + break; + case 40: + text = '40%'; + break; + case 60: + text = '60%'; + break; + case 80: + text = '80%'; + break; + case 100: + text = '100%'; + break; + default: + return Container(); + } + + return Text(text, + style: TextStyle( + color: TColor.gray, + fontSize: 12, + ), + textAlign: TextAlign.center); + } + + SideTitles get bottomTitles => SideTitles( + showTitles: true, + reservedSize: 32, + interval: 1, + getTitlesWidget: bottomTitleWidgets, + ); + + Widget bottomTitleWidgets(double value, TitleMeta meta) { + var style = TextStyle( + color: TColor.gray, + fontSize: 12, + ); + Widget text; + switch (value.toInt()) { + case 1: + text = Text('Dim', style: style); + break; + case 2: + text = Text('Lun', style: style); + break; + case 3: + text = Text('Mar', style: style); + break; + case 4: + text = Text('Mer', style: style); + break; + case 5: + text = Text('Jeu', style: style); + break; + case 6: + text = Text('Ven', style: style); + break; + case 7: + text = Text('Sam', style: style); + break; + default: + text = Text('', style: style); + break; + } + + return SideTitleWidget( + axisSide: meta.axisSide, + space: 10, + child: text, + ); + } +} diff --git a/lib/View/login/Mobile/android_login_view.dart b/lib/View/login/Mobile/android_login_view.dart index c624567..38ab17e 100644 --- a/lib/View/login/Mobile/android_login_view.dart +++ b/lib/View/login/Mobile/android_login_view.dart @@ -1,38 +1,42 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; +import 'package:smartfit_app_mobile/Modele/utile/login_user.dart'; import 'package:smartfit_app_mobile/View/main_tab/main_tab_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:tuple/tuple.dart'; -class AndroidLoginView extends StatelessWidget { - AndroidLoginView( - this._obscureText, - this._errorLogin, - this._msgError, - this._toggle, - this._printMsgError, - this.getUserInfo, - this.checkLoginAndPassword, - this.fillUser, - {super.key}); +class MobileLoginView extends StatefulWidget { + const MobileLoginView({super.key}); - bool _obscureText; - bool _errorLogin; - final String _msgError; + @override + State createState() => _MobileLoginView(); +} + +class _MobileLoginView extends State { + final Login util = Login(); + + bool _obscureText = true; + bool _errorLogin = false; + String _msgError = ""; final controllerTextEmail = TextEditingController(); final controllerTextPassword = TextEditingController(); - // ---- Fonction --- // - final void Function() _toggle; - final Future> Function(String email, String password) - checkLoginAndPassword; - final Future Function(String token) getUserInfo; - final void Function(String msgError) _printMsgError; - final void Function( - BuildContext context, Map map, String token) fillUser; + // Toggles the password show status + void _toggle() { + setState(() { + _obscureText = !_obscureText; + }); + } + + void _printMsgError(String msgError) { + setState(() { + _msgError = msgError; + _errorLogin = true; + }); + } @override Widget build(BuildContext context) { @@ -48,7 +52,7 @@ class AndroidLoginView extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.center, children: [ Text( - "Bienvenue, Android", + "Bienvenue", style: TextStyle(color: TColor.gray, fontSize: 16), ), Text( @@ -114,19 +118,20 @@ class AndroidLoginView extends StatelessWidget { RoundButton( title: "Se connecter", onPressed: () async { - Tuple2 result = await checkLoginAndPassword( - controllerTextEmail.text, - controllerTextPassword.text); + Tuple2 result = + await util.checkLoginAndPassword( + controllerTextEmail.text, + controllerTextPassword.text); if (result.item1 == true) { - Tuple2 infoUser = await getUserInfo(result.item2); + Tuple2 infoUser = await util.getUserInfo(result.item2); if (infoUser.item1 == false) { //print("Erreur - Impossible de récupéré les données de l'utilisateur"); _printMsgError( "Impossible de récupéré les données de l'utilisateur - {$infoUser.item2}"); } else { - fillUser(context, infoUser.item2, result.item2); + util.fillUser(context, infoUser.item2, result.item2); Navigator.push( context, diff --git a/lib/View/login/Mobile/android_signup_view.dart b/lib/View/login/Mobile/android_signup_view.dart new file mode 100644 index 0000000..a503692 --- /dev/null +++ b/lib/View/login/Mobile/android_signup_view.dart @@ -0,0 +1,275 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; +import 'package:smartfit_app_mobile/Modele/utile/signup_user.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:tuple/tuple.dart'; + +class MobileSignUpView extends StatefulWidget { + const MobileSignUpView({super.key}); + + @override + State createState() => _MobileSignUpView(); +} + +class _MobileSignUpView extends State { + final SignUp util = SignUp(); + + bool _obscureText = true; + bool _errorCreateUser = false; + bool _isCheck = false; + String _msgError = ""; + + final controllerTextEmail = TextEditingController(); + final controllerUsername = TextEditingController(); + final controllerTextPassword = TextEditingController(); + + // Toggles the password show status + void _toggle() { + setState(() { + _obscureText = !_obscureText; + }); + } + + void _printMsgError(String msgError) { + setState(() { + _msgError = msgError; + _errorCreateUser = true; + }); + } + + void _check() { + setState(() { + _isCheck = !_isCheck; + }); + } + + @override + Widget build(BuildContext context) { + var media = MediaQuery.of(context).size; + return Scaffold( + backgroundColor: TColor.white, + body: SingleChildScrollView( + child: SafeArea( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + "Bienvenue,", + style: TextStyle(color: TColor.gray, fontSize: 16), + ), + Text( + "Créer un compte", + style: TextStyle( + color: TColor.black, + fontSize: 20, + fontWeight: FontWeight.w700), + ), + SizedBox( + height: media.width * 0.05, + ), + RoundTextField( + hitText: "Prénom", + icon: "assets/img/user_text.svg", + controller: controllerUsername, + ), + SizedBox( + height: media.width * 0.04, + ), + RoundTextField( + hitText: "Email", + icon: "assets/img/email.svg", + keyboardType: TextInputType.emailAddress, + controller: controllerTextEmail, + ), + SizedBox( + height: media.width * 0.04, + ), + RoundTextField( + hitText: "Mot de passe", + icon: "assets/img/lock.svg", + obscureText: _obscureText, + controller: controllerTextPassword, + rigtIcon: TextButton( + onPressed: _toggle, + child: Container( + alignment: Alignment.center, + width: 20, + height: 20, + child: SvgPicture.asset( + "assets/img/show_password.svg", + width: 20, + height: 20, + fit: BoxFit.contain, + ))), + ), + Row( + // crossAxisAlignment: CrossAxisAlignment., + children: [ + IconButton( + onPressed: () { + _check(); + }, + icon: Icon( + _isCheck + ? Icons.check_box_outlined + : Icons.check_box_outline_blank_outlined, + color: TColor.gray, + size: 20, + ), + ), + Padding( + padding: const EdgeInsets.only(top: 8), + child: Text( + "En continuant, vous acceptez notre Politique de\nconfidentialité et nos Conditions d'utilisation.", + style: TextStyle(color: TColor.gray, fontSize: 10), + ), + ) + ], + ), + SizedBox( + height: media.width * 0.05, + ), + Visibility( + visible: _errorCreateUser, + child: Text("Error - $_msgError", + style: TextStyle(color: TColor.red))), + SizedBox( + height: media.width * 0.4, + ), + RoundButton( + title: "Créer un compte", + onPressed: () async { + Tuple2 result = await util.createUser( + controllerTextEmail.text, + controllerUsername.text, + controllerTextPassword.text); + if (result.item1) { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const LoginView())); + } else { + _printMsgError(result.item2); + } + }), + SizedBox( + height: media.width * 0.04, + ), + Row( + // crossAxisAlignment: CrossAxisAlignment., + children: [ + Expanded( + child: Container( + height: 1, + color: TColor.gray.withOpacity(0.5), + )), + Text( + " Ou ", + style: TextStyle(color: TColor.black, fontSize: 12), + ), + Expanded( + child: Container( + height: 1, + color: TColor.gray.withOpacity(0.5), + )), + ], + ), + SizedBox( + height: media.width * 0.04, + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + GestureDetector( + onTap: () {}, + child: Container( + width: 50, + height: 50, + alignment: Alignment.center, + decoration: BoxDecoration( + color: TColor.white, + border: Border.all( + width: 1, + color: TColor.gray.withOpacity(0.4), + ), + borderRadius: BorderRadius.circular(15), + ), + child: Image.asset( + "assets/img/google.png", + width: 20, + height: 20, + ), + ), + ), + SizedBox( + width: media.width * 0.04, + ), + GestureDetector( + onTap: () {}, + child: Container( + width: 50, + height: 50, + alignment: Alignment.center, + decoration: BoxDecoration( + color: TColor.white, + border: Border.all( + width: 1, + color: TColor.gray.withOpacity(0.4), + ), + borderRadius: BorderRadius.circular(15), + ), + child: Image.asset( + "assets/img/suunto.png", + width: 35, + height: 35, + ), + ), + ) + ], + ), + SizedBox( + height: media.width * 0.04, + ), + TextButton( + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const LoginView())); + }, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + "Vous avez déjà un compte ? ", + style: TextStyle( + color: TColor.black, + fontSize: 14, + ), + ), + Text( + "Se connecter", + style: TextStyle( + color: TColor.black, + fontSize: 14, + fontWeight: FontWeight.w700), + ) + ], + ), + ), + SizedBox( + height: media.width * 0.04, + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/View/login/login_view.dart b/lib/View/login/login_view.dart index 1563917..1290373 100644 --- a/lib/View/login/login_view.dart +++ b/lib/View/login/login_view.dart @@ -1,32 +1,7 @@ -import 'dart:convert'; -import 'dart:io'; -import 'package:crypto/crypto.dart'; -import 'package:flutter/foundation.dart'; -import 'package:flutter_svg/svg.dart'; -import 'package:provider/provider.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/Modele/user.dart'; +import 'package:responsive_builder/responsive_builder.dart'; import 'package:smartfit_app_mobile/View/login/Mobile/android_login_view.dart'; import 'package:smartfit_app_mobile/View/login/web/web_login_view.dart'; import 'package:flutter/material.dart'; -import 'package:tuple/tuple.dart'; - -String getPlatforme() { - if (kIsWeb) { - return "Web"; - } - if (Platform.isAndroid) { - return "Android"; - } - if (Platform.isWindows) { - return "Windows"; - } - if (Platform.isMacOS) { - return "MacOS"; - } - return "Null"; -} class LoginView extends StatefulWidget { const LoginView({super.key}); @@ -36,54 +11,10 @@ class LoginView extends StatefulWidget { } class _LoginViewState extends State { - bool _obscureText = true; - String _msgError = ""; - bool _errorLogin = false; - IDataStrategy api = RequestApi(); - String platforme = getPlatforme(); - - Future> checkLoginAndPassword( - String email, String password) async { - Tuple2 result = await api.connexion( - email, sha256.convert(utf8.encode(password)).toString()); - return result; - } - - 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); - } - - 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); - } - - // Toggles the password show status - void _toggle() { - setState(() { - _obscureText = !_obscureText; - }); - } - - void _printMsgError(String msgError) { - _msgError = msgError; - _errorLogin = true; - } - @override Widget build(BuildContext context) { - if (platforme == "Android") { - return AndroidLoginView(_obscureText, _errorLogin, _msgError, _toggle, - _printMsgError, getUserInfo, checkLoginAndPassword, fillUser); - } else { - return WebLoginView(_obscureText, _errorLogin, _msgError, _toggle, - _printMsgError, getUserInfo, checkLoginAndPassword, fillUser); - } + return ScreenTypeLayout.builder( + mobile: (_) => const MobileLoginView(), + desktop: (_) => const WebLoginView()); } } diff --git a/lib/View/login/signup_view.dart b/lib/View/login/signup_view.dart index 7d0aab5..b4630df 100644 --- a/lib/View/login/signup_view.dart +++ b/lib/View/login/signup_view.dart @@ -1,14 +1,7 @@ -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:responsive_builder/responsive_builder.dart'; +import 'package:smartfit_app_mobile/View/login/Mobile/android_signup_view.dart'; import 'package:flutter/material.dart'; -import 'package:tuple/tuple.dart'; +import 'package:smartfit_app_mobile/View/login/web/web_signup_view.dart'; class SignUpView extends StatefulWidget { const SignUpView({super.key}); @@ -18,255 +11,11 @@ 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(); - final controllerTextUsername = TextEditingController(); - final controllerTextPassword = TextEditingController(); - - Future> createUser() async { - return await api.postUser( - controllerTextEmail.text, - sha256.convert(utf8.encode(controllerTextPassword.text)).toString(), - controllerTextUsername.text); - } - - // Toggles the password show status - void _toggle() { - setState(() { - _obscureText = !_obscureText; - }); - } - @override Widget build(BuildContext context) { - var media = MediaQuery.of(context).size; - return Scaffold( - backgroundColor: TColor.white, - body: SingleChildScrollView( - child: SafeArea( - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 20), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - "Bienvenue,", - style: TextStyle(color: TColor.gray, fontSize: 16), - ), - Text( - "Créer un compte", - style: TextStyle( - color: TColor.black, - fontSize: 20, - fontWeight: FontWeight.w700), - ), - SizedBox( - height: media.width * 0.05, - ), - const RoundTextField( - hitText: "Prénom", - icon: "assets/img/user_text.svg", - ), - SizedBox( - height: media.width * 0.04, - ), - RoundTextField( - hitText: "Email", - icon: "assets/img/email.svg", - keyboardType: TextInputType.emailAddress, - controller: controllerTextEmail, - ), - SizedBox( - height: media.width * 0.04, - ), - RoundTextField( - hitText: "Mot de passe", - icon: "assets/img/lock.svg", - obscureText: _obscureText, - controller: controllerTextPassword, - rigtIcon: TextButton( - onPressed: _toggle, - child: Container( - alignment: Alignment.center, - width: 20, - height: 20, - child: SvgPicture.asset( - "assets/img/show_password.svg", - width: 20, - height: 20, - fit: BoxFit.contain, - ))), - ), - Row( - // crossAxisAlignment: CrossAxisAlignment., - children: [ - IconButton( - onPressed: () { - setState(() { - isCheck = !isCheck; - }); - }, - icon: Icon( - isCheck - ? Icons.check_box_outlined - : Icons.check_box_outline_blank_outlined, - color: TColor.gray, - size: 20, - ), - ), - Padding( - padding: const EdgeInsets.only(top: 8), - child: Text( - "En continuant, vous acceptez notre Politique de\nconfidentialité et nos Conditions d'utilisation.", - style: TextStyle(color: TColor.gray, fontSize: 10), - ), - ) - ], - ), - SizedBox( - height: media.width * 0.05, - ), - Visibility( - visible: _errorCreateUser, - child: Text("Error - $_msgError", - style: TextStyle(color: TColor.red))), - SizedBox( - height: media.width * 0.4, - ), - RoundButton( - title: "Créer un compte", - onPressed: () async { - Tuple2 result = await createUser(); - if (result.item1) { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => const LoginView())); - } else { - setState(() { - _errorCreateUser = true; - _msgError = result.item2; - }); - } - }), - SizedBox( - height: media.width * 0.04, - ), - Row( - // crossAxisAlignment: CrossAxisAlignment., - children: [ - Expanded( - child: Container( - height: 1, - color: TColor.gray.withOpacity(0.5), - )), - Text( - " Ou ", - style: TextStyle(color: TColor.black, fontSize: 12), - ), - Expanded( - child: Container( - height: 1, - color: TColor.gray.withOpacity(0.5), - )), - ], - ), - SizedBox( - height: media.width * 0.04, - ), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - GestureDetector( - onTap: () {}, - child: Container( - width: 50, - height: 50, - alignment: Alignment.center, - decoration: BoxDecoration( - color: TColor.white, - border: Border.all( - width: 1, - color: TColor.gray.withOpacity(0.4), - ), - borderRadius: BorderRadius.circular(15), - ), - child: Image.asset( - "assets/img/google.png", - width: 20, - height: 20, - ), - ), - ), - SizedBox( - width: media.width * 0.04, - ), - GestureDetector( - onTap: () {}, - child: Container( - width: 50, - height: 50, - alignment: Alignment.center, - decoration: BoxDecoration( - color: TColor.white, - border: Border.all( - width: 1, - color: TColor.gray.withOpacity(0.4), - ), - borderRadius: BorderRadius.circular(15), - ), - child: Image.asset( - "assets/img/suunto.png", - width: 35, - height: 35, - ), - ), - ) - ], - ), - SizedBox( - height: media.width * 0.04, - ), - TextButton( - onPressed: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => const LoginView())); - }, - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - Text( - "Vous avez déjà un compte ? ", - style: TextStyle( - color: TColor.black, - fontSize: 14, - ), - ), - Text( - "Se connecter", - style: TextStyle( - color: TColor.black, - fontSize: 14, - fontWeight: FontWeight.w700), - ) - ], - ), - ), - SizedBox( - height: media.width * 0.04, - ), - ], - ), - ), - ), - ), + return ScreenTypeLayout.builder( + mobile: (_) => const MobileSignUpView(), + desktop: (_) => const WebSignUpView(), ); } } diff --git a/lib/View/login/web/web_login_view.dart b/lib/View/login/web/web_login_view.dart index d5eedf6..8ee22cd 100644 --- a/lib/View/login/web/web_login_view.dart +++ b/lib/View/login/web/web_login_view.dart @@ -1,38 +1,43 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; +import 'package:provider/provider.dart'; +import 'package:smartfit_app_mobile/Modele/user.dart'; +import 'package:smartfit_app_mobile/Modele/utile/login_user.dart'; import 'package:smartfit_app_mobile/View/main_tab/main_tab_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:tuple/tuple.dart'; -class WebLoginView extends StatelessWidget { - WebLoginView( - this._obscureText, - this._errorLogin, - this._msgError, - this._toggle, - this._printMsgError, - this.getUserInfo, - this.checkLoginAndPassword, - this.fillUser, - {super.key}); +class WebLoginView extends StatefulWidget { + const WebLoginView({super.key}); - bool _obscureText; - bool _errorLogin; - final String _msgError; + @override + State createState() => _WebLoginView(); +} + +class _WebLoginView extends State { + final Login util = Login(); + bool _obscureText = true; + bool _errorLogin = false; + String _msgError = ""; final controllerTextEmail = TextEditingController(); final controllerTextPassword = TextEditingController(); - // ---- Fonction --- // - final void Function() _toggle; - final Future> Function(String email, String password) - checkLoginAndPassword; - final Future Function(String token) getUserInfo; - final void Function(String msgError) _printMsgError; - final void Function( - BuildContext context, Map map, String token) fillUser; + // Toggles the password show status + void _toggle() { + setState(() { + _obscureText = !_obscureText; + }); + } + + void _printMsgError(String msgError) { + setState(() { + _msgError = msgError; + _errorLogin = true; + }); + } @override Widget build(BuildContext context) { @@ -48,7 +53,7 @@ class WebLoginView extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.center, children: [ Text( - "Bienvenue, Web", + "Bienvenue", style: TextStyle(color: TColor.gray, fontSize: 16), ), Text( @@ -114,20 +119,20 @@ class WebLoginView extends StatelessWidget { RoundButton( title: "Se connecter", onPressed: () async { - Tuple2 result = await checkLoginAndPassword( - controllerTextEmail.text, - controllerTextPassword.text); + Tuple2 result = + await util.checkLoginAndPassword( + controllerTextEmail.text, + controllerTextPassword.text); if (result.item1 == true) { - Tuple2 infoUser = await getUserInfo(result.item2); + Tuple2 infoUser = await util.getUserInfo(result.item2); if (infoUser.item1 == false) { //print("Erreur - Impossible de récupéré les données de l'utilisateur"); _printMsgError( "Impossible de récupéré les données de l'utilisateur - {$infoUser.item2}"); } else { - fillUser(context, infoUser.item2, result.item2); - + util.fillUser(context, infoUser.item2, result.item2); Navigator.push( context, MaterialPageRoute( diff --git a/lib/View/login/web/web_signup_view.dart b/lib/View/login/web/web_signup_view.dart new file mode 100644 index 0000000..a580fbd --- /dev/null +++ b/lib/View/login/web/web_signup_view.dart @@ -0,0 +1,275 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; +import 'package:smartfit_app_mobile/Modele/utile/signup_user.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:tuple/tuple.dart'; + +class WebSignUpView extends StatefulWidget { + const WebSignUpView({super.key}); + + @override + State createState() => _WebSignUpView(); +} + +class _WebSignUpView extends State { + final SignUp util = SignUp(); + + bool _obscureText = true; + bool _errorCreateUser = false; + bool _isCheck = false; + String _msgError = ""; + + final controllerTextEmail = TextEditingController(); + final controllerUsername = TextEditingController(); + final controllerTextPassword = TextEditingController(); + + // Toggles the password show status + void _toggle() { + setState(() { + _obscureText = !_obscureText; + }); + } + + void _printMsgError(String msgError) { + setState(() { + _msgError = msgError; + _errorCreateUser = true; + }); + } + + void _check() { + setState(() { + _isCheck = !_isCheck; + }); + } + + @override + Widget build(BuildContext context) { + var media = MediaQuery.of(context).size; + return Scaffold( + backgroundColor: TColor.white, + body: SingleChildScrollView( + child: SafeArea( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + "Bienvenue,", + style: TextStyle(color: TColor.gray, fontSize: 16), + ), + Text( + "Créer un compte", + style: TextStyle( + color: TColor.black, + fontSize: 20, + fontWeight: FontWeight.w700), + ), + SizedBox( + height: media.width * 0.05, + ), + RoundTextField( + hitText: "Prénom", + icon: "assets/img/user_text.svg", + controller: controllerUsername, + ), + SizedBox( + height: media.width * 0.04, + ), + RoundTextField( + hitText: "Email", + icon: "assets/img/email.svg", + keyboardType: TextInputType.emailAddress, + controller: controllerTextEmail, + ), + SizedBox( + height: media.width * 0.04, + ), + RoundTextField( + hitText: "Mot de passe", + icon: "assets/img/lock.svg", + obscureText: _obscureText, + controller: controllerTextPassword, + rigtIcon: TextButton( + onPressed: _toggle, + child: Container( + alignment: Alignment.center, + width: 20, + height: 20, + child: SvgPicture.asset( + "assets/img/show_password.svg", + width: 20, + height: 20, + fit: BoxFit.contain, + ))), + ), + Row( + // crossAxisAlignment: CrossAxisAlignment., + children: [ + IconButton( + onPressed: () { + _check(); + }, + icon: Icon( + _isCheck + ? Icons.check_box_outlined + : Icons.check_box_outline_blank_outlined, + color: TColor.gray, + size: 20, + ), + ), + Padding( + padding: const EdgeInsets.only(top: 8), + child: Text( + "En continuant, vous acceptez notre Politique de\nconfidentialité et nos Conditions d'utilisation.", + style: TextStyle(color: TColor.gray, fontSize: 10), + ), + ) + ], + ), + SizedBox( + height: media.width * 0.05, + ), + Visibility( + visible: _errorCreateUser, + child: Text("Error - $_msgError", + style: TextStyle(color: TColor.red))), + SizedBox( + height: media.width * 0.4, + ), + RoundButton( + title: "Créer un compte", + onPressed: () async { + Tuple2 result = await util.createUser( + controllerTextEmail.text, + controllerUsername.text, + controllerTextPassword.text); + if (result.item1) { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const LoginView())); + } else { + _printMsgError(result.item2); + } + }), + SizedBox( + height: media.width * 0.04, + ), + Row( + // crossAxisAlignment: CrossAxisAlignment., + children: [ + Expanded( + child: Container( + height: 1, + color: TColor.gray.withOpacity(0.5), + )), + Text( + " Ou ", + style: TextStyle(color: TColor.black, fontSize: 12), + ), + Expanded( + child: Container( + height: 1, + color: TColor.gray.withOpacity(0.5), + )), + ], + ), + SizedBox( + height: media.width * 0.04, + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + GestureDetector( + onTap: () {}, + child: Container( + width: 50, + height: 50, + alignment: Alignment.center, + decoration: BoxDecoration( + color: TColor.white, + border: Border.all( + width: 1, + color: TColor.gray.withOpacity(0.4), + ), + borderRadius: BorderRadius.circular(15), + ), + child: Image.asset( + "assets/img/google.png", + width: 20, + height: 20, + ), + ), + ), + SizedBox( + width: media.width * 0.04, + ), + GestureDetector( + onTap: () {}, + child: Container( + width: 50, + height: 50, + alignment: Alignment.center, + decoration: BoxDecoration( + color: TColor.white, + border: Border.all( + width: 1, + color: TColor.gray.withOpacity(0.4), + ), + borderRadius: BorderRadius.circular(15), + ), + child: Image.asset( + "assets/img/suunto.png", + width: 35, + height: 35, + ), + ), + ) + ], + ), + SizedBox( + height: media.width * 0.04, + ), + TextButton( + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const LoginView())); + }, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + "Vous avez déjà un compte ? ", + style: TextStyle( + color: TColor.black, + fontSize: 14, + ), + ), + Text( + "Se connecter", + style: TextStyle( + color: TColor.black, + fontSize: 14, + fontWeight: FontWeight.w700), + ) + ], + ), + ), + SizedBox( + height: media.width * 0.04, + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/View/main_tab/main_tab_view.dart b/lib/View/main_tab/main_tab_view.dart index 85e45f1..5075863 100644 --- a/lib/View/main_tab/main_tab_view.dart +++ b/lib/View/main_tab/main_tab_view.dart @@ -1,10 +1,10 @@ +import 'package:smartfit_app_mobile/View/test/page_test.dart'; import 'package:smartfit_app_mobile/common/colo_extension.dart'; import 'package:smartfit_app_mobile/common_widget/tab_button.dart'; import 'package:smartfit_app_mobile/view/activity/activity.dart'; import 'package:smartfit_app_mobile/view/home/home_view.dart'; import 'package:flutter/material.dart'; import 'package:smartfit_app_mobile/view/map/my_map.dart'; -import 'package:smartfit_app_mobile/view/page_test.dart'; import 'package:smartfit_app_mobile/view/profile/profile_view.dart'; class MainTabView extends StatefulWidget { diff --git a/lib/View/main_tab/select_view.dart b/lib/View/main_tab/select_view.dart index 02c70c1..4ecad70 100644 --- a/lib/View/main_tab/select_view.dart +++ b/lib/View/main_tab/select_view.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:smartfit_app_mobile/view/home/blank_view.dart'; //import '../sleep_tracker/sleep_tracker_view.dart'; - +/* class SelectView extends StatelessWidget { const SelectView({super.key}); @@ -61,3 +61,4 @@ class SelectView extends StatelessWidget { ); } } +*/ \ No newline at end of file diff --git a/lib/View/test/page_test.dart b/lib/View/test/page_test.dart index 4ed6b01..94cdf95 100644 --- a/lib/View/test/page_test.dart +++ b/lib/View/test/page_test.dart @@ -6,10 +6,12 @@ import 'package:flutter/material.dart'; import 'package:http/http.dart'; import 'package:path_provider/path_provider.dart'; import 'package:file_picker/file_picker.dart'; +import 'package:provider/provider.dart'; import 'dart:io'; 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/Modele/manager_file.dart'; +import 'package:smartfit_app_mobile/Modele/user.dart'; import 'package:smartfit_app_mobile/View/login/signup_view.dart'; import 'package:tuple/tuple.dart'; @@ -191,6 +193,8 @@ class _TestPage extends State { @override Widget build(BuildContext context) { + User w = context.watch(); + return Scaffold( body: Column( children: [ @@ -230,7 +234,10 @@ class _TestPage extends State { onPressed: getOneFile, child: const Text("Get One File")), ElevatedButton( onPressed: getInfoUser, child: const Text("Get info User")), - Text(platforme) + Text(platforme), + Text(w.email), + Text(context.watch().username), + Text(Provider.of(context).username) ], ), ); diff --git a/pubspec.yaml b/pubspec.yaml index cfd00f8..7c9fbd9 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -54,6 +54,7 @@ dependencies: provider: ^6.0.5 tuple: ^2.0.2 crypto: ^3.0.3 + responsive_builder: ^0.7.0 dev_dependencies: flutter_test: From 043ca8eabaf499acdf735b1b5927fc4d82c4c963 Mon Sep 17 00:00:00 2001 From: Enzo Date: Wed, 15 Nov 2023 10:23:10 +0100 Subject: [PATCH 07/11] push --- lib/Modele/Api/request_api.dart | 22 +- lib/Modele/utile/login_user.dart | 2 + lib/View/activity/activity.dart | 21 +- lib/View/home/blank_view.dart | 19 - .../home/mobile/mobile_Activity_view.dart | 27 ++ lib/View/home/web/web_Activity_view.dart | 27 ++ lib/View/home/web/web_homeview.dart | 2 +- lib/View/login/Mobile/android_login_view.dart | 34 ++ .../login/Mobile/android_signup_view.dart | 48 +++ lib/View/login/web/web_login_view.dart | 36 ++ lib/View/login/web/web_signup_view.dart | 46 +++ .../profile/mobile/mobile_profile_view.dart | 361 ++++++++++++++++++ lib/View/profile/profile_view.dart | 347 +---------------- lib/View/profile/web/web_profile_view.dart | 361 ++++++++++++++++++ lib/common_widget/round_text_field.dart | 15 +- 15 files changed, 986 insertions(+), 382 deletions(-) delete mode 100644 lib/View/home/blank_view.dart create mode 100644 lib/View/home/mobile/mobile_Activity_view.dart create mode 100644 lib/View/home/web/web_Activity_view.dart create mode 100644 lib/View/profile/mobile/mobile_profile_view.dart create mode 100644 lib/View/profile/web/web_profile_view.dart diff --git a/lib/Modele/Api/request_api.dart b/lib/Modele/Api/request_api.dart index 6e12901..5fd3783 100644 --- a/lib/Modele/Api/request_api.dart +++ b/lib/Modele/Api/request_api.dart @@ -101,12 +101,22 @@ class RequestApi extends IDataStrategy { @override Future> postUser( String email, String hash, String username) async { - final response = await http.post(Uri.parse('$urlApi/user'), - body: { - "email": email, - "hash": hash, - "username": username - }); + print(email); + print(hash); + print(username); + + print({ + "\"email\"": "\"$email\"", + "\"hash\"": "\"$hash\"", + "\"username\"": "\"$username\"" + }); + + final response = + await http.post(Uri.parse('$urlApi/user'), body: { + "\"email\"": "\"$email\"", + "\"hash\"": "\"$hash\"", + "\"username\"": "\"$username\"" + }); if (response.statusCode == 200) { Map json = jsonDecode(response.body); diff --git a/lib/Modele/utile/login_user.dart b/lib/Modele/utile/login_user.dart index d07ce10..9ea6964 100644 --- a/lib/Modele/utile/login_user.dart +++ b/lib/Modele/utile/login_user.dart @@ -27,6 +27,8 @@ class Login { } void fillUser(BuildContext context, Map map, String token) { + print(map); + context.read().email = map["email"]; context.read().username = map["username"]; context.read().token = token; diff --git a/lib/View/activity/activity.dart b/lib/View/activity/activity.dart index db26c3f..db6d9a7 100644 --- a/lib/View/activity/activity.dart +++ b/lib/View/activity/activity.dart @@ -1,3 +1,8 @@ +import 'package:responsive_builder/responsive_builder.dart'; +import 'package:smartfit_app_mobile/View/home/mobile/mobile_Activity_view.dart'; +import 'package:smartfit_app_mobile/View/home/mobile/mobile_homeview.dart'; +import 'package:smartfit_app_mobile/View/home/web/web_Activity_view.dart'; +import 'package:smartfit_app_mobile/View/home/web/web_homeview.dart'; import 'package:smartfit_app_mobile/common_widget/steps.dart'; import 'package:smartfit_app_mobile/common_widget/graph.dart'; import 'package:smartfit_app_mobile/common_widget/info.dart' hide Stats; @@ -9,19 +14,9 @@ class Activity extends StatelessWidget { @override Widget build(BuildContext context) { - return Scaffold( - backgroundColor: Colors.white, - body: Column( - children: const [ - Divider(height: 80), - Steps(), - Graph(), - Info(), - Divider(height: 30), - Stats(), - SizedBox(height: 30), - ], - ), + return ScreenTypeLayout.builder( + mobile: (_) => const MobileActivity(), + desktop: (_) => const WebActivity(), ); } } diff --git a/lib/View/home/blank_view.dart b/lib/View/home/blank_view.dart deleted file mode 100644 index 427d01a..0000000 --- a/lib/View/home/blank_view.dart +++ /dev/null @@ -1,19 +0,0 @@ - -import 'package:smartfit_app_mobile/common/colo_extension.dart'; -import 'package:flutter/material.dart'; - -class BlankView extends StatefulWidget { - const BlankView({super.key}); - - @override - State createState() => _BlankViewState(); -} - -class _BlankViewState extends State { - @override - Widget build(BuildContext context) { - return Scaffold( - backgroundColor: TColor.white, - ); - } -} \ No newline at end of file diff --git a/lib/View/home/mobile/mobile_Activity_view.dart b/lib/View/home/mobile/mobile_Activity_view.dart new file mode 100644 index 0000000..c3db6b1 --- /dev/null +++ b/lib/View/home/mobile/mobile_Activity_view.dart @@ -0,0 +1,27 @@ +import 'package:smartfit_app_mobile/common_widget/steps.dart'; +import 'package:smartfit_app_mobile/common_widget/graph.dart'; +import 'package:smartfit_app_mobile/common_widget/info.dart' hide Stats; +import 'package:smartfit_app_mobile/common_widget/stats.dart'; +import 'package:flutter/material.dart'; + +class MobileActivity extends StatelessWidget { + const MobileActivity({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + body: Column( + children: const [ + Divider(height: 80), + Steps(), + Graph(), + Info(), + Divider(height: 30), + Stats(), + SizedBox(height: 30), + ], + ), + ); + } +} diff --git a/lib/View/home/web/web_Activity_view.dart b/lib/View/home/web/web_Activity_view.dart new file mode 100644 index 0000000..9cb40ee --- /dev/null +++ b/lib/View/home/web/web_Activity_view.dart @@ -0,0 +1,27 @@ +import 'package:smartfit_app_mobile/common_widget/steps.dart'; +import 'package:smartfit_app_mobile/common_widget/graph.dart'; +import 'package:smartfit_app_mobile/common_widget/info.dart' hide Stats; +import 'package:smartfit_app_mobile/common_widget/stats.dart'; +import 'package:flutter/material.dart'; + +class WebActivity extends StatelessWidget { + const WebActivity({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + body: Column( + children: const [ + Divider(height: 80), + Steps(), + Graph(), + Info(), + Divider(height: 30), + Stats(), + SizedBox(height: 30), + ], + ), + ); + } +} diff --git a/lib/View/home/web/web_homeview.dart b/lib/View/home/web/web_homeview.dart index 85f360c..bfe29fb 100644 --- a/lib/View/home/web/web_homeview.dart +++ b/lib/View/home/web/web_homeview.dart @@ -100,7 +100,7 @@ class _WebHomeView extends State { style: TextStyle(color: TColor.gray, fontSize: 12), ), Text( - user.email, + user.username, style: TextStyle( color: TColor.black, fontSize: 20, diff --git a/lib/View/login/Mobile/android_login_view.dart b/lib/View/login/Mobile/android_login_view.dart index 38ab17e..371966b 100644 --- a/lib/View/login/Mobile/android_login_view.dart +++ b/lib/View/login/Mobile/android_login_view.dart @@ -20,10 +20,20 @@ class _MobileLoginView extends State { bool _obscureText = true; bool _errorLogin = false; String _msgError = ""; + bool emailValidate = false; + bool passwordValidate = false; final controllerTextEmail = TextEditingController(); final controllerTextPassword = TextEditingController(); + @override + void initState() { + super.initState(); + // Start listening to changes. + controllerTextEmail.addListener(checkEmail); + controllerTextPassword.addListener(checkPassword); + } + // Toggles the password show status void _toggle() { setState(() { @@ -38,6 +48,25 @@ class _MobileLoginView extends State { }); } + void checkEmail() { + if (!controllerTextEmail.text.contains("@") && + !(controllerTextEmail.text.length > 6)) { + emailValidate = false; + // Faire un affichage + return; + } // Enlever l'affichage + emailValidate = true; + } + + void checkPassword() { + if (!(controllerTextEmail.text.length >= 4)) { + passwordValidate = false; + //Faire un affichage + return; + } // Enlever l'affichage + passwordValidate = true; + } + @override Widget build(BuildContext context) { var media = MediaQuery.of(context).size; @@ -118,6 +147,11 @@ class _MobileLoginView extends State { RoundButton( title: "Se connecter", onPressed: () async { + if (!emailValidate || !passwordValidate) { + _printMsgError( + "Les champs renseigné ne sont pas valide"); + return; + } Tuple2 result = await util.checkLoginAndPassword( controllerTextEmail.text, diff --git a/lib/View/login/Mobile/android_signup_view.dart b/lib/View/login/Mobile/android_signup_view.dart index a503692..63be393 100644 --- a/lib/View/login/Mobile/android_signup_view.dart +++ b/lib/View/login/Mobile/android_signup_view.dart @@ -22,10 +22,23 @@ class _MobileSignUpView extends State { bool _isCheck = false; String _msgError = ""; + bool emailValidate = false; + bool passwordValidate = false; + bool usernameValidate = false; + final controllerTextEmail = TextEditingController(); final controllerUsername = TextEditingController(); final controllerTextPassword = TextEditingController(); + @override + void initState() { + super.initState(); + // Start listening to changes. + controllerTextEmail.addListener(checkEmail); + controllerTextPassword.addListener(checkPassword); + controllerUsername.addListener(checkUsername); + } + // Toggles the password show status void _toggle() { setState(() { @@ -46,6 +59,33 @@ class _MobileSignUpView extends State { }); } + void checkEmail() { + if (!controllerTextEmail.text.contains("@") && + !(controllerTextEmail.text.length > 6)) { + emailValidate = false; + // Faire un affichage + return; + } // Enlever l'affichage + emailValidate = true; + } + + void checkPassword() { + if (!(controllerTextEmail.text.length >= 4)) { + passwordValidate = false; + //Faire un affichage + return; + } // Enlever l'affichage + passwordValidate = true; + } + + void checkUsername() { + if (controllerUsername.text.isEmpty) { + usernameValidate = false; + return; + } + usernameValidate = true; + } + @override Widget build(BuildContext context) { var media = MediaQuery.of(context).size; @@ -144,6 +184,14 @@ class _MobileSignUpView extends State { RoundButton( title: "Créer un compte", onPressed: () async { + if (!emailValidate || + !passwordValidate || + !usernameValidate) { + _printMsgError( + "Les champs renseigné ne sont pas valide"); + return; + } + Tuple2 result = await util.createUser( controllerTextEmail.text, controllerUsername.text, diff --git a/lib/View/login/web/web_login_view.dart b/lib/View/login/web/web_login_view.dart index 8ee22cd..442341a 100644 --- a/lib/View/login/web/web_login_view.dart +++ b/lib/View/login/web/web_login_view.dart @@ -21,10 +21,20 @@ class _WebLoginView extends State { bool _obscureText = true; bool _errorLogin = false; String _msgError = ""; + bool emailValidate = false; + bool passwordValidate = false; final controllerTextEmail = TextEditingController(); final controllerTextPassword = TextEditingController(); + @override + void initState() { + super.initState(); + // Start listening to changes. + controllerTextEmail.addListener(checkEmail); + controllerTextPassword.addListener(checkPassword); + } + // Toggles the password show status void _toggle() { setState(() { @@ -39,6 +49,27 @@ class _WebLoginView extends State { }); } + void checkEmail() { + /* + if (!controllerTextEmail.text.contains("@") && + !(controllerTextEmail.text.length > 6)) { + emailValidate = false; + // Faire un affichage + return; + } // Enlever l'affichage*/ + emailValidate = true; + } + + void checkPassword() { + /* + if (!(controllerTextEmail.text.length >= 4)) { + passwordValidate = false; + //Faire un affichage + return; + } // Enlever l'affichage*/ + passwordValidate = true; + } + @override Widget build(BuildContext context) { var media = MediaQuery.of(context).size; @@ -119,6 +150,11 @@ class _WebLoginView extends State { RoundButton( title: "Se connecter", onPressed: () async { + if (!emailValidate || !passwordValidate) { + _printMsgError( + "Les champs renseigné ne sont pas valide"); + return; + } Tuple2 result = await util.checkLoginAndPassword( controllerTextEmail.text, diff --git a/lib/View/login/web/web_signup_view.dart b/lib/View/login/web/web_signup_view.dart index a580fbd..4935318 100644 --- a/lib/View/login/web/web_signup_view.dart +++ b/lib/View/login/web/web_signup_view.dart @@ -21,11 +21,23 @@ class _WebSignUpView extends State { bool _errorCreateUser = false; bool _isCheck = false; String _msgError = ""; + bool emailValidate = false; + bool passwordValidate = false; + bool usernameValidate = false; final controllerTextEmail = TextEditingController(); final controllerUsername = TextEditingController(); final controllerTextPassword = TextEditingController(); + @override + void initState() { + super.initState(); + // Start listening to changes. + controllerTextEmail.addListener(checkEmail); + controllerTextPassword.addListener(checkPassword); + controllerUsername.addListener(checkUsername); + } + // Toggles the password show status void _toggle() { setState(() { @@ -40,6 +52,33 @@ class _WebSignUpView extends State { }); } + void checkEmail() { + if (!controllerTextEmail.text.contains("@") && + !(controllerTextEmail.text.length > 6)) { + emailValidate = false; + // Faire un affichage + return; + } // Enlever l'affichage + emailValidate = true; + } + + void checkPassword() { + if (!(controllerTextEmail.text.length >= 4)) { + passwordValidate = false; + //Faire un affichage + return; + } // Enlever l'affichage + passwordValidate = true; + } + + void checkUsername() { + if (controllerUsername.text.isEmpty) { + usernameValidate = false; + return; + } + usernameValidate = true; + } + void _check() { setState(() { _isCheck = !_isCheck; @@ -144,6 +183,13 @@ class _WebSignUpView extends State { RoundButton( title: "Créer un compte", onPressed: () async { + if (!emailValidate || + !passwordValidate || + !usernameValidate) { + _printMsgError( + "Les champs renseigné ne sont pas valide"); + return; + } Tuple2 result = await util.createUser( controllerTextEmail.text, controllerUsername.text, diff --git a/lib/View/profile/mobile/mobile_profile_view.dart b/lib/View/profile/mobile/mobile_profile_view.dart new file mode 100644 index 0000000..34c5e9d --- /dev/null +++ b/lib/View/profile/mobile/mobile_profile_view.dart @@ -0,0 +1,361 @@ +import 'package:flutter/material.dart'; +import 'package:animated_toggle_switch/animated_toggle_switch.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/setting_row.dart'; +import 'package:smartfit_app_mobile/common_widget/title_subtitle_cell.dart'; + +class MobileProfileView extends StatefulWidget { + const MobileProfileView({super.key}); + + @override + State createState() => _MobileProfileView(); +} + +class _MobileProfileView extends State { + bool positive = false; + + List accountArr = [ + { + "image": "assets/img/p_personal.png", + "name": "Données personnelles", + "tag": "1" + }, + ]; + + List otherArr = [ + {"image": "assets/img/p_contact.png", "name": "Nous contacter", "tag": "5"}, + { + "image": "assets/img/p_privacy.png", + "name": "Politique de confidentialité", + "tag": "6" + }, + ]; + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + backgroundColor: TColor.white, + centerTitle: true, + elevation: 0, + leadingWidth: 0, + title: Text( + "Profile", + style: TextStyle( + color: TColor.black, fontSize: 16, fontWeight: FontWeight.w700), + ), + actions: [ + InkWell( + onTap: () {}, + child: Container( + margin: const EdgeInsets.all(8), + height: 20, + width: 20, + alignment: Alignment.center, + decoration: BoxDecoration( + color: TColor.lightGray, + borderRadius: BorderRadius.circular(10)), + child: Image.asset( + "assets/img/more_btn.png", + width: 15, + height: 15, + fit: BoxFit.contain, + ), + ), + ) + ], + ), + backgroundColor: TColor.white, + body: SingleChildScrollView( + child: Container( + padding: const EdgeInsets.symmetric(vertical: 15, horizontal: 25), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Row( + children: [ + ClipRRect( + borderRadius: BorderRadius.circular(30), + child: Image.asset( + "assets/img/u1.png", + width: 50, + height: 50, + fit: BoxFit.cover, + ), + ), + const SizedBox( + width: 15, + ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Benjelloun Othmane", + style: TextStyle( + color: TColor.black, + fontSize: 14, + fontWeight: FontWeight.w500, + ), + ), + Text( + "Course à pied", + style: TextStyle( + color: TColor.gray, + fontSize: 12, + ), + ) + ], + ), + ), + SizedBox( + width: 70, + height: 25, + child: RoundButton( + title: "Editer", + type: RoundButtonType.bgGradient, + fontSize: 12, + fontWeight: FontWeight.w400, + onPressed: () { + // Navigator.push( + // context, + // MaterialPageRoute( + // builder: (context) => const ActivityTrackerView(), + // ), + // ); + }, + ), + ) + ], + ), + const SizedBox( + height: 15, + ), + const Row( + children: [ + Expanded( + child: TitleSubtitleCell( + title: "??? cm", + subtitle: "Taille", + ), + ), + SizedBox( + width: 15, + ), + Expanded( + child: TitleSubtitleCell( + title: "?? kg", + subtitle: "Poids", + ), + ), + SizedBox( + width: 15, + ), + Expanded( + child: TitleSubtitleCell( + title: "?? ans", + subtitle: "Age", + ), + ), + ], + ), + const SizedBox( + height: 25, + ), + Container( + padding: + const EdgeInsets.symmetric(vertical: 10, horizontal: 15), + decoration: BoxDecoration( + color: TColor.white, + borderRadius: BorderRadius.circular(15), + boxShadow: const [ + BoxShadow(color: Colors.black12, blurRadius: 2) + ]), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Compte", + style: TextStyle( + color: TColor.black, + fontSize: 16, + fontWeight: FontWeight.w700, + ), + ), + const SizedBox( + height: 8, + ), + ListView.builder( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: accountArr.length, + itemBuilder: (context, index) { + var iObj = accountArr[index] as Map? ?? {}; + return SettingRow( + icon: iObj["image"].toString(), + title: iObj["name"].toString(), + onPressed: () {}, + ); + }, + ) + ], + ), + ), + const SizedBox( + height: 25, + ), + Container( + padding: + const EdgeInsets.symmetric(vertical: 10, horizontal: 15), + decoration: BoxDecoration( + color: TColor.white, + borderRadius: BorderRadius.circular(15), + boxShadow: const [ + BoxShadow(color: Colors.black12, blurRadius: 2) + ]), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Notification", + style: TextStyle( + color: TColor.black, + fontSize: 16, + fontWeight: FontWeight.w700, + ), + ), + const SizedBox( + height: 8, + ), + SizedBox( + height: 30, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Image.asset("assets/img/p_notification.png", + height: 15, width: 15, fit: BoxFit.contain), + const SizedBox( + width: 15, + ), + Expanded( + child: Text( + "Pop-up Notification", + style: TextStyle( + color: TColor.black, + fontSize: 12, + ), + ), + ), + CustomAnimatedToggleSwitch( + current: positive, + values: [false, true], + spacing: 0.0, + indicatorSize: Size.square(25.0), + animationDuration: + const Duration(milliseconds: 200), + animationCurve: Curves.linear, + onChanged: (b) => setState(() => positive = b), + iconBuilder: (context, local, global) { + return const SizedBox(); + }, + cursors: ToggleCursors( + defaultCursor: SystemMouseCursors.click), + onTap: (_) => + setState(() => positive = !positive), + iconsTappable: false, + wrapperBuilder: (context, global, child) { + return Stack( + alignment: Alignment.center, + children: [ + Positioned( + left: 10.0, + right: 10.0, + height: 20.0, + child: DecoratedBox( + decoration: BoxDecoration( + gradient: LinearGradient( + colors: TColor.secondaryG), + borderRadius: + const BorderRadius.all( + Radius.circular(50.0)), + ), + )), + child, + ], + ); + }, + foregroundIndicatorBuilder: (context, global) { + return SizedBox.fromSize( + size: const Size(5, 5), + child: DecoratedBox( + decoration: BoxDecoration( + color: TColor.white, + borderRadius: const BorderRadius.all( + Radius.circular(50.0)), + boxShadow: const [ + BoxShadow( + color: Colors.black38, + spreadRadius: 0.05, + blurRadius: 1.1, + offset: Offset(0.0, 0.8)) + ], + ), + ), + ); + }, + ), + ]), + ) + ], + ), + ), + const SizedBox( + height: 25, + ), + Container( + padding: + const EdgeInsets.symmetric(vertical: 10, horizontal: 15), + decoration: BoxDecoration( + color: TColor.white, + borderRadius: BorderRadius.circular(15), + boxShadow: const [ + BoxShadow(color: Colors.black12, blurRadius: 2) + ]), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Autre", + style: TextStyle( + color: TColor.black, + fontSize: 16, + fontWeight: FontWeight.w700, + ), + ), + const SizedBox( + height: 8, + ), + ListView.builder( + physics: const NeverScrollableScrollPhysics(), + padding: EdgeInsets.zero, + shrinkWrap: true, + itemCount: otherArr.length, + itemBuilder: (context, index) { + var iObj = otherArr[index] as Map? ?? {}; + return SettingRow( + icon: iObj["image"].toString(), + title: iObj["name"].toString(), + onPressed: () {}, + ); + }, + ) + ], + ), + ) + ], + ), + ), + ), + ); + } +} diff --git a/lib/View/profile/profile_view.dart b/lib/View/profile/profile_view.dart index ddc0f43..f7c1dfc 100644 --- a/lib/View/profile/profile_view.dart +++ b/lib/View/profile/profile_view.dart @@ -1,10 +1,7 @@ import 'package:flutter/material.dart'; - -import '../../common/colo_extension.dart'; -import '../../common_widget/round_button.dart'; -import '../../common_widget/setting_row.dart'; -import '../../common_widget/title_subtitle_cell.dart'; -import 'package:animated_toggle_switch/animated_toggle_switch.dart'; +import 'package:responsive_builder/responsive_builder.dart'; +import 'package:smartfit_app_mobile/View/profile/mobile/mobile_profile_view.dart'; +import 'package:smartfit_app_mobile/View/profile/web/web_profile_view.dart'; class ProfileView extends StatefulWidget { const ProfileView({super.key}); @@ -14,341 +11,11 @@ class ProfileView extends StatefulWidget { } class _ProfileViewState extends State { - bool positive = false; - - List accountArr = [ - {"image": "assets/img/p_personal.png", "name": "Données personnelles", "tag": "1"}, - - ]; - - List otherArr = [ - {"image": "assets/img/p_contact.png", "name": "Nous contacter", "tag": "5"}, - {"image": "assets/img/p_privacy.png", "name": "Politique de confidentialité", "tag": "6"}, - ]; @override Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - backgroundColor: TColor.white, - centerTitle: true, - elevation: 0, - leadingWidth: 0, - title: Text( - "Profile", - style: TextStyle( - color: TColor.black, fontSize: 16, fontWeight: FontWeight.w700), - ), - actions: [ - InkWell( - onTap: () {}, - child: Container( - margin: const EdgeInsets.all(8), - height: 20, - width: 20, - alignment: Alignment.center, - decoration: BoxDecoration( - color: TColor.lightGray, - borderRadius: BorderRadius.circular(10)), - child: Image.asset( - "assets/img/more_btn.png", - width: 15, - height: 15, - fit: BoxFit.contain, - ), - ), - ) - ], - ), - backgroundColor: TColor.white, - body: SingleChildScrollView( - child: Container( - padding: const EdgeInsets.symmetric(vertical: 15, horizontal: 25), - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Row( - children: [ - ClipRRect( - borderRadius: BorderRadius.circular(30), - child: Image.asset( - "assets/img/u1.png", - width: 50, - height: 50, - fit: BoxFit.cover, - ), - ), - const SizedBox( - width: 15, - ), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - "Benjelloun Othmane", - style: TextStyle( - color: TColor.black, - fontSize: 14, - fontWeight: FontWeight.w500, - ), - ), - Text( - "Course à pied", - style: TextStyle( - color: TColor.gray, - fontSize: 12, - ), - ) - ], - ), - ), - SizedBox( - width: 70, - height: 25, - child: RoundButton( - title: "Editer", - type: RoundButtonType.bgGradient, - fontSize: 12, - fontWeight: FontWeight.w400, - onPressed: () { - // Navigator.push( - // context, - // MaterialPageRoute( - // builder: (context) => const ActivityTrackerView(), - // ), - // ); - }, - ), - ) - ], - ), - const SizedBox( - height: 15, - ), - const Row( - children: [ - Expanded( - child: TitleSubtitleCell( - title: "??? cm", - subtitle: "Taille", - ), - ), - SizedBox( - width: 15, - ), - Expanded( - child: TitleSubtitleCell( - title: "?? kg", - subtitle: "Poids", - ), - ), - SizedBox( - width: 15, - ), - Expanded( - child: TitleSubtitleCell( - title: "?? ans", - subtitle: "Age", - ), - ), - ], - ), - const SizedBox( - height: 25, - ), - Container( - padding: - const EdgeInsets.symmetric(vertical: 10, horizontal: 15), - decoration: BoxDecoration( - color: TColor.white, - borderRadius: BorderRadius.circular(15), - boxShadow: const [ - BoxShadow(color: Colors.black12, blurRadius: 2) - ]), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - "Compte", - style: TextStyle( - color: TColor.black, - fontSize: 16, - fontWeight: FontWeight.w700, - ), - ), - const SizedBox( - height: 8, - ), - ListView.builder( - physics: const NeverScrollableScrollPhysics(), - shrinkWrap: true, - itemCount: accountArr.length, - itemBuilder: (context, index) { - var iObj = accountArr[index] as Map? ?? {}; - return SettingRow( - icon: iObj["image"].toString(), - title: iObj["name"].toString(), - onPressed: () {}, - ); - }, - ) - ], - ), - ), - const SizedBox( - height: 25, - ), - Container( - padding: - const EdgeInsets.symmetric(vertical: 10, horizontal: 15), - decoration: BoxDecoration( - color: TColor.white, - borderRadius: BorderRadius.circular(15), - boxShadow: const [ - BoxShadow(color: Colors.black12, blurRadius: 2) - ]), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - "Notification", - style: TextStyle( - color: TColor.black, - fontSize: 16, - fontWeight: FontWeight.w700, - ), - ), - const SizedBox( - height: 8, - ), - SizedBox( - height: 30, - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Image.asset("assets/img/p_notification.png", - height: 15, width: 15, fit: BoxFit.contain), - const SizedBox( - width: 15, - ), - Expanded( - child: Text( - "Pop-up Notification", - style: TextStyle( - color: TColor.black, - fontSize: 12, - ), - ), - ), - CustomAnimatedToggleSwitch( - current: positive, - values: [false, true], - spacing : 0.0, - indicatorSize: Size.square(25.0), - animationDuration: - const Duration(milliseconds: 200), - animationCurve: Curves.linear, - onChanged: (b) => setState(() => positive = b), - iconBuilder: (context, local, global) { - return const SizedBox(); - }, - cursors: ToggleCursors(defaultCursor: SystemMouseCursors.click), - onTap: (_) => setState(() => positive = !positive), - iconsTappable: false, - wrapperBuilder: (context, global, child) { - return Stack( - alignment: Alignment.center, - children: [ - Positioned( - left: 10.0, - right: 10.0, - - height: 20.0, - child: DecoratedBox( - decoration: BoxDecoration( - gradient: LinearGradient( - colors: TColor.secondaryG), - borderRadius: - const BorderRadius.all( - Radius.circular(50.0)), - ), - )), - child, - ], - ); - }, - foregroundIndicatorBuilder: (context, global) { - return SizedBox.fromSize( - size: const Size(5, 5), - child: DecoratedBox( - decoration: BoxDecoration( - color: TColor.white, - borderRadius: const BorderRadius.all( - Radius.circular(50.0)), - boxShadow: const [ - BoxShadow( - color: Colors.black38, - spreadRadius: 0.05, - blurRadius: 1.1, - offset: Offset(0.0, 0.8)) - ], - ), - ), - ); - }, - ), - ]), - ) - ], - ), - ), - const SizedBox( - height: 25, - ), - Container( - padding: - const EdgeInsets.symmetric(vertical: 10, horizontal: 15), - decoration: BoxDecoration( - color: TColor.white, - borderRadius: BorderRadius.circular(15), - boxShadow: const [ - BoxShadow(color: Colors.black12, blurRadius: 2) - ]), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - "Autre", - style: TextStyle( - color: TColor.black, - fontSize: 16, - fontWeight: FontWeight.w700, - ), - ), - const SizedBox( - height: 8, - ), - ListView.builder( - physics: const NeverScrollableScrollPhysics(), - padding: EdgeInsets.zero, - shrinkWrap: true, - itemCount: otherArr.length, - itemBuilder: (context, index) { - var iObj = otherArr[index] as Map? ?? {}; - return SettingRow( - icon: iObj["image"].toString(), - title: iObj["name"].toString(), - onPressed: () {}, - ); - }, - ) - ], - ), - ) - ], - ), - ), - ), + return ScreenTypeLayout.builder( + mobile: (_) => const MobileProfileView(), + desktop: (_) => const WebProfileView(), ); } -} \ No newline at end of file +} diff --git a/lib/View/profile/web/web_profile_view.dart b/lib/View/profile/web/web_profile_view.dart new file mode 100644 index 0000000..219d6ce --- /dev/null +++ b/lib/View/profile/web/web_profile_view.dart @@ -0,0 +1,361 @@ +import 'package:flutter/material.dart'; +import 'package:animated_toggle_switch/animated_toggle_switch.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/setting_row.dart'; +import 'package:smartfit_app_mobile/common_widget/title_subtitle_cell.dart'; + +class WebProfileView extends StatefulWidget { + const WebProfileView({super.key}); + + @override + State createState() => _WebProfileView(); +} + +class _WebProfileView extends State { + bool positive = false; + + List accountArr = [ + { + "image": "assets/img/p_personal.png", + "name": "Données personnelles", + "tag": "1" + }, + ]; + + List otherArr = [ + {"image": "assets/img/p_contact.png", "name": "Nous contacter", "tag": "5"}, + { + "image": "assets/img/p_privacy.png", + "name": "Politique de confidentialité", + "tag": "6" + }, + ]; + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + backgroundColor: TColor.white, + centerTitle: true, + elevation: 0, + leadingWidth: 0, + title: Text( + "Profile", + style: TextStyle( + color: TColor.black, fontSize: 16, fontWeight: FontWeight.w700), + ), + actions: [ + InkWell( + onTap: () {}, + child: Container( + margin: const EdgeInsets.all(8), + height: 20, + width: 20, + alignment: Alignment.center, + decoration: BoxDecoration( + color: TColor.lightGray, + borderRadius: BorderRadius.circular(10)), + child: Image.asset( + "assets/img/more_btn.png", + width: 15, + height: 15, + fit: BoxFit.contain, + ), + ), + ) + ], + ), + backgroundColor: TColor.white, + body: SingleChildScrollView( + child: Container( + padding: const EdgeInsets.symmetric(vertical: 15, horizontal: 25), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Row( + children: [ + ClipRRect( + borderRadius: BorderRadius.circular(30), + child: Image.asset( + "assets/img/u1.png", + width: 50, + height: 50, + fit: BoxFit.cover, + ), + ), + const SizedBox( + width: 15, + ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Benjelloun Othmane", + style: TextStyle( + color: TColor.black, + fontSize: 14, + fontWeight: FontWeight.w500, + ), + ), + Text( + "Course à pied", + style: TextStyle( + color: TColor.gray, + fontSize: 12, + ), + ) + ], + ), + ), + SizedBox( + width: 70, + height: 25, + child: RoundButton( + title: "Editer", + type: RoundButtonType.bgGradient, + fontSize: 12, + fontWeight: FontWeight.w400, + onPressed: () { + // Navigator.push( + // context, + // MaterialPageRoute( + // builder: (context) => const ActivityTrackerView(), + // ), + // ); + }, + ), + ) + ], + ), + const SizedBox( + height: 15, + ), + const Row( + children: [ + Expanded( + child: TitleSubtitleCell( + title: "??? cm", + subtitle: "Taille", + ), + ), + SizedBox( + width: 15, + ), + Expanded( + child: TitleSubtitleCell( + title: "?? kg", + subtitle: "Poids", + ), + ), + SizedBox( + width: 15, + ), + Expanded( + child: TitleSubtitleCell( + title: "?? ans", + subtitle: "Age", + ), + ), + ], + ), + const SizedBox( + height: 25, + ), + Container( + padding: + const EdgeInsets.symmetric(vertical: 10, horizontal: 15), + decoration: BoxDecoration( + color: TColor.white, + borderRadius: BorderRadius.circular(15), + boxShadow: const [ + BoxShadow(color: Colors.black12, blurRadius: 2) + ]), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Compte", + style: TextStyle( + color: TColor.black, + fontSize: 16, + fontWeight: FontWeight.w700, + ), + ), + const SizedBox( + height: 8, + ), + ListView.builder( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: accountArr.length, + itemBuilder: (context, index) { + var iObj = accountArr[index] as Map? ?? {}; + return SettingRow( + icon: iObj["image"].toString(), + title: iObj["name"].toString(), + onPressed: () {}, + ); + }, + ) + ], + ), + ), + const SizedBox( + height: 25, + ), + Container( + padding: + const EdgeInsets.symmetric(vertical: 10, horizontal: 15), + decoration: BoxDecoration( + color: TColor.white, + borderRadius: BorderRadius.circular(15), + boxShadow: const [ + BoxShadow(color: Colors.black12, blurRadius: 2) + ]), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Notification", + style: TextStyle( + color: TColor.black, + fontSize: 16, + fontWeight: FontWeight.w700, + ), + ), + const SizedBox( + height: 8, + ), + SizedBox( + height: 30, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Image.asset("assets/img/p_notification.png", + height: 15, width: 15, fit: BoxFit.contain), + const SizedBox( + width: 15, + ), + Expanded( + child: Text( + "Pop-up Notification", + style: TextStyle( + color: TColor.black, + fontSize: 12, + ), + ), + ), + CustomAnimatedToggleSwitch( + current: positive, + values: [false, true], + spacing: 0.0, + indicatorSize: Size.square(25.0), + animationDuration: + const Duration(milliseconds: 200), + animationCurve: Curves.linear, + onChanged: (b) => setState(() => positive = b), + iconBuilder: (context, local, global) { + return const SizedBox(); + }, + cursors: ToggleCursors( + defaultCursor: SystemMouseCursors.click), + onTap: (_) => + setState(() => positive = !positive), + iconsTappable: false, + wrapperBuilder: (context, global, child) { + return Stack( + alignment: Alignment.center, + children: [ + Positioned( + left: 10.0, + right: 10.0, + height: 20.0, + child: DecoratedBox( + decoration: BoxDecoration( + gradient: LinearGradient( + colors: TColor.secondaryG), + borderRadius: + const BorderRadius.all( + Radius.circular(50.0)), + ), + )), + child, + ], + ); + }, + foregroundIndicatorBuilder: (context, global) { + return SizedBox.fromSize( + size: const Size(5, 5), + child: DecoratedBox( + decoration: BoxDecoration( + color: TColor.white, + borderRadius: const BorderRadius.all( + Radius.circular(50.0)), + boxShadow: const [ + BoxShadow( + color: Colors.black38, + spreadRadius: 0.05, + blurRadius: 1.1, + offset: Offset(0.0, 0.8)) + ], + ), + ), + ); + }, + ), + ]), + ) + ], + ), + ), + const SizedBox( + height: 25, + ), + Container( + padding: + const EdgeInsets.symmetric(vertical: 10, horizontal: 15), + decoration: BoxDecoration( + color: TColor.white, + borderRadius: BorderRadius.circular(15), + boxShadow: const [ + BoxShadow(color: Colors.black12, blurRadius: 2) + ]), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Autre", + style: TextStyle( + color: TColor.black, + fontSize: 16, + fontWeight: FontWeight.w700, + ), + ), + const SizedBox( + height: 8, + ), + ListView.builder( + physics: const NeverScrollableScrollPhysics(), + padding: EdgeInsets.zero, + shrinkWrap: true, + itemCount: otherArr.length, + itemBuilder: (context, index) { + var iObj = otherArr[index] as Map? ?? {}; + return SettingRow( + icon: iObj["image"].toString(), + title: iObj["name"].toString(), + onPressed: () {}, + ); + }, + ) + ], + ), + ) + ], + ), + ), + ), + ); + } +} diff --git a/lib/common_widget/round_text_field.dart b/lib/common_widget/round_text_field.dart index 894e20d..006ab83 100644 --- a/lib/common_widget/round_text_field.dart +++ b/lib/common_widget/round_text_field.dart @@ -1,3 +1,4 @@ +import 'dart:ffi'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; @@ -12,7 +13,15 @@ class RoundTextField extends StatelessWidget { final Widget? rigtIcon; final bool obscureText; final EdgeInsets? margin; - const RoundTextField({super.key, required this.hitText, required this.icon, this.controller, this.margin, this.keyboardType, this.obscureText = false , this.rigtIcon }); + const RoundTextField( + {super.key, + required this.hitText, + required this.icon, + this.controller, + this.margin, + this.keyboardType, + this.obscureText = false, + this.rigtIcon}); @override Widget build(BuildContext context) { @@ -36,7 +45,7 @@ class RoundTextField extends StatelessWidget { width: 20, height: 20, child: SvgPicture.asset( - icon, + icon, width: 20, height: 20, fit: BoxFit.contain, @@ -45,4 +54,4 @@ class RoundTextField extends StatelessWidget { ), ); } -} \ No newline at end of file +} From 56ebb6ddf2e1399d00e0c89c45f206944e4f6024 Mon Sep 17 00:00:00 2001 From: Enzo Date: Wed, 15 Nov 2023 10:36:33 +0100 Subject: [PATCH 08/11] plus de majuscule --- lib/Modele/user.dart | 2 +- lib/Modele/utile/login_user.dart | 4 ++-- lib/Modele/utile/signup_user.dart | 2 +- lib/View/activity/activity.dart | 10 ++-------- lib/View/home/mobile/mobile_homeview.dart | 2 +- lib/View/home/web/web_homeview.dart | 2 +- lib/View/login/Mobile/android_login_view.dart | 4 ++-- lib/View/login/Mobile/android_signup_view.dart | 4 ++-- lib/View/login/login_view.dart | 4 ++-- lib/View/login/signup_view.dart | 4 ++-- lib/View/login/web/web_login_view.dart | 6 ++---- lib/View/login/web/web_signup_view.dart | 4 ++-- lib/View/main_tab/main_tab_view.dart | 2 +- lib/View/main_tab/select_view.dart | 6 +----- lib/View/profile/profile_view.dart | 4 ++-- lib/View/test/page_test.dart | 4 +--- lib/common_widget/round_text_field.dart | 2 -- lib/main.dart | 4 ++-- 18 files changed, 27 insertions(+), 43 deletions(-) diff --git a/lib/Modele/user.dart b/lib/Modele/user.dart index 289622d..fa7da89 100644 --- a/lib/Modele/user.dart +++ b/lib/Modele/user.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:smartfit_app_mobile/Modele/activity.dart'; +import 'package:smartfit_app_mobile/modele/activity.dart'; class User extends ChangeNotifier { String username = "VOID"; diff --git a/lib/Modele/utile/login_user.dart b/lib/Modele/utile/login_user.dart index 9ea6964..261e75c 100644 --- a/lib/Modele/utile/login_user.dart +++ b/lib/Modele/utile/login_user.dart @@ -3,9 +3,9 @@ import 'dart:convert'; import 'package:crypto/crypto.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.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/Modele/user.dart'; +import 'package:smartfit_app_mobile/modele/api/i_data_strategy.dart'; +import 'package:smartfit_app_mobile/modele/user.dart'; import 'package:tuple/tuple.dart'; class Login { diff --git a/lib/Modele/utile/signup_user.dart b/lib/Modele/utile/signup_user.dart index b9d26f4..dd678b4 100644 --- a/lib/Modele/utile/signup_user.dart +++ b/lib/Modele/utile/signup_user.dart @@ -1,8 +1,8 @@ import 'dart:convert'; import 'package:crypto/crypto.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/modele/api/i_data_strategy.dart'; import 'package:tuple/tuple.dart'; class SignUp { diff --git a/lib/View/activity/activity.dart b/lib/View/activity/activity.dart index db6d9a7..5198ab7 100644 --- a/lib/View/activity/activity.dart +++ b/lib/View/activity/activity.dart @@ -1,12 +1,6 @@ import 'package:responsive_builder/responsive_builder.dart'; -import 'package:smartfit_app_mobile/View/home/mobile/mobile_Activity_view.dart'; -import 'package:smartfit_app_mobile/View/home/mobile/mobile_homeview.dart'; -import 'package:smartfit_app_mobile/View/home/web/web_Activity_view.dart'; -import 'package:smartfit_app_mobile/View/home/web/web_homeview.dart'; -import 'package:smartfit_app_mobile/common_widget/steps.dart'; -import 'package:smartfit_app_mobile/common_widget/graph.dart'; -import 'package:smartfit_app_mobile/common_widget/info.dart' hide Stats; -import 'package:smartfit_app_mobile/common_widget/stats.dart'; +import 'package:smartfit_app_mobile/view/home/mobile/mobile_Activity_view.dart'; +import 'package:smartfit_app_mobile/view/home/web/web_Activity_view.dart'; import 'package:flutter/material.dart'; class Activity extends StatelessWidget { diff --git a/lib/View/home/mobile/mobile_homeview.dart b/lib/View/home/mobile/mobile_homeview.dart index 2c836c1..e5522e8 100644 --- a/lib/View/home/mobile/mobile_homeview.dart +++ b/lib/View/home/mobile/mobile_homeview.dart @@ -4,7 +4,7 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:simple_animation_progress_bar/simple_animation_progress_bar.dart'; import 'package:simple_circular_progress_bar/simple_circular_progress_bar.dart'; -import 'package:smartfit_app_mobile/Modele/user.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/round_button.dart'; import 'package:smartfit_app_mobile/view/home/activity_tracker.dart'; diff --git a/lib/View/home/web/web_homeview.dart b/lib/View/home/web/web_homeview.dart index bfe29fb..9c63d2c 100644 --- a/lib/View/home/web/web_homeview.dart +++ b/lib/View/home/web/web_homeview.dart @@ -4,7 +4,7 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:simple_animation_progress_bar/simple_animation_progress_bar.dart'; import 'package:simple_circular_progress_bar/simple_circular_progress_bar.dart'; -import 'package:smartfit_app_mobile/Modele/user.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/round_button.dart'; import 'package:smartfit_app_mobile/view/home/activity_tracker.dart'; diff --git a/lib/View/login/Mobile/android_login_view.dart b/lib/View/login/Mobile/android_login_view.dart index 371966b..1fe51f3 100644 --- a/lib/View/login/Mobile/android_login_view.dart +++ b/lib/View/login/Mobile/android_login_view.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; -import 'package:smartfit_app_mobile/Modele/utile/login_user.dart'; -import 'package:smartfit_app_mobile/View/main_tab/main_tab_view.dart'; +import 'package:smartfit_app_mobile/modele/utile/login_user.dart'; +import 'package:smartfit_app_mobile/view/main_tab/main_tab_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'; diff --git a/lib/View/login/Mobile/android_signup_view.dart b/lib/View/login/Mobile/android_signup_view.dart index 63be393..7c39c1c 100644 --- a/lib/View/login/Mobile/android_signup_view.dart +++ b/lib/View/login/Mobile/android_signup_view.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; -import 'package:smartfit_app_mobile/Modele/utile/signup_user.dart'; -import 'package:smartfit_app_mobile/View/login/login_view.dart'; +import 'package:smartfit_app_mobile/modele/utile/signup_user.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'; diff --git a/lib/View/login/login_view.dart b/lib/View/login/login_view.dart index 1290373..55fe3bb 100644 --- a/lib/View/login/login_view.dart +++ b/lib/View/login/login_view.dart @@ -1,6 +1,6 @@ import 'package:responsive_builder/responsive_builder.dart'; -import 'package:smartfit_app_mobile/View/login/Mobile/android_login_view.dart'; -import 'package:smartfit_app_mobile/View/login/web/web_login_view.dart'; +import 'package:smartfit_app_mobile/view/login/Mobile/android_login_view.dart'; +import 'package:smartfit_app_mobile/view/login/web/web_login_view.dart'; import 'package:flutter/material.dart'; class LoginView extends StatefulWidget { diff --git a/lib/View/login/signup_view.dart b/lib/View/login/signup_view.dart index b4630df..a94d65b 100644 --- a/lib/View/login/signup_view.dart +++ b/lib/View/login/signup_view.dart @@ -1,7 +1,7 @@ import 'package:responsive_builder/responsive_builder.dart'; -import 'package:smartfit_app_mobile/View/login/Mobile/android_signup_view.dart'; +import 'package:smartfit_app_mobile/view/login/Mobile/android_signup_view.dart'; import 'package:flutter/material.dart'; -import 'package:smartfit_app_mobile/View/login/web/web_signup_view.dart'; +import 'package:smartfit_app_mobile/view/login/web/web_signup_view.dart'; class SignUpView extends StatefulWidget { const SignUpView({super.key}); diff --git a/lib/View/login/web/web_login_view.dart b/lib/View/login/web/web_login_view.dart index 442341a..fd034c4 100644 --- a/lib/View/login/web/web_login_view.dart +++ b/lib/View/login/web/web_login_view.dart @@ -1,9 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; -import 'package:provider/provider.dart'; -import 'package:smartfit_app_mobile/Modele/user.dart'; -import 'package:smartfit_app_mobile/Modele/utile/login_user.dart'; -import 'package:smartfit_app_mobile/View/main_tab/main_tab_view.dart'; +import 'package:smartfit_app_mobile/modele/utile/login_user.dart'; +import 'package:smartfit_app_mobile/view/main_tab/main_tab_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'; diff --git a/lib/View/login/web/web_signup_view.dart b/lib/View/login/web/web_signup_view.dart index 4935318..46a7087 100644 --- a/lib/View/login/web/web_signup_view.dart +++ b/lib/View/login/web/web_signup_view.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; -import 'package:smartfit_app_mobile/Modele/utile/signup_user.dart'; -import 'package:smartfit_app_mobile/View/login/login_view.dart'; +import 'package:smartfit_app_mobile/modele/utile/signup_user.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'; diff --git a/lib/View/main_tab/main_tab_view.dart b/lib/View/main_tab/main_tab_view.dart index 5075863..a7bacf6 100644 --- a/lib/View/main_tab/main_tab_view.dart +++ b/lib/View/main_tab/main_tab_view.dart @@ -1,4 +1,4 @@ -import 'package:smartfit_app_mobile/View/test/page_test.dart'; +import 'package:smartfit_app_mobile/view/test/page_test.dart'; import 'package:smartfit_app_mobile/common/colo_extension.dart'; import 'package:smartfit_app_mobile/common_widget/tab_button.dart'; import 'package:smartfit_app_mobile/view/activity/activity.dart'; diff --git a/lib/View/main_tab/select_view.dart b/lib/View/main_tab/select_view.dart index 4ecad70..a2786bd 100644 --- a/lib/View/main_tab/select_view.dart +++ b/lib/View/main_tab/select_view.dart @@ -1,8 +1,4 @@ -import 'package:smartfit_app_mobile/common_widget/round_button.dart'; -//import 'package:smartfit_app_mobile/view/meal_planner/meal_planner_view.dart'; -//import 'package:smartfit_app_mobile/view/workout_tracker/workout_tracker_view.dart'; -import 'package:flutter/material.dart'; -import 'package:smartfit_app_mobile/view/home/blank_view.dart'; + //import '../sleep_tracker/sleep_tracker_view.dart'; /* diff --git a/lib/View/profile/profile_view.dart b/lib/View/profile/profile_view.dart index f7c1dfc..8556b5f 100644 --- a/lib/View/profile/profile_view.dart +++ b/lib/View/profile/profile_view.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:responsive_builder/responsive_builder.dart'; -import 'package:smartfit_app_mobile/View/profile/mobile/mobile_profile_view.dart'; -import 'package:smartfit_app_mobile/View/profile/web/web_profile_view.dart'; +import 'package:smartfit_app_mobile/view/profile/mobile/mobile_profile_view.dart'; +import 'package:smartfit_app_mobile/view/profile/web/web_profile_view.dart'; class ProfileView extends StatefulWidget { const ProfileView({super.key}); diff --git a/lib/View/test/page_test.dart b/lib/View/test/page_test.dart index 94cdf95..d3a098f 100644 --- a/lib/View/test/page_test.dart +++ b/lib/View/test/page_test.dart @@ -3,16 +3,14 @@ import 'dart:convert'; import 'package:crypto/crypto.dart'; import 'package:flutter/foundation.dart' show kIsWeb; import 'package:flutter/material.dart'; -import 'package:http/http.dart'; import 'package:path_provider/path_provider.dart'; import 'package:file_picker/file_picker.dart'; import 'package:provider/provider.dart'; import 'dart:io'; 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/Modele/manager_file.dart'; import 'package:smartfit_app_mobile/Modele/user.dart'; -import 'package:smartfit_app_mobile/View/login/signup_view.dart'; +import 'package:smartfit_app_mobile/modele/api/request_api.dart'; import 'package:tuple/tuple.dart'; // ----------- File --------------- // diff --git a/lib/common_widget/round_text_field.dart b/lib/common_widget/round_text_field.dart index 006ab83..f93c6a2 100644 --- a/lib/common_widget/round_text_field.dart +++ b/lib/common_widget/round_text_field.dart @@ -1,5 +1,3 @@ -import 'dart:ffi'; - import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; diff --git a/lib/main.dart b/lib/main.dart index 2aad57e..77fdfa7 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,7 +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/signup_view.dart'; +import 'package:smartfit_app_mobile/modele/user.dart'; +import 'package:smartfit_app_mobile/view/login/signup_view.dart'; import 'package:smartfit_app_mobile/common/colo_extension.dart'; void main() { From bc8d52ee40eb539e63c8f12b98f48ec50693b20c Mon Sep 17 00:00:00 2001 From: Enzo Date: Wed, 15 Nov 2023 10:39:44 +0100 Subject: [PATCH 09/11] change --- lib/main.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/main.dart b/lib/main.dart index 77fdfa7..c48104b 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,8 +1,8 @@ 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/signup_view.dart'; import 'package:smartfit_app_mobile/common/colo_extension.dart'; +import 'package:smartfit_app_mobile/view/login/signup_view.dart'; void main() { runApp(ChangeNotifierProvider( From a0ed987c83fe8c17202a83b69bc116f6d0a9d740 Mon Sep 17 00:00:00 2001 From: RemRem Date: Wed, 15 Nov 2023 10:56:15 +0100 Subject: [PATCH 10/11] rename folder to lowercase + rewrite imports --- .metadata | 25 ++------ lib/{Modele => modele}/activity.dart | 0 .../Api => modele/api}/i_data_strategy.dart | 0 .../Api => modele/api}/request_api.dart | 2 +- lib/{Modele => modele}/manager_file.dart | 0 lib/{Modele => modele}/user.dart | 0 lib/{Modele => modele}/utile/login_user.dart | 2 +- lib/{Modele => modele}/utile/signup_user.dart | 2 +- lib/{View => view}/activity/activity.dart | 0 lib/{View => view}/home/activity_tracker.dart | 0 lib/{View => view}/home/home_view.dart | 4 +- .../home/mobile/mobile_Activity_view.dart | 0 .../home/mobile/mobile_homeview.dart | 0 .../home/notification_view.dart | 0 .../home/web/web_Activity_view.dart | 0 lib/{View => view}/home/web/web_homeview.dart | 0 lib/{View => view}/login/login_view.dart | 2 +- .../login/mobile}/android_login_view.dart | 0 .../login/mobile}/android_signup_view.dart | 0 lib/{View => view}/login/signup_view.dart | 2 +- .../login/web/web_login_view.dart | 0 .../login/web/web_signup_view.dart | 0 .../main_tab/main_tab_view.dart | 0 lib/{View => view}/main_tab/select_view.dart | 0 lib/{View => view}/map/my_map.dart | 0 lib/{View => view}/map/test.dart | 0 .../on_boarding/on_boarding_view.dart | 62 +++++++++---------- .../on_boarding/started_view.dart | 2 +- .../profile/mobile/mobile_profile_view.dart | 0 lib/{View => view}/profile/profile_view.dart | 0 .../profile/web/web_profile_view.dart | 0 lib/{View => view}/test/page_test.dart | 6 +- 32 files changed, 45 insertions(+), 64 deletions(-) rename lib/{Modele => modele}/activity.dart (100%) rename lib/{Modele/Api => modele/api}/i_data_strategy.dart (100%) rename lib/{Modele/Api => modele/api}/request_api.dart (99%) rename lib/{Modele => modele}/manager_file.dart (100%) rename lib/{Modele => modele}/user.dart (100%) rename lib/{Modele => modele}/utile/login_user.dart (94%) rename lib/{Modele => modele}/utile/signup_user.dart (87%) rename lib/{View => view}/activity/activity.dart (100%) rename lib/{View => view}/home/activity_tracker.dart (100%) rename lib/{View => view}/home/home_view.dart (79%) rename lib/{View => view}/home/mobile/mobile_Activity_view.dart (100%) rename lib/{View => view}/home/mobile/mobile_homeview.dart (100%) rename lib/{View => view}/home/notification_view.dart (100%) rename lib/{View => view}/home/web/web_Activity_view.dart (100%) rename lib/{View => view}/home/web/web_homeview.dart (100%) rename lib/{View => view}/login/login_view.dart (89%) rename lib/{View/login/Mobile => view/login/mobile}/android_login_view.dart (100%) rename lib/{View/login/Mobile => view/login/mobile}/android_signup_view.dart (100%) rename lib/{View => view}/login/signup_view.dart (90%) rename lib/{View => view}/login/web/web_login_view.dart (100%) rename lib/{View => view}/login/web/web_signup_view.dart (100%) rename lib/{View => view}/main_tab/main_tab_view.dart (100%) rename lib/{View => view}/main_tab/select_view.dart (100%) rename lib/{View => view}/map/my_map.dart (100%) rename lib/{View => view}/map/test.dart (100%) rename lib/{View => view}/on_boarding/on_boarding_view.dart (68%) rename lib/{View => view}/on_boarding/started_view.dart (99%) rename lib/{View => view}/profile/mobile/mobile_profile_view.dart (100%) rename lib/{View => view}/profile/profile_view.dart (100%) rename lib/{View => view}/profile/web/web_profile_view.dart (100%) rename lib/{View => view}/test/page_test.dart (98%) diff --git a/.metadata b/.metadata index acfc1cf..3408c2c 100644 --- a/.metadata +++ b/.metadata @@ -4,7 +4,7 @@ # This file should be version controlled and should not be manually edited. version: - revision: "6c4930c4ac86fb286f30e31d0ec8bffbcbb9953e" + revision: "d211f42860350d914a5ad8102f9ec32764dc6d06" channel: "stable" project_type: app @@ -13,26 +13,11 @@ project_type: app migration: platforms: - platform: root - create_revision: 6c4930c4ac86fb286f30e31d0ec8bffbcbb9953e - base_revision: 6c4930c4ac86fb286f30e31d0ec8bffbcbb9953e - - platform: android - create_revision: 6c4930c4ac86fb286f30e31d0ec8bffbcbb9953e - base_revision: 6c4930c4ac86fb286f30e31d0ec8bffbcbb9953e - - platform: ios - create_revision: 6c4930c4ac86fb286f30e31d0ec8bffbcbb9953e - base_revision: 6c4930c4ac86fb286f30e31d0ec8bffbcbb9953e + create_revision: d211f42860350d914a5ad8102f9ec32764dc6d06 + base_revision: d211f42860350d914a5ad8102f9ec32764dc6d06 - platform: linux - create_revision: 6c4930c4ac86fb286f30e31d0ec8bffbcbb9953e - base_revision: 6c4930c4ac86fb286f30e31d0ec8bffbcbb9953e - - platform: macos - create_revision: 6c4930c4ac86fb286f30e31d0ec8bffbcbb9953e - base_revision: 6c4930c4ac86fb286f30e31d0ec8bffbcbb9953e - - platform: web - create_revision: 6c4930c4ac86fb286f30e31d0ec8bffbcbb9953e - base_revision: 6c4930c4ac86fb286f30e31d0ec8bffbcbb9953e - - platform: windows - create_revision: 6c4930c4ac86fb286f30e31d0ec8bffbcbb9953e - base_revision: 6c4930c4ac86fb286f30e31d0ec8bffbcbb9953e + create_revision: d211f42860350d914a5ad8102f9ec32764dc6d06 + base_revision: d211f42860350d914a5ad8102f9ec32764dc6d06 # User provided section diff --git a/lib/Modele/activity.dart b/lib/modele/activity.dart similarity index 100% rename from lib/Modele/activity.dart rename to lib/modele/activity.dart diff --git a/lib/Modele/Api/i_data_strategy.dart b/lib/modele/api/i_data_strategy.dart similarity index 100% rename from lib/Modele/Api/i_data_strategy.dart rename to lib/modele/api/i_data_strategy.dart diff --git a/lib/Modele/Api/request_api.dart b/lib/modele/api/request_api.dart similarity index 99% rename from lib/Modele/Api/request_api.dart rename to lib/modele/api/request_api.dart index 5fd3783..0b50eeb 100644 --- a/lib/Modele/Api/request_api.dart +++ b/lib/modele/api/request_api.dart @@ -1,7 +1,7 @@ import 'dart:convert'; import 'dart:io'; -import 'package:smartfit_app_mobile/Modele/Api/i_data_strategy.dart'; +import 'package:smartfit_app_mobile/modele/api/i_data_strategy.dart'; import 'package:http/http.dart' as http; import 'package:tuple/tuple.dart'; diff --git a/lib/Modele/manager_file.dart b/lib/modele/manager_file.dart similarity index 100% rename from lib/Modele/manager_file.dart rename to lib/modele/manager_file.dart diff --git a/lib/Modele/user.dart b/lib/modele/user.dart similarity index 100% rename from lib/Modele/user.dart rename to lib/modele/user.dart diff --git a/lib/Modele/utile/login_user.dart b/lib/modele/utile/login_user.dart similarity index 94% rename from lib/Modele/utile/login_user.dart rename to lib/modele/utile/login_user.dart index 261e75c..f10314c 100644 --- a/lib/Modele/utile/login_user.dart +++ b/lib/modele/utile/login_user.dart @@ -3,7 +3,7 @@ import 'dart:convert'; import 'package:crypto/crypto.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:smartfit_app_mobile/Modele/Api/request_api.dart'; +import 'package:smartfit_app_mobile/modele/api/request_api.dart'; import 'package:smartfit_app_mobile/modele/api/i_data_strategy.dart'; import 'package:smartfit_app_mobile/modele/user.dart'; import 'package:tuple/tuple.dart'; diff --git a/lib/Modele/utile/signup_user.dart b/lib/modele/utile/signup_user.dart similarity index 87% rename from lib/Modele/utile/signup_user.dart rename to lib/modele/utile/signup_user.dart index dd678b4..d398b8c 100644 --- a/lib/Modele/utile/signup_user.dart +++ b/lib/modele/utile/signup_user.dart @@ -1,7 +1,7 @@ import 'dart:convert'; import 'package:crypto/crypto.dart'; -import 'package:smartfit_app_mobile/Modele/Api/request_api.dart'; +import 'package:smartfit_app_mobile/modele/api/request_api.dart'; import 'package:smartfit_app_mobile/modele/api/i_data_strategy.dart'; import 'package:tuple/tuple.dart'; diff --git a/lib/View/activity/activity.dart b/lib/view/activity/activity.dart similarity index 100% rename from lib/View/activity/activity.dart rename to lib/view/activity/activity.dart diff --git a/lib/View/home/activity_tracker.dart b/lib/view/home/activity_tracker.dart similarity index 100% rename from lib/View/home/activity_tracker.dart rename to lib/view/home/activity_tracker.dart diff --git a/lib/View/home/home_view.dart b/lib/view/home/home_view.dart similarity index 79% rename from lib/View/home/home_view.dart rename to lib/view/home/home_view.dart index 3779dbd..0b6f1cb 100644 --- a/lib/View/home/home_view.dart +++ b/lib/view/home/home_view.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:responsive_builder/responsive_builder.dart'; -import 'package:smartfit_app_mobile/View/home/mobile/mobile_homeview.dart'; -import 'package:smartfit_app_mobile/View/home/web/web_homeview.dart'; +import 'package:smartfit_app_mobile/view/home/mobile/mobile_homeview.dart'; +import 'package:smartfit_app_mobile/view/home/web/web_homeview.dart'; class HomeView extends StatefulWidget { const HomeView({super.key}); diff --git a/lib/View/home/mobile/mobile_Activity_view.dart b/lib/view/home/mobile/mobile_Activity_view.dart similarity index 100% rename from lib/View/home/mobile/mobile_Activity_view.dart rename to lib/view/home/mobile/mobile_Activity_view.dart diff --git a/lib/View/home/mobile/mobile_homeview.dart b/lib/view/home/mobile/mobile_homeview.dart similarity index 100% rename from lib/View/home/mobile/mobile_homeview.dart rename to lib/view/home/mobile/mobile_homeview.dart diff --git a/lib/View/home/notification_view.dart b/lib/view/home/notification_view.dart similarity index 100% rename from lib/View/home/notification_view.dart rename to lib/view/home/notification_view.dart diff --git a/lib/View/home/web/web_Activity_view.dart b/lib/view/home/web/web_Activity_view.dart similarity index 100% rename from lib/View/home/web/web_Activity_view.dart rename to lib/view/home/web/web_Activity_view.dart diff --git a/lib/View/home/web/web_homeview.dart b/lib/view/home/web/web_homeview.dart similarity index 100% rename from lib/View/home/web/web_homeview.dart rename to lib/view/home/web/web_homeview.dart diff --git a/lib/View/login/login_view.dart b/lib/view/login/login_view.dart similarity index 89% rename from lib/View/login/login_view.dart rename to lib/view/login/login_view.dart index 55fe3bb..dc272ab 100644 --- a/lib/View/login/login_view.dart +++ b/lib/view/login/login_view.dart @@ -1,5 +1,5 @@ import 'package:responsive_builder/responsive_builder.dart'; -import 'package:smartfit_app_mobile/view/login/Mobile/android_login_view.dart'; +import 'package:smartfit_app_mobile/view/login/mobile/android_login_view.dart'; import 'package:smartfit_app_mobile/view/login/web/web_login_view.dart'; import 'package:flutter/material.dart'; diff --git a/lib/View/login/Mobile/android_login_view.dart b/lib/view/login/mobile/android_login_view.dart similarity index 100% rename from lib/View/login/Mobile/android_login_view.dart rename to lib/view/login/mobile/android_login_view.dart diff --git a/lib/View/login/Mobile/android_signup_view.dart b/lib/view/login/mobile/android_signup_view.dart similarity index 100% rename from lib/View/login/Mobile/android_signup_view.dart rename to lib/view/login/mobile/android_signup_view.dart diff --git a/lib/View/login/signup_view.dart b/lib/view/login/signup_view.dart similarity index 90% rename from lib/View/login/signup_view.dart rename to lib/view/login/signup_view.dart index a94d65b..1b651c3 100644 --- a/lib/View/login/signup_view.dart +++ b/lib/view/login/signup_view.dart @@ -1,5 +1,5 @@ import 'package:responsive_builder/responsive_builder.dart'; -import 'package:smartfit_app_mobile/view/login/Mobile/android_signup_view.dart'; +import 'package:smartfit_app_mobile/view/login/mobile/android_signup_view.dart'; import 'package:flutter/material.dart'; import 'package:smartfit_app_mobile/view/login/web/web_signup_view.dart'; diff --git a/lib/View/login/web/web_login_view.dart b/lib/view/login/web/web_login_view.dart similarity index 100% rename from lib/View/login/web/web_login_view.dart rename to lib/view/login/web/web_login_view.dart diff --git a/lib/View/login/web/web_signup_view.dart b/lib/view/login/web/web_signup_view.dart similarity index 100% rename from lib/View/login/web/web_signup_view.dart rename to lib/view/login/web/web_signup_view.dart diff --git a/lib/View/main_tab/main_tab_view.dart b/lib/view/main_tab/main_tab_view.dart similarity index 100% rename from lib/View/main_tab/main_tab_view.dart rename to lib/view/main_tab/main_tab_view.dart diff --git a/lib/View/main_tab/select_view.dart b/lib/view/main_tab/select_view.dart similarity index 100% rename from lib/View/main_tab/select_view.dart rename to lib/view/main_tab/select_view.dart diff --git a/lib/View/map/my_map.dart b/lib/view/map/my_map.dart similarity index 100% rename from lib/View/map/my_map.dart rename to lib/view/map/my_map.dart diff --git a/lib/View/map/test.dart b/lib/view/map/test.dart similarity index 100% rename from lib/View/map/test.dart rename to lib/view/map/test.dart diff --git a/lib/View/on_boarding/on_boarding_view.dart b/lib/view/on_boarding/on_boarding_view.dart similarity index 68% rename from lib/View/on_boarding/on_boarding_view.dart rename to lib/view/on_boarding/on_boarding_view.dart index 02e6008..1c59bf0 100644 --- a/lib/View/on_boarding/on_boarding_view.dart +++ b/lib/view/on_boarding/on_boarding_view.dart @@ -16,15 +16,12 @@ class _OnBoardingViewState extends State { @override void initState() { - super.initState(); controller.addListener(() { - selectPage = controller.page?.round() ?? 0; + selectPage = controller.page?.round() ?? 0; - setState(() { - - }); + setState(() {}); }); } @@ -39,7 +36,7 @@ class _OnBoardingViewState extends State { "title": "Persévérez", "subtitle": "Continuez à persévérer pour atteindre vos objectifs. La douleur n'est que temporaire. Si vous abandonnez maintenant, vous souffrirez éternellement.", - "image": "assets/img/on_2.svg" + "image": "assets/img/on_2.svg" }, { "title": "Laissez-nous piloter, mettez simplement votre Suunto", @@ -51,7 +48,6 @@ class _OnBoardingViewState extends State { @override Widget build(BuildContext context) { - return Scaffold( backgroundColor: TColor.white, body: Stack( @@ -62,52 +58,52 @@ class _OnBoardingViewState extends State { itemCount: pageArr.length, itemBuilder: (context, index) { var pObj = pageArr[index] as Map? ?? {}; - return OnBoardingPage(pObj: pObj) ; + return OnBoardingPage(pObj: pObj); }), - SizedBox( width: 120, height: 120, child: Stack( alignment: Alignment.center, children: [ - SizedBox( width: 70, height: 70, child: CircularProgressIndicator( color: TColor.primaryColor1, - value: (selectPage + 1) / 3 , + value: (selectPage + 1) / 3, strokeWidth: 2, ), ), - Container( - margin: const EdgeInsets.symmetric(horizontal: 30, vertical: 30), + margin: + const EdgeInsets.symmetric(horizontal: 30, vertical: 30), width: 60, height: 60, - decoration: BoxDecoration(color: TColor.primaryColor1, borderRadius: BorderRadius.circular(35)), - child: IconButton(icon: Icon( Icons.navigate_next, color: TColor.white, ), onPressed: (){ - - if(selectPage < 2) { - selectPage = selectPage + 1; - controller.animateToPage(selectPage, duration: const Duration(milliseconds: 200), curve: Curves.bounceInOut); - setState(() { - - }); - - }else{ - Navigator.push(context, + decoration: BoxDecoration( + color: TColor.primaryColor1, + borderRadius: BorderRadius.circular(35)), + child: IconButton( + icon: Icon( + Icons.navigate_next, + color: TColor.white, + ), + onPressed: () { + if (selectPage < 2) { + selectPage = selectPage + 1; + controller.animateToPage(selectPage, + duration: const Duration(milliseconds: 200), + curve: Curves.bounceInOut); + setState(() {}); + } else { + Navigator.push( + context, MaterialPageRoute( - builder: (context) => const SignUpView() - ) - ); + builder: (context) => const SignUpView())); } - - },), + }, + ), ), - - ], ), ) @@ -115,4 +111,4 @@ class _OnBoardingViewState extends State { ), ); } -} \ No newline at end of file +} diff --git a/lib/View/on_boarding/started_view.dart b/lib/view/on_boarding/started_view.dart similarity index 99% rename from lib/View/on_boarding/started_view.dart rename to lib/view/on_boarding/started_view.dart index d091d59..710c905 100644 --- a/lib/View/on_boarding/started_view.dart +++ b/lib/view/on_boarding/started_view.dart @@ -65,4 +65,4 @@ class _StartedViewState extends State { )), ); } -} \ No newline at end of file +} diff --git a/lib/View/profile/mobile/mobile_profile_view.dart b/lib/view/profile/mobile/mobile_profile_view.dart similarity index 100% rename from lib/View/profile/mobile/mobile_profile_view.dart rename to lib/view/profile/mobile/mobile_profile_view.dart diff --git a/lib/View/profile/profile_view.dart b/lib/view/profile/profile_view.dart similarity index 100% rename from lib/View/profile/profile_view.dart rename to lib/view/profile/profile_view.dart diff --git a/lib/View/profile/web/web_profile_view.dart b/lib/view/profile/web/web_profile_view.dart similarity index 100% rename from lib/View/profile/web/web_profile_view.dart rename to lib/view/profile/web/web_profile_view.dart diff --git a/lib/View/test/page_test.dart b/lib/view/test/page_test.dart similarity index 98% rename from lib/View/test/page_test.dart rename to lib/view/test/page_test.dart index d3a098f..9ac922e 100644 --- a/lib/View/test/page_test.dart +++ b/lib/view/test/page_test.dart @@ -7,9 +7,9 @@ import 'package:path_provider/path_provider.dart'; import 'package:file_picker/file_picker.dart'; import 'package:provider/provider.dart'; import 'dart:io'; -import 'package:smartfit_app_mobile/Modele/Api/i_data_strategy.dart'; -import 'package:smartfit_app_mobile/Modele/manager_file.dart'; -import 'package:smartfit_app_mobile/Modele/user.dart'; +import 'package:smartfit_app_mobile/modele/api/i_data_strategy.dart'; +import 'package:smartfit_app_mobile/modele/manager_file.dart'; +import 'package:smartfit_app_mobile/modele/user.dart'; import 'package:smartfit_app_mobile/modele/api/request_api.dart'; import 'package:tuple/tuple.dart'; From 8e0bef3f70cabcd74dad526499009b87d82c5708 Mon Sep 17 00:00:00 2001 From: Enzo Date: Wed, 15 Nov 2023 11:11:34 +0100 Subject: [PATCH 11/11] correction post user --- lib/modele/api/request_api.dart | 25 ++++++++----------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/lib/modele/api/request_api.dart b/lib/modele/api/request_api.dart index 0b50eeb..14d226f 100644 --- a/lib/modele/api/request_api.dart +++ b/lib/modele/api/request_api.dart @@ -101,22 +101,10 @@ class RequestApi extends IDataStrategy { @override Future> postUser( String email, String hash, String username) async { - print(email); - print(hash); - print(username); - - print({ - "\"email\"": "\"$email\"", - "\"hash\"": "\"$hash\"", - "\"username\"": "\"$username\"" - }); - - final response = - await http.post(Uri.parse('$urlApi/user'), body: { - "\"email\"": "\"$email\"", - "\"hash\"": "\"$hash\"", - "\"username\"": "\"$username\"" - }); + var body = {"email": email, "hash": hash, "username": username}; + var header = {"Content-Type": "application/json"}; + final response = await http.post(Uri.parse('$urlApi/user'), + headers: header, body: jsonEncode(body)); if (response.statusCode == 200) { Map json = jsonDecode(response.body); @@ -167,7 +155,10 @@ class RequestApi extends IDataStrategy { Future modifAttribut( String token, String nameAttribut, String newValue) async { final response = await http.put(Uri.parse('$urlApi/user/$nameAttribut'), - headers: {'Authorization': token}, + headers: { + 'Authorization': token, + "Content-Type": "application/json" + }, body: jsonEncode({nameAttribut: newValue})); if (response.statusCode == 200) {