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/request_api.dart b/lib/modele/api/request_api.dart index 14d226f..c4c700e 100644 --- a/lib/modele/api/request_api.dart +++ b/lib/modele/api/request_api.dart @@ -73,7 +73,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 +121,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 { 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..e67dca4 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,10 @@ class User extends ChangeNotifier { listActivity.insert(index, activity); notifyListeners(); } + + void insertActivityTop(ActivityOfUser activity, BuildContext context) { + listActivity.insert(0, activity); + ListActivityUtile().getContentOnTheFirstFile(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..776411f --- /dev/null +++ b/lib/modele/utile/list_activity.dart/list_activity_utile.dart @@ -0,0 +1,31 @@ +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 getContentOnTheFirstFile(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); + } +} 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 307110f..8f4db7b 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); @@ -19,8 +22,9 @@ class MobileListActivity extends StatefulWidget { class _MobileListActivity extends State { FilePickerResult? result; IDataStrategy strategy = RequestApi(); - ManagerFile _managerFile = ManagerFile(); + final ListActivityUtile _utile = ListActivityUtile(); + /* Future readFile(String nom) async { PlatformFile t = result!.files.single; String? y = t.path; @@ -28,18 +32,61 @@ class _MobileListActivity extends State { print("t"); } else { 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)); + .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())); + } + _utile.getContentOnTheFirstFile(context); + return; + } @override Widget build(BuildContext context) { var media = MediaQuery.of(context).size; int firstActivityIndex = 0; + if (Provider.of(context).listActivity.isNotEmpty) { + _utile.getContentOnTheFirstFile(context); + } + return Scaffold( backgroundColor: TColor.white, body: SingleChildScrollView( @@ -60,16 +107,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( @@ -86,7 +140,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( @@ -109,7 +163,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; @@ -136,7 +190,7 @@ class _MobileListActivity extends State { Provider.of(context, listen: false) .removeActivity(activityObj); Provider.of(context, listen: false) - .insertActivity(0, activityObj); + .insertActivityTop(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..cec1c4d 100644 --- a/lib/view/activity/web/web_list_activity.dart +++ b/lib/view/activity/web/web_list_activity.dart @@ -24,8 +24,6 @@ class _WebListActivityState extends State { IDataStrategy strategy = RequestApi(); int firstActivityIndex = 0; - //late File x = File(file.path); - void readFile(html.File file) async { ManagerFile x = ManagerFile(); final reader = html.FileReader(); @@ -34,14 +32,16 @@ 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; } }); } - List lastWorkoutArr = []; - @override Widget build(BuildContext context) { var media = MediaQuery.of(context).size;