From 4c75f38693ce936c69255ec18d6eac45ee812d6d Mon Sep 17 00:00:00 2001 From: Enzo Date: Tue, 21 Nov 2023 08:39:23 +0100 Subject: [PATCH 1/4] micro change --- lib/view/activity/mobile/mobile_list_activity.dart | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/lib/view/activity/mobile/mobile_list_activity.dart b/lib/view/activity/mobile/mobile_list_activity.dart index 2fd6656..5f8a7f0 100644 --- a/lib/view/activity/mobile/mobile_list_activity.dart +++ b/lib/view/activity/mobile/mobile_list_activity.dart @@ -19,26 +19,17 @@ class MobileListActivity extends StatefulWidget { class _MobileListActivity extends State { FilePickerResult? result; IDataStrategy strategy = RequestApi(); + ManagerFile _managerFile = ManagerFile(); 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!); 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))); } } From c5b38871a5d38521f1996acdd84bf5ff77eb02b6 Mon Sep 17 00:00:00 2001 From: Enzo Date: Tue, 21 Nov 2023 09:59:13 +0100 Subject: [PATCH 2/4] correctif my maps --- lib/view/map/my_map.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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(), From 682ba07aa387f6a39dbf5d48b7b057dde079f7f3 Mon Sep 17 00:00:00 2001 From: Enzo Date: Tue, 21 Nov 2023 16:00:12 +0100 Subject: [PATCH 3/4] list activity --- lib/common_widget/container/workout_row.dart | 9 +- lib/main.dart | 4 +- lib/modele/activity.dart | 39 ++++++--- lib/modele/api/request_api.dart | 34 +------- lib/modele/manager_file.dart | 10 ++- lib/modele/name_attribut_user.dart | 6 ++ lib/modele/name_colonne_file_fit.dart | 3 + lib/modele/user.dart | 7 ++ .../list_activity_utile.dart | 31 +++++++ lib/modele/utile/login_user.dart | 5 +- .../utile/profile_view/profile_utile.dart | 10 +++ .../activity/mobile/mobile_list_activity.dart | 82 +++++++++++++++---- lib/view/activity/web/web_list_activity.dart | 10 +-- 13 files changed, 181 insertions(+), 69 deletions(-) create mode 100644 lib/modele/name_attribut_user.dart create mode 100644 lib/modele/name_colonne_file_fit.dart create mode 100644 lib/modele/utile/list_activity.dart/list_activity_utile.dart create mode 100644 lib/modele/utile/profile_view/profile_utile.dart 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; From 82e5fbdc1aa9dcb1ed5decdef50a769b533a476f Mon Sep 17 00:00:00 2001 From: Enzo Date: Wed, 22 Nov 2023 09:19:11 +0100 Subject: [PATCH 4/4] list activity web + mobile --- lib/modele/api/i_data_strategy.dart | 3 + lib/modele/api/request_api.dart | 39 ++++++++++ lib/modele/user.dart | 10 ++- .../list_activity_utile.dart | 15 +++- .../activity/mobile/mobile_list_activity.dart | 13 ++-- lib/view/activity/web/web_list_activity.dart | 73 +++++++++++++++++-- 6 files changed, 136 insertions(+), 17 deletions(-) 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 c4c700e..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; @@ -182,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/user.dart b/lib/modele/user.dart index e67dca4..c067711 100644 --- a/lib/modele/user.dart +++ b/lib/modele/user.dart @@ -24,9 +24,15 @@ class User extends ChangeNotifier { notifyListeners(); } - void insertActivityTop(ActivityOfUser activity, BuildContext context) { + void insertActivityTopMobile(ActivityOfUser activity, BuildContext context) { listActivity.insert(0, activity); - ListActivityUtile().getContentOnTheFirstFile(context); + 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 index 776411f..23da587 100644 --- a/lib/modele/utile/list_activity.dart/list_activity_utile.dart +++ b/lib/modele/utile/list_activity.dart/list_activity_utile.dart @@ -12,7 +12,7 @@ class ListActivityUtile { final IDataStrategy _strategy = RequestApi(); final ManagerFile _managerFile = ManagerFile(); - Future getContentOnTheFirstFile(BuildContext context) async { + Future getContentOnTheFirstFileMobile(BuildContext context) async { Tuple2 result = await _strategy.getFile( Provider.of(context, listen: false).token, Provider.of(context, listen: false).listActivity[0].fileUuid); @@ -28,4 +28,17 @@ class ListActivityUtile { 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/view/activity/mobile/mobile_list_activity.dart b/lib/view/activity/mobile/mobile_list_activity.dart index 8f4db7b..91987cc 100644 --- a/lib/view/activity/mobile/mobile_list_activity.dart +++ b/lib/view/activity/mobile/mobile_list_activity.dart @@ -21,8 +21,9 @@ 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 { @@ -74,18 +75,13 @@ class _MobileListActivity extends State { element["uuid"].toString(), element["filename"].toString())); } - _utile.getContentOnTheFirstFile(context); + await _utile.getContentOnTheFirstFileMobile(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, @@ -190,7 +186,8 @@ class _MobileListActivity extends State { Provider.of(context, listen: false) .removeActivity(activityObj); Provider.of(context, listen: false) - .insertActivityTop(activityObj, context); + .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 cec1c4d..f9e84ab 100644 --- a/lib/view/activity/web/web_list_activity.dart +++ b/lib/view/activity/web/web_list_activity.dart @@ -1,6 +1,9 @@ +import 'dart:html'; 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,8 +25,9 @@ class WebListActivity extends StatefulWidget { class _WebListActivityState extends State { FilePickerResult? result; IDataStrategy strategy = RequestApi(); + final ListActivityUtile _utile = ListActivityUtile(); int firstActivityIndex = 0; - + /* void readFile(html.File file) async { ManagerFile x = ManagerFile(); final reader = html.FileReader(); @@ -40,6 +44,56 @@ class _WebListActivityState extends State { .contentActivity = result; } }); + }*/ + + void addFile(html.File file) async { + FileReader 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(); + } + }); + } + + // -- 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 @@ -66,6 +120,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 +136,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 +154,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 +177,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 +204,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, ),