Merge remote-tracking branch 'origin/master' into remrem

profile
remrem 1 year ago
commit 9a2b7e4fb2

@ -60,7 +60,14 @@ class WorkoutRow extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
wObj["nomActivite"].toString(),
wObj["categorie"].toString(),
style: TextStyle(
color: TColor.black,
fontSize: 12,
),
),
Text(
wObj["date"].toString(),
style: TextStyle(
color: TColor.black,
fontSize: 12,

@ -2,7 +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/common/colo_extension.dart';
import 'package:smartfit_app_mobile/view/main_tab/main_tab_view.dart';
import 'package:smartfit_app_mobile/view/login/signup_view.dart';
void main() {
runApp(ChangeNotifierProvider(
@ -36,7 +36,7 @@ class MyApp extends StatelessWidget {
primaryColor: TColor.primaryColor1,
fontFamily: "Poppins"),
//home: const StartedView(),
home: const MainTabView(),
home: const SignUpView(),
);
}
}

@ -3,20 +3,42 @@ import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:smartfit_app_mobile/common_widget/graph/graph.dart';
class ActivityOfUser {
late String _nomActivite;
// A afficher
late String _categorie;
late String _date;
late String _fileUuid;
late String _nameFile;
// ------------ //
late String _imageName;
late List<dynamic> _contentActivity;
late int _dataSession;
// -- Getter/Setter -- //
List<dynamic> get contentActivity => _contentActivity;
ActivityOfUser(String nom, List<dynamic> listeDynamic) {
_nomActivite = nom;
_imageName = "assets/img/workout1.svg";
_contentActivity = listeDynamic;
set contentActivity(List<dynamic> content) {
_contentActivity = content;
_dataSession = getDataSession();
}
String get fileUuid => _fileUuid;
String get nameFile => _nameFile;
ActivityOfUser(
String date, String categorie, String fileUuid, String nameFile) {
_categorie = categorie;
_date = date;
_fileUuid = fileUuid;
_nameFile = nameFile;
// Mettre dans une fonction appart
if (categorie == "Walking") {
_imageName = "assets/img/workout1.svg";
} else {
// Mettre des conditions pour d'autre type d'activité
_imageName = "assets/img/workout1.svg";
}
}
// ----- Retourne l'indice de la ligne qui contient les données de la session -- //
int getDataSession() {
for (int i = _contentActivity.length - 1; i != 0; i--) {
@ -287,9 +309,6 @@ class ActivityOfUser {
// -------------------------- FIN Localisation ---------------------- //
Map<String, dynamic> toMap() {
return {
'nomActivite': _nomActivite,
'image': _imageName,
};
return {'categorie': _categorie, 'image': _imageName, 'date': _date};
}
}

@ -1,4 +1,5 @@
import 'dart:io';
import 'dart:typed_data';
import 'package:tuple/tuple.dart';
@ -18,6 +19,8 @@ abstract class IDataStrategy {
// Upload file on BDD
Future<Tuple2<bool, String>> uploadFile(String token, File file);
Future<Tuple2<bool, String>> uploadFileByte(String token,
Uint8List contentFile, String nameFile, String category, String date);
// Get one file by id
Future<Tuple2> getFile(String token, String fileUuid);

@ -1,5 +1,6 @@
import 'dart:convert';
import 'dart:io';
import 'dart:typed_data';
import 'package:smartfit_app_mobile/modele/api/i_data_strategy.dart';
import 'package:http/http.dart' as http;
@ -73,7 +74,8 @@ class RequestApi extends IDataStrategy {
headers: <String, String>{'Authorization': token});
if (response.statusCode == 200) {
return Tuple2(true, response.body);
return Tuple2(true,
(json.decode(response.body) as List).cast<Map<String, dynamic>>());
}
if (response.statusCode == 401) {
return const Tuple2(false, "401 - UNAUTHORIZED");
@ -120,37 +122,6 @@ class RequestApi extends IDataStrategy {
return const Tuple2(false, "Fail");
}
/*
@override
Future<bool> updateEmail(String token, String email) async {
final response = await http.put(Uri.parse('$urlApi/$token/email'),
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
body: jsonEncode(<String, String>{'email': email}));
if (response.statusCode == 200) {
return true;
} else {
return false;
}
}
@override
Future<bool> updateUsername(String token, String username) async {
final response = await http.put(Uri.parse('$urlApi/$token/username'),
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
body: jsonEncode(<String, String>{'username': username}));
if (response.statusCode == 200) {
return true;
} else {
return false;
}
}*/
@override
Future<Tuple2> modifAttribut(
String token, String nameAttribut, String newValue) async {
@ -212,6 +183,44 @@ class RequestApi extends IDataStrategy {
return const Tuple2(false, "Fail ");
}
@override
Future<Tuple2<bool, String>> uploadFileByte(
String token,
Uint8List contentFile,
String nameFile,
String category,
String date) async {
final uri = Uri.parse('$urlApi/user/files');
Map<String, String> headers = {'Authorization': token};
var request = http.MultipartRequest('POST', uri);
final httpImage = http.MultipartFile.fromBytes(
'file',
contentFile,
filename: nameFile,
);
request.files.add(httpImage);
request.headers.addAll(headers);
request.fields["SmartFit_Category"] = category;
request.fields["SmartFit_Date"] = date;
final response = await request.send();
if (response.statusCode == 200) {
return const Tuple2(true, "Successful");
}
if (response.statusCode == 400) {
return const Tuple2(false, "400 - BAD REQUEST");
}
if (response.statusCode == 401) {
return const Tuple2(false, "401 - UNAUTHORIZED");
}
if (response.statusCode == 409) {
return const Tuple2(false, "409 - CONFLICT");
}
return const Tuple2(false, "Fail ");
}
@override
Future<Tuple2> getInfoUser(String token) async {
final response = await http.get(Uri.parse('$urlApi/user/info'),

@ -27,10 +27,18 @@ class ManagerFile {
return fitFile.toRows();
}
List<dynamic> readFitFileWeb(Uint8List bytes) {
Future<List<dynamic>> readFitFileWhithFile(File file) async {
final bytes = await file.readAsBytes();
final fitFile = FitFile.fromBytes(bytes);
return fitFile.toRows();
}
List<dynamic> readFitFileWeb(Uint8List bytes) {
final fitFile = FitFile.fromBytes(bytes);
return fitFile.toRows();
}
// ------------- Get The path of application --- //
Future<String> get localPath async {
final directory = await getApplicationDocumentsDirectory();

@ -0,0 +1,6 @@
class AttributUser {
final String _email = "email";
final String _username = "username";
String get email => _email;
String get username => _username;
}

@ -0,0 +1,3 @@
class AttributFileFit {
// Ajouter une variable privé qui contient le champs + un getter
}

@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:smartfit_app_mobile/modele/activity.dart';
import 'package:smartfit_app_mobile/modele/utile/list_activity.dart/list_activity_utile.dart';
class User extends ChangeNotifier {
String username = "VOID";
@ -22,4 +23,16 @@ class User extends ChangeNotifier {
listActivity.insert(index, activity);
notifyListeners();
}
void insertActivityTopMobile(ActivityOfUser activity, BuildContext context) {
listActivity.insert(0, activity);
ListActivityUtile().getContentOnTheFirstFileMobile(context);
notifyListeners();
}
void insertActivityTopWeb(ActivityOfUser activity, BuildContext context) {
listActivity.insert(0, activity);
ListActivityUtile().getContentOnTheFirstFileWeb(context);
notifyListeners();
}
}

@ -0,0 +1,44 @@
import 'dart:io';
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/manager_file.dart';
import 'package:smartfit_app_mobile/modele/user.dart';
import 'package:tuple/tuple.dart';
class ListActivityUtile {
final IDataStrategy _strategy = RequestApi();
final ManagerFile _managerFile = ManagerFile();
Future<void> getContentOnTheFirstFileMobile(BuildContext context) async {
Tuple2 result = await _strategy.getFile(
Provider.of<User>(context, listen: false).token,
Provider.of<User>(context, listen: false).listActivity[0].fileUuid);
if (result.item1 == false) {
//Erreur
//print(result);
return;
}
File file = File(
"${await _managerFile.localPath}/${Provider.of<User>(context, listen: false).listActivity[0].nameFile}");
await file.create();
await file.writeAsBytes(result.item2);
Provider.of<User>(context, listen: false).listActivity[0].contentActivity =
await _managerFile.readFitFileWhithFile(file);
}
Future<void> getContentOnTheFirstFileWeb(BuildContext context) async {
User user = Provider.of<User>(context, listen: false);
Tuple2 result =
await _strategy.getFile(user.token, user.listActivity[0].fileUuid);
if (result.item1 == false) {
//Erreur
//print(result);
return;
}
Provider.of<User>(context, listen: false).listActivity[0].contentActivity =
await _managerFile.readFitFileWeb(result.item2);
}
}

@ -26,12 +26,9 @@ class Login {
return Tuple2(true, result.item2);
}
void fillUser(BuildContext context, Map<String, dynamic> map, String token) {
print(map);
void fillUser(BuildContext context, Map<dynamic, 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,10 @@
import 'package:smartfit_app_mobile/modele/api/i_data_strategy.dart';
import 'package:smartfit_app_mobile/modele/api/request_api.dart';
class ProfileUtil {
final IDataStrategy _dataStrategy = RequestApi();
void modifyDataUser(String token, String attribut, String newUsername) {
_dataStrategy.modifAttribut(token, attribut, newUsername);
}
}

@ -1,3 +1,5 @@
import 'dart:io';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
@ -5,9 +7,10 @@ import 'package:smartfit_app_mobile/common/colo_extension.dart';
import 'package:smartfit_app_mobile/modele/activity.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/manager_file.dart';
import 'package:smartfit_app_mobile/modele/user.dart';
import 'package:smartfit_app_mobile/common_widget/container/workout_row.dart';
import 'package:smartfit_app_mobile/modele/utile/list_activity.dart/list_activity_utile.dart';
import 'package:tuple/tuple.dart';
class MobileListActivity extends StatefulWidget {
const MobileListActivity({Key? key}) : super(key: key);
@ -18,36 +21,67 @@ class MobileListActivity extends StatefulWidget {
class _MobileListActivity extends State<MobileListActivity> {
FilePickerResult? result;
IDataStrategy strategy = RequestApi();
final IDataStrategy strategy = RequestApi();
final ListActivityUtile _utile = ListActivityUtile();
int firstActivityIndex = 0;
/*
Future<void> readFile(String nom) async {
ManagerFile x = ManagerFile();
PlatformFile t = result!.files.single;
String? y = t.path;
if (t.path == null) {
print("t");
} else {
List<dynamic> result = await x.readFitFile(y!);
print("test11");
print(result);
print("test22");
print(ActivityOfUser(nom, result).getHeartRateWithTime());
print("test33");
List<dynamic> result = await _managerFile.readFitFile(y!);
// Upload the file and Syncronise (getFiles())
strategy.uploadFile(context.watch<User>().token, File(y));
Provider.of<User>(context, listen: false)
.addActivity(ActivityOfUser(nom, result));
//print(x.getDistanceWithTime(ActivityOfUser(result)));
//print(x.getDistance(ActivityOfUser(result)));
//print(x.getAltitudeWithTime(ActivityOfUser(result)));
//print(x.getSpeedWithTime(ActivityOfUser(result)));
.addActivity(ActivityOfUser("Random date", "$nom categorie !"));
Provider.of<User>(context, listen: false)
.listActivity
.last
.contentActivity = result;
}
}*/
void addFile(String path) async {
Tuple2<bool, String> result = await strategy.uploadFile(
Provider.of<User>(context, listen: false).token, File(path));
if (result.item1 == false) {
// Afficher msg d'erreur
print("Upload - ${result.item2}");
return;
}
getFiles();
}
List lastWorkoutArr = [];
void getFiles() async {
Tuple2 result = await strategy
.getFiles(Provider.of<User>(context, listen: false).token);
if (result.item1 == false) {
print("GetFiles - ${result.item2}");
// Afficher une message d'erreur
return;
}
Provider.of<User>(context, listen: false).listActivity.clear();
for (Map<String, dynamic> element in result.item2) {
Provider.of<User>(context, listen: false).addActivity(ActivityOfUser(
element["creation_date"].toString(),
element["category"].toString(),
element["uuid"].toString(),
element["filename"].toString()));
}
await _utile.getContentOnTheFirstFileMobile(context);
return;
}
@override
Widget build(BuildContext context) {
var media = MediaQuery.of(context).size;
int firstActivityIndex = 0;
return Scaffold(
backgroundColor: TColor.white,
@ -69,16 +103,23 @@ class _MobileListActivity extends State<MobileListActivity> {
fontSize: 16,
fontWeight: FontWeight.w700),
),
TextButton(
onPressed: getFiles,
child: Text("Get activity",
style: TextStyle(
color: TColor.gray,
fontSize: 14,
fontWeight: FontWeight.w700))),
TextButton(
onPressed: () async {
result = await FilePicker.platform.pickFiles();
if (result == null) {
print("No file selected");
FilePickerResult? result =
await FilePicker.platform.pickFiles();
if (result != null) {
addFile(result.files.single.path!);
} else {
for (var element in result!.files) {
readFile(element.name);
print(element.name);
}
print("Picker");
// msg d'erreur
// User canceled the picker
}
},
child: Text(
@ -95,7 +136,7 @@ class _MobileListActivity extends State<MobileListActivity> {
? Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(height: 20),
const SizedBox(height: 20),
Text(
"Vous n'avez pas d'activités pour le moment, veuillez en ajouter.",
style: TextStyle(
@ -118,7 +159,7 @@ class _MobileListActivity extends State<MobileListActivity> {
itemBuilder: (context, index) {
var activityObj =
Provider.of<User>(context, listen: true)
.listActivity[index] as ActivityOfUser;
.listActivity[index];
var activityMap = activityObj.toMap();
bool isFirstActivity = false;
@ -145,7 +186,8 @@ class _MobileListActivity extends State<MobileListActivity> {
Provider.of<User>(context, listen: false)
.removeActivity(activityObj);
Provider.of<User>(context, listen: false)
.insertActivity(0, activityObj);
.insertActivityTopMobile(
activityObj, context);
},
isFirstActivity: isFirstActivity,
),

@ -1,6 +1,7 @@
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:smartfit_app_mobile/modele/manager_file.dart';
import 'package:smartfit_app_mobile/modele/utile/list_activity.dart/list_activity_utile.dart';
import 'package:tuple/tuple.dart';
import 'package:universal_html/html.dart' as html;
import 'package:file_picker/file_picker.dart';
@ -22,10 +23,9 @@ class WebListActivity extends StatefulWidget {
class _WebListActivityState extends State<WebListActivity> {
FilePickerResult? result;
IDataStrategy strategy = RequestApi();
final ListActivityUtile _utile = ListActivityUtile();
int firstActivityIndex = 0;
//late File x = File(file.path);
/*
void readFile(html.File file) async {
ManagerFile x = ManagerFile();
final reader = html.FileReader();
@ -34,18 +34,70 @@ class _WebListActivityState extends State<WebListActivity> {
if (reader.readyState == html.FileReader.DONE) {
Uint8List bytes = reader.result as Uint8List;
List<dynamic> result = x.readFitFileWeb(bytes);
Provider.of<User>(context, listen: false).addActivity(
ActivityOfUser("Date random", "${file.name} Categorie", "", ""));
Provider.of<User>(context, listen: false)
.addActivity(ActivityOfUser(file.name, result));
.listActivity
.last
.contentActivity = result;
}
});
}*/
void addFile(html.File file) async {
final reader = html.FileReader();
reader.readAsArrayBuffer(file);
reader.onLoadEnd.listen((event) async {
if (reader.readyState == html.FileReader.DONE) {
Uint8List bytes = reader.result as Uint8List;
String filename = file.name;
String categoryActivity = filename.split("_").first.toLowerCase();
String dateActivity = filename.split("_")[1].split("T").first;
Tuple2<bool, String> result = await strategy.uploadFileByte(
Provider.of<User>(context, listen: false).token,
bytes,
filename,
categoryActivity,
dateActivity);
if (result.item1 == false) {
// Afficher msg d'erreur
print("Upload - ${result.item2}");
return;
}
getFiles();
}
});
}
List lastWorkoutArr = [];
// -- On doit garder cet fonction dans la page pour pouvoir afficher les msg -- //
void getFiles() async {
Tuple2 result = await strategy
.getFiles(Provider.of<User>(context, listen: false).token);
if (result.item1 == false) {
print("GetFiles - ${result.item2}");
// Afficher une message d'erreur
return;
}
Provider.of<User>(context, listen: false).listActivity.clear();
for (Map<String, dynamic> element in result.item2) {
Provider.of<User>(context, listen: false).addActivity(ActivityOfUser(
element["creation_date"].toString(),
element["category"].toString(),
element["uuid"].toString(),
element["filename"].toString()));
}
await _utile.getContentOnTheFirstFileWeb(context);
return;
}
@override
Widget build(BuildContext context) {
var media = MediaQuery.of(context).size;
print("tttt");
return Scaffold(
backgroundColor: TColor.white,
body: SingleChildScrollView(
@ -66,6 +118,13 @@ class _WebListActivityState extends State<WebListActivity> {
fontSize: 16,
fontWeight: FontWeight.w700),
),
TextButton(
onPressed: getFiles,
child: Text("Get activity",
style: TextStyle(
color: TColor.gray,
fontSize: 14,
fontWeight: FontWeight.w700))),
TextButton(
onPressed: () async {
html.FileUploadInputElement uploadInput =
@ -75,8 +134,7 @@ class _WebListActivityState extends State<WebListActivity> {
uploadInput.onChange.listen((e) {
final files = uploadInput.files;
if (files != null && files.isNotEmpty) {
readFile(
files[0]); // Lecture du fichier sélectionné
addFile(files[0]); // Lecture du fichier sélectionné
}
});
},
@ -94,7 +152,7 @@ class _WebListActivityState extends State<WebListActivity> {
? Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(height: 20),
const SizedBox(height: 20),
Text(
"Vous n'avez pas d'activités pour le moment, veuillez en ajouter.",
style: TextStyle(
@ -117,7 +175,7 @@ class _WebListActivityState extends State<WebListActivity> {
itemBuilder: (context, index) {
var activityObj =
Provider.of<User>(context, listen: true)
.listActivity[index] as ActivityOfUser;
.listActivity[index];
var activityMap = activityObj.toMap();
bool isFirstActivity = false;
@ -144,7 +202,8 @@ class _WebListActivityState extends State<WebListActivity> {
Provider.of<User>(context, listen: false)
.removeActivity(activityObj);
Provider.of<User>(context, listen: false)
.insertActivity(0, activityObj);
.insertActivityTopWeb(
activityObj, context);
},
isFirstActivity: isFirstActivity,
),

@ -101,23 +101,23 @@ class _WebHomeView extends State<WebHomeView> {
height: media.width * 0.05,
),
LigneContainerStats(
"${double.parse(maxSpeed.toStringAsFixed(2))} KM/H",
"${double.parse(avgSpeed.toStringAsFixed(2))} km/H",
"${double.parse(maxSpeed.toStringAsFixed(2))} m/s",
"${double.parse(avgSpeed.toStringAsFixed(2))} m/s",
"${avgBpm.toString()} BPM",
"Minimum",
"Maximum",
"Moyenne",
Icons.trending_down,
"Max vitesse",
"Moyenne vitesse",
"Moyenne Bpm",
Icons.trending_up,
Icons.bolt,
Icons.favorite_outline),
SizedBox(
height: media.width * 0.05,
),
GraphAltitudeByTime(media, data),
LigneContainerStats(
"${minAltitude.toInt()} M",
"${maxAltitude.toInt()} M",
"${avgAltitude.toInt()} M",
"${minAltitude.toInt()} m",
"${maxAltitude.toInt()} m",
"${avgAltitude.toInt()} m",
"Minimum",
"Maximum",
"Moyenne",

@ -15,7 +15,7 @@ class MainTabView extends StatefulWidget {
}
class _MainTabViewState extends State<MainTabView> {
int selectTab = 0;
int selectTab = -1;
final PageStorageBucket pageBucket = PageStorageBucket();
Widget currentTab = const ListActivity();
@override

@ -2,9 +2,9 @@ import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:responsive_builder/responsive_builder.dart';
import 'package:smartfit_app_mobile/modele/user.dart';
import 'package:smartfit_app_mobile/view/home/no_activity_view.dart';
import 'package:smartfit_app_mobile/view/map/mobile/mobile_my_map.dart';
import 'package:smartfit_app_mobile/view/map/web/web_my_map.dart';
import 'package:smartfit_app_mobile/view/profile/profile_view.dart';
class MyMap extends StatefulWidget {
const MyMap({Key? key}) : super(key: key);
@ -18,8 +18,8 @@ class _MyMapState extends State<MyMap> {
Widget build(BuildContext context) {
return context.watch<User>().listActivity.isEmpty
? ScreenTypeLayout.builder(
mobile: (_) => const ProfileView(),
desktop: (_) => const ProfileView(),
mobile: (_) => const NoActivityView(),
desktop: (_) => const NoActivityView(),
)
: ScreenTypeLayout.builder(
mobile: (_) => const MobileMyMaps(),

@ -0,0 +1,24 @@
import 'package:flutter/material.dart';
import 'package:responsive_builder/responsive_builder.dart';
import 'package:smartfit_app_mobile/view/profile/mobile/mobile_change_email.dart';
import 'package:smartfit_app_mobile/view/profile/mobile/mobile_change_username.dart';
import 'package:smartfit_app_mobile/view/profile/web/web_change_email.dart';
import 'package:smartfit_app_mobile/view/profile/web/web_change_username.dart';
class ChangeEmailView extends StatefulWidget {
const ChangeEmailView({super.key});
@override
State<ChangeEmailView> createState() => _ChangeEmailViewState();
}
class _ChangeEmailViewState extends State<ChangeEmailView> {
@override
Widget build(BuildContext context) {
return ScreenTypeLayout.builder(
mobile: (_) => const MobileChangeEmailView(),
desktop: (_) => const WebChangeEmailView(),
);
}
}

@ -1,6 +1,10 @@
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:responsive_builder/responsive_builder.dart';
import 'package:smartfit_app_mobile/common_widget/button/round_button.dart';
import 'package:smartfit_app_mobile/common_widget/text_field/round_text_field.dart';
import 'package:smartfit_app_mobile/view/profile/mobile/mobile_change_password.dart';
import 'package:smartfit_app_mobile/view/profile/web/web_change_password.dart';
import '../../common/colo_extension.dart';
@ -8,103 +12,15 @@ class ChangePasswordView extends StatefulWidget {
const ChangePasswordView({super.key});
@override
State<ChangePasswordView> createState() => _ChangeUsernameViewState();
State<ChangePasswordView> createState() => _ChangePasswordViewState();
}
class _ChangeUsernameViewState extends State<ChangePasswordView> {
final TextEditingController controllerTextEmail = TextEditingController();
final TextEditingController controllerTextPassword = TextEditingController();
@override
class _ChangePasswordViewState extends State<ChangePasswordView> {
@override
Widget build(BuildContext context) {
var media = MediaQuery.of(context).size;
return Scaffold(
appBar: AppBar(
backgroundColor: TColor.white,
centerTitle: true,
elevation: 0,
leading: InkWell(
onTap: () {
Navigator.pop(context);
},
child: Container(
margin: const EdgeInsets.all(8),
height: 40,
width: 40,
alignment: Alignment.center,
decoration: BoxDecoration(
color: TColor.lightGray,
borderRadius: BorderRadius.circular(10)),
child: Image.asset(
"assets/img/black_btn.png",
width: 15,
height: 15,
fit: BoxFit.contain,
),
),
),
title: Text(
"Changer son Mot de passe",
style: TextStyle(
color: TColor.black, fontSize: 16, fontWeight: FontWeight.w700),
),
),
backgroundColor: TColor.white,
body: Column(
children: [
SizedBox(
height: media.width * 0.05,
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 200.0),
child: Column(
children: [
Container(
decoration: BoxDecoration(
color: Colors.transparent,
borderRadius: BorderRadius.circular(15),
),
child: Column(
children: [
RoundTextField(
hitText: "Ancien mot de passe",
icon: "assets/img/lock.svg",
keyboardType: TextInputType.text,
controller: controllerTextEmail,
),
SizedBox(height: media.width * 0.04),
RoundTextField(
controller: controllerTextPassword,
hitText: "Nouveau mot de passe",
icon: "assets/img/lock.svg",
obscureText: true,
rigtIcon: TextButton(
onPressed: () {},
child: Container(
alignment: Alignment.center,
width: 20,
height: 20,
child: SvgPicture.asset(
"assets/img/show_password.svg",
width: 20,
height: 20,
fit: BoxFit.contain,
),
),
),
),
],
),
),
],
),
),
],
),
return ScreenTypeLayout.builder(
mobile: (_) => const MobileChangePasswordView(),
desktop: (_) => const WebChangePasswordView(),
);
}
}
}

@ -1,6 +1,10 @@
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:responsive_builder/responsive_builder.dart';
import 'package:smartfit_app_mobile/common_widget/button/round_button.dart';
import 'package:smartfit_app_mobile/common_widget/text_field/round_text_field.dart';
import 'package:smartfit_app_mobile/view/profile/mobile/mobile_change_username.dart';
import 'package:smartfit_app_mobile/view/profile/web/web_change_username.dart';
import '../../common/colo_extension.dart';
@ -12,77 +16,11 @@ class ChangeUsernameView extends StatefulWidget {
}
class _ChangeUsernameViewState extends State<ChangeUsernameView> {
final TextEditingController controllerTextEmail = TextEditingController();
final TextEditingController controllerTextPassword = TextEditingController();
@override
@override
Widget build(BuildContext context) {
var media = MediaQuery.of(context).size;
return Scaffold(
appBar: AppBar(
backgroundColor: TColor.white,
centerTitle: true,
elevation: 0,
leading: InkWell(
onTap: () {
Navigator.pop(context);
},
child: Container(
margin: const EdgeInsets.all(8),
height: 40,
width: 40,
alignment: Alignment.center,
decoration: BoxDecoration(
color: TColor.lightGray,
borderRadius: BorderRadius.circular(10)),
child: Image.asset(
"assets/img/black_btn.png",
width: 15,
height: 15,
fit: BoxFit.contain,
),
),
),
title: Text(
"Changer son pseudo",
style: TextStyle(
color: TColor.black, fontSize: 16, fontWeight: FontWeight.w700),
),
),
backgroundColor: TColor.white,
body: Column(
children: [
SizedBox(
height: media.width * 0.05,
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 200.0),
child: Column(
children: [
Container(
decoration: BoxDecoration(
color: Colors.transparent,
borderRadius: BorderRadius.circular(15),
),
child: Column(
children: [
RoundTextField(
hitText: "Nouveau pseudo",
icon: "assets/img/email.svg",
keyboardType: TextInputType.text,
controller: controllerTextEmail,
),
SizedBox(height: media.width * 0.04),
RoundButton(title: "Confirmer", onPressed: () {}),
],
),
),
],
),
),
],
),
return ScreenTypeLayout.builder(
mobile: (_) => const MobileChangeUsernameView(),
desktop: (_) => const WebChangeUsernameView(),
);
}
}

@ -0,0 +1,123 @@
import 'package:flutter/material.dart';
import 'package:smartfit_app_mobile/common/colo_extension.dart';
class ContactUsView extends StatelessWidget {
const ContactUsView({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
var media = MediaQuery.of(context).size;
return Scaffold(
appBar: AppBar(
backgroundColor: TColor.white,
centerTitle: true,
elevation: 0,
leading: InkWell(
onTap: () {
Navigator.pop(context);
},
child: Container(
margin: const EdgeInsets.all(8),
height: 40,
width: 40,
alignment: Alignment.center,
decoration: BoxDecoration(
color: TColor.lightGray,
borderRadius: BorderRadius.circular(10),
),
child: Image.asset(
"assets/img/black_btn.png",
width: 15,
height: 15,
fit: BoxFit.contain,
),
),
),
title: Text(
"Nous Contacter",
style: TextStyle(
color: TColor.black,
fontSize: 16,
fontWeight: FontWeight.w700,
),
),
),
backgroundColor: TColor.white,
body: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.all(20.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
SizedBox(height: media.width * 0.02),
const Text(
"Vous pouvez nous contacter pour toute question, suggestion ou problème concernant notre application SmartFit.",
style: TextStyle(
fontSize: 16,
),
),
SizedBox(height: media.width * 0.05),
const Text(
"Adresse e-mail",
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
const Text(
"contact@smartfitapp.com",
style: TextStyle(
fontSize: 16,
),
),
SizedBox(height: media.width * 0.02),
const Text(
"Téléphone",
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
const Text(
"+1234567890",
style: TextStyle(
fontSize: 16,
),
),
SizedBox(height: media.width * 0.02),
const Text(
"Adresse",
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
const Text(
"123 Rue SmartFit, Ville, Pays",
style: TextStyle(
fontSize: 16,
),
),
SizedBox(height: media.width * 0.02),
const Text(
"Heures de bureau",
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
const Text(
"Lundi - Vendredi : 9h00 - 18h00",
style: TextStyle(
fontSize: 16,
),
),
],
),
),
),
);
}
}

@ -0,0 +1,115 @@
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:smartfit_app_mobile/common/colo_extension.dart';
import 'package:smartfit_app_mobile/common_widget/button/round_button.dart';
import 'package:smartfit_app_mobile/common_widget/text_field/round_text_field.dart';
class MobileChangeEmailView extends StatefulWidget {
const MobileChangeEmailView({super.key});
@override
State<MobileChangeEmailView> createState() => _MobileChangeEmailViewState();
}
class _MobileChangeEmailViewState extends State<MobileChangeEmailView> {
final TextEditingController controllerTextEmail = TextEditingController();
final TextEditingController controllerTextPassword = TextEditingController();
String oldUsername = "Ancien e-mail";
@override
Widget build(BuildContext context) {
var media = MediaQuery.of(context).size;
return Scaffold(
appBar: AppBar(
backgroundColor: TColor.white,
centerTitle: true,
elevation: 0,
leading: InkWell(
onTap: () {
Navigator.pop(context);
},
child: Container(
margin: const EdgeInsets.all(8),
height: 40,
width: 40,
alignment: Alignment.center,
decoration: BoxDecoration(
color: TColor.lightGray,
borderRadius: BorderRadius.circular(10)),
child: Image.asset(
"assets/img/black_btn.png",
width: 15,
height: 15,
fit: BoxFit.contain,
),
),
),
title: Text(
"Changer son e-mail",
style: TextStyle(
color: TColor.black, fontSize: 16, fontWeight: FontWeight.w700),
),
),
backgroundColor: TColor.white,
body: Column(
children: [
SizedBox(
height: media.width * 0.07,
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 20.0),
child: Column(
children: [
Row(
children: [
Text(
"Ancien e-mail : ",
style: TextStyle(
color: TColor.black,
fontSize: 16,
fontWeight: FontWeight.bold,
),
),
Text(
oldUsername, // Utilisez votre ancien pseudo ici
style: TextStyle(
color: TColor.black,
fontSize: 16,
),
),
],
),
SizedBox(height: media.width * 0.07),
Container(
decoration: BoxDecoration(
color: Colors.transparent,
borderRadius: BorderRadius.circular(15),
),
child: Column(
children: [
RoundTextField(
hitText: "Nouveau e-mail",
icon: "assets/img/user_text.svg",
keyboardType: TextInputType.text,
controller: controllerTextEmail,
),
SizedBox(height: media.width * 0.07),
RoundButton(
title: "Confirmer",
onPressed: () {}),
],
),
),
],
),
),
],
),
);
}
}

@ -0,0 +1,113 @@
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:smartfit_app_mobile/common/colo_extension.dart';
import 'package:smartfit_app_mobile/common_widget/button/round_button.dart';
import 'package:smartfit_app_mobile/common_widget/text_field/round_text_field.dart';
class MobileChangePasswordView extends StatefulWidget {
const MobileChangePasswordView({super.key});
@override
State<MobileChangePasswordView> createState() => _MobileChangePasswordViewState();
}
class _MobileChangePasswordViewState extends State<MobileChangePasswordView> {
final TextEditingController controllerTextEmail = TextEditingController();
final TextEditingController controllerTextPassword = TextEditingController();
@override
Widget build(BuildContext context) {
var media = MediaQuery.of(context).size;
return Scaffold(
appBar: AppBar(
backgroundColor: TColor.white,
centerTitle: true,
elevation: 0,
leading: InkWell(
onTap: () {
Navigator.pop(context);
},
child: Container(
margin: const EdgeInsets.all(8),
height: 40,
width: 40,
alignment: Alignment.center,
decoration: BoxDecoration(
color: TColor.lightGray,
borderRadius: BorderRadius.circular(10)),
child: Image.asset(
"assets/img/black_btn.png",
width: 15,
height: 15,
fit: BoxFit.contain,
),
),
),
title: Text(
"Changer son Mot de passe",
style: TextStyle(
color: TColor.black, fontSize: 16, fontWeight: FontWeight.w700),
),
),
backgroundColor: TColor.white,
body: Column(
children: [
SizedBox(
height: media.width * 0.05,
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 20.0),
child: Column(
children: [
Container(
decoration: BoxDecoration(
color: Colors.transparent,
borderRadius: BorderRadius.circular(15),
),
child: Column(
children: [
SizedBox(height: media.width * 0.05),
RoundTextField(
hitText: "Ancien mot de passe",
obscureText: true,
icon: "assets/img/lock.svg",
keyboardType: TextInputType.text,
controller: controllerTextEmail,
),
SizedBox(height: media.width * 0.07),
RoundTextField(
controller: controllerTextPassword,
hitText: "Nouveau mot de passe",
icon: "assets/img/lock.svg",
obscureText: true,
),
SizedBox(height: media.width * 0.07),
RoundTextField(
controller: controllerTextPassword,
hitText: "Confirmer nouveau mot de passe",
icon: "assets/img/lock.svg",
obscureText: true,
),
SizedBox(height: media.width * 0.07),
RoundButton(
title: "Confirmer",
onPressed: () {}),
],
),
),
],
),
),
],
),
);
}
}

@ -0,0 +1,115 @@
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:smartfit_app_mobile/common/colo_extension.dart';
import 'package:smartfit_app_mobile/common_widget/button/round_button.dart';
import 'package:smartfit_app_mobile/common_widget/text_field/round_text_field.dart';
class MobileChangeUsernameView extends StatefulWidget {
const MobileChangeUsernameView({super.key});
@override
State<MobileChangeUsernameView> createState() => _MobileChangeUsernameViewState();
}
class _MobileChangeUsernameViewState extends State<MobileChangeUsernameView> {
final TextEditingController controllerTextEmail = TextEditingController();
final TextEditingController controllerTextPassword = TextEditingController();
String oldUsername = "Ancien pseudo";
@override
Widget build(BuildContext context) {
var media = MediaQuery.of(context).size;
return Scaffold(
appBar: AppBar(
backgroundColor: TColor.white,
centerTitle: true,
elevation: 0,
leading: InkWell(
onTap: () {
Navigator.pop(context);
},
child: Container(
margin: const EdgeInsets.all(8),
height: 40,
width: 40,
alignment: Alignment.center,
decoration: BoxDecoration(
color: TColor.lightGray,
borderRadius: BorderRadius.circular(10)),
child: Image.asset(
"assets/img/black_btn.png",
width: 15,
height: 15,
fit: BoxFit.contain,
),
),
),
title: Text(
"Changer son pseudo",
style: TextStyle(
color: TColor.black, fontSize: 16, fontWeight: FontWeight.w700),
),
),
backgroundColor: TColor.white,
body: Column(
children: [
SizedBox(
height: media.width * 0.07,
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 20.0),
child: Column(
children: [
Row(
children: [
Text(
"Ancien pseudo : ",
style: TextStyle(
color: TColor.black,
fontSize: 16,
fontWeight: FontWeight.bold,
),
),
Text(
oldUsername, // Utilisez votre ancien pseudo ici
style: TextStyle(
color: TColor.black,
fontSize: 16,
),
),
],
),
SizedBox(height: media.width * 0.07),
Container(
decoration: BoxDecoration(
color: Colors.transparent,
borderRadius: BorderRadius.circular(15),
),
child: Column(
children: [
RoundTextField(
hitText: "Nouveau pseudo",
icon: "assets/img/user_text.svg",
keyboardType: TextInputType.text,
controller: controllerTextEmail,
),
SizedBox(height: media.width * 0.07),
RoundButton(
title: "Confirmer",
onPressed: () {}),
],
),
),
],
),
),
],
),
);
}
}

@ -4,6 +4,11 @@ import 'package:smartfit_app_mobile/common/colo_extension.dart';
import 'package:smartfit_app_mobile/common_widget/button/round_button.dart';
import 'package:smartfit_app_mobile/common_widget/setting_row.dart';
import 'package:smartfit_app_mobile/common_widget/title_subtitle_cell.dart';
import 'package:smartfit_app_mobile/view/profile/change_password.dart';
import 'package:smartfit_app_mobile/view/profile/change_email.dart';
import 'package:smartfit_app_mobile/view/profile/change_username.dart';
import 'package:smartfit_app_mobile/view/profile/contact_us_view.dart';
import 'package:smartfit_app_mobile/view/profile/policy_view.dart';
class MobileProfileView extends StatefulWidget {
const MobileProfileView({super.key});
@ -18,9 +23,19 @@ class _MobileProfileView extends State<MobileProfileView> {
List accountArr = [
{
"image": "assets/img/p_personal.png",
"name": "Données personnelles",
"name": "Changer son pseudo",
"tag": "1"
},
{
"image": "assets/img/p_personal.png",
"name": "Changer son email",
"tag": "3"
},
{
"image": "assets/img/p_personal.png",
"name": "Changer son mot de passe",
"tag": "2"
},
];
List otherArr = [
@ -190,14 +205,37 @@ class _MobileProfileView extends State<MobileProfileView> {
shrinkWrap: true,
itemCount: accountArr.length,
itemBuilder: (context, index) {
var iObj = accountArr[index] as Map? ?? {};
var iObj = accountArr[index];
return SettingRow(
icon: iObj["image"].toString(),
title: iObj["name"].toString(),
onPressed: () {},
icon: iObj["image"]!,
title: iObj["name"]!,
onPressed: () {
if (iObj["tag"] == "1") {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => ChangeUsernameView(),
),
);
} else if (iObj["tag"] == "2") {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => ChangePasswordView(),
),
);
} else {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => ChangeEmailView(),
),
);
}
},
);
},
)
),
],
),
),
@ -345,7 +383,25 @@ class _MobileProfileView extends State<MobileProfileView> {
return SettingRow(
icon: iObj["image"].toString(),
title: iObj["name"].toString(),
onPressed: () {},
onPressed: () {
if (iObj["tag"] == "6") {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => PrivacyPolicyView(),
),
);
} else if (iObj["tag"] == "5") {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => ContactUsView(),
),
);
} else {
// Autre logique si nécessaire pour d'autres éléments de la liste
}
},
);
},
)

@ -0,0 +1,197 @@
import 'package:flutter/material.dart';
import 'package:smartfit_app_mobile/common/colo_extension.dart';
class PrivacyPolicyView extends StatelessWidget {
const PrivacyPolicyView({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
var media = MediaQuery.of(context).size;
return Scaffold(
appBar: AppBar(
backgroundColor: TColor.white,
centerTitle: true,
elevation: 0,
leading: InkWell(
onTap: () {
Navigator.pop(context);
},
child: Container(
margin: const EdgeInsets.all(8),
height: 40,
width: 40,
alignment: Alignment.center,
decoration: BoxDecoration(
color: TColor.lightGray,
borderRadius: BorderRadius.circular(10),
),
child: Image.asset(
"assets/img/black_btn.png",
width: 15,
height: 15,
fit: BoxFit.contain,
),
),
),
title: Text(
"Politique de confidentialité",
style: TextStyle(
color: TColor.black,
fontSize: 16,
fontWeight: FontWeight.w700,
),
),
),
backgroundColor: TColor.white,
body: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.all(20.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
const Text(
"Politique de confidentialité de SmartFit",
style: TextStyle(
fontSize: 24,
fontWeight: FontWeight.bold,
),
),
SizedBox(height: media.width * 0.02),
const Text(
"Cette Politique de confidentialité explique comment SmartFit collecte, utilise, protège et partage vos informations lorsque vous utilisez notre application mobile SmartFit.",
style: TextStyle(
fontSize: 16,
),
),
SizedBox(height: media.width * 0.05),
const Text(
"Collecte et Utilisation des Informations",
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
SizedBox(height: media.width * 0.02),
const Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
"SmartFit recueille des données uniquement dans le but d'analyser et d'afficher des informations relatives à vos activités physiques à partir des données collectées par votre montre connectée. Ces informations peuvent inclure, sans toutefois s'y limiter :",
style: TextStyle(
fontSize: 16,
),
),
SizedBox(height: 10),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
"• Données d'activité physique (comme la fréquence cardiaque, le nombre de pas, la distance parcourue, etc.)",
style: TextStyle(
fontSize: 16,
),
),
Text(
"• Données sur les habitudes de sommeil",
style: TextStyle(
fontSize: 16,
),
),
Text(
"• Informations de localisation (si l'option est activée par l'utilisateur)",
style: TextStyle(
fontSize: 16,
),
),
Text(
"• Préférences de l'utilisateur concernant les paramètres de l'application",
style: TextStyle(
fontSize: 16,
),
),
Text(
"Ces informations sont utilisées pour générer des graphiques, des statistiques et des recommandations personnalisées afin de vous aider dans vos objectifs de remise en forme.",
style: TextStyle(
fontSize: 16,
),
),
],
),
],
),
SizedBox(height: media.width * 0.05),
const Text(
"Protection des Informations",
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
const Text(
"SmartFit attache une grande importance à la sécurité de vos données. Nous mettons en place des mesures techniques et organisationnelles appropriées pour protéger vos informations contre tout accès non autorisé, altération, divulgation ou destruction.",
style: TextStyle(
fontSize: 16,
),
),
SizedBox(height: media.width * 0.02),
const Text(
"Partage des Informations",
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
const Text(
"Les données collectées par SmartFit ne seront pas partagées, vendues ou louées à des tiers à des fins de marketing ou de publicité sans votre consentement explicite.",
style: TextStyle(
fontSize: 16,
),
),
const Text(
"Cependant, il est possible que nous partagions des informations avec des prestataires de services tiers qui nous aident à fournir et à améliorer notre application. Ces tiers sont tenus de protéger vos informations conformément à cette Politique de confidentialité.",
style: TextStyle(
fontSize: 16,
),
),
SizedBox(height: media.width * 0.02),
const Text(
"Modifications de la Politique de Confidentialité",
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
const Text(
"SmartFit se réserve le droit de mettre à jour cette Politique de confidentialité de temps à autre. Les modifications seront publiées sur cette page et entreront en vigueur dès leur publication.",
style: TextStyle(
fontSize: 16,
),
),
SizedBox(height: media.width * 0.02),
const Text(
"Consentement",
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
const Text(
"En utilisant l'application SmartFit, vous consentez à la collecte et à l'utilisation de vos informations telles que décrites dans cette Politique de confidentialité.",
style: TextStyle(
fontSize: 16,
),
),
const Text(
"Pour toute question concernant cette Politique de confidentialité, veuillez nous contacter à l'adresse suivante : smartfit.contact@gmail.com",
style: TextStyle(
fontSize: 16,
),
),
],
),
),
),
);
}
}

@ -0,0 +1,115 @@
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:smartfit_app_mobile/common/colo_extension.dart';
import 'package:smartfit_app_mobile/common_widget/button/round_button.dart';
import 'package:smartfit_app_mobile/common_widget/text_field/round_text_field.dart';
class WebChangeEmailView extends StatefulWidget {
const WebChangeEmailView({super.key});
@override
State<WebChangeEmailView> createState() => _WebChangeEmailViewState();
}
class _WebChangeEmailViewState extends State<WebChangeEmailView> {
final TextEditingController controllerTextEmail = TextEditingController();
final TextEditingController controllerTextPassword = TextEditingController();
String oldUsername = "Ancien e-mail";
@override
Widget build(BuildContext context) {
var media = MediaQuery.of(context).size;
return Scaffold(
appBar: AppBar(
backgroundColor: TColor.white,
centerTitle: true,
elevation: 0,
leading: InkWell(
onTap: () {
Navigator.pop(context);
},
child: Container(
margin: const EdgeInsets.all(8),
height: 40,
width: 40,
alignment: Alignment.center,
decoration: BoxDecoration(
color: TColor.lightGray,
borderRadius: BorderRadius.circular(10)),
child: Image.asset(
"assets/img/black_btn.png",
width: 15,
height: 15,
fit: BoxFit.contain,
),
),
),
title: Text(
"Changer son e-mail",
style: TextStyle(
color: TColor.black, fontSize: 16, fontWeight: FontWeight.w700),
),
),
backgroundColor: TColor.white,
body: Column(
children: [
SizedBox(
height: media.width * 0.05,
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 200.0),
child: Column(
children: [
Row(
children: [
Text(
"Ancien e-mail : ",
style: TextStyle(
color: TColor.black,
fontSize: 16,
fontWeight: FontWeight.bold,
),
),
Text(
oldUsername,
style: TextStyle(
color: TColor.black,
fontSize: 16,
),
),
],
),
SizedBox(height: media.width * 0.04),
Container(
decoration: BoxDecoration(
color: Colors.transparent,
borderRadius: BorderRadius.circular(15),
),
child: Column(
children: [
RoundTextField(
hitText: "Nouveau email",
icon: "assets/img/user_text.svg",
keyboardType: TextInputType.text,
controller: controllerTextEmail,
),
SizedBox(height: media.width * 0.04),
RoundButton(
title: "Confirmer",
onPressed: () {}),
],
),
),
],
),
),
],
),
);
}
}

@ -0,0 +1,112 @@
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:smartfit_app_mobile/common/colo_extension.dart';
import 'package:smartfit_app_mobile/common_widget/button/round_button.dart';
import 'package:smartfit_app_mobile/common_widget/text_field/round_text_field.dart';
class WebChangePasswordView extends StatefulWidget {
const WebChangePasswordView({super.key});
@override
State<WebChangePasswordView> createState() => _WebChangePasswordViewState();
}
class _WebChangePasswordViewState extends State<WebChangePasswordView> {
final TextEditingController controllerTextEmail = TextEditingController();
final TextEditingController controllerTextPassword = TextEditingController();
@override
Widget build(BuildContext context) {
var media = MediaQuery.of(context).size;
return Scaffold(
appBar: AppBar(
backgroundColor: TColor.white,
centerTitle: true,
elevation: 0,
leading: InkWell(
onTap: () {
Navigator.pop(context);
},
child: Container(
margin: const EdgeInsets.all(8),
height: 40,
width: 40,
alignment: Alignment.center,
decoration: BoxDecoration(
color: TColor.lightGray,
borderRadius: BorderRadius.circular(10)),
child: Image.asset(
"assets/img/black_btn.png",
width: 15,
height: 15,
fit: BoxFit.contain,
),
),
),
title: Text(
"Changer son Mot de passe",
style: TextStyle(
color: TColor.black, fontSize: 16, fontWeight: FontWeight.w700),
),
),
backgroundColor: TColor.white,
body: Column(
children: [
SizedBox(
height: media.width * 0.05,
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 200.0),
child: Column(
children: [
Container(
decoration: BoxDecoration(
color: Colors.transparent,
borderRadius: BorderRadius.circular(15),
),
child: Column(
children: [
RoundTextField(
hitText: "Ancien mot de passe",
obscureText: true,
icon: "assets/img/lock.svg",
keyboardType: TextInputType.text,
controller: controllerTextEmail,
),
SizedBox(height: media.width * 0.02),
RoundTextField(
controller: controllerTextPassword,
hitText: "Nouveau mot de passe",
icon: "assets/img/lock.svg",
obscureText: true,
),
SizedBox(height: media.width * 0.02),
RoundTextField(
controller: controllerTextPassword,
hitText: "Confirmer nouveau mot de passe",
icon: "assets/img/lock.svg",
obscureText: true,
),
SizedBox(height: media.width * 0.04),
RoundButton(
title: "Confirmer",
onPressed: () {}),
],
),
),
],
),
),
],
),
);
}
}

@ -0,0 +1,115 @@
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:smartfit_app_mobile/common/colo_extension.dart';
import 'package:smartfit_app_mobile/common_widget/button/round_button.dart';
import 'package:smartfit_app_mobile/common_widget/text_field/round_text_field.dart';
class WebChangeUsernameView extends StatefulWidget {
const WebChangeUsernameView({super.key});
@override
State<WebChangeUsernameView> createState() => _WebChangeUsernameViewState();
}
class _WebChangeUsernameViewState extends State<WebChangeUsernameView> {
final TextEditingController controllerTextEmail = TextEditingController();
final TextEditingController controllerTextPassword = TextEditingController();
String oldUsername = "Ancien pseudo";
@override
Widget build(BuildContext context) {
var media = MediaQuery.of(context).size;
return Scaffold(
appBar: AppBar(
backgroundColor: TColor.white,
centerTitle: true,
elevation: 0,
leading: InkWell(
onTap: () {
Navigator.pop(context);
},
child: Container(
margin: const EdgeInsets.all(8),
height: 40,
width: 40,
alignment: Alignment.center,
decoration: BoxDecoration(
color: TColor.lightGray,
borderRadius: BorderRadius.circular(10)),
child: Image.asset(
"assets/img/black_btn.png",
width: 15,
height: 15,
fit: BoxFit.contain,
),
),
),
title: Text(
"Changer son pseudo",
style: TextStyle(
color: TColor.black, fontSize: 16, fontWeight: FontWeight.w700),
),
),
backgroundColor: TColor.white,
body: Column(
children: [
SizedBox(
height: media.width * 0.05,
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 200.0),
child: Column(
children: [
Row(
children: [
Text(
"Ancien pseudo : ",
style: TextStyle(
color: TColor.black,
fontSize: 16,
fontWeight: FontWeight.bold,
),
),
Text(
oldUsername, // Utilisez votre ancien pseudo ici
style: TextStyle(
color: TColor.black,
fontSize: 16,
),
),
],
),
SizedBox(height: media.width * 0.04),
Container(
decoration: BoxDecoration(
color: Colors.transparent,
borderRadius: BorderRadius.circular(15),
),
child: Column(
children: [
RoundTextField(
hitText: "Nouveau pseudo",
icon: "assets/img/user_text.svg",
keyboardType: TextInputType.text,
controller: controllerTextEmail,
),
SizedBox(height: media.width * 0.04),
RoundButton(
title: "Confirmer",
onPressed: () {}),
],
),
),
],
),
),
],
),
);
}
}

@ -5,7 +5,10 @@ import 'package:smartfit_app_mobile/common_widget/button/round_button.dart';
import 'package:smartfit_app_mobile/common_widget/setting_row.dart';
import 'package:smartfit_app_mobile/common_widget/title_subtitle_cell.dart';
import 'package:smartfit_app_mobile/view/profile/change_password.dart';
import 'package:smartfit_app_mobile/view/profile/change_email.dart';
import 'package:smartfit_app_mobile/view/profile/change_username.dart';
import 'package:smartfit_app_mobile/view/profile/contact_us_view.dart';
import 'package:smartfit_app_mobile/view/profile/policy_view.dart';
class WebProfileView extends StatefulWidget {
const WebProfileView({super.key});
@ -23,6 +26,11 @@ class _WebProfileView extends State<WebProfileView> {
"name": "Changer son pseudo",
"tag": "1"
},
{
"image": "assets/img/p_personal.png",
"name": "Changer son email",
"tag": "3"
},
{
"image": "assets/img/p_personal.png",
"name": "Changer son mot de passe",
@ -219,7 +227,12 @@ class _WebProfileView extends State<WebProfileView> {
),
);
} else {
// Autre logique si nécessaire pour d'autres éléments de la liste
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => ChangeEmailView(),
),
);
}
},
);
@ -372,7 +385,25 @@ class _WebProfileView extends State<WebProfileView> {
return SettingRow(
icon: iObj["image"].toString(),
title: iObj["name"].toString(),
onPressed: () {},
onPressed: () {
if (iObj["tag"] == "6") {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const PrivacyPolicyView(),
),
);
} else if (iObj["tag"] == "5") {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => ContactUsView(),
),
);
} else {
// Autre logique si nécessaire pour d'autres éléments de la liste
}
},
);
},
)

Loading…
Cancel
Save