pull/1/head
Enzo 2 years ago
parent 2d8992478f
commit fdad41c5e5

@ -2,8 +2,8 @@ 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 { class User extends ChangeNotifier {
String? username; String username = "VOID";
String? email; String email = "VOID";
String? token; String token = "VOID";
List<ActivityOfUser>? listActivity; List<ActivityOfUser>? listActivity;
} }

@ -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<Tuple2<bool, String>> checkLoginAndPassword(
String email, String password) async {
Tuple2<bool, String> result = await api.connexion(
email, sha256.convert(utf8.encode(password)).toString());
return result;
}
Future<Tuple2<bool, Map<dynamic, dynamic>>> getUserInfo(String token) async {
Tuple2 result = await api.getInfoUser(token);
if (result.item1 == false) {
return const Tuple2(false, <String, String>{"Empty": "Empty"});
}
return Tuple2(true, result.item2);
}
void fillUser(BuildContext context, Map<String, dynamic> map, String token) {
context.read<User>().email = map["email"];
context.read<User>().username = map["username"];
context.read<User>().token = token;
context.read<User>().listActivity = List.empty(growable: true);
}
}

@ -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<Tuple2<bool, String>> createUser(
String email, String username, String password) async {
return await api.postUser(
email, sha256.convert(utf8.encode(password)).toString(), username);
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -1,38 +1,42 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.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/View/main_tab/main_tab_view.dart';
import 'package:smartfit_app_mobile/common/colo_extension.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_button.dart';
import 'package:smartfit_app_mobile/common_widget/round_text_field.dart'; import 'package:smartfit_app_mobile/common_widget/round_text_field.dart';
import 'package:tuple/tuple.dart'; import 'package:tuple/tuple.dart';
class AndroidLoginView extends StatelessWidget { class MobileLoginView extends StatefulWidget {
AndroidLoginView( const MobileLoginView({super.key});
this._obscureText,
this._errorLogin,
this._msgError,
this._toggle,
this._printMsgError,
this.getUserInfo,
this.checkLoginAndPassword,
this.fillUser,
{super.key});
bool _obscureText; @override
bool _errorLogin; State<MobileLoginView> createState() => _MobileLoginView();
final String _msgError; }
class _MobileLoginView extends State<MobileLoginView> {
final Login util = Login();
bool _obscureText = true;
bool _errorLogin = false;
String _msgError = "";
final controllerTextEmail = TextEditingController(); final controllerTextEmail = TextEditingController();
final controllerTextPassword = TextEditingController(); final controllerTextPassword = TextEditingController();
// ---- Fonction --- // // Toggles the password show status
final void Function() _toggle; void _toggle() {
final Future<Tuple2<bool, String>> Function(String email, String password) setState(() {
checkLoginAndPassword; _obscureText = !_obscureText;
final Future<Tuple2> Function(String token) getUserInfo; });
final void Function(String msgError) _printMsgError; }
final void Function(
BuildContext context, Map<String, dynamic> map, String token) fillUser; void _printMsgError(String msgError) {
setState(() {
_msgError = msgError;
_errorLogin = true;
});
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -48,7 +52,7 @@ class AndroidLoginView extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
Text( Text(
"Bienvenue, Android", "Bienvenue",
style: TextStyle(color: TColor.gray, fontSize: 16), style: TextStyle(color: TColor.gray, fontSize: 16),
), ),
Text( Text(
@ -114,19 +118,20 @@ class AndroidLoginView extends StatelessWidget {
RoundButton( RoundButton(
title: "Se connecter", title: "Se connecter",
onPressed: () async { onPressed: () async {
Tuple2<bool, String> result = await checkLoginAndPassword( Tuple2<bool, String> result =
await util.checkLoginAndPassword(
controllerTextEmail.text, controllerTextEmail.text,
controllerTextPassword.text); controllerTextPassword.text);
if (result.item1 == true) { if (result.item1 == true) {
Tuple2 infoUser = await getUserInfo(result.item2); Tuple2 infoUser = await util.getUserInfo(result.item2);
if (infoUser.item1 == false) { if (infoUser.item1 == false) {
//print("Erreur - Impossible de récupéré les données de l'utilisateur"); //print("Erreur - Impossible de récupéré les données de l'utilisateur");
_printMsgError( _printMsgError(
"Impossible de récupéré les données de l'utilisateur - {$infoUser.item2}"); "Impossible de récupéré les données de l'utilisateur - {$infoUser.item2}");
} else { } else {
fillUser(context, infoUser.item2, result.item2); util.fillUser(context, infoUser.item2, result.item2);
Navigator.push( Navigator.push(
context, context,

@ -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<MobileSignUpView> createState() => _MobileSignUpView();
}
class _MobileSignUpView extends State<MobileSignUpView> {
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<bool, String> 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,
),
],
),
),
),
),
);
}
}

@ -1,32 +1,7 @@
import 'dart:convert'; import 'package:responsive_builder/responsive_builder.dart';
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/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:smartfit_app_mobile/View/login/web/web_login_view.dart';
import 'package:flutter/material.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 { class LoginView extends StatefulWidget {
const LoginView({super.key}); const LoginView({super.key});
@ -36,54 +11,10 @@ class LoginView extends StatefulWidget {
} }
class _LoginViewState extends State<LoginView> { class _LoginViewState extends State<LoginView> {
bool _obscureText = true;
String _msgError = "";
bool _errorLogin = false;
IDataStrategy api = RequestApi();
String platforme = getPlatforme();
Future<Tuple2<bool, String>> checkLoginAndPassword(
String email, String password) async {
Tuple2<bool, String> result = await api.connexion(
email, sha256.convert(utf8.encode(password)).toString());
return result;
}
Future<Tuple2<bool, Map<dynamic, dynamic>>> getUserInfo(String token) async {
Tuple2 result = await api.getInfoUser(token);
if (result.item1 == false) {
return const Tuple2(false, <String, String>{"Empty": "Empty"});
}
return Tuple2(true, result.item2);
}
void fillUser(BuildContext context, Map<String, dynamic> map, String token) {
context.read<User>().email = map["email"];
context.read<User>().username = map["username"];
context.read<User>().token = token;
context.read<User>().listActivity = List.empty(growable: true);
}
// Toggles the password show status
void _toggle() {
setState(() {
_obscureText = !_obscureText;
});
}
void _printMsgError(String msgError) {
_msgError = msgError;
_errorLogin = true;
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
if (platforme == "Android") { return ScreenTypeLayout.builder(
return AndroidLoginView(_obscureText, _errorLogin, _msgError, _toggle, mobile: (_) => const MobileLoginView(),
_printMsgError, getUserInfo, checkLoginAndPassword, fillUser); desktop: (_) => const WebLoginView());
} else {
return WebLoginView(_obscureText, _errorLogin, _msgError, _toggle,
_printMsgError, getUserInfo, checkLoginAndPassword, fillUser);
}
} }
} }

@ -1,14 +1,7 @@
import 'dart:convert'; import 'package:responsive_builder/responsive_builder.dart';
import 'package:crypto/crypto.dart'; import 'package:smartfit_app_mobile/View/login/Mobile/android_signup_view.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:flutter/material.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 { class SignUpView extends StatefulWidget {
const SignUpView({super.key}); const SignUpView({super.key});
@ -18,255 +11,11 @@ class SignUpView extends StatefulWidget {
} }
class _SignUpViewState extends State<SignUpView> { class _SignUpViewState extends State<SignUpView> {
bool _obscureText = true;
bool _errorCreateUser = false;
bool isCheck = false;
String _msgError = "";
IDataStrategy api = RequestApi();
final controllerTextEmail = TextEditingController();
final controllerTextUsername = TextEditingController();
final controllerTextPassword = TextEditingController();
Future<Tuple2<bool, String>> 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 @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
var media = MediaQuery.of(context).size; return ScreenTypeLayout.builder(
return Scaffold( mobile: (_) => const MobileSignUpView(),
backgroundColor: TColor.white, desktop: (_) => const WebSignUpView(),
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<bool, String> 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,
),
],
),
),
),
),
); );
} }
} }

@ -1,38 +1,43 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.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/View/main_tab/main_tab_view.dart';
import 'package:smartfit_app_mobile/common/colo_extension.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_button.dart';
import 'package:smartfit_app_mobile/common_widget/round_text_field.dart'; import 'package:smartfit_app_mobile/common_widget/round_text_field.dart';
import 'package:tuple/tuple.dart'; import 'package:tuple/tuple.dart';
class WebLoginView extends StatelessWidget { class WebLoginView extends StatefulWidget {
WebLoginView( const WebLoginView({super.key});
this._obscureText,
this._errorLogin,
this._msgError,
this._toggle,
this._printMsgError,
this.getUserInfo,
this.checkLoginAndPassword,
this.fillUser,
{super.key});
bool _obscureText; @override
bool _errorLogin; State<WebLoginView> createState() => _WebLoginView();
final String _msgError; }
class _WebLoginView extends State<WebLoginView> {
final Login util = Login();
bool _obscureText = true;
bool _errorLogin = false;
String _msgError = "";
final controllerTextEmail = TextEditingController(); final controllerTextEmail = TextEditingController();
final controllerTextPassword = TextEditingController(); final controllerTextPassword = TextEditingController();
// ---- Fonction --- // // Toggles the password show status
final void Function() _toggle; void _toggle() {
final Future<Tuple2<bool, String>> Function(String email, String password) setState(() {
checkLoginAndPassword; _obscureText = !_obscureText;
final Future<Tuple2> Function(String token) getUserInfo; });
final void Function(String msgError) _printMsgError; }
final void Function(
BuildContext context, Map<String, dynamic> map, String token) fillUser; void _printMsgError(String msgError) {
setState(() {
_msgError = msgError;
_errorLogin = true;
});
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -48,7 +53,7 @@ class WebLoginView extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
Text( Text(
"Bienvenue, Web", "Bienvenue",
style: TextStyle(color: TColor.gray, fontSize: 16), style: TextStyle(color: TColor.gray, fontSize: 16),
), ),
Text( Text(
@ -114,20 +119,20 @@ class WebLoginView extends StatelessWidget {
RoundButton( RoundButton(
title: "Se connecter", title: "Se connecter",
onPressed: () async { onPressed: () async {
Tuple2<bool, String> result = await checkLoginAndPassword( Tuple2<bool, String> result =
await util.checkLoginAndPassword(
controllerTextEmail.text, controllerTextEmail.text,
controllerTextPassword.text); controllerTextPassword.text);
if (result.item1 == true) { if (result.item1 == true) {
Tuple2 infoUser = await getUserInfo(result.item2); Tuple2 infoUser = await util.getUserInfo(result.item2);
if (infoUser.item1 == false) { if (infoUser.item1 == false) {
//print("Erreur - Impossible de récupéré les données de l'utilisateur"); //print("Erreur - Impossible de récupéré les données de l'utilisateur");
_printMsgError( _printMsgError(
"Impossible de récupéré les données de l'utilisateur - {$infoUser.item2}"); "Impossible de récupéré les données de l'utilisateur - {$infoUser.item2}");
} else { } else {
fillUser(context, infoUser.item2, result.item2); util.fillUser(context, infoUser.item2, result.item2);
Navigator.push( Navigator.push(
context, context,
MaterialPageRoute( MaterialPageRoute(

@ -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<WebSignUpView> createState() => _WebSignUpView();
}
class _WebSignUpView extends State<WebSignUpView> {
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<bool, String> 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,
),
],
),
),
),
),
);
}
}

@ -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/colo_extension.dart';
import 'package:smartfit_app_mobile/common_widget/tab_button.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/activity/activity.dart';
import 'package:smartfit_app_mobile/view/home/home_view.dart'; import 'package:smartfit_app_mobile/view/home/home_view.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:smartfit_app_mobile/view/map/my_map.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'; import 'package:smartfit_app_mobile/view/profile/profile_view.dart';
class MainTabView extends StatefulWidget { class MainTabView extends StatefulWidget {

@ -5,7 +5,7 @@ import 'package:flutter/material.dart';
import 'package:smartfit_app_mobile/view/home/blank_view.dart'; import 'package:smartfit_app_mobile/view/home/blank_view.dart';
//import '../sleep_tracker/sleep_tracker_view.dart'; //import '../sleep_tracker/sleep_tracker_view.dart';
/*
class SelectView extends StatelessWidget { class SelectView extends StatelessWidget {
const SelectView({super.key}); const SelectView({super.key});
@ -61,3 +61,4 @@ class SelectView extends StatelessWidget {
); );
} }
} }
*/

@ -6,10 +6,12 @@ import 'package:flutter/material.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
import 'package:path_provider/path_provider.dart'; import 'package:path_provider/path_provider.dart';
import 'package:file_picker/file_picker.dart'; import 'package:file_picker/file_picker.dart';
import 'package:provider/provider.dart';
import 'dart:io'; 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:smartfit_app_mobile/Modele/Api/request_api.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/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/View/login/signup_view.dart';
import 'package:tuple/tuple.dart'; import 'package:tuple/tuple.dart';
@ -191,6 +193,8 @@ class _TestPage extends State<TestPage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
User w = context.watch<User>();
return Scaffold( return Scaffold(
body: Column( body: Column(
children: [ children: [
@ -230,7 +234,10 @@ class _TestPage extends State<TestPage> {
onPressed: getOneFile, child: const Text("Get One File")), onPressed: getOneFile, child: const Text("Get One File")),
ElevatedButton( ElevatedButton(
onPressed: getInfoUser, child: const Text("Get info User")), onPressed: getInfoUser, child: const Text("Get info User")),
Text(platforme) Text(platforme),
Text(w.email),
Text(context.watch<User>().username),
Text(Provider.of<User>(context).username)
], ],
), ),
); );

@ -54,6 +54,7 @@ dependencies:
provider: ^6.0.5 provider: ^6.0.5
tuple: ^2.0.2 tuple: ^2.0.2
crypto: ^3.0.3 crypto: ^3.0.3
responsive_builder: ^0.7.0
dev_dependencies: dev_dependencies:
flutter_test: flutter_test:

Loading…
Cancel
Save