diff --git a/lib/common_widget/container/workout_row.dart b/lib/common_widget/container/workout_row.dart index e4d5f85..0fd3514 100644 --- a/lib/common_widget/container/workout_row.dart +++ b/lib/common_widget/container/workout_row.dart @@ -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, diff --git a/lib/main.dart b/lib/main.dart index 049d2fc..e1b9afd 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -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(), ); } } diff --git a/lib/modele/activity.dart b/lib/modele/activity.dart index 6e7d6ca..fba97fd 100644 --- a/lib/modele/activity.dart +++ b/lib/modele/activity.dart @@ -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 _contentActivity; late int _dataSession; + // -- Getter/Setter -- // List get contentActivity => _contentActivity; - - ActivityOfUser(String nom, List listeDynamic) { - _nomActivite = nom; - _imageName = "assets/img/workout1.svg"; - _contentActivity = listeDynamic; + set contentActivity(List 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 toMap() { - return { - 'nomActivite': _nomActivite, - 'image': _imageName, - }; + return {'categorie': _categorie, 'image': _imageName, 'date': _date}; } } diff --git a/lib/modele/api/i_data_strategy.dart b/lib/modele/api/i_data_strategy.dart index 9d6edb0..49c4940 100644 --- a/lib/modele/api/i_data_strategy.dart +++ b/lib/modele/api/i_data_strategy.dart @@ -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> uploadFile(String token, File file); + Future> uploadFileByte(String token, + Uint8List contentFile, String nameFile, String category, String date); // Get one file by id Future getFile(String token, String fileUuid); diff --git a/lib/modele/api/request_api.dart b/lib/modele/api/request_api.dart index 14d226f..8d0756f 100644 --- a/lib/modele/api/request_api.dart +++ b/lib/modele/api/request_api.dart @@ -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: {'Authorization': token}); if (response.statusCode == 200) { - return Tuple2(true, response.body); + return Tuple2(true, + (json.decode(response.body) as List).cast>()); } 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 updateEmail(String token, String email) async { - final response = await http.put(Uri.parse('$urlApi/$token/email'), - headers: { - 'Content-Type': 'application/json; charset=UTF-8', - }, - body: jsonEncode({'email': email})); - - if (response.statusCode == 200) { - return true; - } else { - return false; - } - } - - @override - Future updateUsername(String token, String username) async { - final response = await http.put(Uri.parse('$urlApi/$token/username'), - headers: { - 'Content-Type': 'application/json; charset=UTF-8', - }, - body: jsonEncode({'username': username})); - - if (response.statusCode == 200) { - return true; - } else { - return false; - } - }*/ - @override Future modifAttribut( String token, String nameAttribut, String newValue) async { @@ -212,6 +183,44 @@ class RequestApi extends IDataStrategy { return const Tuple2(false, "Fail "); } + @override + Future> uploadFileByte( + String token, + Uint8List contentFile, + String nameFile, + String category, + String date) async { + final uri = Uri.parse('$urlApi/user/files'); + Map 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 getInfoUser(String token) async { final response = await http.get(Uri.parse('$urlApi/user/info'), diff --git a/lib/modele/manager_file.dart b/lib/modele/manager_file.dart index 0b453bd..a9ee7d2 100644 --- a/lib/modele/manager_file.dart +++ b/lib/modele/manager_file.dart @@ -27,10 +27,18 @@ class ManagerFile { return fitFile.toRows(); } - List readFitFileWeb(Uint8List bytes) { + + Future> readFitFileWhithFile(File file) async { + final bytes = await file.readAsBytes(); final fitFile = FitFile.fromBytes(bytes); return fitFile.toRows(); } + + List readFitFileWeb(Uint8List bytes) { + final fitFile = FitFile.fromBytes(bytes); + return fitFile.toRows(); + } + // ------------- Get The path of application --- // Future get localPath async { final directory = await getApplicationDocumentsDirectory(); diff --git a/lib/modele/name_attribut_user.dart b/lib/modele/name_attribut_user.dart new file mode 100644 index 0000000..f8a5361 --- /dev/null +++ b/lib/modele/name_attribut_user.dart @@ -0,0 +1,6 @@ +class AttributUser { + final String _email = "email"; + final String _username = "username"; + String get email => _email; + String get username => _username; +} diff --git a/lib/modele/name_colonne_file_fit.dart b/lib/modele/name_colonne_file_fit.dart new file mode 100644 index 0000000..bef4cef --- /dev/null +++ b/lib/modele/name_colonne_file_fit.dart @@ -0,0 +1,3 @@ +class AttributFileFit { + // Ajouter une variable privé qui contient le champs + un getter +} diff --git a/lib/modele/user.dart b/lib/modele/user.dart index c248810..c067711 100644 --- a/lib/modele/user.dart +++ b/lib/modele/user.dart @@ -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(); + } } diff --git a/lib/modele/utile/list_activity.dart/list_activity_utile.dart b/lib/modele/utile/list_activity.dart/list_activity_utile.dart new file mode 100644 index 0000000..23da587 --- /dev/null +++ b/lib/modele/utile/list_activity.dart/list_activity_utile.dart @@ -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 getContentOnTheFirstFileMobile(BuildContext context) async { + Tuple2 result = await _strategy.getFile( + Provider.of(context, listen: false).token, + Provider.of(context, listen: false).listActivity[0].fileUuid); + if (result.item1 == false) { + //Erreur + //print(result); + return; + } + File file = File( + "${await _managerFile.localPath}/${Provider.of(context, listen: false).listActivity[0].nameFile}"); + await file.create(); + await file.writeAsBytes(result.item2); + Provider.of(context, listen: false).listActivity[0].contentActivity = + await _managerFile.readFitFileWhithFile(file); + } + + Future getContentOnTheFirstFileWeb(BuildContext context) async { + User user = Provider.of(context, listen: false); + Tuple2 result = + await _strategy.getFile(user.token, user.listActivity[0].fileUuid); + if (result.item1 == false) { + //Erreur + //print(result); + return; + } + Provider.of(context, listen: false).listActivity[0].contentActivity = + await _managerFile.readFitFileWeb(result.item2); + } +} diff --git a/lib/modele/utile/login_user.dart b/lib/modele/utile/login_user.dart index f10314c..f2864c6 100644 --- a/lib/modele/utile/login_user.dart +++ b/lib/modele/utile/login_user.dart @@ -26,12 +26,9 @@ class Login { return Tuple2(true, result.item2); } - void fillUser(BuildContext context, Map map, String token) { - print(map); - + 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/profile_view/profile_utile.dart b/lib/modele/utile/profile_view/profile_utile.dart new file mode 100644 index 0000000..e1ee3fa --- /dev/null +++ b/lib/modele/utile/profile_view/profile_utile.dart @@ -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); + } +} diff --git a/lib/view/activity/mobile/mobile_list_activity.dart b/lib/view/activity/mobile/mobile_list_activity.dart index 98b910f..91987cc 100644 --- a/lib/view/activity/mobile/mobile_list_activity.dart +++ b/lib/view/activity/mobile/mobile_list_activity.dart @@ -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 { FilePickerResult? result; - IDataStrategy strategy = RequestApi(); + final IDataStrategy strategy = RequestApi(); + final ListActivityUtile _utile = ListActivityUtile(); + int firstActivityIndex = 0; + /* Future readFile(String nom) async { - ManagerFile x = ManagerFile(); PlatformFile t = result!.files.single; String? y = t.path; if (t.path == null) { print("t"); } else { - List result = await x.readFitFile(y!); - print("test11"); - print(result); - print("test22"); - print(ActivityOfUser(nom, result).getHeartRateWithTime()); - print("test33"); + List result = await _managerFile.readFitFile(y!); + + // Upload the file and Syncronise (getFiles()) + + strategy.uploadFile(context.watch().token, File(y)); + Provider.of(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(context, listen: false) + .listActivity + .last + .contentActivity = result; + } + }*/ + + void addFile(String path) async { + Tuple2 result = await strategy.uploadFile( + Provider.of(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(context, listen: false).token); + if (result.item1 == false) { + print("GetFiles - ${result.item2}"); + // Afficher une message d'erreur + return; + } + Provider.of(context, listen: false).listActivity.clear(); + + for (Map element in result.item2) { + Provider.of(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 { 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 { ? 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 { itemBuilder: (context, index) { var activityObj = Provider.of(context, listen: true) - .listActivity[index] as ActivityOfUser; + .listActivity[index]; var activityMap = activityObj.toMap(); bool isFirstActivity = false; @@ -145,7 +186,8 @@ class _MobileListActivity extends State { Provider.of(context, listen: false) .removeActivity(activityObj); Provider.of(context, listen: false) - .insertActivity(0, activityObj); + .insertActivityTopMobile( + activityObj, context); }, isFirstActivity: isFirstActivity, ), diff --git a/lib/view/activity/web/web_list_activity.dart b/lib/view/activity/web/web_list_activity.dart index aef0e23..14731ff 100644 --- a/lib/view/activity/web/web_list_activity.dart +++ b/lib/view/activity/web/web_list_activity.dart @@ -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 { 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 { if (reader.readyState == html.FileReader.DONE) { Uint8List bytes = reader.result as Uint8List; List result = x.readFitFileWeb(bytes); + Provider.of(context, listen: false).addActivity( + ActivityOfUser("Date random", "${file.name} Categorie", "", "")); Provider.of(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 result = await strategy.uploadFileByte( + Provider.of(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(context, listen: false).token); + if (result.item1 == false) { + print("GetFiles - ${result.item2}"); + // Afficher une message d'erreur + return; + } + Provider.of(context, listen: false).listActivity.clear(); + + for (Map element in result.item2) { + Provider.of(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 { 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 { 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 { ? 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 { itemBuilder: (context, index) { var activityObj = Provider.of(context, listen: true) - .listActivity[index] as ActivityOfUser; + .listActivity[index]; var activityMap = activityObj.toMap(); bool isFirstActivity = false; @@ -144,7 +202,8 @@ class _WebListActivityState extends State { Provider.of(context, listen: false) .removeActivity(activityObj); Provider.of(context, listen: false) - .insertActivity(0, activityObj); + .insertActivityTopWeb( + activityObj, context); }, isFirstActivity: isFirstActivity, ), diff --git a/lib/view/home/web/web_homeview.dart b/lib/view/home/web/web_homeview.dart index 7ce47de..47c60d7 100644 --- a/lib/view/home/web/web_homeview.dart +++ b/lib/view/home/web/web_homeview.dart @@ -101,23 +101,23 @@ class _WebHomeView extends State { 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", diff --git a/lib/view/main_tab/main_tab_view.dart b/lib/view/main_tab/main_tab_view.dart index 44b7b75..3d6d211 100644 --- a/lib/view/main_tab/main_tab_view.dart +++ b/lib/view/main_tab/main_tab_view.dart @@ -15,7 +15,7 @@ class MainTabView extends StatefulWidget { } class _MainTabViewState extends State { - int selectTab = 0; + int selectTab = -1; final PageStorageBucket pageBucket = PageStorageBucket(); Widget currentTab = const ListActivity(); @override diff --git a/lib/view/map/my_map.dart b/lib/view/map/my_map.dart index 64b3609..720d7b3 100644 --- a/lib/view/map/my_map.dart +++ b/lib/view/map/my_map.dart @@ -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 { Widget build(BuildContext context) { return context.watch().listActivity.isEmpty ? ScreenTypeLayout.builder( - mobile: (_) => const ProfileView(), - desktop: (_) => const ProfileView(), + mobile: (_) => const NoActivityView(), + desktop: (_) => const NoActivityView(), ) : ScreenTypeLayout.builder( mobile: (_) => const MobileMyMaps(), diff --git a/lib/view/profile/change_email.dart b/lib/view/profile/change_email.dart new file mode 100644 index 0000000..9b61eae --- /dev/null +++ b/lib/view/profile/change_email.dart @@ -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 createState() => _ChangeEmailViewState(); +} + +class _ChangeEmailViewState extends State { + @override + Widget build(BuildContext context) { + return ScreenTypeLayout.builder( + mobile: (_) => const MobileChangeEmailView(), + desktop: (_) => const WebChangeEmailView(), + ); + } +} diff --git a/lib/view/profile/change_password.dart b/lib/view/profile/change_password.dart index fcd0213..6ff6525 100644 --- a/lib/view/profile/change_password.dart +++ b/lib/view/profile/change_password.dart @@ -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 createState() => _ChangeUsernameViewState(); + State createState() => _ChangePasswordViewState(); } -class _ChangeUsernameViewState extends State { - final TextEditingController controllerTextEmail = TextEditingController(); - final TextEditingController controllerTextPassword = TextEditingController(); - - - @override +class _ChangePasswordViewState extends State { + @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(), ); } -} \ No newline at end of file +} diff --git a/lib/view/profile/change_username.dart b/lib/view/profile/change_username.dart index ad71734..c7591f6 100644 --- a/lib/view/profile/change_username.dart +++ b/lib/view/profile/change_username.dart @@ -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 { - 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(), ); } } diff --git a/lib/view/profile/contact_us_view.dart b/lib/view/profile/contact_us_view.dart new file mode 100644 index 0000000..4ad2003 --- /dev/null +++ b/lib/view/profile/contact_us_view.dart @@ -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, + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/view/profile/mobile/mobile_change_email.dart b/lib/view/profile/mobile/mobile_change_email.dart new file mode 100644 index 0000000..f623052 --- /dev/null +++ b/lib/view/profile/mobile/mobile_change_email.dart @@ -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 createState() => _MobileChangeEmailViewState(); +} + +class _MobileChangeEmailViewState extends State { + 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: () {}), + ], + ), + ), + ], + ), + ), + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/view/profile/mobile/mobile_change_password.dart b/lib/view/profile/mobile/mobile_change_password.dart new file mode 100644 index 0000000..2bb37a4 --- /dev/null +++ b/lib/view/profile/mobile/mobile_change_password.dart @@ -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 createState() => _MobileChangePasswordViewState(); +} + +class _MobileChangePasswordViewState extends State { + 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: () {}), + + ], + ), + ), + ], + ), + ), + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/view/profile/mobile/mobile_change_username.dart b/lib/view/profile/mobile/mobile_change_username.dart new file mode 100644 index 0000000..66f2abb --- /dev/null +++ b/lib/view/profile/mobile/mobile_change_username.dart @@ -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 createState() => _MobileChangeUsernameViewState(); +} + +class _MobileChangeUsernameViewState extends State { + 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: () {}), + ], + ), + ), + ], + ), + ), + ], + ), + ); + } +} \ 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 index a64bcb9..b60212f 100644 --- a/lib/view/profile/mobile/mobile_profile_view.dart +++ b/lib/view/profile/mobile/mobile_profile_view.dart @@ -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 { 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 { 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 { 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 + } + }, ); }, ) diff --git a/lib/view/profile/policy_view.dart b/lib/view/profile/policy_view.dart new file mode 100644 index 0000000..94f7f5b --- /dev/null +++ b/lib/view/profile/policy_view.dart @@ -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, + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/view/profile/web/web_change_email.dart b/lib/view/profile/web/web_change_email.dart new file mode 100644 index 0000000..797c08d --- /dev/null +++ b/lib/view/profile/web/web_change_email.dart @@ -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 createState() => _WebChangeEmailViewState(); +} + +class _WebChangeEmailViewState extends State { + 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: () {}), + ], + ), + ), + ], + ), + ), + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/view/profile/web/web_change_password.dart b/lib/view/profile/web/web_change_password.dart new file mode 100644 index 0000000..bb080e2 --- /dev/null +++ b/lib/view/profile/web/web_change_password.dart @@ -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 createState() => _WebChangePasswordViewState(); +} + +class _WebChangePasswordViewState extends State { + 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: () {}), + + ], + ), + ), + ], + ), + ), + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/view/profile/web/web_change_username.dart b/lib/view/profile/web/web_change_username.dart new file mode 100644 index 0000000..53f99ce --- /dev/null +++ b/lib/view/profile/web/web_change_username.dart @@ -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 createState() => _WebChangeUsernameViewState(); +} + +class _WebChangeUsernameViewState extends State { + 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: () {}), + ], + ), + ), + ], + ), + ), + ], + ), + ); + } +} \ 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 index f16e4b8..598e01e 100644 --- a/lib/view/profile/web/web_profile_view.dart +++ b/lib/view/profile/web/web_profile_view.dart @@ -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 { "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 { ), ); } 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 { 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 + } + }, ); }, )