From 225f2b04e5191b1a2933e77c8622f33b51d0aaab Mon Sep 17 00:00:00 2001 From: Enzo Date: Wed, 15 Nov 2023 16:38:56 +0100 Subject: [PATCH 01/11] list activity (mobile/web) --- lib/view/activity/list_activity.dart | 240 +----------------- .../activity/mobile/mobile_list_activity.dart | 151 +++++++++++ lib/view/activity/web/web_list_activity.dart | 151 +++++++++++ .../home/mobile/mobile_Activity_view.dart | 6 + 4 files changed, 314 insertions(+), 234 deletions(-) create mode 100644 lib/view/activity/mobile/mobile_list_activity.dart create mode 100644 lib/view/activity/web/web_list_activity.dart diff --git a/lib/view/activity/list_activity.dart b/lib/view/activity/list_activity.dart index ecf1f80..d4056cc 100644 --- a/lib/view/activity/list_activity.dart +++ b/lib/view/activity/list_activity.dart @@ -1,18 +1,7 @@ -import 'dart:convert'; -import 'dart:io'; - -import 'package:crypto/crypto.dart'; -import 'package:file_picker/file_picker.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/activity.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/workout_row.dart'; import 'package:flutter/material.dart'; -import 'package:tuple/tuple.dart'; -import '../../common/colo_extension.dart'; +import 'package:responsive_builder/responsive_builder.dart'; +import 'package:smartfit_app_mobile/view/activity/mobile/mobile_list_activity.dart'; +import 'package:smartfit_app_mobile/view/activity/web/web_list_activity.dart'; class ListActivity extends StatefulWidget { const ListActivity({super.key}); @@ -22,228 +11,11 @@ class ListActivity extends StatefulWidget { } class _ListActivityState extends State { - FilePickerResult? result; - IDataStrategy strategy = RequestApi(); - - //late File x = File(file.path); - 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"); - 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))); - } - } - - Future createUser() async { - String mds = "1234"; - var byte = utf8.encode(mds); - var digest = sha256.convert(byte); - print(digest.toString()); - print("Appel"); - Tuple2 res = - await strategy.postUser("toto@gmail.com", digest.toString(), "toto"); - print(res.item1); - print(res.item2); - } - - Future login() async { - String mds = "1234"; - var byte = utf8.encode(mds); - var digest = sha256.convert(byte); - print(digest.toString()); - print("Appel"); - Tuple2 res = - await strategy.connexion("toto@gmail.com", digest.toString()); - print(res.item1); - print(res.item2); - } - - Future deleteUser() async { - String token = - "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1dWlkIjoiYjA3OThmMjAtN2ZiMy0xMWVlLWJhZmQtMDI0MjBhNWEwMDFmIiwiZXhwIjoxNzA0ODgyNDI3fQ.2_bnvEC7_pwchielF3Kpu9fFtXDv_KabdOU8T07UnWI"; - print("Appel"); - Tuple2 res = await strategy.deleteUser(token); - print(res.item1); - print(res.item2); - } - - Future getFiles() async { - String token = - "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1dWlkIjoiOGUyYWVmMTItN2ZiNC0xMWVlLWJhZmQtMDI0MjBhNWEwMDFmIiwiZXhwIjoxNzA0ODgyNzk3fQ.b_zsOHj2C-Y28CrcozbSjEz8BUWL8kgjjx5CDhES8PI"; - print("Appel"); - Tuple2 res = await strategy.getFiles(token); - print(res.item1); - print(res.item2); - } - - Future modifAttribut() async { - String nameAtt = "username"; - String newValue = "toto2"; - String token = - "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1dWlkIjoiOGUyYWVmMTItN2ZiNC0xMWVlLWJhZmQtMDI0MjBhNWEwMDFmIiwiZXhwIjoxNzA0ODgzMDM4fQ.umN7LmUDbKUOeIToLcsOUIioQ7u4wsReHggRDB68VPQ"; - print("Appel"); - Tuple2 res = await strategy.modifAttribut(token, nameAtt, newValue); - print(res.item1); - print(res.item2); - } - - Future uploadFile() async { - PlatformFile t = result!.files.single; - String token = - "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1dWlkIjoiOGUyYWVmMTItN2ZiNC0xMWVlLWJhZmQtMDI0MjBhNWEwMDFmIiwiZXhwIjoxNzA0ODgzNjM5fQ.0TmfJ9eYnszw4_RkNwPkMzkJxvsIFs5BI9uhQ7qYb0g"; - String? lol = t.path!; - print("Appel"); - Tuple2 res = await strategy.uploadFile(token, File(lol)); - print(res.item1); - print(res.item2); - } - - Future getOneFile() async { - String ui = "fc6e234c-7fc6-11ee-bafd-02420a5a001f"; - String token = - "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1dWlkIjoiOGUyYWVmMTItN2ZiNC0xMWVlLWJhZmQtMDI0MjBhNWEwMDFmIiwiZXhwIjoxNzA0ODgzOTE3fQ.TUdrGEo7A0auQlUfO5RQm874QWuGXFBSKbJ8qTGPF2M"; - print("Appel"); - Tuple2 res = await strategy.getFile(token, ui); - print(res.item1); - print(res.item2); - - ManagerFile x = ManagerFile(); - File file = File("${await x.localPath}/Walking_2023-11-08T10_57_28.fit"); - await file.create(); - await file.writeAsBytes(res.item2); - print(await x.localPath); - print("Save"); - - print(await x - .readFitFile("${await x.localPath}/Walking_2023-11-08T10_57_28.fit")); - } - - Future getInfoUser() async { - String token = - "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1dWlkIjoiOGUyYWVmMTItN2ZiNC0xMWVlLWJhZmQtMDI0MjBhNWEwMDFmIiwiZXhwIjoxNzA0ODgzOTE3fQ.TUdrGEo7A0auQlUfO5RQm874QWuGXFBSKbJ8qTGPF2M"; - Tuple2 res = await strategy.getInfoUser(token); - print(res.item1); - print(res.item2); - } - - List lastWorkoutArr = []; - @override Widget build(BuildContext context) { - var media = MediaQuery.of(context).size; - - return Scaffold( - backgroundColor: TColor.white, - body: SingleChildScrollView( - child: SafeArea( - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 15), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox(height: 20), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - "List Activités", - style: TextStyle( - color: TColor.black, - fontSize: 16, - fontWeight: FontWeight.w700), - ), - TextButton( - onPressed: () async { - result = await FilePicker.platform.pickFiles(); - if (result == null) { - print("No file selected"); - } else { - for (var element in result!.files) { - readFile(element.name); - print(element.name); - } - } - }, - child: Text( - "Ajouter", - style: TextStyle( - color: TColor.gray, - fontSize: 14, - fontWeight: FontWeight.w700), - ), - ) - ], - ), - Provider.of(context, listen: true).listActivity.isEmpty - ? Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox(height: 20), - Text( - "Vous n'avez pas d'activités pour le moment, veuillez en ajouter.", - style: TextStyle( - color: TColor.gray, - fontSize: 11, - fontStyle: FontStyle.italic, - fontWeight: FontWeight.w400, - ), - ) - ]) - : ListView.builder( - padding: EdgeInsets.zero, - physics: const NeverScrollableScrollPhysics(), - shrinkWrap: true, - itemCount: Provider.of(context, listen: true) - .listActivity - .length, - itemBuilder: (context, index) { - var activityObj = - Provider.of(context, listen: true) - .listActivity[index] as ActivityOfUser; - var activityMap = activityObj.toMap(); - return InkWell( - onTap: () { - Provider.of(context, listen: false) - .removeActivity(activityObj); - Provider.of(context, listen: false) - .insertActivity(0, activityObj); - }, - child: WorkoutRow( - wObj: activityMap, - onDelete: () { - Provider.of(context, listen: false) - .removeActivity(activityObj); - }, - onClick: () { - Provider.of(context, listen: false) - .removeActivity(activityObj); - Provider.of(context, listen: false) - .insertActivity(0, activityObj); - }, - )); - }), - SizedBox( - height: media.width * 0.1, - ), - ], - ), - ), - ), - ), + return ScreenTypeLayout.builder( + mobile: (_) => const MobileListActivity(), + desktop: (_) => const WebListActivity(), ); } } diff --git a/lib/view/activity/mobile/mobile_list_activity.dart b/lib/view/activity/mobile/mobile_list_activity.dart new file mode 100644 index 0000000..ad4736f --- /dev/null +++ b/lib/view/activity/mobile/mobile_list_activity.dart @@ -0,0 +1,151 @@ +import 'package:file_picker/file_picker.dart'; +import 'package:provider/provider.dart'; +import 'package:smartfit_app_mobile/common/colo_extension.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/activity.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/workout_row.dart'; +import 'package:flutter/material.dart'; + +class MobileListActivity extends StatefulWidget { + const MobileListActivity({super.key}); + + @override + State createState() => _MobileListActivity(); +} + +class _MobileListActivity extends State { + FilePickerResult? result; + IDataStrategy strategy = RequestApi(); + + 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"); + 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))); + } + } + + List lastWorkoutArr = []; + + @override + Widget build(BuildContext context) { + var media = MediaQuery.of(context).size; + + return Scaffold( + backgroundColor: TColor.white, + body: SingleChildScrollView( + child: SafeArea( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 15), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox(height: 20), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "List Activités", + style: TextStyle( + color: TColor.black, + fontSize: 16, + fontWeight: FontWeight.w700), + ), + TextButton( + onPressed: () async { + result = await FilePicker.platform.pickFiles(); + if (result == null) { + print("No file selected"); + } else { + for (var element in result!.files) { + readFile(element.name); + print(element.name); + } + } + }, + child: Text( + "Ajouter", + style: TextStyle( + color: TColor.gray, + fontSize: 14, + fontWeight: FontWeight.w700), + ), + ) + ], + ), + Provider.of(context, listen: true).listActivity.isEmpty + ? Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: 20), + Text( + "Vous n'avez pas d'activités pour le moment, veuillez en ajouter.", + style: TextStyle( + color: TColor.gray, + fontSize: 11, + fontStyle: FontStyle.italic, + fontWeight: FontWeight.w400, + ), + ) + ]) + : ListView.builder( + padding: EdgeInsets.zero, + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: Provider.of(context, listen: true) + .listActivity + .length, + itemBuilder: (context, index) { + var activityObj = + Provider.of(context, listen: true) + .listActivity[index] as ActivityOfUser; + var activityMap = activityObj.toMap(); + return InkWell( + onTap: () { + Provider.of(context, listen: false) + .removeActivity(activityObj); + Provider.of(context, listen: false) + .insertActivity(0, activityObj); + }, + child: WorkoutRow( + wObj: activityMap, + onDelete: () { + Provider.of(context, listen: false) + .removeActivity(activityObj); + }, + onClick: () { + Provider.of(context, listen: false) + .removeActivity(activityObj); + Provider.of(context, listen: false) + .insertActivity(0, activityObj); + }, + )); + }), + SizedBox( + height: media.width * 0.1, + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/view/activity/web/web_list_activity.dart b/lib/view/activity/web/web_list_activity.dart new file mode 100644 index 0000000..3905c97 --- /dev/null +++ b/lib/view/activity/web/web_list_activity.dart @@ -0,0 +1,151 @@ +import 'package:file_picker/file_picker.dart'; +import 'package:provider/provider.dart'; +import 'package:smartfit_app_mobile/common/colo_extension.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/activity.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/workout_row.dart'; +import 'package:flutter/material.dart'; + +class WebListActivity extends StatefulWidget { + const WebListActivity({super.key}); + + @override + State createState() => _WebListActivity(); +} + +class _WebListActivity extends State { + FilePickerResult? result; + IDataStrategy strategy = RequestApi(); + + 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"); + 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))); + } + } + + List lastWorkoutArr = []; + + @override + Widget build(BuildContext context) { + var media = MediaQuery.of(context).size; + + return Scaffold( + backgroundColor: TColor.white, + body: SingleChildScrollView( + child: SafeArea( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 15), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: 20), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "List Activités", + style: TextStyle( + color: TColor.black, + fontSize: 16, + fontWeight: FontWeight.w700), + ), + TextButton( + onPressed: () async { + result = await FilePicker.platform.pickFiles(); + if (result == null) { + print("No file selected"); + } else { + for (var element in result!.files) { + readFile(element.name); + print(element.name); + } + } + }, + child: Text( + "Ajouter", + style: TextStyle( + color: TColor.gray, + fontSize: 14, + fontWeight: FontWeight.w700), + ), + ) + ], + ), + Provider.of(context, listen: true).listActivity.isEmpty + ? Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: 20), + Text( + "Vous n'avez pas d'activités pour le moment, veuillez en ajouter.", + style: TextStyle( + color: TColor.gray, + fontSize: 11, + fontStyle: FontStyle.italic, + fontWeight: FontWeight.w400, + ), + ) + ]) + : ListView.builder( + padding: EdgeInsets.zero, + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: Provider.of(context, listen: true) + .listActivity + .length, + itemBuilder: (context, index) { + var activityObj = + Provider.of(context, listen: true) + .listActivity[index] as ActivityOfUser; + var activityMap = activityObj.toMap(); + return InkWell( + onTap: () { + Provider.of(context, listen: false) + .removeActivity(activityObj); + Provider.of(context, listen: false) + .insertActivity(0, activityObj); + }, + child: WorkoutRow( + wObj: activityMap, + onDelete: () { + Provider.of(context, listen: false) + .removeActivity(activityObj); + }, + onClick: () { + Provider.of(context, listen: false) + .removeActivity(activityObj); + Provider.of(context, listen: false) + .insertActivity(0, activityObj); + }, + )); + }), + SizedBox( + height: media.width * 0.1, + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/view/home/mobile/mobile_Activity_view.dart b/lib/view/home/mobile/mobile_Activity_view.dart index b3188f3..d42419e 100644 --- a/lib/view/home/mobile/mobile_Activity_view.dart +++ b/lib/view/home/mobile/mobile_Activity_view.dart @@ -1,14 +1,20 @@ +import 'package:provider/provider.dart'; import 'package:smartfit_app_mobile/common_widget/steps.dart'; import 'package:smartfit_app_mobile/common_widget/graph.dart'; import 'package:smartfit_app_mobile/common_widget/info.dart' hide Stats; import 'package:smartfit_app_mobile/common_widget/stats.dart'; import 'package:flutter/material.dart'; +import 'package:smartfit_app_mobile/modele/user.dart'; class MobileActivity extends StatelessWidget { const MobileActivity({Key? key}) : super(key: key); @override Widget build(BuildContext context) { + if (context.watch().listActivity.isEmpty) { + return const Scaffold(body: Text("C'est vide")); + } + return const Scaffold( backgroundColor: Colors.white, body: Column( From 247c062b526c7ed16b9d916e3155e2baebef379c Mon Sep 17 00:00:00 2001 From: Enzo Date: Thu, 16 Nov 2023 11:36:04 +0100 Subject: [PATCH 02/11] affichage home view --- lib/common_widget/container_stats.dart | 56 + lib/common_widget/ligne_container_stats.dart | 31 + lib/common_widget/stats.dart | 4 +- lib/common_widget/steps.dart | 2 - lib/main.dart | 3 +- lib/modele/activity.dart | 97 +- lib/modele/user.dart | 3 +- lib/view/activity/activity.dart | 22 +- lib/view/home/home_view.dart | 22 +- .../home/mobile/mobile_Activity_view.dart | 4 - lib/view/home/mobile/mobile_homeview.dart | 616 ++-------- lib/view/ne_pas_supprimer/home_view.txt | 1050 +++++++++++++++++ 12 files changed, 1310 insertions(+), 600 deletions(-) create mode 100644 lib/common_widget/container_stats.dart create mode 100644 lib/common_widget/ligne_container_stats.dart create mode 100644 lib/view/ne_pas_supprimer/home_view.txt diff --git a/lib/common_widget/container_stats.dart b/lib/common_widget/container_stats.dart new file mode 100644 index 0000000..c18f603 --- /dev/null +++ b/lib/common_widget/container_stats.dart @@ -0,0 +1,56 @@ +import 'package:flutter/material.dart'; + +class ContainerStats extends StatelessWidget { + const ContainerStats(this.value, this.designation, {Key? key}) + : super(key: key); + + final String value; + final String designation; + + @override + Widget build(BuildContext context) { + return Container( + height: 110, + width: 110, + padding: const EdgeInsets.all(8), + margin: const EdgeInsets.symmetric(vertical: 5), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(15), + border: Border.all( + color: const Color(0xffe1e1e1), + ), + boxShadow: const [ + BoxShadow( + color: Colors.black12, + offset: Offset(3, 3), + blurRadius: 3, + ), + ]), + child: Stack( + children: [ + Align( + alignment: Alignment.bottomLeft, + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + designation, + style: const TextStyle(fontSize: 10), + ), + Text( + value, + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.w800, + ), + ), + ], + ), + ) + ], + ), + ); + } +} diff --git a/lib/common_widget/ligne_container_stats.dart b/lib/common_widget/ligne_container_stats.dart new file mode 100644 index 0000000..3530c38 --- /dev/null +++ b/lib/common_widget/ligne_container_stats.dart @@ -0,0 +1,31 @@ +import 'package:flutter/material.dart'; +import 'package:smartfit_app_mobile/common_widget/container_stats.dart'; + +class LigneContainerStats extends StatelessWidget { + const LigneContainerStats(this.value1, this.value2, this.value3, + this.designation1, this.designation2, this.designation3, + {Key? key}) + : super(key: key); + + final String value1; + final String value2; + final String value3; + + final String designation1; + final String designation2; + final String designation3; + + @override + Widget build(BuildContext context) { + return Row( + children: [ + const SizedBox(height: 10), + ContainerStats(value1, designation1), + const SizedBox(height: 10), + ContainerStats(value2, designation2), + const SizedBox(height: 10), + ContainerStats(value3, designation3), + ], + ); + } +} diff --git a/lib/common_widget/stats.dart b/lib/common_widget/stats.dart index 32e9264..977eb0b 100644 --- a/lib/common_widget/stats.dart +++ b/lib/common_widget/stats.dart @@ -24,7 +24,7 @@ class Stats extends StatelessWidget { padding: const EdgeInsets.symmetric(horizontal: 30), child: Row( children: [ - Text( + const Text( 'Statistiques', style: TextStyle( fontSize: 14, @@ -45,7 +45,7 @@ class Stats extends StatelessWidget { scrollDirection: Axis.horizontal, child: Row( children: [ - SizedBox(width: 30), + const SizedBox(width: 30), InfoStat( icon: Icons.timer, iconColor: Color.fromARGB(255, 255, 255, 255), diff --git a/lib/common_widget/steps.dart b/lib/common_widget/steps.dart index 370785d..5bee49f 100644 --- a/lib/common_widget/steps.dart +++ b/lib/common_widget/steps.dart @@ -7,8 +7,6 @@ class Steps extends StatelessWidget { @override Widget build(BuildContext context) { - print("lhwaa"); - String steps = Provider.of(context, listen: false) .listActivity[0] .getTotalSteps(); diff --git a/lib/main.dart b/lib/main.dart index 77fdfa7..28c7f13 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -3,6 +3,7 @@ import 'package:provider/provider.dart'; import 'package:smartfit_app_mobile/modele/user.dart'; import 'package:smartfit_app_mobile/view/login/signup_view.dart'; import 'package:smartfit_app_mobile/common/colo_extension.dart'; +import 'package:smartfit_app_mobile/view/main_tab/main_tab_view.dart'; void main() { runApp(ChangeNotifierProvider( @@ -36,7 +37,7 @@ class MyApp extends StatelessWidget { primaryColor: TColor.primaryColor1, fontFamily: "Poppins"), //home: const StartedView(), - home: const SignUpView(), + home: const MainTabView(), ); } } diff --git a/lib/modele/activity.dart b/lib/modele/activity.dart index 605d8de..413f99e 100644 --- a/lib/modele/activity.dart +++ b/lib/modele/activity.dart @@ -5,6 +5,7 @@ class ActivityOfUser { late String _nomActivite; late String _imageName; late List _contentActivity; + late int _dataSession; List get contentActivity => _contentActivity; @@ -12,6 +13,18 @@ class ActivityOfUser { _nomActivite = nom; _imageName = "assets/img/workout1.svg"; _contentActivity = listeDynamic; + _dataSession = getDataSession(); + } + + // ----- 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--) { + if (_contentActivity[i][0] == "Data" && + _contentActivity[i][2] == "session") { + return i; + } + } + return 0; } List getHeartRateWithTime() { @@ -64,7 +77,6 @@ class ActivityOfUser { if (ligne.length >= 39 && ligne[0] == "Data" && ligne[39] == "total_calories") { - print(ligne[39]); if (firtTimeStamp == 0) { firtTimeStamp = ligne[4]; } @@ -77,77 +89,48 @@ class ActivityOfUser { } String getTotalSteps() { - print(_contentActivity.length); - for (int i = 0; - i < _contentActivity[_contentActivity.length - 3].length; - i++) { - print(_contentActivity[_contentActivity.length - 3][i]); - - if (_contentActivity[_contentActivity.length - 3][i] == "total_strides") { - return _contentActivity[_contentActivity.length - 3][i + 1].toString(); + for (int i = 0; i < _contentActivity[_dataSession].length; i++) { + if (_contentActivity[_dataSession][i] == "total_strides") { + return _contentActivity[_dataSession][i + 1].toString(); } } - return "NAN"; + return "null"; } String getTotalCalorie() { - print(_contentActivity.length); - for (int i = 0; - i < _contentActivity[_contentActivity.length - 3].length; - i++) { - print(_contentActivity[_contentActivity.length - 3][i]); - - if (_contentActivity[_contentActivity.length - 3][i] == - "total_calories") { - return _contentActivity[_contentActivity.length - 3][i + 1].toString(); + for (int i = 0; i < _contentActivity[_dataSession].length; i++) { + if (_contentActivity[_dataSession][i] == "total_calories") { + return _contentActivity[_dataSession][i + 1].toString(); } } - return "NAN"; + return "null"; } String getTotalAvgHeartRate() { - print(_contentActivity.length); - for (int i = 0; - i < _contentActivity[_contentActivity.length - 3].length; - i++) { - print(_contentActivity[_contentActivity.length - 3][i]); - - if (_contentActivity[_contentActivity.length - 3][i] == - "total_calories") { - return _contentActivity[_contentActivity.length - 3][i + 1].toString(); + for (int i = 0; i < _contentActivity[_dataSession].length; i++) { + if (_contentActivity[_dataSession][i] == "avg_heart_rate") { + return _contentActivity[_dataSession][i + 1].toString(); } } - return "NAN"; + return "null"; } String getTotalTime() { - print(_contentActivity.length); - for (int i = 0; - i < _contentActivity[_contentActivity.length - 3].length; - i++) { - print(_contentActivity[_contentActivity.length - 3][i]); - - if (_contentActivity[_contentActivity.length - 3][i] == - "total_elapsed_time") { - return _contentActivity[_contentActivity.length - 3][i + 1].toString(); + for (int i = 0; i < _contentActivity[_dataSession].length; i++) { + if (_contentActivity[_dataSession][i] == "total_elapsed_time") { + return _contentActivity[_dataSession][i + 1].toString(); } } - return "NAN"; + return "null"; } String getTotalDistance() { - print(_contentActivity.length); - for (int i = 0; - i < _contentActivity[_contentActivity.length - 3].length; - i++) { - print(_contentActivity[_contentActivity.length - 3][i]); - - if (_contentActivity[_contentActivity.length - 3][i] == - "total_distance") { - return _contentActivity[_contentActivity.length - 3][i + 1].toString(); + for (int i = 0; i < _contentActivity[_dataSession].length; i++) { + if (_contentActivity[_dataSession][i] == "total_distance") { + return _contentActivity[_dataSession][i + 1].toString(); } } - return "NAN"; + return "null"; } List getAltitudeWithTime() { @@ -167,20 +150,6 @@ class ActivityOfUser { return result; } - double getDistance() { - double result = 0.0; - for (int i = _contentActivity.length - 1; i >= 0; i--) { - if (_contentActivity[i].length >= 8 && - _contentActivity[i][0] == "Data" && - _contentActivity[i][6] == "distance") { - if (_contentActivity[i][7] > result) { - result = _contentActivity[i][7].toDouble(); - } - } - } - return result; - } - List getSpeedWithTime() { List result = List.empty(growable: true); int firtTimeStamp = 0; diff --git a/lib/modele/user.dart b/lib/modele/user.dart index 24d6d9b..d9715a8 100644 --- a/lib/modele/user.dart +++ b/lib/modele/user.dart @@ -5,10 +5,11 @@ class User extends ChangeNotifier { String username = "VOID"; String email = "VOID"; String token = "VOID"; - List listActivity = List.empty(); + List listActivity = List.empty(growable: true); void addActivity(ActivityOfUser activity) { listActivity.add(activity); + print("add"); notifyListeners(); } diff --git a/lib/view/activity/activity.dart b/lib/view/activity/activity.dart index 5198ab7..6e05af5 100644 --- a/lib/view/activity/activity.dart +++ b/lib/view/activity/activity.dart @@ -1,4 +1,6 @@ +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/mobile/mobile_Activity_view.dart'; import 'package:smartfit_app_mobile/view/home/web/web_Activity_view.dart'; import 'package:flutter/material.dart'; @@ -8,9 +10,21 @@ class Activity extends StatelessWidget { @override Widget build(BuildContext context) { - return ScreenTypeLayout.builder( - mobile: (_) => const MobileActivity(), - desktop: (_) => const WebActivity(), - ); + if (context.watch().listActivity.isEmpty) { + return const Scaffold( + body: Column( + children: [ + Text("C'est vide"), + Text("C'est vide"), + Text("C'est vide"), + Text("C'est vide") + ], + )); + } else { + return ScreenTypeLayout.builder( + mobile: (_) => const MobileActivity(), + desktop: (_) => const WebActivity(), + ); + } } } diff --git a/lib/view/home/home_view.dart b/lib/view/home/home_view.dart index 0b6f1cb..4695ac0 100644 --- a/lib/view/home/home_view.dart +++ b/lib/view/home/home_view.dart @@ -1,5 +1,7 @@ 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/mobile/mobile_homeview.dart'; import 'package:smartfit_app_mobile/view/home/web/web_homeview.dart'; @@ -13,9 +15,21 @@ class HomeView extends StatefulWidget { class _HomeViewState extends State { @override Widget build(BuildContext context) { - return ScreenTypeLayout.builder( - mobile: (_) => const MobileHomeView(), - desktop: (_) => const WebHomeView(), - ); + if (context.watch().listActivity.isEmpty) { + return const Scaffold( + body: Column( + children: [ + Text("C'est vide"), + Text("C'est vide"), + Text("C'est vide"), + Text("C'est vide") + ], + )); + } else { + return ScreenTypeLayout.builder( + mobile: (_) => const MobileHomeView(), + desktop: (_) => const WebHomeView(), + ); + } } } diff --git a/lib/view/home/mobile/mobile_Activity_view.dart b/lib/view/home/mobile/mobile_Activity_view.dart index d42419e..17af619 100644 --- a/lib/view/home/mobile/mobile_Activity_view.dart +++ b/lib/view/home/mobile/mobile_Activity_view.dart @@ -11,10 +11,6 @@ class MobileActivity extends StatelessWidget { @override Widget build(BuildContext context) { - if (context.watch().listActivity.isEmpty) { - return const Scaffold(body: Text("C'est vide")); - } - return const Scaffold( backgroundColor: Colors.white, body: Column( diff --git a/lib/view/home/mobile/mobile_homeview.dart b/lib/view/home/mobile/mobile_homeview.dart index 196a0d5..6d23570 100644 --- a/lib/view/home/mobile/mobile_homeview.dart +++ b/lib/view/home/mobile/mobile_homeview.dart @@ -4,6 +4,8 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:simple_animation_progress_bar/simple_animation_progress_bar.dart'; import 'package:simple_circular_progress_bar/simple_circular_progress_bar.dart'; +import 'package:smartfit_app_mobile/common_widget/container_stats.dart'; +import 'package:smartfit_app_mobile/common_widget/ligne_container_stats.dart'; import 'package:smartfit_app_mobile/modele/user.dart'; import 'package:smartfit_app_mobile/common/colo_extension.dart'; import 'package:smartfit_app_mobile/common_widget/round_button.dart'; @@ -18,9 +20,56 @@ class MobileHomeView extends StatefulWidget { } class _MobileHomeView extends State { - List showingTooltipOnSpots = [0]; + List bpmSecondes = [FlSpot(0, 30)]; + List bpmSecondes2 = []; + double calories = 0.0; + List vitesseSecondes = [FlSpot(0, 30)]; + List altitudeSecondes = [FlSpot(0, 30)]; + + TextEditingController bpmController = TextEditingController(); + + void normaliserDeuxiemeElement(List liste) { + // Trouver le plus grand élément dans la liste + double maxElement = 0.0; + for (var spot in liste) { + if (spot.y > maxElement) { + maxElement = spot.y; + } + } + + // Calculer le facteur de normalisation + double normalisationFactor = maxElement != 0.0 ? 100 / maxElement : 1.0; + + // Mettre à jour tous les éléments de la liste + for (int i = 0; i < liste.length; i++) { + liste[i] = FlSpot(liste[i].x, liste[i].y * normalisationFactor); + } + } - List allSpots = [const FlSpot(0, 20)]; + List lastWorkoutArr = [ + { + "name": "Full Body Workout", + "image": "assets/img/Workout1.png", + "kcal": "180", + "time": "20", + "progress": 0.3 + }, + { + "name": "Lower Body Workout", + "image": "assets/img/Workout2.png", + "kcal": "200", + "time": "30", + "progress": 0.4 + }, + { + "name": "Ab Workout", + "image": "assets/img/Workout3.png", + "kcal": "300", + "time": "40", + "progress": 0.7 + }, + ]; + List showingTooltipOnSpots = [0]; List waterArr = [ {"title": "6am - 8am", "subtitle": "600ml"}, @@ -33,12 +82,24 @@ class _MobileHomeView extends State { @override Widget build(BuildContext context) { var media = MediaQuery.of(context).size; - User user = context.watch(); + + bpmSecondes = + Provider.of(context).listActivity[0].getHeartRateWithTime(); + vitesseSecondes = + Provider.of(context).listActivity[0].getSpeedWithTime(); + altitudeSecondes = + Provider.of(context).listActivity[0].getAltitudeWithTime(); + calories = double.parse( + Provider.of(context).listActivity[0].getTotalCalorie()); + + normaliserDeuxiemeElement(vitesseSecondes); + normaliserDeuxiemeElement(altitudeSecondes); + bpmSecondes2 = List.from(bpmSecondes); + normaliserDeuxiemeElement(bpmSecondes2); final lineBarsData = [ LineChartBarData( - showingIndicators: showingTooltipOnSpots, - spots: allSpots, + spots: bpmSecondes, isCurved: false, barWidth: 2, belowBarData: BarAreaData( @@ -77,7 +138,7 @@ class _MobileHomeView extends State { style: TextStyle(color: TColor.gray, fontSize: 12), ), Text( - user.username, + "Benjelloun Othmane", style: TextStyle( color: TColor.black, fontSize: 20, @@ -105,123 +166,6 @@ class _MobileHomeView extends State { SizedBox( height: media.width * 0.05, ), - Container( - height: media.width * 0.4, - decoration: BoxDecoration( - gradient: LinearGradient(colors: TColor.primaryG), - borderRadius: BorderRadius.circular(media.width * 0.075)), - child: Stack(alignment: Alignment.center, children: [ - Image.asset( - "assets/img/bg_dots.png", - height: media.width * 0.4, - width: double.maxFinite, - fit: BoxFit.fitHeight, - ), - Padding( - padding: const EdgeInsets.symmetric( - vertical: 25, horizontal: 25), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - "Graph 1", - style: TextStyle( - color: TColor.white, - fontSize: 14, - fontWeight: FontWeight.w700), - ), - Text( - "Sous titre 1", - style: TextStyle( - color: TColor.white.withOpacity(0.7), - fontSize: 12), - ), - SizedBox( - height: media.width * 0.05, - ), - SizedBox( - width: 120, - height: 35, - child: RoundButton( - title: "Voir plus", - type: RoundButtonType.bgSGradient, - fontSize: 12, - fontWeight: FontWeight.w400, - onPressed: () {})) - ], - ), - AspectRatio( - aspectRatio: 1, - child: PieChart( - PieChartData( - pieTouchData: PieTouchData( - touchCallback: - (FlTouchEvent event, pieTouchResponse) {}, - ), - startDegreeOffset: 250, - borderData: FlBorderData( - show: false, - ), - sectionsSpace: 1, - centerSpaceRadius: 0, - sections: showingSections(), - ), - ), - ), - ], - ), - ) - ]), - ), - SizedBox( - height: media.width * 0.05, - ), - Container( - padding: - const EdgeInsets.symmetric(vertical: 15, horizontal: 15), - decoration: BoxDecoration( - color: TColor.primaryColor2.withOpacity(0.3), - borderRadius: BorderRadius.circular(15), - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - "Suivi d'activité", - style: TextStyle( - color: TColor.black, - fontSize: 14, - fontWeight: FontWeight.w700), - ), - SizedBox( - width: 70, - height: 25, - child: RoundButton( - title: "Voir", - type: RoundButtonType.bgGradient, - fontSize: 12, - fontWeight: FontWeight.w400, - onPressed: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => - const ActivityTrackerView(), - ), - ); - }, - ), - ) - ], - ), - ), - SizedBox( - height: media.width * 0.05, - ), Text( "Status d'activité", style: TextStyle( @@ -253,29 +197,23 @@ class _MobileHomeView extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Graph 2 ( rhythme cardiaque )", + "Rythme cardiaque", style: TextStyle( color: TColor.black, fontSize: 16, fontWeight: FontWeight.w700), ), - ShaderMask( - blendMode: BlendMode.srcIn, - shaderCallback: (bounds) { - return LinearGradient( - colors: TColor.primaryG, - begin: Alignment.centerLeft, - end: Alignment.centerRight) - .createShader(Rect.fromLTRB( - 0, 0, bounds.width, bounds.height)); - }, - child: Text( - "78 BPM", - style: TextStyle( - color: - TColor.primaryColor1.withOpacity(0.7), - fontWeight: FontWeight.w700, - fontSize: 18), + TextField( + controller: bpmController, + readOnly: true, + style: TextStyle( + color: + TColor.primaryColor1.withOpacity(0.8), + fontWeight: FontWeight.w700, + fontSize: 18), + decoration: const InputDecoration( + border: InputBorder + .none, // Ajoutez cette ligne pour supprimer la bordure ), ), ], @@ -347,8 +285,9 @@ class _MobileHomeView extends State { getTooltipItems: (List lineBarsSpot) { return lineBarsSpot.map((lineBarSpot) { + bpmController.text = "${lineBarSpot.y} BPM"; return LineTooltipItem( - "il y a ${lineBarSpot.x.toInt()} minutes", + "Seconde ${lineBarSpot.x.toInt() / 10}", const TextStyle( color: Colors.white, fontSize: 10, @@ -360,12 +299,12 @@ class _MobileHomeView extends State { ), ), lineBarsData: lineBarsData, - minY: 0, - maxY: 130, - titlesData: FlTitlesData( + minY: 50, + maxY: 250, + titlesData: const FlTitlesData( show: false, ), - gridData: FlGridData(show: false), + gridData: const FlGridData(show: false), borderData: FlBorderData( show: true, border: Border.all( @@ -381,352 +320,17 @@ class _MobileHomeView extends State { SizedBox( height: media.width * 0.05, ), - Row( - children: [ - Expanded( - child: Container( - height: media.width * 0.95, - padding: const EdgeInsets.symmetric( - vertical: 25, horizontal: 20), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(25), - boxShadow: const [ - BoxShadow(color: Colors.black12, blurRadius: 2) - ]), - child: Row( - children: [ - SimpleAnimationProgressBar( - height: media.width * 0.85, - width: media.width * 0.07, - backgroundColor: Colors.grey.shade100, - foregrondColor: Colors.purple, - ratio: 0.5, - direction: Axis.vertical, - curve: Curves.fastLinearToSlowEaseIn, - duration: const Duration(seconds: 3), - borderRadius: BorderRadius.circular(15), - gradientColor: LinearGradient( - colors: TColor.primaryG, - begin: Alignment.bottomCenter, - end: Alignment.topCenter), - ), - const SizedBox( - width: 10, - ), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - "Graph 3", - style: TextStyle( - color: TColor.black, - fontSize: 12, - fontWeight: FontWeight.w700), - ), - ShaderMask( - blendMode: BlendMode.srcIn, - shaderCallback: (bounds) { - return LinearGradient( - colors: TColor.primaryG, - begin: Alignment.centerLeft, - end: Alignment.centerRight) - .createShader(Rect.fromLTRB( - 0, 0, bounds.width, bounds.height)); - }, - child: Text( - "ex : objectif", - style: TextStyle( - color: TColor.white.withOpacity(0.7), - fontWeight: FontWeight.w700, - fontSize: 14), - ), - ), - const SizedBox( - height: 10, - ), - Text( - "Mis à jour en temps réel", - style: TextStyle( - color: TColor.gray, - fontSize: 12, - ), - ), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: waterArr.map((wObj) { - var isLast = wObj == waterArr.last; - return Row( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Column( - mainAxisAlignment: - MainAxisAlignment.start, - crossAxisAlignment: - CrossAxisAlignment.center, - children: [ - Container( - margin: - const EdgeInsets.symmetric( - vertical: 4), - width: 10, - height: 10, - decoration: BoxDecoration( - color: TColor.secondaryColor1 - .withOpacity(0.5), - borderRadius: - BorderRadius.circular(5), - ), - ), - if (!isLast) - DottedDashedLine( - height: media.width * 0.078, - width: 0, - dashColor: TColor - .secondaryColor1 - .withOpacity(0.5), - axis: Axis.vertical) - ], - ), - const SizedBox( - width: 10, - ), - Column( - mainAxisAlignment: - MainAxisAlignment.start, - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Text( - wObj["title"].toString(), - style: TextStyle( - color: TColor.gray, - fontSize: 10, - ), - ), - ShaderMask( - blendMode: BlendMode.srcIn, - shaderCallback: (bounds) { - return LinearGradient( - colors: - TColor.secondaryG, - begin: Alignment - .centerLeft, - end: Alignment - .centerRight) - .createShader(Rect.fromLTRB( - 0, - 0, - bounds.width, - bounds.height)); - }, - child: Text( - wObj["subtitle"].toString(), - style: TextStyle( - color: TColor.white - .withOpacity(0.7), - fontSize: 12), - ), - ), - ], - ) - ], - ); - }).toList(), - ) - ], - )) - ], - ), - ), - ), - SizedBox( - width: media.width * 0.05, - ), - Expanded( - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - Container( - width: double.maxFinite, - height: media.width * 0.45, - padding: const EdgeInsets.symmetric( - vertical: 25, horizontal: 20), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(25), - boxShadow: const [ - BoxShadow(color: Colors.black12, blurRadius: 2) - ]), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - "Graph 4", - style: TextStyle( - color: TColor.black, - fontSize: 12, - fontWeight: FontWeight.w700), - ), - ShaderMask( - blendMode: BlendMode.srcIn, - shaderCallback: (bounds) { - return LinearGradient( - colors: TColor.primaryG, - begin: Alignment.centerLeft, - end: Alignment.centerRight) - .createShader(Rect.fromLTRB( - 0, 0, bounds.width, bounds.height)); - }, - child: Text( - "durée", - style: TextStyle( - color: TColor.white.withOpacity(0.7), - fontWeight: FontWeight.w700, - fontSize: 14), - ), - ), - const Spacer(), - Image.asset("assets/img/sleep_graph.png", - width: double.maxFinite, - height: 80, - fit: BoxFit.fitWidth) - ]), - ), - SizedBox( - height: media.width * 0.05, - ), - Container( - width: double.maxFinite, - height: media.width * 0.45, - padding: const EdgeInsets.symmetric( - vertical: 25, horizontal: 20), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(25), - boxShadow: const [ - BoxShadow(color: Colors.black12, blurRadius: 2) - ]), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - "Calories", - style: TextStyle( - color: TColor.black, - fontSize: 12, - fontWeight: FontWeight.w700), - ), - ShaderMask( - blendMode: BlendMode.srcIn, - shaderCallback: (bounds) { - return LinearGradient( - colors: TColor.primaryG, - begin: Alignment.centerLeft, - end: Alignment.centerRight) - .createShader(Rect.fromLTRB( - 0, 0, bounds.width, bounds.height)); - }, - child: Text( - "760 kCal", - style: TextStyle( - color: TColor.white.withOpacity(0.7), - fontWeight: FontWeight.w700, - fontSize: 14), - ), - ), - const Spacer(), - Container( - alignment: Alignment.center, - child: SizedBox( - width: media.width * 0.2, - height: media.width * 0.2, - child: Stack( - alignment: Alignment.center, - children: [ - Container( - width: media.width * 0.15, - height: media.width * 0.15, - alignment: Alignment.center, - decoration: BoxDecoration( - gradient: LinearGradient( - colors: TColor.primaryG), - borderRadius: BorderRadius.circular( - media.width * 0.075), - ), - child: FittedBox( - child: Text( - "230kCal\nrestantes", - textAlign: TextAlign.center, - style: TextStyle( - color: TColor.white, - fontSize: 11), - ), - ), - ), - SimpleCircularProgressBar( - progressStrokeWidth: 10, - backStrokeWidth: 10, - progressColors: TColor.primaryG, - backColor: Colors.grey.shade100, - valueNotifier: ValueNotifier(50), - startAngle: -180, - ), - ], - ), - ), - ) - ]), - ), - ], - )) - ], - ), - SizedBox( - height: media.width * 0.1, - ), + const LigneContainerStats("1", "2", "3", "s", "s", "s"), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - "graph 5", + "Rythme cardique et vitesse", style: TextStyle( color: TColor.black, fontSize: 16, fontWeight: FontWeight.w700), ), - Container( - height: 30, - padding: const EdgeInsets.symmetric(horizontal: 8), - decoration: BoxDecoration( - gradient: LinearGradient(colors: TColor.primaryG), - borderRadius: BorderRadius.circular(15), - ), - child: DropdownButtonHideUnderline( - child: DropdownButton( - items: ["Semaine", "Mois"] - .map((name) => DropdownMenuItem( - value: name, - child: Text( - name, - style: TextStyle( - color: TColor.gray, fontSize: 14), - ), - )) - .toList(), - onChanged: (value) {}, - icon: Icon(Icons.expand_more, color: TColor.white), - hint: Text( - "Semaine", - textAlign: TextAlign.center, - style: - TextStyle(color: TColor.white, fontSize: 12), - ), - ), - )), ], ), SizedBox( @@ -778,7 +382,7 @@ class _MobileHomeView extends State { List spotIndexes) { return spotIndexes.map((index) { return TouchedSpotIndicatorData( - FlLine( + const FlLine( color: Colors.transparent, ), FlDotData( @@ -801,7 +405,7 @@ class _MobileHomeView extends State { getTooltipItems: (List lineBarsSpot) { return lineBarsSpot.map((lineBarSpot) { return LineTooltipItem( - "il y a ${lineBarSpot.x.toInt()} minutes", + "Seconde ${lineBarSpot.x.toInt() / 10} ", const TextStyle( color: Colors.white, fontSize: 10, @@ -813,15 +417,13 @@ class _MobileHomeView extends State { ), ), lineBarsData: lineBarsData1, - minY: -0.5, + minY: 0, maxY: 110, titlesData: FlTitlesData( show: true, - leftTitles: AxisTitles(), - topTitles: AxisTitles(), - bottomTitles: AxisTitles( - sideTitles: bottomTitles, - ), + leftTitles: const AxisTitles(), + topTitles: const AxisTitles(), + bottomTitles: const AxisTitles(), rightTitles: AxisTitles( sideTitles: rightTitles, )), @@ -859,12 +461,6 @@ class _MobileHomeView extends State { ); } - void updateChartData(List newData) { - setState(() { - allSpots = newData; - }); - } - List showingSections() { return List.generate( 2, @@ -922,17 +518,9 @@ class _MobileHomeView extends State { ]), barWidth: 4, isStrokeCapRound: true, - dotData: FlDotData(show: false), + dotData: const FlDotData(show: false), belowBarData: BarAreaData(show: false), - spots: const [ - FlSpot(1, 35), - FlSpot(2, 70), - FlSpot(3, 40), - FlSpot(4, 80), - FlSpot(5, 25), - FlSpot(6, 70), - FlSpot(7, 35), - ], + spots: vitesseSecondes, ); LineChartBarData get lineChartBarData1_2 => LineChartBarData( @@ -943,19 +531,11 @@ class _MobileHomeView extends State { ]), barWidth: 2, isStrokeCapRound: true, - dotData: FlDotData(show: false), + dotData: const FlDotData(show: false), belowBarData: BarAreaData( show: false, ), - spots: const [ - FlSpot(1, 80), - FlSpot(2, 50), - FlSpot(3, 90), - FlSpot(4, 40), - FlSpot(5, 80), - FlSpot(6, 35), - FlSpot(7, 60), - ], + spots: bpmSecondes2, ); SideTitles get rightTitles => SideTitles( @@ -1000,7 +580,7 @@ class _MobileHomeView extends State { SideTitles get bottomTitles => SideTitles( showTitles: true, - reservedSize: 32, + reservedSize: 50, interval: 1, getTitlesWidget: bottomTitleWidgets, ); diff --git a/lib/view/ne_pas_supprimer/home_view.txt b/lib/view/ne_pas_supprimer/home_view.txt new file mode 100644 index 0000000..f89fb10 --- /dev/null +++ b/lib/view/ne_pas_supprimer/home_view.txt @@ -0,0 +1,1050 @@ +import 'package:dotted_dashed_line/dotted_dashed_line.dart'; +import 'package:fl_chart/fl_chart.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:simple_animation_progress_bar/simple_animation_progress_bar.dart'; +import 'package:simple_circular_progress_bar/simple_circular_progress_bar.dart'; +import 'package:smartfit_app_mobile/modele/user.dart'; +import 'package:smartfit_app_mobile/common/colo_extension.dart'; +import 'package:smartfit_app_mobile/common_widget/round_button.dart'; +import 'package:smartfit_app_mobile/view/home/activity_tracker.dart'; +import 'package:smartfit_app_mobile/view/home/notification_view.dart'; + +class MobileHomeView extends StatefulWidget { + const MobileHomeView({super.key}); + + @override + State createState() => _MobileHomeView(); +} + +class _MobileHomeView extends State { + List bpmSecondes = [FlSpot(0, 30)]; + List bpmSecondes2 = []; + double calories = 0.0; + List vitesseSecondes = [FlSpot(0, 30)]; + List altitudeSecondes = [FlSpot(0, 30)]; + + TextEditingController bpmController = TextEditingController(); + + void normaliserDeuxiemeElement(List liste) { + // Trouver le plus grand élément dans la liste + double maxElement = 0.0; + for (var spot in liste) { + if (spot.y > maxElement) { + maxElement = spot.y; + } + } + + // Calculer le facteur de normalisation + double normalisationFactor = maxElement != 0.0 ? 100 / maxElement : 1.0; + + // Mettre à jour tous les éléments de la liste + for (int i = 0; i < liste.length; i++) { + liste[i] = FlSpot(liste[i].x, liste[i].y * normalisationFactor); + } + } + + List lastWorkoutArr = [ + { + "name": "Full Body Workout", + "image": "assets/img/Workout1.png", + "kcal": "180", + "time": "20", + "progress": 0.3 + }, + { + "name": "Lower Body Workout", + "image": "assets/img/Workout2.png", + "kcal": "200", + "time": "30", + "progress": 0.4 + }, + { + "name": "Ab Workout", + "image": "assets/img/Workout3.png", + "kcal": "300", + "time": "40", + "progress": 0.7 + }, + ]; + List showingTooltipOnSpots = [0]; + + List waterArr = [ + {"title": "6am - 8am", "subtitle": "600ml"}, + {"title": "9am - 11am", "subtitle": "500ml"}, + {"title": "11am - 2pm", "subtitle": "1000ml"}, + {"title": "2pm - 4pm", "subtitle": "700ml"}, + {"title": "4pm - now", "subtitle": "900ml"}, + ]; + + @override + Widget build(BuildContext context) { + var media = MediaQuery.of(context).size; + + bpmSecondes = + Provider.of(context).listActivity[0].getHeartRateWithTime(); + vitesseSecondes = + Provider.of(context).listActivity[0].getSpeedWithTime(); + altitudeSecondes = + Provider.of(context).listActivity[0].getAltitudeWithTime(); + calories = double.parse( + Provider.of(context).listActivity[0].getTotalCalorie()); + + normaliserDeuxiemeElement(vitesseSecondes); + normaliserDeuxiemeElement(altitudeSecondes); + //bpmSecondes2 = List.from(bpmSecondes); + normaliserDeuxiemeElement(bpmSecondes); + + final lineBarsData = [ + LineChartBarData( + spots: bpmSecondes, + isCurved: false, + barWidth: 2, + belowBarData: BarAreaData( + show: true, + gradient: LinearGradient(colors: [ + TColor.secondaryColor1.withOpacity(0.4), + TColor.secondaryColor2.withOpacity(0.1), + ], begin: Alignment.topCenter, end: Alignment.bottomCenter), + ), + dotData: FlDotData(show: false), + gradient: LinearGradient( + colors: TColor.secondaryG, + ), + ), + ]; + print("test5"); + + final tooltipsOnBar = lineBarsData[0]; + + return Scaffold( + backgroundColor: TColor.white, + body: SingleChildScrollView( + child: SafeArea( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 15), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Bienvenue,", + style: TextStyle(color: TColor.gray, fontSize: 12), + ), + Text( + "Benjelloun Othmane", + style: TextStyle( + color: TColor.black, + fontSize: 20, + fontWeight: FontWeight.w700), + ), + ], + ), + IconButton( + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const NotificationView(), + ), + ); + }, + icon: Image.asset( + "assets/img/notification_active.png", + width: 25, + height: 25, + fit: BoxFit.fitHeight, + )) + ], + ), + SizedBox( + height: media.width * 0.05, + ), + Container( + height: media.width * 0.4, + decoration: BoxDecoration( + gradient: LinearGradient(colors: TColor.primaryG), + borderRadius: BorderRadius.circular(media.width * 0.075)), + child: Stack(alignment: Alignment.center, children: [ + Image.asset( + "assets/img/bg_dots.png", + height: media.width * 0.4, + width: double.maxFinite, + fit: BoxFit.fitHeight, + ), + Padding( + padding: const EdgeInsets.symmetric( + vertical: 25, horizontal: 25), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Graph 1", + style: TextStyle( + color: TColor.white, + fontSize: 14, + fontWeight: FontWeight.w700), + ), + Text( + "Sous titre 1", + style: TextStyle( + color: TColor.white.withOpacity(0.7), + fontSize: 12), + ), + SizedBox( + height: media.width * 0.05, + ), + SizedBox( + width: 120, + height: 35, + child: RoundButton( + title: "Voir plus", + type: RoundButtonType.bgSGradient, + fontSize: 12, + fontWeight: FontWeight.w400, + onPressed: () {})) + ], + ), + AspectRatio( + aspectRatio: 1, + child: PieChart( + PieChartData( + pieTouchData: PieTouchData( + touchCallback: + (FlTouchEvent event, pieTouchResponse) {}, + ), + startDegreeOffset: 250, + borderData: FlBorderData( + show: false, + ), + sectionsSpace: 1, + centerSpaceRadius: 0, + sections: showingSections(), + ), + ), + ), + ], + ), + ) + ]), + ), + SizedBox( + height: media.width * 0.05, + ), + Container( + padding: + const EdgeInsets.symmetric(vertical: 15, horizontal: 15), + decoration: BoxDecoration( + color: TColor.primaryColor2.withOpacity(0.3), + borderRadius: BorderRadius.circular(15), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "Suivi d'activité", + style: TextStyle( + color: TColor.black, + fontSize: 14, + fontWeight: FontWeight.w700), + ), + SizedBox( + width: 70, + height: 25, + child: RoundButton( + title: "Voir", + type: RoundButtonType.bgGradient, + fontSize: 12, + fontWeight: FontWeight.w400, + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + const ActivityTrackerView(), + ), + ); + }, + ), + ) + ], + ), + ), + SizedBox( + height: media.width * 0.05, + ), + Text( + "Status d'activité", + style: TextStyle( + color: TColor.black, + fontSize: 16, + fontWeight: FontWeight.w700), + ), + SizedBox( + height: media.width * 0.02, + ), + ClipRRect( + borderRadius: BorderRadius.circular(25), + child: Container( + height: media.width * 0.4, + width: double.maxFinite, + decoration: BoxDecoration( + color: TColor.primaryColor2.withOpacity(0.3), + borderRadius: BorderRadius.circular(25), + ), + child: Stack( + alignment: Alignment.topLeft, + children: [ + Padding( + padding: const EdgeInsets.symmetric( + vertical: 20, horizontal: 20), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Rythme cardiaque", + style: TextStyle( + color: TColor.black, + fontSize: 16, + fontWeight: FontWeight.w700), + ), + TextField( + controller: bpmController, + readOnly: true, + style: TextStyle( + color: + TColor.primaryColor1.withOpacity(0.8), + fontWeight: FontWeight.w700, + fontSize: 18), + decoration: InputDecoration( + border: InputBorder + .none, // Ajoutez cette ligne pour supprimer la bordure + ), + ), + ], + ), + ), + LineChart( + LineChartData( + showingTooltipIndicators: + showingTooltipOnSpots.map((index) { + return ShowingTooltipIndicators([ + LineBarSpot( + tooltipsOnBar, + lineBarsData.indexOf(tooltipsOnBar), + tooltipsOnBar.spots[index], + ), + ]); + }).toList(), + lineTouchData: LineTouchData( + enabled: true, + handleBuiltInTouches: false, + touchCallback: (FlTouchEvent event, + LineTouchResponse? response) { + if (response == null || + response.lineBarSpots == null) { + return; + } + if (event is FlTapUpEvent) { + final spotIndex = + response.lineBarSpots!.first.spotIndex; + showingTooltipOnSpots.clear(); + setState(() { + showingTooltipOnSpots.add(spotIndex); + }); + } + }, + mouseCursorResolver: (FlTouchEvent event, + LineTouchResponse? response) { + if (response == null || + response.lineBarSpots == null) { + return SystemMouseCursors.basic; + } + return SystemMouseCursors.click; + }, + getTouchedSpotIndicator: + (LineChartBarData barData, + List spotIndexes) { + return spotIndexes.map((index) { + return TouchedSpotIndicatorData( + FlLine( + color: TColor.secondaryColor1, + ), + FlDotData( + show: true, + getDotPainter: + (spot, percent, barData, index) => + FlDotCirclePainter( + radius: 3, + color: Colors.white, + strokeWidth: 3, + strokeColor: TColor.secondaryColor1, + ), + ), + ); + }).toList(); + }, + touchTooltipData: LineTouchTooltipData( + tooltipBgColor: TColor.secondaryColor1, + tooltipRoundedRadius: 20, + getTooltipItems: + (List lineBarsSpot) { + return lineBarsSpot.map((lineBarSpot) { + bpmController.text = "${lineBarSpot.y} BPM"; + return LineTooltipItem( + "Seconde ${lineBarSpot.x.toInt() / 10}", + TextStyle( + color: Colors.white, + fontSize: 10, + fontWeight: FontWeight.bold, + ), + ); + }).toList(); + }, + ), + ), + lineBarsData: lineBarsData, + minY: 50, + maxY: 250, + titlesData: FlTitlesData( + show: false, + ), + gridData: FlGridData(show: false), + borderData: FlBorderData( + show: true, + border: Border.all( + color: Colors.transparent, + ), + ), + ), + ) + ], + ), + ), + ), + SizedBox( + height: media.width * 0.05, + ), + Row( + children: [ + Expanded( + child: Container( + height: media.width * 0.95, + padding: const EdgeInsets.symmetric( + vertical: 25, horizontal: 20), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(25), + boxShadow: const [ + BoxShadow(color: Colors.black12, blurRadius: 2) + ]), + child: Row( + children: [ + SimpleAnimationProgressBar( + height: media.width * 0.85, + width: media.width * 0.07, + backgroundColor: Colors.grey.shade100, + foregrondColor: Colors.purple, + ratio: 0.5, + direction: Axis.vertical, + curve: Curves.fastLinearToSlowEaseIn, + duration: const Duration(seconds: 3), + borderRadius: BorderRadius.circular(15), + gradientColor: LinearGradient( + colors: TColor.primaryG, + begin: Alignment.bottomCenter, + end: Alignment.topCenter), + ), + const SizedBox( + width: 10, + ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Graph 3", + style: TextStyle( + color: TColor.black, + fontSize: 12, + fontWeight: FontWeight.w700), + ), + ShaderMask( + blendMode: BlendMode.srcIn, + shaderCallback: (bounds) { + return LinearGradient( + colors: TColor.primaryG, + begin: Alignment.centerLeft, + end: Alignment.centerRight) + .createShader(Rect.fromLTRB( + 0, 0, bounds.width, bounds.height)); + }, + child: Text( + "ex : objectif", + style: TextStyle( + color: TColor.white.withOpacity(0.7), + fontWeight: FontWeight.w700, + fontSize: 14), + ), + ), + const SizedBox( + height: 10, + ), + Text( + "Mis à jour en temps réel", + style: TextStyle( + color: TColor.gray, + fontSize: 12, + ), + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: waterArr.map((wObj) { + var isLast = wObj == waterArr.last; + return Row( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Column( + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.center, + children: [ + Container( + margin: + const EdgeInsets.symmetric( + vertical: 4), + width: 10, + height: 10, + decoration: BoxDecoration( + color: TColor.secondaryColor1 + .withOpacity(0.5), + borderRadius: + BorderRadius.circular(5), + ), + ), + if (!isLast) + DottedDashedLine( + height: media.width * 0.078, + width: 0, + dashColor: TColor + .secondaryColor1 + .withOpacity(0.5), + axis: Axis.vertical) + ], + ), + const SizedBox( + width: 10, + ), + Column( + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Text( + wObj["title"].toString(), + style: TextStyle( + color: TColor.gray, + fontSize: 10, + ), + ), + ShaderMask( + blendMode: BlendMode.srcIn, + shaderCallback: (bounds) { + return LinearGradient( + colors: + TColor.secondaryG, + begin: Alignment + .centerLeft, + end: Alignment + .centerRight) + .createShader(Rect.fromLTRB( + 0, + 0, + bounds.width, + bounds.height)); + }, + child: Text( + wObj["subtitle"].toString(), + style: TextStyle( + color: TColor.white + .withOpacity(0.7), + fontSize: 12), + ), + ), + ], + ) + ], + ); + }).toList(), + ) + ], + )) + ], + ), + ), + ), + SizedBox( + width: media.width * 0.05, + ), + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Container( + width: double.maxFinite, + height: media.width * 0.45, + padding: const EdgeInsets.symmetric( + vertical: 25, horizontal: 20), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(25), + boxShadow: const [ + BoxShadow(color: Colors.black12, blurRadius: 2) + ]), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Graph 4", + style: TextStyle( + color: TColor.black, + fontSize: 12, + fontWeight: FontWeight.w700), + ), + ShaderMask( + blendMode: BlendMode.srcIn, + shaderCallback: (bounds) { + return LinearGradient( + colors: TColor.primaryG, + begin: Alignment.centerLeft, + end: Alignment.centerRight) + .createShader(Rect.fromLTRB( + 0, 0, bounds.width, bounds.height)); + }, + child: Text( + "durée", + style: TextStyle( + color: TColor.white.withOpacity(0.7), + fontWeight: FontWeight.w700, + fontSize: 14), + ), + ), + const Spacer(), + Image.asset("assets/img/sleep_graph.png", + width: double.maxFinite, + height: 80, + fit: BoxFit.fitWidth) + ]), + ), + SizedBox( + height: media.width * 0.05, + ), + Container( + width: double.maxFinite, + height: media.width * 0.45, + padding: const EdgeInsets.symmetric( + vertical: 25, horizontal: 20), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(25), + boxShadow: const [ + BoxShadow(color: Colors.black12, blurRadius: 2) + ]), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Calories", + style: TextStyle( + color: TColor.black, + fontSize: 12, + fontWeight: FontWeight.w700), + ), + ShaderMask( + blendMode: BlendMode.srcIn, + shaderCallback: (bounds) { + return LinearGradient( + colors: TColor.primaryG, + begin: Alignment.centerLeft, + end: Alignment.centerRight) + .createShader(Rect.fromLTRB( + 0, 0, bounds.width, bounds.height)); + }, + child: Text( + '${calories.toString()} kCal', + style: TextStyle( + color: TColor.white.withOpacity(0.7), + fontWeight: FontWeight.w700, + fontSize: 14), + ), + ), + const Spacer(), + Container( + alignment: Alignment.center, + child: SizedBox( + width: media.width * 0.2, + height: media.width * 0.2, + child: Stack( + alignment: Alignment.center, + children: [ + Container( + width: media.width * 0.15, + height: media.width * 0.15, + alignment: Alignment.center, + decoration: BoxDecoration( + gradient: LinearGradient( + colors: TColor.primaryG), + borderRadius: BorderRadius.circular( + media.width * 0.075), + ), + child: FittedBox( + child: Text( + '${200 - calories.toInt()} kCal\n restantes', + textAlign: TextAlign.center, + style: TextStyle( + color: TColor.white, + fontSize: 11), + ), + ), + ), + SimpleCircularProgressBar( + progressStrokeWidth: 10, + backStrokeWidth: 10, + progressColors: TColor.primaryG, + backColor: Colors.grey.shade100, + valueNotifier: ValueNotifier( + calories / 200 * 100), + startAngle: -180, + ), + ], + ), + ), + ) + ]), + ), + ], + )) + ], + ), + SizedBox( + height: media.width * 0.1, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "Rythme cardique et vitesse", + style: TextStyle( + color: TColor.black, + fontSize: 16, + fontWeight: FontWeight.w700), + ), + ], + ), + SizedBox( + height: media.width * 0.05, + ), + Container( + padding: const EdgeInsets.only(left: 15), + height: media.width * 0.5, + width: double.maxFinite, + child: LineChart( + LineChartData( + showingTooltipIndicators: + showingTooltipOnSpots.map((index) { + return ShowingTooltipIndicators([ + LineBarSpot( + tooltipsOnBar, + lineBarsData.indexOf(tooltipsOnBar), + tooltipsOnBar.spots[index], + ), + ]); + }).toList(), + lineTouchData: LineTouchData( + enabled: true, + handleBuiltInTouches: false, + touchCallback: (FlTouchEvent event, + LineTouchResponse? response) { + if (response == null || + response.lineBarSpots == null) { + return; + } + if (event is FlTapUpEvent) { + final spotIndex = + response.lineBarSpots!.first.spotIndex; + showingTooltipOnSpots.clear(); + setState(() { + showingTooltipOnSpots.add(spotIndex); + }); + } + }, + mouseCursorResolver: (FlTouchEvent event, + LineTouchResponse? response) { + if (response == null || + response.lineBarSpots == null) { + return SystemMouseCursors.basic; + } + return SystemMouseCursors.click; + }, + getTouchedSpotIndicator: (LineChartBarData barData, + List spotIndexes) { + return spotIndexes.map((index) { + return TouchedSpotIndicatorData( + FlLine( + color: Colors.transparent, + ), + FlDotData( + show: true, + getDotPainter: + (spot, percent, barData, index) => + FlDotCirclePainter( + radius: 3, + color: Colors.white, + strokeWidth: 3, + strokeColor: TColor.secondaryColor1, + ), + ), + ); + }).toList(); + }, + touchTooltipData: LineTouchTooltipData( + tooltipBgColor: TColor.secondaryColor1, + tooltipRoundedRadius: 20, + getTooltipItems: (List lineBarsSpot) { + return lineBarsSpot.map((lineBarSpot) { + return LineTooltipItem( + "Seconde ${lineBarSpot.x.toInt() / 10} ", + const TextStyle( + color: Colors.white, + fontSize: 10, + fontWeight: FontWeight.bold, + ), + ); + }).toList(); + }, + ), + ), + lineBarsData: lineBarsData1, + minY: 0, + maxY: 110, + titlesData: FlTitlesData( + show: true, + leftTitles: AxisTitles(), + topTitles: AxisTitles(), + bottomTitles: AxisTitles(), + rightTitles: AxisTitles( + sideTitles: rightTitles, + )), + gridData: FlGridData( + show: true, + drawHorizontalLine: true, + horizontalInterval: 25, + drawVerticalLine: false, + getDrawingHorizontalLine: (value) { + return FlLine( + color: TColor.gray.withOpacity(0.15), + strokeWidth: 2, + ); + }, + ), + borderData: FlBorderData( + show: true, + border: Border.all( + color: Colors.transparent, + ), + ), + ), + )), + SizedBox( + height: media.width * 0.05, + ), + SizedBox( + height: media.width * 0.1, + ), + ], + ), + ), + ), + ), + ); + } + + List showingSections() { + return List.generate( + 2, + (i) { + var color0 = TColor.secondaryColor1; + + switch (i) { + case 0: + return PieChartSectionData( + color: color0, + value: 33, + title: '', + radius: 55, + titlePositionPercentageOffset: 0.55, + badgeWidget: const Text( + "20,1", + style: TextStyle( + color: Colors.white, + fontSize: 12, + fontWeight: FontWeight.w700), + )); + case 1: + return PieChartSectionData( + color: Colors.white, + value: 75, + title: '', + radius: 45, + titlePositionPercentageOffset: 0.55, + ); + + default: + throw Error(); + } + }, + ); + } + + LineTouchData get lineTouchData1 => LineTouchData( + handleBuiltInTouches: true, + touchTooltipData: LineTouchTooltipData( + tooltipBgColor: Colors.blueGrey.withOpacity(0.8), + ), + ); + + List get lineBarsData1 => [ + lineChartBarData1_1, + lineChartBarData1_2, + ]; + + LineChartBarData get lineChartBarData1_1 => LineChartBarData( + isCurved: true, + gradient: LinearGradient(colors: [ + TColor.primaryColor2.withOpacity(0.5), + TColor.primaryColor1.withOpacity(0.5), + ]), + barWidth: 4, + isStrokeCapRound: true, + dotData: FlDotData(show: false), + belowBarData: BarAreaData(show: false), + spots: vitesseSecondes, + ); + + LineChartBarData get lineChartBarData1_2 => LineChartBarData( + isCurved: true, + gradient: LinearGradient(colors: [ + TColor.secondaryColor2.withOpacity(0.5), + TColor.secondaryColor1.withOpacity(0.5), + ]), + barWidth: 2, + isStrokeCapRound: true, + dotData: FlDotData(show: false), + belowBarData: BarAreaData( + show: false, + ), + spots: bpmSecondes2, + ); + + SideTitles get rightTitles => SideTitles( + getTitlesWidget: rightTitleWidgets, + showTitles: true, + interval: 20, + reservedSize: 40, + ); + + Widget rightTitleWidgets(double value, TitleMeta meta) { + String text; + switch (value.toInt()) { + case 0: + text = '0%'; + break; + case 20: + text = '20%'; + break; + case 40: + text = '40%'; + break; + case 60: + text = '60%'; + break; + case 80: + text = '80%'; + break; + case 100: + text = '100%'; + break; + default: + return Container(); + } + + return Text(text, + style: TextStyle( + color: TColor.gray, + fontSize: 12, + ), + textAlign: TextAlign.center); + } + + SideTitles get bottomTitles => SideTitles( + showTitles: true, + reservedSize: 50, + interval: 1, + getTitlesWidget: bottomTitleWidgets, + ); + + Widget bottomTitleWidgets(double value, TitleMeta meta) { + var style = TextStyle( + color: TColor.gray, + fontSize: 12, + ); + Widget text; + switch (value.toInt()) { + case 1: + text = Text('Dim', style: style); + break; + case 2: + text = Text('Lun', style: style); + break; + case 3: + text = Text('Mar', style: style); + break; + case 4: + text = Text('Mer', style: style); + break; + case 5: + text = Text('Jeu', style: style); + break; + case 6: + text = Text('Ven', style: style); + break; + case 7: + text = Text('Sam', style: style); + break; + default: + text = Text('', style: style); + break; + } + + return SideTitleWidget( + axisSide: meta.axisSide, + space: 10, + child: text, + ); + } +} From b51b991f3fc554345d01ac8e2fab8c9de82a9e7a Mon Sep 17 00:00:00 2001 From: Enzo Date: Thu, 16 Nov 2023 11:38:12 +0100 Subject: [PATCH 03/11] change activity --- lib/view/{home => activity}/mobile/mobile_Activity_view.dart | 0 lib/view/{home => activity}/web/web_Activity_view.dart | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename lib/view/{home => activity}/mobile/mobile_Activity_view.dart (100%) rename lib/view/{home => activity}/web/web_Activity_view.dart (100%) diff --git a/lib/view/home/mobile/mobile_Activity_view.dart b/lib/view/activity/mobile/mobile_Activity_view.dart similarity index 100% rename from lib/view/home/mobile/mobile_Activity_view.dart rename to lib/view/activity/mobile/mobile_Activity_view.dart diff --git a/lib/view/home/web/web_Activity_view.dart b/lib/view/activity/web/web_Activity_view.dart similarity index 100% rename from lib/view/home/web/web_Activity_view.dart rename to lib/view/activity/web/web_Activity_view.dart From d8f94a41c91799cd3ee605fec6fe6b3a20987224 Mon Sep 17 00:00:00 2001 From: Enzo Date: Thu, 16 Nov 2023 16:24:01 +0100 Subject: [PATCH 04/11] Gros nettoyage --- .../{ => button}/round_button.dart | 2 +- .../{ => button}/tab_button.dart | 0 .../{ => container}/container_stats.dart | 0 .../ligne_container_stats.dart | 2 +- .../{ => container}/workout_row.dart | 0 .../graph/bpm_and_speed_by_time.dart | 223 +++++++ lib/common_widget/graph/bpm_by_time.dart | 213 +++++++ lib/common_widget/{ => graph}/graph.dart | 0 lib/common_widget/{ => not_use}/dates.dart | 6 +- lib/common_widget/{ => not_use}/helpers.dart | 0 .../{ => not_use}/latest_activity_row.dart | 0 .../{ => not_use}/notification_row.dart | 0 .../{ => on_boarding}/on_boarding_page.dart | 11 +- lib/common_widget/other/entete_home_view.dart | 47 ++ .../{ => text_field}/round_text_field.dart | 2 +- lib/main.dart | 1 - lib/modele/activity.dart | 2 +- lib/modele/user.dart | 1 - .../utile/home_view/data_home_view.dart | 13 + .../utile/home_view/home_view_util.dart | 37 ++ lib/view/activity/activity.dart | 4 +- .../activity/mobile/mobile_Activity_view.dart | 2 +- .../activity/mobile/mobile_list_activity.dart | 2 +- lib/view/activity/web/web_Activity_view.dart | 2 +- lib/view/activity/web/web_list_activity.dart | 2 +- lib/view/home/mobile/mobile_homeview.dart | 571 +----------------- lib/view/home/notification_view.dart | 59 +- lib/view/home/web/web_homeview.dart | 2 +- lib/view/login/mobile/android_login_view.dart | 4 +- .../login/mobile/android_signup_view.dart | 4 +- lib/view/login/web/web_login_view.dart | 4 +- lib/view/login/web/web_signup_view.dart | 4 +- lib/view/main_tab/main_tab_view.dart | 2 +- lib/view/on_boarding/on_boarding_view.dart | 2 +- lib/view/on_boarding/started_view.dart | 2 +- .../profile/mobile/mobile_profile_view.dart | 2 +- lib/view/profile/web/web_profile_view.dart | 2 +- 37 files changed, 624 insertions(+), 606 deletions(-) rename lib/common_widget/{ => button}/round_button.dart (98%) rename lib/common_widget/{ => button}/tab_button.dart (100%) rename lib/common_widget/{ => container}/container_stats.dart (100%) rename lib/common_widget/{ => container}/ligne_container_stats.dart (90%) rename lib/common_widget/{ => container}/workout_row.dart (100%) create mode 100644 lib/common_widget/graph/bpm_and_speed_by_time.dart create mode 100644 lib/common_widget/graph/bpm_by_time.dart rename lib/common_widget/{ => graph}/graph.dart (100%) rename lib/common_widget/{ => not_use}/dates.dart (94%) rename lib/common_widget/{ => not_use}/helpers.dart (100%) rename lib/common_widget/{ => not_use}/latest_activity_row.dart (100%) rename lib/common_widget/{ => not_use}/notification_row.dart (100%) rename lib/common_widget/{ => on_boarding}/on_boarding_page.dart (91%) create mode 100644 lib/common_widget/other/entete_home_view.dart rename lib/common_widget/{ => text_field}/round_text_field.dart (97%) create mode 100644 lib/modele/utile/home_view/data_home_view.dart create mode 100644 lib/modele/utile/home_view/home_view_util.dart diff --git a/lib/common_widget/round_button.dart b/lib/common_widget/button/round_button.dart similarity index 98% rename from lib/common_widget/round_button.dart rename to lib/common_widget/button/round_button.dart index d243c38..23fc278 100644 --- a/lib/common_widget/round_button.dart +++ b/lib/common_widget/button/round_button.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import '../common/colo_extension.dart'; +import '../../common/colo_extension.dart'; enum RoundButtonType { bgGradient, bgSGradient, textGradient } diff --git a/lib/common_widget/tab_button.dart b/lib/common_widget/button/tab_button.dart similarity index 100% rename from lib/common_widget/tab_button.dart rename to lib/common_widget/button/tab_button.dart diff --git a/lib/common_widget/container_stats.dart b/lib/common_widget/container/container_stats.dart similarity index 100% rename from lib/common_widget/container_stats.dart rename to lib/common_widget/container/container_stats.dart diff --git a/lib/common_widget/ligne_container_stats.dart b/lib/common_widget/container/ligne_container_stats.dart similarity index 90% rename from lib/common_widget/ligne_container_stats.dart rename to lib/common_widget/container/ligne_container_stats.dart index 3530c38..359272d 100644 --- a/lib/common_widget/ligne_container_stats.dart +++ b/lib/common_widget/container/ligne_container_stats.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:smartfit_app_mobile/common_widget/container_stats.dart'; +import 'package:smartfit_app_mobile/common_widget/container/container_stats.dart'; class LigneContainerStats extends StatelessWidget { const LigneContainerStats(this.value1, this.value2, this.value3, diff --git a/lib/common_widget/workout_row.dart b/lib/common_widget/container/workout_row.dart similarity index 100% rename from lib/common_widget/workout_row.dart rename to lib/common_widget/container/workout_row.dart diff --git a/lib/common_widget/graph/bpm_and_speed_by_time.dart b/lib/common_widget/graph/bpm_and_speed_by_time.dart new file mode 100644 index 0000000..0c9dc00 --- /dev/null +++ b/lib/common_widget/graph/bpm_and_speed_by_time.dart @@ -0,0 +1,223 @@ +import 'package:fl_chart/fl_chart.dart'; +import 'package:flutter/material.dart'; +import 'package:smartfit_app_mobile/common/colo_extension.dart'; +import 'package:smartfit_app_mobile/modele/utile/home_view/data_home_view.dart'; + +class GraphBpmAndSpeedByTime extends StatefulWidget { + final Size media; + final DataHomeView data; + + const GraphBpmAndSpeedByTime(this.media, this.data, {Key? key}) + : super(key: key); + + @override + State createState() => _GraphBpmAndSpeedByTime(); +} + +class _GraphBpmAndSpeedByTime extends State { + TextEditingController bpmController = TextEditingController(); + + List showingTooltipOnSpots = [0]; + + SideTitles get rightTitles => SideTitles( + getTitlesWidget: rightTitleWidgets, + showTitles: true, + interval: 20, + reservedSize: 40, + ); + + Widget rightTitleWidgets(double value, TitleMeta meta) { + String text; + switch (value.toInt()) { + case 0: + text = '0%'; + break; + case 20: + text = '20%'; + break; + case 40: + text = '40%'; + break; + case 60: + text = '60%'; + break; + case 80: + text = '80%'; + break; + case 100: + text = '100%'; + break; + default: + return Container(); + } + + return Text(text, + style: TextStyle( + color: TColor.gray, + fontSize: 12, + ), + textAlign: TextAlign.center); + } + + List get lineBarsData1 => [ + lineChartBarData1_1, + lineChartBarData1_2, + ]; + + LineChartBarData get lineChartBarData1_1 => LineChartBarData( + isCurved: true, + gradient: LinearGradient(colors: [ + TColor.primaryColor2.withOpacity(0.5), + TColor.primaryColor1.withOpacity(0.5), + ]), + barWidth: 4, + isStrokeCapRound: true, + dotData: const FlDotData(show: false), + belowBarData: BarAreaData(show: false), + spots: widget.data.vitesseSecondes, + ); + + LineChartBarData get lineChartBarData1_2 => LineChartBarData( + isCurved: true, + gradient: LinearGradient(colors: [ + TColor.secondaryColor2.withOpacity(0.5), + TColor.secondaryColor1.withOpacity(0.5), + ]), + barWidth: 2, + isStrokeCapRound: true, + dotData: const FlDotData(show: false), + belowBarData: BarAreaData( + show: false, + ), + spots: widget.data.bpmSecondes2, + ); + + @override + Widget build(BuildContext context) { + final lineBarsData = [ + LineChartBarData( + spots: widget.data.bpmSecondes, + isCurved: false, + barWidth: 2, + belowBarData: BarAreaData( + show: true, + gradient: LinearGradient(colors: [ + TColor.secondaryColor1.withOpacity(0.4), + TColor.secondaryColor2.withOpacity(0.1), + ], begin: Alignment.topCenter, end: Alignment.bottomCenter), + ), + dotData: const FlDotData(show: false), + gradient: LinearGradient( + colors: TColor.secondaryG, + ), + ), + ]; + final tooltipsOnBar = lineBarsData[0]; + + return Container( + padding: const EdgeInsets.only(left: 15), + height: widget.media.width * 0.5, + width: double.maxFinite, + child: LineChart( + LineChartData( + showingTooltipIndicators: showingTooltipOnSpots.map((index) { + return ShowingTooltipIndicators([ + LineBarSpot( + tooltipsOnBar, + lineBarsData.indexOf(tooltipsOnBar), + tooltipsOnBar.spots[index], + ), + ]); + }).toList(), + lineTouchData: LineTouchData( + enabled: true, + handleBuiltInTouches: false, + touchCallback: (FlTouchEvent event, LineTouchResponse? response) { + if (response == null || response.lineBarSpots == null) { + return; + } + if (event is FlTapUpEvent) { + final spotIndex = response.lineBarSpots!.first.spotIndex; + showingTooltipOnSpots.clear(); + setState(() { + showingTooltipOnSpots.add(spotIndex); + }); + } + }, + mouseCursorResolver: + (FlTouchEvent event, LineTouchResponse? response) { + if (response == null || response.lineBarSpots == null) { + return SystemMouseCursors.basic; + } + return SystemMouseCursors.click; + }, + getTouchedSpotIndicator: + (LineChartBarData barData, List spotIndexes) { + return spotIndexes.map((index) { + return TouchedSpotIndicatorData( + const FlLine( + color: Colors.transparent, + ), + FlDotData( + show: true, + getDotPainter: (spot, percent, barData, index) => + FlDotCirclePainter( + radius: 3, + color: Colors.white, + strokeWidth: 3, + strokeColor: TColor.secondaryColor1, + ), + ), + ); + }).toList(); + }, + touchTooltipData: LineTouchTooltipData( + tooltipBgColor: TColor.secondaryColor1, + tooltipRoundedRadius: 20, + getTooltipItems: (List lineBarsSpot) { + return lineBarsSpot.map((lineBarSpot) { + return LineTooltipItem( + "Seconde ${lineBarSpot.x.toInt() / 10} ", + const TextStyle( + color: Colors.white, + fontSize: 10, + fontWeight: FontWeight.bold, + ), + ); + }).toList(); + }, + ), + ), + lineBarsData: lineBarsData1, + minY: 0, + maxY: 110, + titlesData: FlTitlesData( + show: true, + leftTitles: const AxisTitles(), + topTitles: const AxisTitles(), + bottomTitles: const AxisTitles(), + rightTitles: AxisTitles( + sideTitles: rightTitles, + )), + gridData: FlGridData( + show: true, + drawHorizontalLine: true, + horizontalInterval: 25, + drawVerticalLine: false, + getDrawingHorizontalLine: (value) { + return FlLine( + color: TColor.gray.withOpacity(0.15), + strokeWidth: 2, + ); + }, + ), + borderData: FlBorderData( + show: true, + border: Border.all( + color: Colors.transparent, + ), + ), + ), + )); + } +} diff --git a/lib/common_widget/graph/bpm_by_time.dart b/lib/common_widget/graph/bpm_by_time.dart new file mode 100644 index 0000000..aaa580c --- /dev/null +++ b/lib/common_widget/graph/bpm_by_time.dart @@ -0,0 +1,213 @@ +import 'package:fl_chart/fl_chart.dart'; +import 'package:flutter/material.dart'; +import 'package:smartfit_app_mobile/common/colo_extension.dart'; +import 'package:smartfit_app_mobile/modele/utile/home_view/data_home_view.dart'; + +class GraphBpmByTime extends StatefulWidget { + final Size media; + final DataHomeView data; + + const GraphBpmByTime(this.media, this.data, {Key? key}) : super(key: key); + + @override + State createState() => _GraphBpmByTime(); +} + +class _GraphBpmByTime extends State { + TextEditingController bpmController = TextEditingController(); + + // Il faut chercher à le suprimer + List showingTooltipOnSpots = [0]; + + List get lineBarsData1 => [ + lineChartBarData1_1, + lineChartBarData1_2, + ]; + + LineChartBarData get lineChartBarData1_1 => LineChartBarData( + isCurved: true, + gradient: LinearGradient(colors: [ + TColor.primaryColor2.withOpacity(0.5), + TColor.primaryColor1.withOpacity(0.5), + ]), + barWidth: 4, + isStrokeCapRound: true, + dotData: const FlDotData(show: false), + belowBarData: BarAreaData(show: false), + spots: widget.data.vitesseSecondes, + ); + + LineChartBarData get lineChartBarData1_2 => LineChartBarData( + isCurved: true, + gradient: LinearGradient(colors: [ + TColor.secondaryColor2.withOpacity(0.5), + TColor.secondaryColor1.withOpacity(0.5), + ]), + barWidth: 2, + isStrokeCapRound: true, + dotData: const FlDotData(show: false), + belowBarData: BarAreaData( + show: false, + ), + spots: widget.data.bpmSecondes2, + ); + + @override + Widget build(BuildContext context) { + Size media = MediaQuery.of(context).size; + + final lineBarsData = [ + LineChartBarData( + spots: widget.data.bpmSecondes, + isCurved: false, + barWidth: 2, + belowBarData: BarAreaData( + show: true, + gradient: LinearGradient(colors: [ + TColor.secondaryColor1.withOpacity(0.4), + TColor.secondaryColor2.withOpacity(0.1), + ], begin: Alignment.topCenter, end: Alignment.bottomCenter), + ), + dotData: const FlDotData(show: false), + gradient: LinearGradient( + colors: TColor.secondaryG, + ), + ), + ]; + + final tooltipsOnBar = lineBarsData[0]; + + return ClipRRect( + borderRadius: BorderRadius.circular(25), + child: Container( + height: media.width * 0.4, + width: double.maxFinite, + decoration: BoxDecoration( + color: TColor.primaryColor2.withOpacity(0.3), + borderRadius: BorderRadius.circular(25), + ), + child: Stack( + alignment: Alignment.topLeft, + children: [ + Padding( + padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 20), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Rythme cardiaque", + style: TextStyle( + color: TColor.black, + fontSize: 16, + fontWeight: FontWeight.w700), + ), + TextField( + controller: bpmController, + readOnly: true, + style: TextStyle( + color: TColor.primaryColor1.withOpacity(0.8), + fontWeight: FontWeight.w700, + fontSize: 18), + decoration: const InputDecoration( + border: InputBorder + .none, // Ajoutez cette ligne pour supprimer la bordure + ), + ), + ], + ), + ), + LineChart( + LineChartData( + showingTooltipIndicators: showingTooltipOnSpots.map((index) { + return ShowingTooltipIndicators([ + LineBarSpot( + tooltipsOnBar, + lineBarsData.indexOf(tooltipsOnBar), + tooltipsOnBar.spots[index], + ), + ]); + }).toList(), + lineTouchData: LineTouchData( + enabled: true, + handleBuiltInTouches: false, + touchCallback: + (FlTouchEvent event, LineTouchResponse? response) { + if (response == null || response.lineBarSpots == null) { + return; + } + if (event is FlTapUpEvent) { + final spotIndex = response.lineBarSpots!.first.spotIndex; + showingTooltipOnSpots.clear(); + setState(() { + showingTooltipOnSpots.add(spotIndex); + }); + } + }, + mouseCursorResolver: + (FlTouchEvent event, LineTouchResponse? response) { + if (response == null || response.lineBarSpots == null) { + return SystemMouseCursors.basic; + } + return SystemMouseCursors.click; + }, + getTouchedSpotIndicator: + (LineChartBarData barData, List spotIndexes) { + return spotIndexes.map((index) { + return TouchedSpotIndicatorData( + FlLine( + color: TColor.secondaryColor1, + ), + FlDotData( + show: true, + getDotPainter: (spot, percent, barData, index) => + FlDotCirclePainter( + radius: 3, + color: Colors.white, + strokeWidth: 3, + strokeColor: TColor.secondaryColor1, + ), + ), + ); + }).toList(); + }, + touchTooltipData: LineTouchTooltipData( + tooltipBgColor: TColor.secondaryColor1, + tooltipRoundedRadius: 20, + getTooltipItems: (List lineBarsSpot) { + return lineBarsSpot.map((lineBarSpot) { + bpmController.text = "${lineBarSpot.y} BPM"; + return LineTooltipItem( + "Seconde ${lineBarSpot.x.toInt() / 10}", + const TextStyle( + color: Colors.white, + fontSize: 10, + fontWeight: FontWeight.bold, + ), + ); + }).toList(); + }, + ), + ), + lineBarsData: lineBarsData, + minY: 50, + maxY: 250, + titlesData: const FlTitlesData( + show: false, + ), + gridData: const FlGridData(show: false), + borderData: FlBorderData( + show: true, + border: Border.all( + color: Colors.transparent, + ), + ), + ), + ) + ], + ), + ), + ); + } +} diff --git a/lib/common_widget/graph.dart b/lib/common_widget/graph/graph.dart similarity index 100% rename from lib/common_widget/graph.dart rename to lib/common_widget/graph/graph.dart diff --git a/lib/common_widget/dates.dart b/lib/common_widget/not_use/dates.dart similarity index 94% rename from lib/common_widget/dates.dart rename to lib/common_widget/not_use/dates.dart index 126f864..ecaaa9f 100644 --- a/lib/common_widget/dates.dart +++ b/lib/common_widget/not_use/dates.dart @@ -1,5 +1,5 @@ import 'package:smartfit_app_mobile/common/colo_extension.dart'; -import 'package:smartfit_app_mobile/common_widget/helpers.dart'; +import 'package:smartfit_app_mobile/common_widget/not_use/helpers.dart'; import 'package:flutter/material.dart'; class Dates extends StatelessWidget { @@ -45,7 +45,7 @@ class DateBox extends StatelessWidget { padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 5), decoration: BoxDecoration( gradient: active - ? LinearGradient(colors: [ + ? LinearGradient(colors: [ TColor.primaryColor2, TColor.primaryColor1, ], begin: Alignment.topCenter) @@ -77,4 +77,4 @@ class DateBox extends StatelessWidget { ), ); } -} \ No newline at end of file +} diff --git a/lib/common_widget/helpers.dart b/lib/common_widget/not_use/helpers.dart similarity index 100% rename from lib/common_widget/helpers.dart rename to lib/common_widget/not_use/helpers.dart diff --git a/lib/common_widget/latest_activity_row.dart b/lib/common_widget/not_use/latest_activity_row.dart similarity index 100% rename from lib/common_widget/latest_activity_row.dart rename to lib/common_widget/not_use/latest_activity_row.dart diff --git a/lib/common_widget/notification_row.dart b/lib/common_widget/not_use/notification_row.dart similarity index 100% rename from lib/common_widget/notification_row.dart rename to lib/common_widget/not_use/notification_row.dart diff --git a/lib/common_widget/on_boarding_page.dart b/lib/common_widget/on_boarding/on_boarding_page.dart similarity index 91% rename from lib/common_widget/on_boarding_page.dart rename to lib/common_widget/on_boarding/on_boarding_page.dart index ff21b3e..f08d299 100644 --- a/lib/common_widget/on_boarding_page.dart +++ b/lib/common_widget/on_boarding/on_boarding_page.dart @@ -1,8 +1,7 @@ - import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; -import '../common/colo_extension.dart'; +import '../../common/colo_extension.dart'; class OnBoardingPage extends StatelessWidget { final Map pObj; @@ -10,10 +9,8 @@ class OnBoardingPage extends StatelessWidget { @override Widget build(BuildContext context) { - var media = MediaQuery.of(context).size; - return - - SizedBox( + var media = MediaQuery.of(context).size; + return SizedBox( width: media.width, height: media.height, child: Column( @@ -51,4 +48,4 @@ class OnBoardingPage extends StatelessWidget { ), ); } -} \ No newline at end of file +} diff --git a/lib/common_widget/other/entete_home_view.dart b/lib/common_widget/other/entete_home_view.dart new file mode 100644 index 0000000..b5ab1e8 --- /dev/null +++ b/lib/common_widget/other/entete_home_view.dart @@ -0,0 +1,47 @@ +import 'package:flutter/material.dart'; +import 'package:smartfit_app_mobile/common/colo_extension.dart'; +import 'package:smartfit_app_mobile/view/home/notification_view.dart'; + +class EnteteHomeView extends StatelessWidget { + const EnteteHomeView({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Bienvenue,", + style: TextStyle(color: TColor.gray, fontSize: 12), + ), + Text( + "Benjelloun Othmane", + style: TextStyle( + color: TColor.black, + fontSize: 20, + fontWeight: FontWeight.w700), + ), + ], + ), + IconButton( + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const NotificationView(), + ), + ); + }, + icon: Image.asset( + "assets/img/notification_active.png", + width: 25, + height: 25, + fit: BoxFit.fitHeight, + )) + ], + ); + } +} diff --git a/lib/common_widget/round_text_field.dart b/lib/common_widget/text_field/round_text_field.dart similarity index 97% rename from lib/common_widget/round_text_field.dart rename to lib/common_widget/text_field/round_text_field.dart index f93c6a2..b9a28b6 100644 --- a/lib/common_widget/round_text_field.dart +++ b/lib/common_widget/text_field/round_text_field.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; -import '../common/colo_extension.dart'; +import '../../common/colo_extension.dart'; class RoundTextField extends StatelessWidget { final TextEditingController? controller; diff --git a/lib/main.dart b/lib/main.dart index 28c7f13..8187d32 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:smartfit_app_mobile/modele/user.dart'; -import 'package:smartfit_app_mobile/view/login/signup_view.dart'; import 'package:smartfit_app_mobile/common/colo_extension.dart'; import 'package:smartfit_app_mobile/view/main_tab/main_tab_view.dart'; diff --git a/lib/modele/activity.dart b/lib/modele/activity.dart index 413f99e..2b4ff76 100644 --- a/lib/modele/activity.dart +++ b/lib/modele/activity.dart @@ -1,5 +1,5 @@ import 'package:fl_chart/fl_chart.dart'; -import 'package:smartfit_app_mobile/common_widget/graph.dart'; +import 'package:smartfit_app_mobile/common_widget/graph/graph.dart'; class ActivityOfUser { late String _nomActivite; diff --git a/lib/modele/user.dart b/lib/modele/user.dart index d9715a8..c248810 100644 --- a/lib/modele/user.dart +++ b/lib/modele/user.dart @@ -9,7 +9,6 @@ class User extends ChangeNotifier { void addActivity(ActivityOfUser activity) { listActivity.add(activity); - print("add"); notifyListeners(); } diff --git a/lib/modele/utile/home_view/data_home_view.dart b/lib/modele/utile/home_view/data_home_view.dart new file mode 100644 index 0000000..cdf14a6 --- /dev/null +++ b/lib/modele/utile/home_view/data_home_view.dart @@ -0,0 +1,13 @@ +import 'package:fl_chart/fl_chart.dart'; + +class DataHomeView { + late List bpmSecondes; + late List bpmSecondes2; + late List vitesseSecondes; + + DataHomeView( + this.bpmSecondes, + this.bpmSecondes2, + this.vitesseSecondes, + ); +} diff --git a/lib/modele/utile/home_view/home_view_util.dart b/lib/modele/utile/home_view/home_view_util.dart new file mode 100644 index 0000000..abed685 --- /dev/null +++ b/lib/modele/utile/home_view/home_view_util.dart @@ -0,0 +1,37 @@ +import 'package:fl_chart/fl_chart.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:smartfit_app_mobile/modele/user.dart'; +import 'package:smartfit_app_mobile/modele/utile/home_view/data_home_view.dart'; + +class HomeViewUtil { + DataHomeView initData(BuildContext context) { + List bpmSecondes = + Provider.of(context).listActivity[0].getHeartRateWithTime(); + List vitesseSecondes = + Provider.of(context).listActivity[0].getSpeedWithTime(); + + List bpmSecondes2 = List.from(bpmSecondes); + return DataHomeView( + normaliserDeuxiemeElement(bpmSecondes), + normaliserDeuxiemeElement(bpmSecondes2), + normaliserDeuxiemeElement(vitesseSecondes)); + } + + List normaliserDeuxiemeElement(List liste) { + // Trouver le plus grand élément dans la liste + double maxElement = 0.0; + for (var spot in liste) { + if (spot.y > maxElement) { + maxElement = spot.y; + } + } + // Calculer le facteur de normalisation + double normalisationFactor = maxElement != 0.0 ? 100 / maxElement : 1.0; + // Mettre à jour tous les éléments de la liste + for (int i = 0; i < liste.length; i++) { + liste[i] = FlSpot(liste[i].x, liste[i].y * normalisationFactor); + } + return liste; + } +} diff --git a/lib/view/activity/activity.dart b/lib/view/activity/activity.dart index 6e05af5..dac64eb 100644 --- a/lib/view/activity/activity.dart +++ b/lib/view/activity/activity.dart @@ -1,8 +1,8 @@ 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/mobile/mobile_Activity_view.dart'; -import 'package:smartfit_app_mobile/view/home/web/web_Activity_view.dart'; +import 'package:smartfit_app_mobile/view/activity/mobile/mobile_Activity_view.dart'; +import 'package:smartfit_app_mobile/view/activity/web/web_Activity_view.dart'; import 'package:flutter/material.dart'; class Activity extends StatelessWidget { diff --git a/lib/view/activity/mobile/mobile_Activity_view.dart b/lib/view/activity/mobile/mobile_Activity_view.dart index 17af619..85c2d9a 100644 --- a/lib/view/activity/mobile/mobile_Activity_view.dart +++ b/lib/view/activity/mobile/mobile_Activity_view.dart @@ -1,6 +1,6 @@ import 'package:provider/provider.dart'; import 'package:smartfit_app_mobile/common_widget/steps.dart'; -import 'package:smartfit_app_mobile/common_widget/graph.dart'; +import 'package:smartfit_app_mobile/common_widget/graph/graph.dart'; import 'package:smartfit_app_mobile/common_widget/info.dart' hide Stats; import 'package:smartfit_app_mobile/common_widget/stats.dart'; import 'package:flutter/material.dart'; diff --git a/lib/view/activity/mobile/mobile_list_activity.dart b/lib/view/activity/mobile/mobile_list_activity.dart index ad4736f..2fd6656 100644 --- a/lib/view/activity/mobile/mobile_list_activity.dart +++ b/lib/view/activity/mobile/mobile_list_activity.dart @@ -6,7 +6,7 @@ import 'package:smartfit_app_mobile/modele/api/request_api.dart'; import 'package:smartfit_app_mobile/modele/activity.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/workout_row.dart'; +import 'package:smartfit_app_mobile/common_widget/container/workout_row.dart'; import 'package:flutter/material.dart'; class MobileListActivity extends StatefulWidget { diff --git a/lib/view/activity/web/web_Activity_view.dart b/lib/view/activity/web/web_Activity_view.dart index 8f091ce..be3183d 100644 --- a/lib/view/activity/web/web_Activity_view.dart +++ b/lib/view/activity/web/web_Activity_view.dart @@ -1,5 +1,5 @@ import 'package:smartfit_app_mobile/common_widget/steps.dart'; -import 'package:smartfit_app_mobile/common_widget/graph.dart'; +import 'package:smartfit_app_mobile/common_widget/graph/graph.dart'; import 'package:smartfit_app_mobile/common_widget/info.dart' hide Stats; import 'package:smartfit_app_mobile/common_widget/stats.dart'; import 'package:flutter/material.dart'; diff --git a/lib/view/activity/web/web_list_activity.dart b/lib/view/activity/web/web_list_activity.dart index 3905c97..4e9e7f6 100644 --- a/lib/view/activity/web/web_list_activity.dart +++ b/lib/view/activity/web/web_list_activity.dart @@ -6,7 +6,7 @@ import 'package:smartfit_app_mobile/modele/api/request_api.dart'; import 'package:smartfit_app_mobile/modele/activity.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/workout_row.dart'; +import 'package:smartfit_app_mobile/common_widget/container/workout_row.dart'; import 'package:flutter/material.dart'; class WebListActivity extends StatefulWidget { diff --git a/lib/view/home/mobile/mobile_homeview.dart b/lib/view/home/mobile/mobile_homeview.dart index 6d23570..235dc2f 100644 --- a/lib/view/home/mobile/mobile_homeview.dart +++ b/lib/view/home/mobile/mobile_homeview.dart @@ -1,16 +1,12 @@ -import 'package:dotted_dashed_line/dotted_dashed_line.dart'; import 'package:fl_chart/fl_chart.dart'; import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; -import 'package:simple_animation_progress_bar/simple_animation_progress_bar.dart'; -import 'package:simple_circular_progress_bar/simple_circular_progress_bar.dart'; -import 'package:smartfit_app_mobile/common_widget/container_stats.dart'; -import 'package:smartfit_app_mobile/common_widget/ligne_container_stats.dart'; -import 'package:smartfit_app_mobile/modele/user.dart'; +import 'package:smartfit_app_mobile/common_widget/container/ligne_container_stats.dart'; +import 'package:smartfit_app_mobile/common_widget/graph/bpm_and_speed_by_time.dart'; +import 'package:smartfit_app_mobile/common_widget/graph/bpm_by_time.dart'; +import 'package:smartfit_app_mobile/common_widget/other/entete_home_view.dart'; import 'package:smartfit_app_mobile/common/colo_extension.dart'; -import 'package:smartfit_app_mobile/common_widget/round_button.dart'; -import 'package:smartfit_app_mobile/view/home/activity_tracker.dart'; -import 'package:smartfit_app_mobile/view/home/notification_view.dart'; +import 'package:smartfit_app_mobile/modele/utile/home_view/data_home_view.dart'; +import 'package:smartfit_app_mobile/modele/utile/home_view/home_view_util.dart'; class MobileHomeView extends StatefulWidget { const MobileHomeView({super.key}); @@ -20,103 +16,14 @@ class MobileHomeView extends StatefulWidget { } class _MobileHomeView extends State { - List bpmSecondes = [FlSpot(0, 30)]; - List bpmSecondes2 = []; - double calories = 0.0; - List vitesseSecondes = [FlSpot(0, 30)]; - List altitudeSecondes = [FlSpot(0, 30)]; - + late DataHomeView data; TextEditingController bpmController = TextEditingController(); - void normaliserDeuxiemeElement(List liste) { - // Trouver le plus grand élément dans la liste - double maxElement = 0.0; - for (var spot in liste) { - if (spot.y > maxElement) { - maxElement = spot.y; - } - } - - // Calculer le facteur de normalisation - double normalisationFactor = maxElement != 0.0 ? 100 / maxElement : 1.0; - - // Mettre à jour tous les éléments de la liste - for (int i = 0; i < liste.length; i++) { - liste[i] = FlSpot(liste[i].x, liste[i].y * normalisationFactor); - } - } - - List lastWorkoutArr = [ - { - "name": "Full Body Workout", - "image": "assets/img/Workout1.png", - "kcal": "180", - "time": "20", - "progress": 0.3 - }, - { - "name": "Lower Body Workout", - "image": "assets/img/Workout2.png", - "kcal": "200", - "time": "30", - "progress": 0.4 - }, - { - "name": "Ab Workout", - "image": "assets/img/Workout3.png", - "kcal": "300", - "time": "40", - "progress": 0.7 - }, - ]; - List showingTooltipOnSpots = [0]; - - List waterArr = [ - {"title": "6am - 8am", "subtitle": "600ml"}, - {"title": "9am - 11am", "subtitle": "500ml"}, - {"title": "11am - 2pm", "subtitle": "1000ml"}, - {"title": "2pm - 4pm", "subtitle": "700ml"}, - {"title": "4pm - now", "subtitle": "900ml"}, - ]; - @override Widget build(BuildContext context) { var media = MediaQuery.of(context).size; - bpmSecondes = - Provider.of(context).listActivity[0].getHeartRateWithTime(); - vitesseSecondes = - Provider.of(context).listActivity[0].getSpeedWithTime(); - altitudeSecondes = - Provider.of(context).listActivity[0].getAltitudeWithTime(); - calories = double.parse( - Provider.of(context).listActivity[0].getTotalCalorie()); - - normaliserDeuxiemeElement(vitesseSecondes); - normaliserDeuxiemeElement(altitudeSecondes); - bpmSecondes2 = List.from(bpmSecondes); - normaliserDeuxiemeElement(bpmSecondes2); - - final lineBarsData = [ - LineChartBarData( - spots: bpmSecondes, - isCurved: false, - barWidth: 2, - belowBarData: BarAreaData( - show: true, - gradient: LinearGradient(colors: [ - TColor.secondaryColor1.withOpacity(0.4), - TColor.secondaryColor2.withOpacity(0.1), - ], begin: Alignment.topCenter, end: Alignment.bottomCenter), - ), - dotData: const FlDotData(show: false), - gradient: LinearGradient( - colors: TColor.secondaryG, - ), - ), - ]; - - final tooltipsOnBar = lineBarsData[0]; + data = HomeViewUtil().initData(context); return Scaffold( backgroundColor: TColor.white, @@ -127,42 +34,7 @@ class _MobileHomeView extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - "Bienvenue,", - style: TextStyle(color: TColor.gray, fontSize: 12), - ), - Text( - "Benjelloun Othmane", - style: TextStyle( - color: TColor.black, - fontSize: 20, - fontWeight: FontWeight.w700), - ), - ], - ), - IconButton( - onPressed: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => const NotificationView(), - ), - ); - }, - icon: Image.asset( - "assets/img/notification_active.png", - width: 25, - height: 25, - fit: BoxFit.fitHeight, - )) - ], - ), + const EnteteHomeView(), SizedBox( height: media.width * 0.05, ), @@ -176,147 +48,7 @@ class _MobileHomeView extends State { SizedBox( height: media.width * 0.02, ), - ClipRRect( - borderRadius: BorderRadius.circular(25), - child: Container( - height: media.width * 0.4, - width: double.maxFinite, - decoration: BoxDecoration( - color: TColor.primaryColor2.withOpacity(0.3), - borderRadius: BorderRadius.circular(25), - ), - child: Stack( - alignment: Alignment.topLeft, - children: [ - Padding( - padding: const EdgeInsets.symmetric( - vertical: 20, horizontal: 20), - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - "Rythme cardiaque", - style: TextStyle( - color: TColor.black, - fontSize: 16, - fontWeight: FontWeight.w700), - ), - TextField( - controller: bpmController, - readOnly: true, - style: TextStyle( - color: - TColor.primaryColor1.withOpacity(0.8), - fontWeight: FontWeight.w700, - fontSize: 18), - decoration: const InputDecoration( - border: InputBorder - .none, // Ajoutez cette ligne pour supprimer la bordure - ), - ), - ], - ), - ), - LineChart( - LineChartData( - showingTooltipIndicators: - showingTooltipOnSpots.map((index) { - return ShowingTooltipIndicators([ - LineBarSpot( - tooltipsOnBar, - lineBarsData.indexOf(tooltipsOnBar), - tooltipsOnBar.spots[index], - ), - ]); - }).toList(), - lineTouchData: LineTouchData( - enabled: true, - handleBuiltInTouches: false, - touchCallback: (FlTouchEvent event, - LineTouchResponse? response) { - if (response == null || - response.lineBarSpots == null) { - return; - } - if (event is FlTapUpEvent) { - final spotIndex = - response.lineBarSpots!.first.spotIndex; - showingTooltipOnSpots.clear(); - setState(() { - showingTooltipOnSpots.add(spotIndex); - }); - } - }, - mouseCursorResolver: (FlTouchEvent event, - LineTouchResponse? response) { - if (response == null || - response.lineBarSpots == null) { - return SystemMouseCursors.basic; - } - return SystemMouseCursors.click; - }, - getTouchedSpotIndicator: - (LineChartBarData barData, - List spotIndexes) { - return spotIndexes.map((index) { - return TouchedSpotIndicatorData( - FlLine( - color: TColor.secondaryColor1, - ), - FlDotData( - show: true, - getDotPainter: - (spot, percent, barData, index) => - FlDotCirclePainter( - radius: 3, - color: Colors.white, - strokeWidth: 3, - strokeColor: TColor.secondaryColor1, - ), - ), - ); - }).toList(); - }, - touchTooltipData: LineTouchTooltipData( - tooltipBgColor: TColor.secondaryColor1, - tooltipRoundedRadius: 20, - getTooltipItems: - (List lineBarsSpot) { - return lineBarsSpot.map((lineBarSpot) { - bpmController.text = "${lineBarSpot.y} BPM"; - return LineTooltipItem( - "Seconde ${lineBarSpot.x.toInt() / 10}", - const TextStyle( - color: Colors.white, - fontSize: 10, - fontWeight: FontWeight.bold, - ), - ); - }).toList(); - }, - ), - ), - lineBarsData: lineBarsData, - minY: 50, - maxY: 250, - titlesData: const FlTitlesData( - show: false, - ), - gridData: const FlGridData(show: false), - borderData: FlBorderData( - show: true, - border: Border.all( - color: Colors.transparent, - ), - ), - ), - ) - ], - ), - ), - ), + GraphBpmByTime(media, data), SizedBox( height: media.width * 0.05, ), @@ -336,123 +68,16 @@ class _MobileHomeView extends State { SizedBox( height: media.width * 0.05, ), + GraphBpmAndSpeedByTime(media, data), + SizedBox( + height: media.width * 0.05, + ), + const LigneContainerStats("1", "2", "3", "s", "s", "s"), Container( padding: const EdgeInsets.only(left: 15), height: media.width * 0.5, width: double.maxFinite, - child: LineChart( - LineChartData( - showingTooltipIndicators: - showingTooltipOnSpots.map((index) { - return ShowingTooltipIndicators([ - LineBarSpot( - tooltipsOnBar, - lineBarsData.indexOf(tooltipsOnBar), - tooltipsOnBar.spots[index], - ), - ]); - }).toList(), - lineTouchData: LineTouchData( - enabled: true, - handleBuiltInTouches: false, - touchCallback: (FlTouchEvent event, - LineTouchResponse? response) { - if (response == null || - response.lineBarSpots == null) { - return; - } - if (event is FlTapUpEvent) { - final spotIndex = - response.lineBarSpots!.first.spotIndex; - showingTooltipOnSpots.clear(); - setState(() { - showingTooltipOnSpots.add(spotIndex); - }); - } - }, - mouseCursorResolver: (FlTouchEvent event, - LineTouchResponse? response) { - if (response == null || - response.lineBarSpots == null) { - return SystemMouseCursors.basic; - } - return SystemMouseCursors.click; - }, - getTouchedSpotIndicator: (LineChartBarData barData, - List spotIndexes) { - return spotIndexes.map((index) { - return TouchedSpotIndicatorData( - const FlLine( - color: Colors.transparent, - ), - FlDotData( - show: true, - getDotPainter: - (spot, percent, barData, index) => - FlDotCirclePainter( - radius: 3, - color: Colors.white, - strokeWidth: 3, - strokeColor: TColor.secondaryColor1, - ), - ), - ); - }).toList(); - }, - touchTooltipData: LineTouchTooltipData( - tooltipBgColor: TColor.secondaryColor1, - tooltipRoundedRadius: 20, - getTooltipItems: (List lineBarsSpot) { - return lineBarsSpot.map((lineBarSpot) { - return LineTooltipItem( - "Seconde ${lineBarSpot.x.toInt() / 10} ", - const TextStyle( - color: Colors.white, - fontSize: 10, - fontWeight: FontWeight.bold, - ), - ); - }).toList(); - }, - ), - ), - lineBarsData: lineBarsData1, - minY: 0, - maxY: 110, - titlesData: FlTitlesData( - show: true, - leftTitles: const AxisTitles(), - topTitles: const AxisTitles(), - bottomTitles: const AxisTitles(), - rightTitles: AxisTitles( - sideTitles: rightTitles, - )), - gridData: FlGridData( - show: true, - drawHorizontalLine: true, - horizontalInterval: 25, - drawVerticalLine: false, - getDrawingHorizontalLine: (value) { - return FlLine( - color: TColor.gray.withOpacity(0.15), - strokeWidth: 2, - ); - }, - ), - borderData: FlBorderData( - show: true, - border: Border.all( - color: Colors.transparent, - ), - ), - ), - )), - SizedBox( - height: media.width * 0.05, - ), - SizedBox( - height: media.width * 0.1, - ), + child: LineChart(LineChartData())) ], ), ), @@ -460,168 +85,4 @@ class _MobileHomeView extends State { ), ); } - - List showingSections() { - return List.generate( - 2, - (i) { - var color0 = TColor.secondaryColor1; - - switch (i) { - case 0: - return PieChartSectionData( - color: color0, - value: 33, - title: '', - radius: 55, - titlePositionPercentageOffset: 0.55, - badgeWidget: const Text( - "20,1", - style: TextStyle( - color: Colors.white, - fontSize: 12, - fontWeight: FontWeight.w700), - )); - case 1: - return PieChartSectionData( - color: Colors.white, - value: 75, - title: '', - radius: 45, - titlePositionPercentageOffset: 0.55, - ); - - default: - throw Error(); - } - }, - ); - } - - LineTouchData get lineTouchData1 => LineTouchData( - handleBuiltInTouches: true, - touchTooltipData: LineTouchTooltipData( - tooltipBgColor: Colors.blueGrey.withOpacity(0.8), - ), - ); - - List get lineBarsData1 => [ - lineChartBarData1_1, - lineChartBarData1_2, - ]; - - LineChartBarData get lineChartBarData1_1 => LineChartBarData( - isCurved: true, - gradient: LinearGradient(colors: [ - TColor.primaryColor2.withOpacity(0.5), - TColor.primaryColor1.withOpacity(0.5), - ]), - barWidth: 4, - isStrokeCapRound: true, - dotData: const FlDotData(show: false), - belowBarData: BarAreaData(show: false), - spots: vitesseSecondes, - ); - - LineChartBarData get lineChartBarData1_2 => LineChartBarData( - isCurved: true, - gradient: LinearGradient(colors: [ - TColor.secondaryColor2.withOpacity(0.5), - TColor.secondaryColor1.withOpacity(0.5), - ]), - barWidth: 2, - isStrokeCapRound: true, - dotData: const FlDotData(show: false), - belowBarData: BarAreaData( - show: false, - ), - spots: bpmSecondes2, - ); - - SideTitles get rightTitles => SideTitles( - getTitlesWidget: rightTitleWidgets, - showTitles: true, - interval: 20, - reservedSize: 40, - ); - - Widget rightTitleWidgets(double value, TitleMeta meta) { - String text; - switch (value.toInt()) { - case 0: - text = '0%'; - break; - case 20: - text = '20%'; - break; - case 40: - text = '40%'; - break; - case 60: - text = '60%'; - break; - case 80: - text = '80%'; - break; - case 100: - text = '100%'; - break; - default: - return Container(); - } - - return Text(text, - style: TextStyle( - color: TColor.gray, - fontSize: 12, - ), - textAlign: TextAlign.center); - } - - SideTitles get bottomTitles => SideTitles( - showTitles: true, - reservedSize: 50, - interval: 1, - getTitlesWidget: bottomTitleWidgets, - ); - - Widget bottomTitleWidgets(double value, TitleMeta meta) { - var style = TextStyle( - color: TColor.gray, - fontSize: 12, - ); - Widget text; - switch (value.toInt()) { - case 1: - text = Text('Dim', style: style); - break; - case 2: - text = Text('Lun', style: style); - break; - case 3: - text = Text('Mar', style: style); - break; - case 4: - text = Text('Mer', style: style); - break; - case 5: - text = Text('Jeu', style: style); - break; - case 6: - text = Text('Ven', style: style); - break; - case 7: - text = Text('Sam', style: style); - break; - default: - text = Text('', style: style); - break; - } - - return SideTitleWidget( - axisSide: meta.axisSide, - space: 10, - child: text, - ); - } } diff --git a/lib/view/home/notification_view.dart b/lib/view/home/notification_view.dart index c8e46c5..53de5c5 100644 --- a/lib/view/home/notification_view.dart +++ b/lib/view/home/notification_view.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import '../../common/colo_extension.dart'; -import '../../common_widget/notification_row.dart'; +import '../../common_widget/not_use/notification_row.dart'; class NotificationView extends StatefulWidget { const NotificationView({super.key}); @@ -12,12 +12,36 @@ class NotificationView extends StatefulWidget { class _NotificationViewState extends State { List notificationArr = [ - {"image": "assets/img/workout1.svg", "title": "Hey, c'est l'heure du sport", "time": "Il y a 3 minutes"}, - {"image": "assets/img/workout1.svg", "title": "Ne manque pas ton entrainement", "time": "Il y a 7 minutes"}, - {"image": "assets/img/workout1.svg", "title": "Hey, c'est l'heure du sport", "time": "Il y a 5 jours"}, - {"image": "assets/img/workout1.svg", "title": "Ne manque pas ton entrainement", "time": "29 Mai"}, - {"image": "assets/img/workout1.svg", "title": "Hey, c'est l'heure du sport", "time": "8 Avril"}, - {"image": "assets/img/workout1.svg", "title": "Ne manque pas ton entrainement", "time": "8 Avril"}, + { + "image": "assets/img/workout1.svg", + "title": "Hey, c'est l'heure du sport", + "time": "Il y a 3 minutes" + }, + { + "image": "assets/img/workout1.svg", + "title": "Ne manque pas ton entrainement", + "time": "Il y a 7 minutes" + }, + { + "image": "assets/img/workout1.svg", + "title": "Hey, c'est l'heure du sport", + "time": "Il y a 5 jours" + }, + { + "image": "assets/img/workout1.svg", + "title": "Ne manque pas ton entrainement", + "time": "29 Mai" + }, + { + "image": "assets/img/workout1.svg", + "title": "Hey, c'est l'heure du sport", + "time": "8 Avril" + }, + { + "image": "assets/img/workout1.svg", + "title": "Ne manque pas ton entrainement", + "time": "8 Avril" + }, ]; @override @@ -75,13 +99,18 @@ class _NotificationViewState extends State { ), backgroundColor: TColor.white, body: ListView.separated( - padding: const EdgeInsets.symmetric(vertical: 15, horizontal: 25), - itemBuilder: ((context, index) { - var nObj = notificationArr[index] as Map? ?? {}; - return NotificationRow(nObj: nObj); - }), separatorBuilder: (context, index){ - return Divider(color: TColor.gray.withOpacity(0.5), height: 1, ); - }, itemCount: notificationArr.length), + padding: const EdgeInsets.symmetric(vertical: 15, horizontal: 25), + itemBuilder: ((context, index) { + var nObj = notificationArr[index] as Map? ?? {}; + return NotificationRow(nObj: nObj); + }), + separatorBuilder: (context, index) { + return Divider( + color: TColor.gray.withOpacity(0.5), + height: 1, + ); + }, + itemCount: notificationArr.length), ); } -} \ No newline at end of file +} diff --git a/lib/view/home/web/web_homeview.dart b/lib/view/home/web/web_homeview.dart index 9c63d2c..f95605c 100644 --- a/lib/view/home/web/web_homeview.dart +++ b/lib/view/home/web/web_homeview.dart @@ -6,7 +6,7 @@ import 'package:simple_animation_progress_bar/simple_animation_progress_bar.dart import 'package:simple_circular_progress_bar/simple_circular_progress_bar.dart'; import 'package:smartfit_app_mobile/modele/user.dart'; import 'package:smartfit_app_mobile/common/colo_extension.dart'; -import 'package:smartfit_app_mobile/common_widget/round_button.dart'; +import 'package:smartfit_app_mobile/common_widget/button/round_button.dart'; import 'package:smartfit_app_mobile/view/home/activity_tracker.dart'; import 'package:smartfit_app_mobile/view/home/notification_view.dart'; diff --git a/lib/view/login/mobile/android_login_view.dart b/lib/view/login/mobile/android_login_view.dart index 1fe51f3..0d825f4 100644 --- a/lib/view/login/mobile/android_login_view.dart +++ b/lib/view/login/mobile/android_login_view.dart @@ -3,8 +3,8 @@ import 'package:flutter_svg/svg.dart'; import 'package:smartfit_app_mobile/modele/utile/login_user.dart'; import 'package:smartfit_app_mobile/view/main_tab/main_tab_view.dart'; import 'package:smartfit_app_mobile/common/colo_extension.dart'; -import 'package:smartfit_app_mobile/common_widget/round_button.dart'; -import 'package:smartfit_app_mobile/common_widget/round_text_field.dart'; +import 'package:smartfit_app_mobile/common_widget/button/round_button.dart'; +import 'package:smartfit_app_mobile/common_widget/text_field/round_text_field.dart'; import 'package:tuple/tuple.dart'; class MobileLoginView extends StatefulWidget { diff --git a/lib/view/login/mobile/android_signup_view.dart b/lib/view/login/mobile/android_signup_view.dart index 7c39c1c..094a5f6 100644 --- a/lib/view/login/mobile/android_signup_view.dart +++ b/lib/view/login/mobile/android_signup_view.dart @@ -3,8 +3,8 @@ import 'package:flutter_svg/svg.dart'; import 'package:smartfit_app_mobile/modele/utile/signup_user.dart'; import 'package:smartfit_app_mobile/view/login/login_view.dart'; import 'package:smartfit_app_mobile/common/colo_extension.dart'; -import 'package:smartfit_app_mobile/common_widget/round_button.dart'; -import 'package:smartfit_app_mobile/common_widget/round_text_field.dart'; +import 'package:smartfit_app_mobile/common_widget/button/round_button.dart'; +import 'package:smartfit_app_mobile/common_widget/text_field/round_text_field.dart'; import 'package:tuple/tuple.dart'; class MobileSignUpView extends StatefulWidget { diff --git a/lib/view/login/web/web_login_view.dart b/lib/view/login/web/web_login_view.dart index ceecf45..743048e 100644 --- a/lib/view/login/web/web_login_view.dart +++ b/lib/view/login/web/web_login_view.dart @@ -3,8 +3,8 @@ import 'package:flutter_svg/svg.dart'; import 'package:smartfit_app_mobile/modele/utile/login_user.dart'; import 'package:smartfit_app_mobile/view/main_tab/main_tab_view.dart'; import 'package:smartfit_app_mobile/common/colo_extension.dart'; -import 'package:smartfit_app_mobile/common_widget/round_button.dart'; -import 'package:smartfit_app_mobile/common_widget/round_text_field.dart'; +import 'package:smartfit_app_mobile/common_widget/button/round_button.dart'; +import 'package:smartfit_app_mobile/common_widget/text_field/round_text_field.dart'; import 'package:tuple/tuple.dart'; class WebLoginView extends StatefulWidget { diff --git a/lib/view/login/web/web_signup_view.dart b/lib/view/login/web/web_signup_view.dart index 46a7087..d026b90 100644 --- a/lib/view/login/web/web_signup_view.dart +++ b/lib/view/login/web/web_signup_view.dart @@ -3,8 +3,8 @@ import 'package:flutter_svg/svg.dart'; import 'package:smartfit_app_mobile/modele/utile/signup_user.dart'; import 'package:smartfit_app_mobile/view/login/login_view.dart'; import 'package:smartfit_app_mobile/common/colo_extension.dart'; -import 'package:smartfit_app_mobile/common_widget/round_button.dart'; -import 'package:smartfit_app_mobile/common_widget/round_text_field.dart'; +import 'package:smartfit_app_mobile/common_widget/button/round_button.dart'; +import 'package:smartfit_app_mobile/common_widget/text_field/round_text_field.dart'; import 'package:tuple/tuple.dart'; class WebSignUpView extends StatefulWidget { diff --git a/lib/view/main_tab/main_tab_view.dart b/lib/view/main_tab/main_tab_view.dart index 8655b38..28641a4 100644 --- a/lib/view/main_tab/main_tab_view.dart +++ b/lib/view/main_tab/main_tab_view.dart @@ -1,6 +1,6 @@ import 'package:smartfit_app_mobile/view/activity/list_activity.dart'; import 'package:smartfit_app_mobile/common/colo_extension.dart'; -import 'package:smartfit_app_mobile/common_widget/tab_button.dart'; +import 'package:smartfit_app_mobile/common_widget/button/tab_button.dart'; import 'package:smartfit_app_mobile/view/activity/activity.dart'; import 'package:smartfit_app_mobile/view/home/home_view.dart'; import 'package:flutter/material.dart'; diff --git a/lib/view/on_boarding/on_boarding_view.dart b/lib/view/on_boarding/on_boarding_view.dart index 1c59bf0..a9c3ca8 100644 --- a/lib/view/on_boarding/on_boarding_view.dart +++ b/lib/view/on_boarding/on_boarding_view.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:smartfit_app_mobile/common/colo_extension.dart'; -import 'package:smartfit_app_mobile/common_widget/on_boarding_page.dart'; +import 'package:smartfit_app_mobile/common_widget/on_boarding/on_boarding_page.dart'; import 'package:smartfit_app_mobile/view/login/signup_view.dart'; class OnBoardingView extends StatefulWidget { diff --git a/lib/view/on_boarding/started_view.dart b/lib/view/on_boarding/started_view.dart index 710c905..098e4df 100644 --- a/lib/view/on_boarding/started_view.dart +++ b/lib/view/on_boarding/started_view.dart @@ -1,7 +1,7 @@ import 'package:smartfit_app_mobile/common/colo_extension.dart'; import 'package:smartfit_app_mobile/view/on_boarding/on_boarding_view.dart'; import 'package:flutter/material.dart'; -import '../../common_widget/round_button.dart'; +import '../../common_widget/button/round_button.dart'; import 'package:flutter_svg/flutter_svg.dart'; class StartedView extends StatefulWidget { diff --git a/lib/view/profile/mobile/mobile_profile_view.dart b/lib/view/profile/mobile/mobile_profile_view.dart index 34c5e9d..9ef1fbe 100644 --- a/lib/view/profile/mobile/mobile_profile_view.dart +++ b/lib/view/profile/mobile/mobile_profile_view.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:animated_toggle_switch/animated_toggle_switch.dart'; import 'package:smartfit_app_mobile/common/colo_extension.dart'; -import 'package:smartfit_app_mobile/common_widget/round_button.dart'; +import 'package:smartfit_app_mobile/common_widget/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'; diff --git a/lib/view/profile/web/web_profile_view.dart b/lib/view/profile/web/web_profile_view.dart index 219d6ce..a58a07d 100644 --- a/lib/view/profile/web/web_profile_view.dart +++ b/lib/view/profile/web/web_profile_view.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:animated_toggle_switch/animated_toggle_switch.dart'; import 'package:smartfit_app_mobile/common/colo_extension.dart'; -import 'package:smartfit_app_mobile/common_widget/round_button.dart'; +import 'package:smartfit_app_mobile/common_widget/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'; From 8fe91016003593ffa1093e37a839fc4511844eda Mon Sep 17 00:00:00 2001 From: otbenjello Date: Mon, 20 Nov 2023 08:23:06 +0100 Subject: [PATCH 05/11] branche pour responsive web --- .../container/ligne_container_stats.dart | 6 +- .../graph/bpm_and_speed_by_time.dart | 2 +- lib/common_widget/graph/bpm_by_time.dart | 2 +- lib/modele/manager_file.dart | 6 +- .../utile/home_view/home_view_util.dart | 2 +- lib/view/activity/web/web_list_activity.dart | 76 +- lib/view/home/web/web_homeview.dart | 1021 +---------------- 7 files changed, 80 insertions(+), 1035 deletions(-) diff --git a/lib/common_widget/container/ligne_container_stats.dart b/lib/common_widget/container/ligne_container_stats.dart index 359272d..96e35e8 100644 --- a/lib/common_widget/container/ligne_container_stats.dart +++ b/lib/common_widget/container/ligne_container_stats.dart @@ -19,11 +19,11 @@ class LigneContainerStats extends StatelessWidget { Widget build(BuildContext context) { return Row( children: [ - const SizedBox(height: 10), + const SizedBox(width: 20), ContainerStats(value1, designation1), - const SizedBox(height: 10), + const SizedBox(width: 20), ContainerStats(value2, designation2), - const SizedBox(height: 10), + const SizedBox(width: 20), ContainerStats(value3, designation3), ], ); diff --git a/lib/common_widget/graph/bpm_and_speed_by_time.dart b/lib/common_widget/graph/bpm_and_speed_by_time.dart index 0c9dc00..8b2c717 100644 --- a/lib/common_widget/graph/bpm_and_speed_by_time.dart +++ b/lib/common_widget/graph/bpm_and_speed_by_time.dart @@ -116,7 +116,7 @@ class _GraphBpmAndSpeedByTime extends State { return Container( padding: const EdgeInsets.only(left: 15), - height: widget.media.width * 0.5, + height: widget.media.width * 0.3, width: double.maxFinite, child: LineChart( LineChartData( diff --git a/lib/common_widget/graph/bpm_by_time.dart b/lib/common_widget/graph/bpm_by_time.dart index aaa580c..928f67b 100644 --- a/lib/common_widget/graph/bpm_by_time.dart +++ b/lib/common_widget/graph/bpm_by_time.dart @@ -80,7 +80,7 @@ class _GraphBpmByTime extends State { return ClipRRect( borderRadius: BorderRadius.circular(25), child: Container( - height: media.width * 0.4, + height: media.width * 0.2, width: double.maxFinite, decoration: BoxDecoration( color: TColor.primaryColor2.withOpacity(0.3), diff --git a/lib/modele/manager_file.dart b/lib/modele/manager_file.dart index f07ffd5..0b453bd 100644 --- a/lib/modele/manager_file.dart +++ b/lib/modele/manager_file.dart @@ -1,5 +1,6 @@ import 'dart:convert'; import 'dart:io'; +import 'dart:typed_data'; import 'package:csv/csv.dart'; import 'package:fit_tool/fit_tool.dart'; import 'package:path_provider/path_provider.dart'; @@ -26,7 +27,10 @@ class ManagerFile { 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/utile/home_view/home_view_util.dart b/lib/modele/utile/home_view/home_view_util.dart index abed685..44cbe8c 100644 --- a/lib/modele/utile/home_view/home_view_util.dart +++ b/lib/modele/utile/home_view/home_view_util.dart @@ -13,7 +13,7 @@ class HomeViewUtil { List bpmSecondes2 = List.from(bpmSecondes); return DataHomeView( - normaliserDeuxiemeElement(bpmSecondes), + bpmSecondes, normaliserDeuxiemeElement(bpmSecondes2), normaliserDeuxiemeElement(vitesseSecondes)); } diff --git a/lib/view/activity/web/web_list_activity.dart b/lib/view/activity/web/web_list_activity.dart index 4e9e7f6..f6d2530 100644 --- a/lib/view/activity/web/web_list_activity.dart +++ b/lib/view/activity/web/web_list_activity.dart @@ -1,3 +1,10 @@ +import 'dart:convert'; +import 'dart:io'; +import 'dart:typed_data'; +import 'package:flutter/material.dart'; +import 'dart:html' as html; // Importation des fonctionnalités HTML + +import 'package:crypto/crypto.dart'; import 'package:file_picker/file_picker.dart'; import 'package:provider/provider.dart'; import 'package:smartfit_app_mobile/common/colo_extension.dart'; @@ -8,40 +15,45 @@ 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:flutter/material.dart'; +import 'package:tuple/tuple.dart'; class WebListActivity extends StatefulWidget { const WebListActivity({super.key}); @override - State createState() => _WebListActivity(); + State createState() => _WebListActivityState(); } -class _WebListActivity extends State { +class _WebListActivityState extends State { FilePickerResult? result; IDataStrategy strategy = RequestApi(); - 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"); - 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))); + //late File x = File(file.path); + List parseFile(Uint8List bytes) { + String csvString = utf8.decode(bytes); // Convertit les bytes en chaîne UTF-8 + List lines = LineSplitter.split(csvString).toList(); // Sépare les lignes + + for (String line in lines) { + print(line); // Affiche chaque ligne du fichier } + + return lines; // Ou retournez les lignes du fichier } + void readFile(html.File file) async { + ManagerFile x = ManagerFile(); + final reader = html.FileReader(); + reader.readAsArrayBuffer(file); + reader.onLoadEnd.listen((event) { + if (reader.readyState == html.FileReader.DONE) { + Uint8List bytes = reader.result as Uint8List; + List result = x.readFitFileWeb(bytes) ; + Provider.of(context, listen: false) + .addActivity(ActivityOfUser(file.name, result )); + } + }); + } + List lastWorkoutArr = []; @override @@ -70,15 +82,15 @@ class _WebListActivity extends State { ), TextButton( onPressed: () async { - result = await FilePicker.platform.pickFiles(); - if (result == null) { - print("No file selected"); - } else { - for (var element in result!.files) { - readFile(element.name); - print(element.name); + html.FileUploadInputElement uploadInput = html.FileUploadInputElement(); + uploadInput.click(); + + uploadInput.onChange.listen((e) { + final files = uploadInput.files; + if (files != null && files.isNotEmpty) { + readFile(files[0]); // Lecture du fichier sélectionné } - } + }); }, child: Text( "Ajouter", @@ -147,5 +159,7 @@ class _WebListActivity extends State { ), ), ); - } -} + } + + +} \ No newline at end of file diff --git a/lib/view/home/web/web_homeview.dart b/lib/view/home/web/web_homeview.dart index f95605c..7c04521 100644 --- a/lib/view/home/web/web_homeview.dart +++ b/lib/view/home/web/web_homeview.dart @@ -1,14 +1,12 @@ -import 'package:dotted_dashed_line/dotted_dashed_line.dart'; import 'package:fl_chart/fl_chart.dart'; import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; -import 'package:simple_animation_progress_bar/simple_animation_progress_bar.dart'; -import 'package:simple_circular_progress_bar/simple_circular_progress_bar.dart'; -import 'package:smartfit_app_mobile/modele/user.dart'; +import 'package:smartfit_app_mobile/common_widget/container/ligne_container_stats.dart'; +import 'package:smartfit_app_mobile/common_widget/graph/bpm_and_speed_by_time.dart'; +import 'package:smartfit_app_mobile/common_widget/graph/bpm_by_time.dart'; +import 'package:smartfit_app_mobile/common_widget/other/entete_home_view.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/view/home/activity_tracker.dart'; -import 'package:smartfit_app_mobile/view/home/notification_view.dart'; +import 'package:smartfit_app_mobile/modele/utile/home_view/data_home_view.dart'; +import 'package:smartfit_app_mobile/modele/utile/home_view/home_view_util.dart'; class WebHomeView extends StatefulWidget { const WebHomeView({super.key}); @@ -18,230 +16,28 @@ class WebHomeView extends StatefulWidget { } class _WebHomeView extends State { - List lastWorkoutArr = [ - { - "name": "Full Body Workout", - "image": "assets/img/Workout1.png", - "kcal": "180", - "time": "20", - "progress": 0.3 - }, - { - "name": "Lower Body Workout", - "image": "assets/img/Workout2.png", - "kcal": "200", - "time": "30", - "progress": 0.4 - }, - { - "name": "Ab Workout", - "image": "assets/img/Workout3.png", - "kcal": "300", - "time": "40", - "progress": 0.7 - }, - ]; - List showingTooltipOnSpots = [0]; - - List allSpots = [FlSpot(0, 20)]; - - List waterArr = [ - {"title": "6am - 8am", "subtitle": "600ml"}, - {"title": "9am - 11am", "subtitle": "500ml"}, - {"title": "11am - 2pm", "subtitle": "1000ml"}, - {"title": "2pm - 4pm", "subtitle": "700ml"}, - {"title": "4pm - now", "subtitle": "900ml"}, - ]; + late DataHomeView data; + TextEditingController bpmController = TextEditingController(); @override Widget build(BuildContext context) { var media = MediaQuery.of(context).size; - User user = context.watch(); - final lineBarsData = [ - LineChartBarData( - showingIndicators: showingTooltipOnSpots, - spots: allSpots, - isCurved: false, - barWidth: 2, - belowBarData: BarAreaData( - show: true, - gradient: LinearGradient(colors: [ - TColor.secondaryColor1.withOpacity(0.4), - TColor.secondaryColor2.withOpacity(0.1), - ], begin: Alignment.topCenter, end: Alignment.bottomCenter), - ), - dotData: FlDotData(show: false), - gradient: LinearGradient( - colors: TColor.secondaryG, - ), - ), - ]; - - final tooltipsOnBar = lineBarsData[0]; + data = HomeViewUtil().initData(context); return Scaffold( backgroundColor: TColor.white, body: SingleChildScrollView( child: SafeArea( child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 15), + padding: const EdgeInsets.symmetric(horizontal: 200), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - "Bienvenue,", - style: TextStyle(color: TColor.gray, fontSize: 12), - ), - Text( - user.username, - style: TextStyle( - color: TColor.black, - fontSize: 20, - fontWeight: FontWeight.w700), - ), - ], - ), - IconButton( - onPressed: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => const NotificationView(), - ), - ); - }, - icon: Image.asset( - "assets/img/notification_active.png", - width: 25, - height: 25, - fit: BoxFit.fitHeight, - )) - ], - ), - SizedBox( - height: media.width * 0.05, - ), - Container( - height: media.width * 0.4, - decoration: BoxDecoration( - gradient: LinearGradient(colors: TColor.primaryG), - borderRadius: BorderRadius.circular(media.width * 0.075)), - child: Stack(alignment: Alignment.center, children: [ - Image.asset( - "assets/img/bg_dots.png", - height: media.width * 0.4, - width: double.maxFinite, - fit: BoxFit.fitHeight, - ), - Padding( - padding: const EdgeInsets.symmetric( - vertical: 25, horizontal: 25), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - "Graph 1", - style: TextStyle( - color: TColor.white, - fontSize: 14, - fontWeight: FontWeight.w700), - ), - Text( - "Sous titre 1", - style: TextStyle( - color: TColor.white.withOpacity(0.7), - fontSize: 12), - ), - SizedBox( - height: media.width * 0.05, - ), - SizedBox( - width: 120, - height: 35, - child: RoundButton( - title: "Voir plus", - type: RoundButtonType.bgSGradient, - fontSize: 12, - fontWeight: FontWeight.w400, - onPressed: () {})) - ], - ), - AspectRatio( - aspectRatio: 1, - child: PieChart( - PieChartData( - pieTouchData: PieTouchData( - touchCallback: - (FlTouchEvent event, pieTouchResponse) {}, - ), - startDegreeOffset: 250, - borderData: FlBorderData( - show: false, - ), - sectionsSpace: 1, - centerSpaceRadius: 0, - sections: showingSections(), - ), - ), - ), - ], - ), - ) - ]), - ), SizedBox( - height: media.width * 0.05, - ), - Container( - padding: - const EdgeInsets.symmetric(vertical: 15, horizontal: 15), - decoration: BoxDecoration( - color: TColor.primaryColor2.withOpacity(0.3), - borderRadius: BorderRadius.circular(15), - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - "Suivi d'activité", - style: TextStyle( - color: TColor.black, - fontSize: 14, - fontWeight: FontWeight.w700), - ), - SizedBox( - width: 70, - height: 25, - child: RoundButton( - title: "Voir", - type: RoundButtonType.bgGradient, - fontSize: 12, - fontWeight: FontWeight.w400, - onPressed: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => - const ActivityTrackerView(), - ), - ); - }, - ), - ) - ], - ), + height: media.width * 0.03, ), + const EnteteHomeView(), SizedBox( height: media.width * 0.05, ), @@ -255,625 +51,42 @@ class _WebHomeView extends State { SizedBox( height: media.width * 0.02, ), - ClipRRect( - borderRadius: BorderRadius.circular(25), - child: Container( - height: media.width * 0.4, - width: double.maxFinite, - decoration: BoxDecoration( - color: TColor.primaryColor2.withOpacity(0.3), - borderRadius: BorderRadius.circular(25), - ), - child: Stack( - alignment: Alignment.topLeft, - children: [ - Padding( - padding: const EdgeInsets.symmetric( - vertical: 20, horizontal: 20), - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - "Graph 2 ( rhythme cardiaque )", - style: TextStyle( - color: TColor.black, - fontSize: 16, - fontWeight: FontWeight.w700), - ), - ShaderMask( - blendMode: BlendMode.srcIn, - shaderCallback: (bounds) { - return LinearGradient( - colors: TColor.primaryG, - begin: Alignment.centerLeft, - end: Alignment.centerRight) - .createShader(Rect.fromLTRB( - 0, 0, bounds.width, bounds.height)); - }, - child: Text( - "78 BPM", - style: TextStyle( - color: - TColor.primaryColor1.withOpacity(0.7), - fontWeight: FontWeight.w700, - fontSize: 18), - ), - ), - ], - ), - ), - LineChart( - LineChartData( - showingTooltipIndicators: - showingTooltipOnSpots.map((index) { - return ShowingTooltipIndicators([ - LineBarSpot( - tooltipsOnBar, - lineBarsData.indexOf(tooltipsOnBar), - tooltipsOnBar.spots[index], - ), - ]); - }).toList(), - lineTouchData: LineTouchData( - enabled: true, - handleBuiltInTouches: false, - touchCallback: (FlTouchEvent event, - LineTouchResponse? response) { - if (response == null || - response.lineBarSpots == null) { - return; - } - if (event is FlTapUpEvent) { - final spotIndex = - response.lineBarSpots!.first.spotIndex; - showingTooltipOnSpots.clear(); - setState(() { - showingTooltipOnSpots.add(spotIndex); - }); - } - }, - mouseCursorResolver: (FlTouchEvent event, - LineTouchResponse? response) { - if (response == null || - response.lineBarSpots == null) { - return SystemMouseCursors.basic; - } - return SystemMouseCursors.click; - }, - getTouchedSpotIndicator: - (LineChartBarData barData, - List spotIndexes) { - return spotIndexes.map((index) { - return TouchedSpotIndicatorData( - FlLine( - color: TColor.secondaryColor1, - ), - FlDotData( - show: true, - getDotPainter: - (spot, percent, barData, index) => - FlDotCirclePainter( - radius: 3, - color: Colors.white, - strokeWidth: 3, - strokeColor: TColor.secondaryColor1, - ), - ), - ); - }).toList(); - }, - touchTooltipData: LineTouchTooltipData( - tooltipBgColor: TColor.secondaryColor1, - tooltipRoundedRadius: 20, - getTooltipItems: - (List lineBarsSpot) { - return lineBarsSpot.map((lineBarSpot) { - return LineTooltipItem( - "il y a ${lineBarSpot.x.toInt()} minutes", - const TextStyle( - color: Colors.white, - fontSize: 10, - fontWeight: FontWeight.bold, - ), - ); - }).toList(); - }, - ), - ), - lineBarsData: lineBarsData, - minY: 0, - maxY: 130, - titlesData: FlTitlesData( - show: false, - ), - gridData: FlGridData(show: false), - borderData: FlBorderData( - show: true, - border: Border.all( - color: Colors.transparent, - ), - ), - ), - ) - ], - ), - ), - ), + GraphBpmByTime(media, data), SizedBox( height: media.width * 0.05, ), - Row( - children: [ - Expanded( - child: Container( - height: media.width * 0.95, - padding: const EdgeInsets.symmetric( - vertical: 25, horizontal: 20), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(25), - boxShadow: const [ - BoxShadow(color: Colors.black12, blurRadius: 2) - ]), - child: Row( - children: [ - SimpleAnimationProgressBar( - height: media.width * 0.85, - width: media.width * 0.07, - backgroundColor: Colors.grey.shade100, - foregrondColor: Colors.purple, - ratio: 0.5, - direction: Axis.vertical, - curve: Curves.fastLinearToSlowEaseIn, - duration: const Duration(seconds: 3), - borderRadius: BorderRadius.circular(15), - gradientColor: LinearGradient( - colors: TColor.primaryG, - begin: Alignment.bottomCenter, - end: Alignment.topCenter), - ), - const SizedBox( - width: 10, - ), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - "Graph 3", - style: TextStyle( - color: TColor.black, - fontSize: 12, - fontWeight: FontWeight.w700), - ), - ShaderMask( - blendMode: BlendMode.srcIn, - shaderCallback: (bounds) { - return LinearGradient( - colors: TColor.primaryG, - begin: Alignment.centerLeft, - end: Alignment.centerRight) - .createShader(Rect.fromLTRB( - 0, 0, bounds.width, bounds.height)); - }, - child: Text( - "ex : objectif", - style: TextStyle( - color: TColor.white.withOpacity(0.7), - fontWeight: FontWeight.w700, - fontSize: 14), - ), - ), - const SizedBox( - height: 10, - ), - Text( - "Mis à jour en temps réel", - style: TextStyle( - color: TColor.gray, - fontSize: 12, - ), - ), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: waterArr.map((wObj) { - var isLast = wObj == waterArr.last; - return Row( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Column( - mainAxisAlignment: - MainAxisAlignment.start, - crossAxisAlignment: - CrossAxisAlignment.center, - children: [ - Container( - margin: - const EdgeInsets.symmetric( - vertical: 4), - width: 10, - height: 10, - decoration: BoxDecoration( - color: TColor.secondaryColor1 - .withOpacity(0.5), - borderRadius: - BorderRadius.circular(5), - ), - ), - if (!isLast) - DottedDashedLine( - height: media.width * 0.078, - width: 0, - dashColor: TColor - .secondaryColor1 - .withOpacity(0.5), - axis: Axis.vertical) - ], - ), - const SizedBox( - width: 10, - ), - Column( - mainAxisAlignment: - MainAxisAlignment.start, - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Text( - wObj["title"].toString(), - style: TextStyle( - color: TColor.gray, - fontSize: 10, - ), - ), - ShaderMask( - blendMode: BlendMode.srcIn, - shaderCallback: (bounds) { - return LinearGradient( - colors: - TColor.secondaryG, - begin: Alignment - .centerLeft, - end: Alignment - .centerRight) - .createShader(Rect.fromLTRB( - 0, - 0, - bounds.width, - bounds.height)); - }, - child: Text( - wObj["subtitle"].toString(), - style: TextStyle( - color: TColor.white - .withOpacity(0.7), - fontSize: 12), - ), - ), - ], - ) - ], - ); - }).toList(), - ) - ], - )) - ], - ), - ), - ), - SizedBox( - width: media.width * 0.05, - ), - Expanded( - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - Container( - width: double.maxFinite, - height: media.width * 0.45, - padding: const EdgeInsets.symmetric( - vertical: 25, horizontal: 20), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(25), - boxShadow: const [ - BoxShadow(color: Colors.black12, blurRadius: 2) - ]), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - "Graph 4", - style: TextStyle( - color: TColor.black, - fontSize: 12, - fontWeight: FontWeight.w700), - ), - ShaderMask( - blendMode: BlendMode.srcIn, - shaderCallback: (bounds) { - return LinearGradient( - colors: TColor.primaryG, - begin: Alignment.centerLeft, - end: Alignment.centerRight) - .createShader(Rect.fromLTRB( - 0, 0, bounds.width, bounds.height)); - }, - child: Text( - "durée", - style: TextStyle( - color: TColor.white.withOpacity(0.7), - fontWeight: FontWeight.w700, - fontSize: 14), - ), - ), - const Spacer(), - Image.asset("assets/img/sleep_graph.png", - width: double.maxFinite, - height: 80, - fit: BoxFit.fitWidth) - ]), - ), - SizedBox( - height: media.width * 0.05, - ), - Container( - width: double.maxFinite, - height: media.width * 0.45, - padding: const EdgeInsets.symmetric( - vertical: 25, horizontal: 20), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(25), - boxShadow: const [ - BoxShadow(color: Colors.black12, blurRadius: 2) - ]), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - "Calories", - style: TextStyle( - color: TColor.black, - fontSize: 12, - fontWeight: FontWeight.w700), - ), - ShaderMask( - blendMode: BlendMode.srcIn, - shaderCallback: (bounds) { - return LinearGradient( - colors: TColor.primaryG, - begin: Alignment.centerLeft, - end: Alignment.centerRight) - .createShader(Rect.fromLTRB( - 0, 0, bounds.width, bounds.height)); - }, - child: Text( - "760 kCal", - style: TextStyle( - color: TColor.white.withOpacity(0.7), - fontWeight: FontWeight.w700, - fontSize: 14), - ), - ), - const Spacer(), - Container( - alignment: Alignment.center, - child: SizedBox( - width: media.width * 0.2, - height: media.width * 0.2, - child: Stack( - alignment: Alignment.center, - children: [ - Container( - width: media.width * 0.15, - height: media.width * 0.15, - alignment: Alignment.center, - decoration: BoxDecoration( - gradient: LinearGradient( - colors: TColor.primaryG), - borderRadius: BorderRadius.circular( - media.width * 0.075), - ), - child: FittedBox( - child: Text( - "230kCal\nrestantes", - textAlign: TextAlign.center, - style: TextStyle( - color: TColor.white, - fontSize: 11), - ), - ), - ), - SimpleCircularProgressBar( - progressStrokeWidth: 10, - backStrokeWidth: 10, - progressColors: TColor.primaryG, - backColor: Colors.grey.shade100, - valueNotifier: ValueNotifier(50), - startAngle: -180, - ), - ], - ), - ), - ) - ]), - ), - ], - )) - ], - ), + const LigneContainerStats("1", "2", "3", "s", "s", "s"), SizedBox( - height: media.width * 0.1, + height: media.width * 0.05, ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - "graph 5", + "Rythme cardique et vitesse", style: TextStyle( color: TColor.black, fontSize: 16, fontWeight: FontWeight.w700), ), - Container( - height: 30, - padding: const EdgeInsets.symmetric(horizontal: 8), - decoration: BoxDecoration( - gradient: LinearGradient(colors: TColor.primaryG), - borderRadius: BorderRadius.circular(15), - ), - child: DropdownButtonHideUnderline( - child: DropdownButton( - items: ["Semaine", "Mois"] - .map((name) => DropdownMenuItem( - value: name, - child: Text( - name, - style: TextStyle( - color: TColor.gray, fontSize: 14), - ), - )) - .toList(), - onChanged: (value) {}, - icon: Icon(Icons.expand_more, color: TColor.white), - hint: Text( - "Semaine", - textAlign: TextAlign.center, - style: - TextStyle(color: TColor.white, fontSize: 12), - ), - ), - )), ], ), SizedBox( height: media.width * 0.05, ), - Container( - padding: const EdgeInsets.only(left: 15), - height: media.width * 0.5, - width: double.maxFinite, - child: LineChart( - LineChartData( - showingTooltipIndicators: - showingTooltipOnSpots.map((index) { - return ShowingTooltipIndicators([ - LineBarSpot( - tooltipsOnBar, - lineBarsData.indexOf(tooltipsOnBar), - tooltipsOnBar.spots[index], - ), - ]); - }).toList(), - lineTouchData: LineTouchData( - enabled: true, - handleBuiltInTouches: false, - touchCallback: (FlTouchEvent event, - LineTouchResponse? response) { - if (response == null || - response.lineBarSpots == null) { - return; - } - if (event is FlTapUpEvent) { - final spotIndex = - response.lineBarSpots!.first.spotIndex; - showingTooltipOnSpots.clear(); - setState(() { - showingTooltipOnSpots.add(spotIndex); - }); - } - }, - mouseCursorResolver: (FlTouchEvent event, - LineTouchResponse? response) { - if (response == null || - response.lineBarSpots == null) { - return SystemMouseCursors.basic; - } - return SystemMouseCursors.click; - }, - getTouchedSpotIndicator: (LineChartBarData barData, - List spotIndexes) { - return spotIndexes.map((index) { - return TouchedSpotIndicatorData( - FlLine( - color: Colors.transparent, - ), - FlDotData( - show: true, - getDotPainter: - (spot, percent, barData, index) => - FlDotCirclePainter( - radius: 3, - color: Colors.white, - strokeWidth: 3, - strokeColor: TColor.secondaryColor1, - ), - ), - ); - }).toList(); - }, - touchTooltipData: LineTouchTooltipData( - tooltipBgColor: TColor.secondaryColor1, - tooltipRoundedRadius: 20, - getTooltipItems: (List lineBarsSpot) { - return lineBarsSpot.map((lineBarSpot) { - return LineTooltipItem( - "il y a ${lineBarSpot.x.toInt()} minutes", - const TextStyle( - color: Colors.white, - fontSize: 10, - fontWeight: FontWeight.bold, - ), - ); - }).toList(); - }, - ), - ), - lineBarsData: lineBarsData1, - minY: -0.5, - maxY: 110, - titlesData: FlTitlesData( - show: true, - leftTitles: AxisTitles(), - topTitles: AxisTitles(), - bottomTitles: AxisTitles( - sideTitles: bottomTitles, - ), - rightTitles: AxisTitles( - sideTitles: rightTitles, - )), - gridData: FlGridData( - show: true, - drawHorizontalLine: true, - horizontalInterval: 25, - drawVerticalLine: false, - getDrawingHorizontalLine: (value) { - return FlLine( - color: TColor.gray.withOpacity(0.15), - strokeWidth: 2, - ); - }, - ), - borderData: FlBorderData( - show: true, - border: Border.all( - color: Colors.transparent, - ), - ), - ), - )), + GraphBpmAndSpeedByTime(media, data), SizedBox( height: media.width * 0.05, ), + const LigneContainerStats("1", "2", "3", "s", "s", "s"), SizedBox( - height: media.width * 0.1, + height: media.width * 0.05, ), + Container( + padding: const EdgeInsets.only(left: 15), + height: media.width * 0.5, + width: double.maxFinite, + child: LineChart(LineChartData())) ], ), ), @@ -881,190 +94,4 @@ class _WebHomeView extends State { ), ); } - - void updateChartData(List newData) { - setState(() { - allSpots = newData; - }); - } - - List showingSections() { - return List.generate( - 2, - (i) { - var color0 = TColor.secondaryColor1; - - switch (i) { - case 0: - return PieChartSectionData( - color: color0, - value: 33, - title: '', - radius: 55, - titlePositionPercentageOffset: 0.55, - badgeWidget: const Text( - "20,1", - style: TextStyle( - color: Colors.white, - fontSize: 12, - fontWeight: FontWeight.w700), - )); - case 1: - return PieChartSectionData( - color: Colors.white, - value: 75, - title: '', - radius: 45, - titlePositionPercentageOffset: 0.55, - ); - - default: - throw Error(); - } - }, - ); - } - - LineTouchData get lineTouchData1 => LineTouchData( - handleBuiltInTouches: true, - touchTooltipData: LineTouchTooltipData( - tooltipBgColor: Colors.blueGrey.withOpacity(0.8), - ), - ); - - List get lineBarsData1 => [ - lineChartBarData1_1, - lineChartBarData1_2, - ]; - - LineChartBarData get lineChartBarData1_1 => LineChartBarData( - isCurved: true, - gradient: LinearGradient(colors: [ - TColor.primaryColor2.withOpacity(0.5), - TColor.primaryColor1.withOpacity(0.5), - ]), - barWidth: 4, - isStrokeCapRound: true, - dotData: FlDotData(show: false), - belowBarData: BarAreaData(show: false), - spots: const [ - FlSpot(1, 35), - FlSpot(2, 70), - FlSpot(3, 40), - FlSpot(4, 80), - FlSpot(5, 25), - FlSpot(6, 70), - FlSpot(7, 35), - ], - ); - - LineChartBarData get lineChartBarData1_2 => LineChartBarData( - isCurved: true, - gradient: LinearGradient(colors: [ - TColor.secondaryColor2.withOpacity(0.5), - TColor.secondaryColor1.withOpacity(0.5), - ]), - barWidth: 2, - isStrokeCapRound: true, - dotData: FlDotData(show: false), - belowBarData: BarAreaData( - show: false, - ), - spots: const [ - FlSpot(1, 80), - FlSpot(2, 50), - FlSpot(3, 90), - FlSpot(4, 40), - FlSpot(5, 80), - FlSpot(6, 35), - FlSpot(7, 60), - ], - ); - - SideTitles get rightTitles => SideTitles( - getTitlesWidget: rightTitleWidgets, - showTitles: true, - interval: 20, - reservedSize: 40, - ); - - Widget rightTitleWidgets(double value, TitleMeta meta) { - String text; - switch (value.toInt()) { - case 0: - text = '0%'; - break; - case 20: - text = '20%'; - break; - case 40: - text = '40%'; - break; - case 60: - text = '60%'; - break; - case 80: - text = '80%'; - break; - case 100: - text = '100%'; - break; - default: - return Container(); - } - - return Text(text, - style: TextStyle( - color: TColor.gray, - fontSize: 12, - ), - textAlign: TextAlign.center); - } - - SideTitles get bottomTitles => SideTitles( - showTitles: true, - reservedSize: 32, - interval: 1, - getTitlesWidget: bottomTitleWidgets, - ); - - Widget bottomTitleWidgets(double value, TitleMeta meta) { - var style = TextStyle( - color: TColor.gray, - fontSize: 12, - ); - Widget text; - switch (value.toInt()) { - case 1: - text = Text('Dim', style: style); - break; - case 2: - text = Text('Lun', style: style); - break; - case 3: - text = Text('Mar', style: style); - break; - case 4: - text = Text('Mer', style: style); - break; - case 5: - text = Text('Jeu', style: style); - break; - case 6: - text = Text('Ven', style: style); - break; - case 7: - text = Text('Sam', style: style); - break; - default: - text = Text('', style: style); - break; - } - - return SideTitleWidget( - axisSide: meta.axisSide, - space: 10, - child: text, - ); - } } From f37e74f6b76225083571b9bc4a53d794cae2372a Mon Sep 17 00:00:00 2001 From: otbenjello Date: Mon, 20 Nov 2023 08:54:34 +0100 Subject: [PATCH 06/11] ajout stats responsive --- .../container/container_stats.dart | 10 +++- .../container/ligne_container_stats.dart | 48 ++++++++++++++++--- lib/view/home/web/web_homeview.dart | 4 +- 3 files changed, 52 insertions(+), 10 deletions(-) diff --git a/lib/common_widget/container/container_stats.dart b/lib/common_widget/container/container_stats.dart index c18f603..e5ce6f0 100644 --- a/lib/common_widget/container/container_stats.dart +++ b/lib/common_widget/container/container_stats.dart @@ -1,11 +1,14 @@ import 'package:flutter/material.dart'; +import 'package:smartfit_app_mobile/common/colo_extension.dart'; +import 'package:smartfit_app_mobile/common_widget/stats.dart'; class ContainerStats extends StatelessWidget { - const ContainerStats(this.value, this.designation, {Key? key}) + const ContainerStats(this.value, this.designation, this.icon, {Key? key}) : super(key: key); final String value; final String designation; + final IconData icon; @override Widget build(BuildContext context) { @@ -29,6 +32,11 @@ class ContainerStats extends StatelessWidget { ]), child: Stack( children: [ + StatIcon( + icon: icon, + iconColor: TColor.white, + iconBackground: TColor.secondaryColor1, + ), Align( alignment: Alignment.bottomLeft, child: Column( diff --git a/lib/common_widget/container/ligne_container_stats.dart b/lib/common_widget/container/ligne_container_stats.dart index 96e35e8..e294767 100644 --- a/lib/common_widget/container/ligne_container_stats.dart +++ b/lib/common_widget/container/ligne_container_stats.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:smartfit_app_mobile/common/colo_extension.dart'; import 'package:smartfit_app_mobile/common_widget/container/container_stats.dart'; class LigneContainerStats extends StatelessWidget { @@ -17,15 +18,48 @@ class LigneContainerStats extends StatelessWidget { @override Widget build(BuildContext context) { - return Row( + return Column( children: [ - const SizedBox(width: 20), - ContainerStats(value1, designation1), - const SizedBox(width: 20), - ContainerStats(value2, designation2), - const SizedBox(width: 20), - ContainerStats(value3, designation3), + Divider(height: 30), + + Padding( + padding: const EdgeInsets.symmetric(horizontal: 30), + child: Row( + children: [ + const Text( + 'Statistiques', + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.w800, + ), + ), + SizedBox(width: 8), + Icon( + Icons.pie_chart_rounded, + size: 15, + color: TColor.secondaryColor1, + ), + ], + ), + ), + + SizedBox(height: 20), + + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const SizedBox(width: 25), + ContainerStats(value1, designation1, Icons.timer ), + const SizedBox(width: 25), + ContainerStats(value2, designation2, Icons.favorite_outline), + const SizedBox(width: 25), + ContainerStats(value3, designation3, Icons.bolt), + ], + ), + Divider(height: 30), ], ); + + } } diff --git a/lib/view/home/web/web_homeview.dart b/lib/view/home/web/web_homeview.dart index 7c04521..038b796 100644 --- a/lib/view/home/web/web_homeview.dart +++ b/lib/view/home/web/web_homeview.dart @@ -55,7 +55,7 @@ class _WebHomeView extends State { SizedBox( height: media.width * 0.05, ), - const LigneContainerStats("1", "2", "3", "s", "s", "s"), + const LigneContainerStats("30 s", "90 BPM", "290 kCal", "Temps", "Heart rate", "Calories"), SizedBox( height: media.width * 0.05, ), @@ -78,7 +78,7 @@ class _WebHomeView extends State { SizedBox( height: media.width * 0.05, ), - const LigneContainerStats("1", "2", "3", "s", "s", "s"), + const LigneContainerStats("30 s", "90 BPM", "290 kCal", "Temps", "Heart rate", "Calories"), SizedBox( height: media.width * 0.05, ), From adf957257c25809651b096fafcef84001afd3d16 Mon Sep 17 00:00:00 2001 From: otbenjello Date: Mon, 20 Nov 2023 10:22:12 +0100 Subject: [PATCH 07/11] correction responsive + ajout vrais stats --- .../container/container_stats.dart | 4 +-- .../container/ligne_container_stats.dart | 24 ++++++++++------- lib/common_widget/graph/bpm_by_time.dart | 2 +- lib/common_widget/stats.dart | 2 +- lib/modele/activity.dart | 26 +++++++++++++++++++ lib/view/activity/web/web_list_activity.dart | 2 +- lib/view/home/mobile/mobile_homeview.dart | 4 +-- lib/view/home/web/web_homeview.dart | 14 +++++++--- pubspec.yaml | 1 + 9 files changed, 60 insertions(+), 19 deletions(-) diff --git a/lib/common_widget/container/container_stats.dart b/lib/common_widget/container/container_stats.dart index e5ce6f0..ff2ddbb 100644 --- a/lib/common_widget/container/container_stats.dart +++ b/lib/common_widget/container/container_stats.dart @@ -13,8 +13,8 @@ class ContainerStats extends StatelessWidget { @override Widget build(BuildContext context) { return Container( - height: 110, - width: 110, + height: 100, + width: 100, padding: const EdgeInsets.all(8), margin: const EdgeInsets.symmetric(vertical: 5), decoration: BoxDecoration( diff --git a/lib/common_widget/container/ligne_container_stats.dart b/lib/common_widget/container/ligne_container_stats.dart index e294767..3f536ff 100644 --- a/lib/common_widget/container/ligne_container_stats.dart +++ b/lib/common_widget/container/ligne_container_stats.dart @@ -5,6 +5,7 @@ import 'package:smartfit_app_mobile/common_widget/container/container_stats.dart class LigneContainerStats extends StatelessWidget { const LigneContainerStats(this.value1, this.value2, this.value3, this.designation1, this.designation2, this.designation3, + this.icon1, this.icon2, this.icon3, {Key? key}) : super(key: key); @@ -16,6 +17,11 @@ class LigneContainerStats extends StatelessWidget { final String designation2; final String designation3; + final IconData icon1; + final IconData icon2; + final IconData icon3; + + @override Widget build(BuildContext context) { return Column( @@ -44,17 +50,17 @@ class LigneContainerStats extends StatelessWidget { ), SizedBox(height: 20), - - Row( + SingleChildScrollView( + scrollDirection: Axis.horizontal, + child:Row( mainAxisAlignment: MainAxisAlignment.center, children: [ - const SizedBox(width: 25), - ContainerStats(value1, designation1, Icons.timer ), - const SizedBox(width: 25), - ContainerStats(value2, designation2, Icons.favorite_outline), - const SizedBox(width: 25), - ContainerStats(value3, designation3, Icons.bolt), - ], + ContainerStats(value1, designation1, icon1), + const SizedBox(width: 20), + ContainerStats(value2, designation2, icon2), + const SizedBox(width: 20), + ContainerStats(value3, designation3, icon3), + ],) ), Divider(height: 30), ], diff --git a/lib/common_widget/graph/bpm_by_time.dart b/lib/common_widget/graph/bpm_by_time.dart index 928f67b..5be0ab6 100644 --- a/lib/common_widget/graph/bpm_by_time.dart +++ b/lib/common_widget/graph/bpm_by_time.dart @@ -80,7 +80,7 @@ class _GraphBpmByTime extends State { return ClipRRect( borderRadius: BorderRadius.circular(25), child: Container( - height: media.width * 0.2, + height: media.height * 0.3, width: double.maxFinite, decoration: BoxDecoration( color: TColor.primaryColor2.withOpacity(0.3), diff --git a/lib/common_widget/stats.dart b/lib/common_widget/stats.dart index 977eb0b..a7c93dd 100644 --- a/lib/common_widget/stats.dart +++ b/lib/common_widget/stats.dart @@ -45,7 +45,7 @@ class Stats extends StatelessWidget { scrollDirection: Axis.horizontal, child: Row( children: [ - const SizedBox(width: 30), + const SizedBox(width: 15), InfoStat( icon: Icons.timer, iconColor: Color.fromARGB(255, 255, 255, 255), diff --git a/lib/modele/activity.dart b/lib/modele/activity.dart index 2b4ff76..37cf1ad 100644 --- a/lib/modele/activity.dart +++ b/lib/modele/activity.dart @@ -97,6 +97,32 @@ class ActivityOfUser { return "null"; } + String getMaxBpm() { + for (int i = 0; i < _contentActivity[_dataSession].length; i++) { + if (_contentActivity[_dataSession][i] == "max_heart_rate") { + return _contentActivity[_dataSession][i + 1].toString(); + } + } + return "null"; + } + String getMinBpm() { + for (int i = 0; i < _contentActivity[_dataSession].length; i++) { + if (_contentActivity[_dataSession][i] == "min_heart_rate") { + return _contentActivity[_dataSession][i + 1].toString(); + } + } + return "null"; + } + + String getAvgBpm() { + for (int i = 0; i < _contentActivity[_dataSession].length; i++) { + if (_contentActivity[_dataSession][i] == "avg_heart_rate") { + return _contentActivity[_dataSession][i + 1].toString(); + } + } + return "null"; + } + String getTotalCalorie() { for (int i = 0; i < _contentActivity[_dataSession].length; i++) { if (_contentActivity[_dataSession][i] == "total_calories") { diff --git a/lib/view/activity/web/web_list_activity.dart b/lib/view/activity/web/web_list_activity.dart index f6d2530..08de8aa 100644 --- a/lib/view/activity/web/web_list_activity.dart +++ b/lib/view/activity/web/web_list_activity.dart @@ -2,7 +2,7 @@ import 'dart:convert'; import 'dart:io'; import 'dart:typed_data'; import 'package:flutter/material.dart'; -import 'dart:html' as html; // Importation des fonctionnalités HTML +import 'package:universal_html/html.dart' as html; import 'package:crypto/crypto.dart'; import 'package:file_picker/file_picker.dart'; diff --git a/lib/view/home/mobile/mobile_homeview.dart b/lib/view/home/mobile/mobile_homeview.dart index 235dc2f..8e7cc54 100644 --- a/lib/view/home/mobile/mobile_homeview.dart +++ b/lib/view/home/mobile/mobile_homeview.dart @@ -52,7 +52,7 @@ class _MobileHomeView extends State { SizedBox( height: media.width * 0.05, ), - const LigneContainerStats("1", "2", "3", "s", "s", "s"), + const LigneContainerStats("1", "2", "3", "Minimum", "Maximum", "Moyenne", Icons.trending_down,Icons.trending_up,Icons.favorite_outline ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ @@ -72,7 +72,7 @@ class _MobileHomeView extends State { SizedBox( height: media.width * 0.05, ), - const LigneContainerStats("1", "2", "3", "s", "s", "s"), + const LigneContainerStats("1", "2", "3", "Minimum", "Maximum", "Moyenne", Icons.trending_down,Icons.trending_up,Icons.favorite_outline ), Container( padding: const EdgeInsets.only(left: 15), height: media.width * 0.5, diff --git a/lib/view/home/web/web_homeview.dart b/lib/view/home/web/web_homeview.dart index 038b796..3f8e2d2 100644 --- a/lib/view/home/web/web_homeview.dart +++ b/lib/view/home/web/web_homeview.dart @@ -1,10 +1,12 @@ import 'package:fl_chart/fl_chart.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:smartfit_app_mobile/common_widget/container/ligne_container_stats.dart'; import 'package:smartfit_app_mobile/common_widget/graph/bpm_and_speed_by_time.dart'; import 'package:smartfit_app_mobile/common_widget/graph/bpm_by_time.dart'; import 'package:smartfit_app_mobile/common_widget/other/entete_home_view.dart'; import 'package:smartfit_app_mobile/common/colo_extension.dart'; +import 'package:smartfit_app_mobile/modele/user.dart'; import 'package:smartfit_app_mobile/modele/utile/home_view/data_home_view.dart'; import 'package:smartfit_app_mobile/modele/utile/home_view/home_view_util.dart'; @@ -19,12 +21,16 @@ class _WebHomeView extends State { late DataHomeView data; TextEditingController bpmController = TextEditingController(); + @override Widget build(BuildContext context) { var media = MediaQuery.of(context).size; + String maxBpm = context.watch().listActivity[0].getMaxBpm(); + String minBpm = context.watch().listActivity[0].getMinBpm(); + String avgBpm = context.watch().listActivity[0].getAvgBpm(); data = HomeViewUtil().initData(context); - + return Scaffold( backgroundColor: TColor.white, body: SingleChildScrollView( @@ -55,7 +61,8 @@ class _WebHomeView extends State { SizedBox( height: media.width * 0.05, ), - const LigneContainerStats("30 s", "90 BPM", "290 kCal", "Temps", "Heart rate", "Calories"), + + LigneContainerStats(maxBpm+ " BPM",minBpm+ " BPM" ,avgBpm+ " BPM", "Minimum", "Maximum", "Moyenne", Icons.trending_down,Icons.trending_up,Icons.favorite_outline), SizedBox( height: media.width * 0.05, ), @@ -78,7 +85,8 @@ class _WebHomeView extends State { SizedBox( height: media.width * 0.05, ), - const LigneContainerStats("30 s", "90 BPM", "290 kCal", "Temps", "Heart rate", "Calories"), + const LigneContainerStats("30 BPM", "90 BPM", "290 BPM", "Minimum", "Maximum", "Moyenne", Icons.trending_down,Icons.trending_up,Icons.favorite_outline), + SizedBox( height: media.width * 0.05, ), diff --git a/pubspec.yaml b/pubspec.yaml index 7c9fbd9..8581686 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -55,6 +55,7 @@ dependencies: tuple: ^2.0.2 crypto: ^3.0.3 responsive_builder: ^0.7.0 + universal_html: ^2.2.4 dev_dependencies: flutter_test: From ae4610ec4173cf56028163e5c3bf86fc6c413c1e Mon Sep 17 00:00:00 2001 From: Enzo Date: Mon, 20 Nov 2023 10:42:14 +0100 Subject: [PATCH 08/11] graph altitude --- lib/common_widget/graph/altitude_by_time.dart | 67 +++++++++++++++++++ lib/common_widget/info.dart | 8 +-- lib/modele/activity.dart | 20 ++++++ .../utile/home_view/data_home_view.dart | 8 +-- .../utile/home_view/home_view_util.dart | 17 ++--- lib/view/activity/web/web_list_activity.dart | 35 +++++----- lib/view/home/mobile/mobile_homeview.dart | 7 +- lib/view/home/web/web_homeview.dart | 7 +- 8 files changed, 126 insertions(+), 43 deletions(-) create mode 100644 lib/common_widget/graph/altitude_by_time.dart diff --git a/lib/common_widget/graph/altitude_by_time.dart b/lib/common_widget/graph/altitude_by_time.dart new file mode 100644 index 0000000..ff8c2b7 --- /dev/null +++ b/lib/common_widget/graph/altitude_by_time.dart @@ -0,0 +1,67 @@ +import 'package:fl_chart/fl_chart.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:smartfit_app_mobile/common/colo_extension.dart'; +import 'package:smartfit_app_mobile/modele/user.dart'; +import 'package:smartfit_app_mobile/modele/utile/home_view/data_home_view.dart'; + +class GraphAltitudeByTime extends StatefulWidget { + final Size media; + final DataHomeView data; + + const GraphAltitudeByTime(this.media, this.data, {Key? key}) + : super(key: key); + + @override + State createState() => _GraphAltitudeByTime(); +} + +class _GraphAltitudeByTime extends State { + @override + Widget build(BuildContext context) { + final double maxY = + context.watch().listActivity[0].getMaxAltitude() + 2; + final double minY = + context.watch().listActivity[0].getMinAltitude() - 2; + + final lineBarsData = [ + LineChartBarData( + spots: widget.data.altitudeSeconde, + isCurved: false, + dotData: const FlDotData(show: false)) + ]; + + return Container( + padding: const EdgeInsets.only(left: 15), + height: widget.media.width * 0.5, + width: double.maxFinite, + child: LineChart(LineChartData( + lineBarsData: lineBarsData, + borderData: FlBorderData(show: false), + maxY: maxY, + minY: minY, + gridData: FlGridData( + drawVerticalLine: false, + drawHorizontalLine: true, + horizontalInterval: 1, + getDrawingHorizontalLine: (value) { + return FlLine( + color: TColor.gray.withOpacity(0.15), + strokeWidth: 2, + ); + }), + titlesData: FlTitlesData( + leftTitles: const AxisTitles(), + topTitles: const AxisTitles(), + bottomTitles: const AxisTitles(), + rightTitles: AxisTitles( + sideTitles: SideTitles( + reservedSize: 50, + showTitles: true, + getTitlesWidget: (value, meta) { + return Text("${value.toInt()} m"); + }, + )), + )))); + } +} diff --git a/lib/common_widget/info.dart b/lib/common_widget/info.dart index bf1b4f3..c82720b 100644 --- a/lib/common_widget/info.dart +++ b/lib/common_widget/info.dart @@ -41,12 +41,12 @@ class Stats extends StatelessWidget { Text.rich( TextSpan( text: value, - style: TextStyle( + style: const TextStyle( fontSize: 20, fontWeight: FontWeight.w900, ), children: [ - TextSpan(text: ' '), + const TextSpan(text: ' '), TextSpan( text: unit, style: TextStyle( @@ -56,10 +56,10 @@ class Stats extends StatelessWidget { ), ]), ), - SizedBox(height: 6), + const SizedBox(height: 6), Text( label, - style: TextStyle( + style: const TextStyle( fontSize: 10, fontWeight: FontWeight.w500, ), diff --git a/lib/modele/activity.dart b/lib/modele/activity.dart index 2b4ff76..569adde 100644 --- a/lib/modele/activity.dart +++ b/lib/modele/activity.dart @@ -133,6 +133,7 @@ class ActivityOfUser { return "null"; } + // ---------------------------------------- Altitude -------------------- // List getAltitudeWithTime() { List result = List.empty(growable: true); int firtTimeStamp = 0; @@ -150,6 +151,25 @@ class ActivityOfUser { return result; } + double getMaxAltitude() { + for (int i = 4; i < _contentActivity[_dataSession].length; i++) { + if (_contentActivity[_dataSession][i] == "max_altitude") { + return _contentActivity[_dataSession][i + 1]; + } + } + return 0.0; + } + + double getMinAltitude() { + for (int i = 4; i < _contentActivity[_dataSession].length; i++) { + if (_contentActivity[_dataSession][i] == "min_altitude") { + return _contentActivity[_dataSession][i + 1]; + } + } + return 0.0; + } + // -------------------------- FIN altitude ---------------------- // + List getSpeedWithTime() { List result = List.empty(growable: true); int firtTimeStamp = 0; diff --git a/lib/modele/utile/home_view/data_home_view.dart b/lib/modele/utile/home_view/data_home_view.dart index cdf14a6..962bc96 100644 --- a/lib/modele/utile/home_view/data_home_view.dart +++ b/lib/modele/utile/home_view/data_home_view.dart @@ -4,10 +4,8 @@ class DataHomeView { late List bpmSecondes; late List bpmSecondes2; late List vitesseSecondes; + late List altitudeSeconde; - DataHomeView( - this.bpmSecondes, - this.bpmSecondes2, - this.vitesseSecondes, - ); + DataHomeView(this.bpmSecondes, this.bpmSecondes2, this.vitesseSecondes, + this.altitudeSeconde); } diff --git a/lib/modele/utile/home_view/home_view_util.dart b/lib/modele/utile/home_view/home_view_util.dart index 44cbe8c..f6591d5 100644 --- a/lib/modele/utile/home_view/home_view_util.dart +++ b/lib/modele/utile/home_view/home_view_util.dart @@ -1,21 +1,22 @@ import 'package:fl_chart/fl_chart.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; +import 'package:smartfit_app_mobile/modele/activity.dart'; import 'package:smartfit_app_mobile/modele/user.dart'; import 'package:smartfit_app_mobile/modele/utile/home_view/data_home_view.dart'; class HomeViewUtil { DataHomeView initData(BuildContext context) { - List bpmSecondes = - Provider.of(context).listActivity[0].getHeartRateWithTime(); - List vitesseSecondes = - Provider.of(context).listActivity[0].getSpeedWithTime(); + ActivityOfUser activity = Provider.of(context).listActivity[0]; + + List bpmSecondes = activity.getHeartRateWithTime(); + List vitesseSecondes = activity.getSpeedWithTime(); + List altitudeSeconde = activity.getAltitudeWithTime(); List bpmSecondes2 = List.from(bpmSecondes); - return DataHomeView( - bpmSecondes, - normaliserDeuxiemeElement(bpmSecondes2), - normaliserDeuxiemeElement(vitesseSecondes)); + + return DataHomeView(bpmSecondes, normaliserDeuxiemeElement(bpmSecondes2), + normaliserDeuxiemeElement(vitesseSecondes), altitudeSeconde); } List normaliserDeuxiemeElement(List liste) { diff --git a/lib/view/activity/web/web_list_activity.dart b/lib/view/activity/web/web_list_activity.dart index f6d2530..c12dc8a 100644 --- a/lib/view/activity/web/web_list_activity.dart +++ b/lib/view/activity/web/web_list_activity.dart @@ -2,7 +2,6 @@ import 'dart:convert'; import 'dart:io'; import 'dart:typed_data'; import 'package:flutter/material.dart'; -import 'dart:html' as html; // Importation des fonctionnalités HTML import 'package:crypto/crypto.dart'; import 'package:file_picker/file_picker.dart'; @@ -30,9 +29,11 @@ class _WebListActivityState extends State { //late File x = File(file.path); List parseFile(Uint8List bytes) { - String csvString = utf8.decode(bytes); // Convertit les bytes en chaîne UTF-8 - List lines = LineSplitter.split(csvString).toList(); // Sépare les lignes - + String csvString = + utf8.decode(bytes); // Convertit les bytes en chaîne UTF-8 + List lines = + LineSplitter.split(csvString).toList(); // Sépare les lignes + for (String line in lines) { print(line); // Affiche chaque ligne du fichier } @@ -40,20 +41,21 @@ class _WebListActivityState extends State { return lines; // Ou retournez les lignes du fichier } - void readFile(html.File file) async { + void readFile() async { + /* ManagerFile x = ManagerFile(); final reader = html.FileReader(); reader.readAsArrayBuffer(file); reader.onLoadEnd.listen((event) { if (reader.readyState == html.FileReader.DONE) { Uint8List bytes = reader.result as Uint8List; - List result = x.readFitFileWeb(bytes) ; + List result = x.readFitFileWeb(bytes); Provider.of(context, listen: false) - .addActivity(ActivityOfUser(file.name, result )); + .addActivity(ActivityOfUser(file.name, result)); } - }); + });*/ } - + List lastWorkoutArr = []; @override @@ -82,15 +84,18 @@ class _WebListActivityState extends State { ), TextButton( onPressed: () async { - html.FileUploadInputElement uploadInput = html.FileUploadInputElement(); + /* + html.FileUploadInputElement uploadInput = + html.FileUploadInputElement(); uploadInput.click(); uploadInput.onChange.listen((e) { final files = uploadInput.files; if (files != null && files.isNotEmpty) { - readFile(files[0]); // Lecture du fichier sélectionné + readFile( + files[0]); // Lecture du fichier sélectionné } - }); + });*/ }, child: Text( "Ajouter", @@ -159,7 +164,5 @@ class _WebListActivityState extends State { ), ), ); - } - - -} \ No newline at end of file + } +} diff --git a/lib/view/home/mobile/mobile_homeview.dart b/lib/view/home/mobile/mobile_homeview.dart index 235dc2f..46e0ed9 100644 --- a/lib/view/home/mobile/mobile_homeview.dart +++ b/lib/view/home/mobile/mobile_homeview.dart @@ -1,6 +1,7 @@ import 'package:fl_chart/fl_chart.dart'; import 'package:flutter/material.dart'; import 'package:smartfit_app_mobile/common_widget/container/ligne_container_stats.dart'; +import 'package:smartfit_app_mobile/common_widget/graph/altitude_by_time.dart'; import 'package:smartfit_app_mobile/common_widget/graph/bpm_and_speed_by_time.dart'; import 'package:smartfit_app_mobile/common_widget/graph/bpm_by_time.dart'; import 'package:smartfit_app_mobile/common_widget/other/entete_home_view.dart'; @@ -73,11 +74,7 @@ class _MobileHomeView extends State { height: media.width * 0.05, ), const LigneContainerStats("1", "2", "3", "s", "s", "s"), - Container( - padding: const EdgeInsets.only(left: 15), - height: media.width * 0.5, - width: double.maxFinite, - child: LineChart(LineChartData())) + GraphAltitudeByTime(media, data) ], ), ), diff --git a/lib/view/home/web/web_homeview.dart b/lib/view/home/web/web_homeview.dart index 7c04521..79e6008 100644 --- a/lib/view/home/web/web_homeview.dart +++ b/lib/view/home/web/web_homeview.dart @@ -1,6 +1,7 @@ import 'package:fl_chart/fl_chart.dart'; import 'package:flutter/material.dart'; import 'package:smartfit_app_mobile/common_widget/container/ligne_container_stats.dart'; +import 'package:smartfit_app_mobile/common_widget/graph/altitude_by_time.dart'; import 'package:smartfit_app_mobile/common_widget/graph/bpm_and_speed_by_time.dart'; import 'package:smartfit_app_mobile/common_widget/graph/bpm_by_time.dart'; import 'package:smartfit_app_mobile/common_widget/other/entete_home_view.dart'; @@ -82,11 +83,7 @@ class _WebHomeView extends State { SizedBox( height: media.width * 0.05, ), - Container( - padding: const EdgeInsets.only(left: 15), - height: media.width * 0.5, - width: double.maxFinite, - child: LineChart(LineChartData())) + GraphAltitudeByTime(media, data) ], ), ), From d098b03ecf38c2de5461db8075fc201aebf212a6 Mon Sep 17 00:00:00 2001 From: otbenjello Date: Mon, 20 Nov 2023 10:42:17 +0100 Subject: [PATCH 09/11] responsive + stat --- lib/common_widget/stats.dart | 29 ------------------- .../utile/home_view/home_view_util.dart | 2 +- lib/view/home/mobile/mobile_homeview.dart | 9 ++++-- lib/view/home/web/web_homeview.dart | 2 +- lib/view/ne_pas_supprimer/home_view.txt | 2 +- 5 files changed, 10 insertions(+), 34 deletions(-) diff --git a/lib/common_widget/stats.dart b/lib/common_widget/stats.dart index a7c93dd..2fcb512 100644 --- a/lib/common_widget/stats.dart +++ b/lib/common_widget/stats.dart @@ -126,7 +126,6 @@ class InfoStat extends StatelessWidget { iconColor: iconColor, iconBackground: iconBackground, ), - Change(time: time), Align( alignment: Alignment.bottomLeft, child: Column( @@ -153,35 +152,7 @@ class InfoStat extends StatelessWidget { } } -class Change extends StatelessWidget { - const Change({ - Key? key, - required this.time, - }) : super(key: key); - final String time; - - @override - Widget build(BuildContext context) { - return Align( - alignment: Alignment.topRight, - child: Container( - padding: const EdgeInsets.symmetric( - vertical: 1, - horizontal: 4, - ), - decoration: BoxDecoration( - color: Colors.green, - borderRadius: BorderRadius.circular(500), - ), - child: Text( - time, - style: const TextStyle(fontSize: 10, color: Colors.white), - ), - ), - ); - } -} class StatIcon extends StatelessWidget { const StatIcon({ diff --git a/lib/modele/utile/home_view/home_view_util.dart b/lib/modele/utile/home_view/home_view_util.dart index 44cbe8c..15e7803 100644 --- a/lib/modele/utile/home_view/home_view_util.dart +++ b/lib/modele/utile/home_view/home_view_util.dart @@ -15,7 +15,7 @@ class HomeViewUtil { return DataHomeView( bpmSecondes, normaliserDeuxiemeElement(bpmSecondes2), - normaliserDeuxiemeElement(vitesseSecondes)); + normaliserDeuxiemeElement(vitesseSecondes),); } List normaliserDeuxiemeElement(List liste) { diff --git a/lib/view/home/mobile/mobile_homeview.dart b/lib/view/home/mobile/mobile_homeview.dart index 8e7cc54..c3d3cc0 100644 --- a/lib/view/home/mobile/mobile_homeview.dart +++ b/lib/view/home/mobile/mobile_homeview.dart @@ -1,10 +1,12 @@ import 'package:fl_chart/fl_chart.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:smartfit_app_mobile/common_widget/container/ligne_container_stats.dart'; import 'package:smartfit_app_mobile/common_widget/graph/bpm_and_speed_by_time.dart'; import 'package:smartfit_app_mobile/common_widget/graph/bpm_by_time.dart'; import 'package:smartfit_app_mobile/common_widget/other/entete_home_view.dart'; import 'package:smartfit_app_mobile/common/colo_extension.dart'; +import 'package:smartfit_app_mobile/modele/user.dart'; import 'package:smartfit_app_mobile/modele/utile/home_view/data_home_view.dart'; import 'package:smartfit_app_mobile/modele/utile/home_view/home_view_util.dart'; @@ -22,7 +24,9 @@ class _MobileHomeView extends State { @override Widget build(BuildContext context) { var media = MediaQuery.of(context).size; - + String maxBpm = context.watch().listActivity[0].getMaxBpm(); + String minBpm = context.watch().listActivity[0].getMinBpm(); + String avgBpm = context.watch().listActivity[0].getAvgBpm(); data = HomeViewUtil().initData(context); return Scaffold( @@ -52,7 +56,8 @@ class _MobileHomeView extends State { SizedBox( height: media.width * 0.05, ), - const LigneContainerStats("1", "2", "3", "Minimum", "Maximum", "Moyenne", Icons.trending_down,Icons.trending_up,Icons.favorite_outline ), + LigneContainerStats(minBpm+ " BPM",maxBpm+ " BPM" ,avgBpm+ " BPM", "Minimum", "Maximum", "Moyenne", Icons.trending_down,Icons.trending_up,Icons.favorite_outline), + Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ diff --git a/lib/view/home/web/web_homeview.dart b/lib/view/home/web/web_homeview.dart index 3f8e2d2..d1e9483 100644 --- a/lib/view/home/web/web_homeview.dart +++ b/lib/view/home/web/web_homeview.dart @@ -62,7 +62,7 @@ class _WebHomeView extends State { height: media.width * 0.05, ), - LigneContainerStats(maxBpm+ " BPM",minBpm+ " BPM" ,avgBpm+ " BPM", "Minimum", "Maximum", "Moyenne", Icons.trending_down,Icons.trending_up,Icons.favorite_outline), + LigneContainerStats(minBpm+ " BPM",maxBpm+ " BPM" ,avgBpm+ " BPM", "Minimum", "Maximum", "Moyenne", Icons.trending_down,Icons.trending_up,Icons.favorite_outline), SizedBox( height: media.width * 0.05, ), diff --git a/lib/view/ne_pas_supprimer/home_view.txt b/lib/view/ne_pas_supprimer/home_view.txt index f89fb10..0cb05f6 100644 --- a/lib/view/ne_pas_supprimer/home_view.txt +++ b/lib/view/ne_pas_supprimer/home_view.txt @@ -264,7 +264,7 @@ class _MobileHomeView extends State { title: "Voir", type: RoundButtonType.bgGradient, fontSize: 12, - fontWeight: FontWeight.w400, + fontWeight: FontWeight.w0, onPressed: () { Navigator.push( context, From d4728f0dc4aedff4ba1ece7103780ea15c52d6a8 Mon Sep 17 00:00:00 2001 From: Enzo Date: Mon, 20 Nov 2023 10:53:12 +0100 Subject: [PATCH 10/11] micro change --- .../activity/mobile/mobile_Activity_view.dart | 1 - lib/view/activity/web/web_list_activity.dart | 16 ++++------- lib/view/home/mobile/mobile_homeview.dart | 21 ++++++++++---- lib/view/home/web/web_homeview.dart | 28 ++++++++++++++----- 4 files changed, 42 insertions(+), 24 deletions(-) diff --git a/lib/view/activity/mobile/mobile_Activity_view.dart b/lib/view/activity/mobile/mobile_Activity_view.dart index 85c2d9a..273f6be 100644 --- a/lib/view/activity/mobile/mobile_Activity_view.dart +++ b/lib/view/activity/mobile/mobile_Activity_view.dart @@ -4,7 +4,6 @@ import 'package:smartfit_app_mobile/common_widget/graph/graph.dart'; import 'package:smartfit_app_mobile/common_widget/info.dart' hide Stats; import 'package:smartfit_app_mobile/common_widget/stats.dart'; import 'package:flutter/material.dart'; -import 'package:smartfit_app_mobile/modele/user.dart'; class MobileActivity extends StatelessWidget { const MobileActivity({Key? key}) : super(key: key); diff --git a/lib/view/activity/web/web_list_activity.dart b/lib/view/activity/web/web_list_activity.dart index 3d7cc62..cebb8c8 100644 --- a/lib/view/activity/web/web_list_activity.dart +++ b/lib/view/activity/web/web_list_activity.dart @@ -1,21 +1,17 @@ import 'dart:convert'; -import 'dart:io'; import 'dart:typed_data'; import 'package:flutter/material.dart'; +import 'package:smartfit_app_mobile/modele/manager_file.dart'; import 'package:universal_html/html.dart' as html; -import 'package:crypto/crypto.dart'; import 'package:file_picker/file_picker.dart'; import 'package:provider/provider.dart'; import 'package:smartfit_app_mobile/common/colo_extension.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/activity.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:flutter/material.dart'; -import 'package:tuple/tuple.dart'; class WebListActivity extends StatefulWidget { const WebListActivity({super.key}); @@ -42,8 +38,7 @@ class _WebListActivityState extends State { return lines; // Ou retournez les lignes du fichier } - void readFile() async { - /* + void readFile(html.File file) async { ManagerFile x = ManagerFile(); final reader = html.FileReader(); reader.readAsArrayBuffer(file); @@ -54,7 +49,7 @@ class _WebListActivityState extends State { Provider.of(context, listen: false) .addActivity(ActivityOfUser(file.name, result)); } - });*/ + }); } List lastWorkoutArr = []; @@ -72,7 +67,7 @@ class _WebListActivityState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - SizedBox(height: 20), + const SizedBox(height: 20), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ @@ -85,7 +80,6 @@ class _WebListActivityState extends State { ), TextButton( onPressed: () async { - /* html.FileUploadInputElement uploadInput = html.FileUploadInputElement(); uploadInput.click(); @@ -96,7 +90,7 @@ class _WebListActivityState extends State { readFile( files[0]); // Lecture du fichier sélectionné } - });*/ + }); }, child: Text( "Ajouter", diff --git a/lib/view/home/mobile/mobile_homeview.dart b/lib/view/home/mobile/mobile_homeview.dart index 9fd8957..f8a23cc 100644 --- a/lib/view/home/mobile/mobile_homeview.dart +++ b/lib/view/home/mobile/mobile_homeview.dart @@ -1,4 +1,3 @@ -import 'package:fl_chart/fl_chart.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:smartfit_app_mobile/common_widget/container/ligne_container_stats.dart'; @@ -58,9 +57,9 @@ class _MobileHomeView extends State { height: media.width * 0.05, ), LigneContainerStats( - minBpm + " BPM", - maxBpm + " BPM", - avgBpm + " BPM", + "$minBpm BPM", + "$maxBpm BPM", + "$avgBpm BPM", "Minimum", "Maximum", "Moyenne", @@ -86,7 +85,19 @@ class _MobileHomeView extends State { SizedBox( height: media.width * 0.05, ), - const LigneContainerStats("1", "2", "3", "s", "s", "s"), + const LigneContainerStats( + "30 BPM", + "90 BPM", + "290 BPM", + "Minimum", + "Maximum", + "Moyenne", + Icons.trending_down, + Icons.trending_up, + Icons.favorite_outline), + SizedBox( + height: media.width * 0.05, + ), GraphAltitudeByTime(media, data) ], ), diff --git a/lib/view/home/web/web_homeview.dart b/lib/view/home/web/web_homeview.dart index 943b35f..0976901 100644 --- a/lib/view/home/web/web_homeview.dart +++ b/lib/view/home/web/web_homeview.dart @@ -1,4 +1,3 @@ -import 'package:fl_chart/fl_chart.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:smartfit_app_mobile/common_widget/container/ligne_container_stats.dart'; @@ -22,7 +21,6 @@ class _WebHomeView extends State { late DataHomeView data; TextEditingController bpmController = TextEditingController(); - @override Widget build(BuildContext context) { var media = MediaQuery.of(context).size; @@ -31,7 +29,7 @@ class _WebHomeView extends State { String avgBpm = context.watch().listActivity[0].getAvgBpm(); data = HomeViewUtil().initData(context); - + return Scaffold( backgroundColor: TColor.white, body: SingleChildScrollView( @@ -62,8 +60,16 @@ class _WebHomeView extends State { SizedBox( height: media.width * 0.05, ), - - LigneContainerStats(minBpm+ " BPM",maxBpm+ " BPM" ,avgBpm+ " BPM", "Minimum", "Maximum", "Moyenne", Icons.trending_down,Icons.trending_up,Icons.favorite_outline), + LigneContainerStats( + "$minBpm BPM", + "$maxBpm BPM", + "$avgBpm BPM", + "Minimum", + "Maximum", + "Moyenne", + Icons.trending_down, + Icons.trending_up, + Icons.favorite_outline), SizedBox( height: media.width * 0.05, ), @@ -86,8 +92,16 @@ class _WebHomeView extends State { SizedBox( height: media.width * 0.05, ), - const LigneContainerStats("30 BPM", "90 BPM", "290 BPM", "Minimum", "Maximum", "Moyenne", Icons.trending_down,Icons.trending_up,Icons.favorite_outline), - + const LigneContainerStats( + "30 BPM", + "90 BPM", + "290 BPM", + "Minimum", + "Maximum", + "Moyenne", + Icons.trending_down, + Icons.trending_up, + Icons.favorite_outline), SizedBox( height: media.width * 0.05, ), From 421398f96e751ce4455a15ce244cef8473f0b678 Mon Sep 17 00:00:00 2001 From: Enzo Date: Mon, 20 Nov 2023 15:36:33 +0100 Subject: [PATCH 11/11] Home + Maps --- lib/common_widget/graph/altitude_by_time.dart | 9 +- lib/common_widget/stats.dart | 5 +- lib/modele/activity.dart | 134 +++++++++------ lib/modele/utile/maps/maps_utile.dart | 16 ++ lib/view/home/mobile/mobile_homeview.dart | 56 +++++-- lib/view/home/web/web_homeview.dart | 33 ++-- lib/view/map/mobile/mobile_my_map.dart | 46 ++++++ lib/view/map/my_map.dart | 155 ++---------------- lib/view/map/web/web_my_map.dart | 47 ++++++ lib/view/ne_pas_supprimer/map.txt | 131 +++++++++++++++ web/index.html | 3 + 11 files changed, 421 insertions(+), 214 deletions(-) create mode 100644 lib/modele/utile/maps/maps_utile.dart create mode 100644 lib/view/map/mobile/mobile_my_map.dart create mode 100644 lib/view/map/web/web_my_map.dart create mode 100644 lib/view/ne_pas_supprimer/map.txt diff --git a/lib/common_widget/graph/altitude_by_time.dart b/lib/common_widget/graph/altitude_by_time.dart index ff8c2b7..fcdd9ca 100644 --- a/lib/common_widget/graph/altitude_by_time.dart +++ b/lib/common_widget/graph/altitude_by_time.dart @@ -28,6 +28,9 @@ class _GraphAltitudeByTime extends State { LineChartBarData( spots: widget.data.altitudeSeconde, isCurved: false, + gradient: LinearGradient( + colors: TColor.primaryG, + ), dotData: const FlDotData(show: false)) ]; @@ -43,7 +46,7 @@ class _GraphAltitudeByTime extends State { gridData: FlGridData( drawVerticalLine: false, drawHorizontalLine: true, - horizontalInterval: 1, + horizontalInterval: (maxY - minY) / 5, getDrawingHorizontalLine: (value) { return FlLine( color: TColor.gray.withOpacity(0.15), @@ -56,10 +59,10 @@ class _GraphAltitudeByTime extends State { bottomTitles: const AxisTitles(), rightTitles: AxisTitles( sideTitles: SideTitles( - reservedSize: 50, + reservedSize: 60, showTitles: true, getTitlesWidget: (value, meta) { - return Text("${value.toInt()} m"); + return Text("${double.parse(value.toStringAsFixed(2))} m"); }, )), )))); diff --git a/lib/common_widget/stats.dart b/lib/common_widget/stats.dart index 2fcb512..1591d68 100644 --- a/lib/common_widget/stats.dart +++ b/lib/common_widget/stats.dart @@ -13,7 +13,8 @@ class Stats extends StatelessWidget { .getTotalCalorie(); String heartrate = Provider.of(context, listen: false) .listActivity[0] - .getTotalAvgHeartRate(); + .getAvgBpm() + .toString(); String time = Provider.of(context, listen: false) .listActivity[0] .getTotalTime(); @@ -152,8 +153,6 @@ class InfoStat extends StatelessWidget { } } - - class StatIcon extends StatelessWidget { const StatIcon({ Key? key, diff --git a/lib/modele/activity.dart b/lib/modele/activity.dart index bb525cb..6e7d6ca 100644 --- a/lib/modele/activity.dart +++ b/lib/modele/activity.dart @@ -1,4 +1,5 @@ import 'package:fl_chart/fl_chart.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:smartfit_app_mobile/common_widget/graph/graph.dart'; class ActivityOfUser { @@ -27,6 +28,7 @@ class ActivityOfUser { return 0; } + // ----------------- BPM ------------------ // List getHeartRateWithTime() { List result = List.empty(growable: true); int firtTimeStamp = 0; @@ -53,6 +55,35 @@ class ActivityOfUser { return result; } + int getMaxBpm() { + for (int i = 0; i < _contentActivity[_dataSession].length; i++) { + if (_contentActivity[_dataSession][i] == "max_heart_rate") { + return _contentActivity[_dataSession][i + 1]; + } + } + return 0; + } + + int getMinBpm() { + for (int i = 0; i < _contentActivity[_dataSession].length; i++) { + if (_contentActivity[_dataSession][i] == "min_heart_rate") { + return _contentActivity[_dataSession][i + 1]; + } + } + return 0; + } + + int getAvgBpm() { + for (int i = 0; i < _contentActivity[_dataSession].length; i++) { + if (_contentActivity[_dataSession][i] == "avg_heart_rate") { + return _contentActivity[_dataSession][i + 1]; + } + } + return 0; + } + // -------------------------- FIN BPM ---------------------- // + + // ---------------------- Distance ---------------------- // List getDistanceWithTime() { List result = List.empty(growable: true); int firtTimeStamp = 0; @@ -70,6 +101,18 @@ class ActivityOfUser { return result; } + String getTotalDistance() { + for (int i = 0; i < _contentActivity[_dataSession].length; i++) { + if (_contentActivity[_dataSession][i] == "total_distance") { + return _contentActivity[_dataSession][i + 1].toString(); + } + } + return "null"; + } + + // ---------------------- FIN Distance ---------------------- // + + // ---------------------- Calories ---------------------- // List getCalories() { List result = List.empty(growable: true); int firtTimeStamp = 0; @@ -88,41 +131,6 @@ class ActivityOfUser { return result; } - String getTotalSteps() { - for (int i = 0; i < _contentActivity[_dataSession].length; i++) { - if (_contentActivity[_dataSession][i] == "total_strides") { - return _contentActivity[_dataSession][i + 1].toString(); - } - } - return "null"; - } - - String getMaxBpm() { - for (int i = 0; i < _contentActivity[_dataSession].length; i++) { - if (_contentActivity[_dataSession][i] == "max_heart_rate") { - return _contentActivity[_dataSession][i + 1].toString(); - } - } - return "null"; - } - String getMinBpm() { - for (int i = 0; i < _contentActivity[_dataSession].length; i++) { - if (_contentActivity[_dataSession][i] == "min_heart_rate") { - return _contentActivity[_dataSession][i + 1].toString(); - } - } - return "null"; - } - - String getAvgBpm() { - for (int i = 0; i < _contentActivity[_dataSession].length; i++) { - if (_contentActivity[_dataSession][i] == "avg_heart_rate") { - return _contentActivity[_dataSession][i + 1].toString(); - } - } - return "null"; - } - String getTotalCalorie() { for (int i = 0; i < _contentActivity[_dataSession].length; i++) { if (_contentActivity[_dataSession][i] == "total_calories") { @@ -132,15 +140,20 @@ class ActivityOfUser { return "null"; } - String getTotalAvgHeartRate() { + // ---------------------- FIN Calories ---------------------- // + + // ---------------------- Step ------------------------------// + String getTotalSteps() { for (int i = 0; i < _contentActivity[_dataSession].length; i++) { - if (_contentActivity[_dataSession][i] == "avg_heart_rate") { + if (_contentActivity[_dataSession][i] == "total_strides") { return _contentActivity[_dataSession][i + 1].toString(); } } return "null"; } + // ----------------------- FIN Step ------------------------ // + // ------------------------- Time ----------------------------- // String getTotalTime() { for (int i = 0; i < _contentActivity[_dataSession].length; i++) { if (_contentActivity[_dataSession][i] == "total_elapsed_time") { @@ -149,15 +162,7 @@ class ActivityOfUser { } return "null"; } - - String getTotalDistance() { - for (int i = 0; i < _contentActivity[_dataSession].length; i++) { - if (_contentActivity[_dataSession][i] == "total_distance") { - return _contentActivity[_dataSession][i + 1].toString(); - } - } - return "null"; - } + // ---------------------------- FIN time -------------------- // // ---------------------------------------- Altitude -------------------- // List getAltitudeWithTime() { @@ -196,6 +201,8 @@ class ActivityOfUser { } // -------------------------- FIN altitude ---------------------- // + // -------------------------- Speed ---------------------- // + List getSpeedWithTime() { List result = List.empty(growable: true); int firtTimeStamp = 0; @@ -244,6 +251,41 @@ class ActivityOfUser { return result; } + double getMaxSpeed() { + for (int i = 4; i < _contentActivity[_dataSession].length; i++) { + if (_contentActivity[_dataSession][i] == "max_speed") { + return _contentActivity[_dataSession][i + 1]; + } + } + return 0.0; + } + + double getAvgSpeed() { + for (int i = 4; i < _contentActivity[_dataSession].length; i++) { + if (_contentActivity[_dataSession][i] == "avg_speed") { + return _contentActivity[_dataSession][i + 1]; + } + } + return 0.0; + } + + // -------------------------- FIN Speed ---------------------- // + + // -------------------------- Localisation ------------------- // + + List getPosition() { + List list = List.empty(growable: true); + + for (List ligne in _contentActivity) { + if (ligne[0] == "Data" && ligne[6] == "position_lat") { + list.add(LatLng(ligne[7], ligne[10])); + } + } + return list; + } + + // -------------------------- FIN Localisation ---------------------- // + Map toMap() { return { 'nomActivite': _nomActivite, diff --git a/lib/modele/utile/maps/maps_utile.dart b/lib/modele/utile/maps/maps_utile.dart new file mode 100644 index 0000000..e74c450 --- /dev/null +++ b/lib/modele/utile/maps/maps_utile.dart @@ -0,0 +1,16 @@ +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:provider/provider.dart'; +import 'package:smartfit_app_mobile/modele/user.dart'; + +class MapUtil { + Set initPolines(BuildContext context, int largueur, Color couleur) { + Set _polylines = {}; + _polylines.add(Polyline( + polylineId: const PolylineId("Polyline"), + color: couleur, + points: context.watch().listActivity[0].getPosition(), + width: largueur)); + return _polylines; + } +} diff --git a/lib/view/home/mobile/mobile_homeview.dart b/lib/view/home/mobile/mobile_homeview.dart index f8a23cc..b051c31 100644 --- a/lib/view/home/mobile/mobile_homeview.dart +++ b/lib/view/home/mobile/mobile_homeview.dart @@ -24,9 +24,18 @@ class _MobileHomeView extends State { @override Widget build(BuildContext context) { var media = MediaQuery.of(context).size; - String maxBpm = context.watch().listActivity[0].getMaxBpm(); - String minBpm = context.watch().listActivity[0].getMinBpm(); - String avgBpm = context.watch().listActivity[0].getAvgBpm(); + // -- BPM -- // + int maxBpm = context.watch().listActivity[0].getMaxBpm(); + int minBpm = context.watch().listActivity[0].getMinBpm(); + int avgBpm = context.watch().listActivity[0].getAvgBpm(); + // -- Altitude -- // + double minAltitude = context.watch().listActivity[0].getMinAltitude(); + double maxAltitude = context.watch().listActivity[0].getMaxAltitude(); + double avgAltitude = (maxAltitude + minAltitude) / 2; + // -- Speed -- // + double maxSpeed = context.watch().listActivity[0].getMaxSpeed(); + double avgSpeed = context.watch().listActivity[0].getAvgSpeed(); + data = HomeViewUtil().initData(context); return Scaffold( @@ -57,9 +66,9 @@ class _MobileHomeView extends State { height: media.width * 0.05, ), LigneContainerStats( - "$minBpm BPM", - "$maxBpm BPM", - "$avgBpm BPM", + "${minBpm.toString()} BPM", + "${maxBpm.toString()} BPM", + "${avgBpm.toString()} BPM", "Minimum", "Maximum", "Moyenne", @@ -85,10 +94,36 @@ class _MobileHomeView extends State { SizedBox( height: media.width * 0.05, ), - const LigneContainerStats( - "30 BPM", - "90 BPM", - "290 BPM", + LigneContainerStats( + "${double.parse(maxSpeed.toStringAsFixed(2))} KM/H", + "${double.parse(avgSpeed.toStringAsFixed(2))} km/H", + "${avgBpm.toString()} BPM", + "Max Speed", + "Moyenne Speed", + "Moyenne BPM", + Icons.trending_down, + Icons.trending_up, + Icons.favorite_outline), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "Altitude", + style: TextStyle( + color: TColor.black, + fontSize: 16, + fontWeight: FontWeight.w700), + ), + ], + ), + SizedBox( + height: media.width * 0.05, + ), + GraphAltitudeByTime(media, data), + LigneContainerStats( + "${minAltitude.toInt()} M", + "${maxAltitude.toInt()} M", + "${avgAltitude.toInt()} M", "Minimum", "Maximum", "Moyenne", @@ -98,7 +133,6 @@ class _MobileHomeView extends State { SizedBox( height: media.width * 0.05, ), - GraphAltitudeByTime(media, data) ], ), ), diff --git a/lib/view/home/web/web_homeview.dart b/lib/view/home/web/web_homeview.dart index 0976901..adeff48 100644 --- a/lib/view/home/web/web_homeview.dart +++ b/lib/view/home/web/web_homeview.dart @@ -24,9 +24,17 @@ class _WebHomeView extends State { @override Widget build(BuildContext context) { var media = MediaQuery.of(context).size; - String maxBpm = context.watch().listActivity[0].getMaxBpm(); - String minBpm = context.watch().listActivity[0].getMinBpm(); - String avgBpm = context.watch().listActivity[0].getAvgBpm(); + // -- BPM -- // + int maxBpm = context.watch().listActivity[0].getMaxBpm(); + int minBpm = context.watch().listActivity[0].getMinBpm(); + int avgBpm = context.watch().listActivity[0].getAvgBpm(); + // -- Altitude -- // + double minAltitude = context.watch().listActivity[0].getMinAltitude(); + double maxAltitude = context.watch().listActivity[0].getMaxAltitude(); + double avgAltitude = (maxAltitude + minAltitude) / 2; + // -- Speed -- // + double maxSpeed = context.watch().listActivity[0].getMaxSpeed(); + double avgSpeed = context.watch().listActivity[0].getAvgSpeed(); data = HomeViewUtil().initData(context); @@ -61,9 +69,9 @@ class _WebHomeView extends State { height: media.width * 0.05, ), LigneContainerStats( - "$minBpm BPM", - "$maxBpm BPM", - "$avgBpm BPM", + "${double.parse(maxSpeed.toStringAsFixed(2))} KM/H", + "${double.parse(avgSpeed.toStringAsFixed(2))} km/H", + "${avgBpm.toString()} BPM", "Minimum", "Maximum", "Moyenne", @@ -92,10 +100,10 @@ class _WebHomeView extends State { SizedBox( height: media.width * 0.05, ), - const LigneContainerStats( - "30 BPM", - "90 BPM", - "290 BPM", + LigneContainerStats( + "${minAltitude.toInt()} M", + "${maxAltitude.toInt()} M", + "${avgAltitude.toInt()} M", "Minimum", "Maximum", "Moyenne", @@ -105,7 +113,10 @@ class _WebHomeView extends State { SizedBox( height: media.width * 0.05, ), - GraphAltitudeByTime(media, data) + GraphAltitudeByTime(media, data), + SizedBox( + height: media.width * 0.05, + ), ], ), ), diff --git a/lib/view/map/mobile/mobile_my_map.dart b/lib/view/map/mobile/mobile_my_map.dart new file mode 100644 index 0000000..a3b35dc --- /dev/null +++ b/lib/view/map/mobile/mobile_my_map.dart @@ -0,0 +1,46 @@ +import 'dart:async'; +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:smartfit_app_mobile/common/colo_extension.dart'; +import 'package:smartfit_app_mobile/modele/utile/maps/maps_utile.dart'; + +class MobileMyMaps extends StatefulWidget { + const MobileMyMaps({super.key}); + + @override + State createState() => _MobileMyMaps(); +} + +class _MobileMyMaps extends State { + final Completer _googleMapController = Completer(); + CameraPosition? _cameraPosition; + Set _polylines = {}; + + @override + Widget build(BuildContext context) { + _polylines = MapUtil().initPolines(context, 10, TColor.primaryColor1); + _cameraPosition = + CameraPosition(target: _polylines.first.points.first, zoom: 18); + + return Scaffold( + body: _getMap(), + ); + } + + Widget _getMap() { + return Stack( + children: [ + GoogleMap( + initialCameraPosition: _cameraPosition!, + mapType: MapType.normal, + onMapCreated: (GoogleMapController controller) { + if (!_googleMapController.isCompleted) { + _googleMapController.complete(controller); + } + }, + polylines: _polylines, + ) + ], + ); + } +} diff --git a/lib/view/map/my_map.dart b/lib/view/map/my_map.dart index 272fe38..64b3609 100644 --- a/lib/view/map/my_map.dart +++ b/lib/view/map/my_map.dart @@ -1,154 +1,29 @@ -import 'dart:async'; - import 'package:flutter/material.dart'; -import 'package:google_maps_flutter/google_maps_flutter.dart'; -import 'package:location/location.dart'; -import 'package:smartfit_app_mobile/common/colo_extension.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/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); + const MyMap({Key? key}) : super(key: key); @override State createState() => _MyMapState(); } class _MyMapState extends State { - - Completer _googleMapController = Completer(); - CameraPosition? _cameraPosition; - Location? _location; - LocationData? _currentLocation; - List _polylineCoordinates = []; - Set _polylines = {}; - Set _markers = {}; // Add a set to store markers - - @override - void initState() { - _init(); - super.initState(); - } - - _init() async { - _location = Location(); - _cameraPosition = CameraPosition( - target: LatLng(0, 0), // this is just the example lat and lng for initializing - zoom: 20 - ); - _initLocation(); - } - - //function to listen when we move position - _initLocation() { - - _location?.getLocation().then((location) { - _currentLocation = location; - }); - - _location?.onLocationChanged.listen((newLocation) { - setState(() { - _currentLocation = newLocation; - _polylineCoordinates.add(LatLng( - _currentLocation?.latitude ?? 0, - _currentLocation?.longitude ?? 0, - )); - _updatePolyline(); - - }); - - moveToPosition(LatLng(_currentLocation?.latitude ?? 0, - _currentLocation?.longitude ?? 0)); - }); - } - - _updatePolyline() { - setState(() { - _polylines.clear(); - _polylines.add(Polyline( - polylineId: PolylineId("polyline"), - color: TColor.primaryColor1, - points: _polylineCoordinates, - width: 10, - )); - }); - } - - // Updated _updateMarker to use the custom marker - _updateMarker(LatLng position) async { - final markerId = MarkerId('marker'); - final marker = Marker( - markerId: markerId, - position: position - ); - _markers.clear(); - _markers.add(marker); -} - - - moveToPosition(LatLng latLng) async { - GoogleMapController mapController = await _googleMapController.future; - mapController.animateCamera( - CameraUpdate.newCameraPosition( - CameraPosition( - target: latLng, - zoom: 15 - ) - ) - ); - } - @override Widget build(BuildContext context) { - return Scaffold( - body: _buildBody(), - ); - } - - Widget _buildBody() { - return _getMap(); - } - - Widget _getMarker() { - return Container( - width: 25, - height: 25, - padding: EdgeInsets.all(2), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(100), - boxShadow: [ - BoxShadow( - color: Colors.grey, - offset: Offset(0,3), - spreadRadius: 4, - blurRadius: 6 - ) - ] - ), - child: ClipOval(child: Image.asset("assets/img/u1.png")), - ); - } - - Widget _getMap() { - return Stack( - children: [ - GoogleMap( - initialCameraPosition: _cameraPosition!, - mapType: MapType.normal, - onMapCreated: (GoogleMapController controller) { - if (!_googleMapController.isCompleted) { - _googleMapController.complete(controller); - } - }, - polylines: _polylines, - markers: _markers, - ), - Positioned.fill( - child: Align( - alignment: Alignment.center, - child: _getMarker() + return context.watch().listActivity.isEmpty + ? ScreenTypeLayout.builder( + mobile: (_) => const ProfileView(), + desktop: (_) => const ProfileView(), ) - ) - ], - ); + : ScreenTypeLayout.builder( + mobile: (_) => const MobileMyMaps(), + desktop: (_) => const WebMyMaps(), + ); } } diff --git a/lib/view/map/web/web_my_map.dart b/lib/view/map/web/web_my_map.dart new file mode 100644 index 0000000..6c4517a --- /dev/null +++ b/lib/view/map/web/web_my_map.dart @@ -0,0 +1,47 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:smartfit_app_mobile/common/colo_extension.dart'; +import 'package:smartfit_app_mobile/modele/utile/maps/maps_utile.dart'; + +class WebMyMaps extends StatefulWidget { + const WebMyMaps({super.key}); + + @override + State createState() => _WebMyMaps(); +} + +class _WebMyMaps extends State { + final Completer _googleMapController = Completer(); + CameraPosition? _cameraPosition; + Set _polylines = {}; + + @override + Widget build(BuildContext context) { + _polylines = MapUtil().initPolines(context, 10, TColor.primaryColor1); + _cameraPosition = + CameraPosition(target: _polylines.first.points.first, zoom: 18); + + return Scaffold( + body: _getMap(), + ); + } + + Widget _getMap() { + return Stack( + children: [ + GoogleMap( + initialCameraPosition: _cameraPosition!, + mapType: MapType.normal, + onMapCreated: (GoogleMapController controller) { + if (!_googleMapController.isCompleted) { + _googleMapController.complete(controller); + } + }, + polylines: _polylines, + ) + ], + ); + } +} diff --git a/lib/view/ne_pas_supprimer/map.txt b/lib/view/ne_pas_supprimer/map.txt new file mode 100644 index 0000000..c1e6fa5 --- /dev/null +++ b/lib/view/ne_pas_supprimer/map.txt @@ -0,0 +1,131 @@ +import 'dart:async'; +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:location/location.dart'; +import 'package:smartfit_app_mobile/common/colo_extension.dart'; + +class MobileMyMaps extends StatefulWidget { + const MobileMyMaps({super.key}); + + @override + State createState() => _MobileMyMaps(); +} + +class _MobileMyMaps extends State { + Completer _googleMapController = Completer(); + CameraPosition? _cameraPosition; + Location? _location; + LocationData? _currentLocation; + List _polylineCoordinates = []; + Set _polylines = {}; + Set _markers = {}; // Add a set to store markers + + @override + void initState() { + _init(); + super.initState(); + } + + _init() async { + _location = Location(); + _cameraPosition = const CameraPosition( + target: LatLng( + 0, 0), // this is just the example lat and lng for initializing + zoom: 20); + _initLocation(); + } + + //function to listen when we move position + _initLocation() { + _location?.getLocation().then((location) { + _currentLocation = location; + }); + + _location?.onLocationChanged.listen((newLocation) { + setState(() { + _currentLocation = newLocation; + _polylineCoordinates.add(LatLng( + _currentLocation?.latitude ?? 0, + _currentLocation?.longitude ?? 0, + )); + _updatePolyline(); + }); + + moveToPosition(LatLng( + _currentLocation?.latitude ?? 0, _currentLocation?.longitude ?? 0)); + }); + } + + _updatePolyline() { + setState(() { + _polylines.clear(); + _polylines.add(Polyline( + polylineId: PolylineId("polyline"), + color: TColor.primaryColor1, + points: _polylineCoordinates, + width: 10, + )); + }); + } + + /* + // Updated _updateMarker to use the custom marker + _updateMarker(LatLng position) async { + final markerId = MarkerId('marker'); + final marker = Marker(markerId: markerId, position: position); + _markers.clear(); + _markers.add(marker); + }*/ + + moveToPosition(LatLng latLng) async { + GoogleMapController mapController = await _googleMapController.future; + mapController.animateCamera(CameraUpdate.newCameraPosition( + CameraPosition(target: latLng, zoom: 15))); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: _getMap(), + ); + } + + Widget _getMarker() { + return Container( + width: 25, + height: 25, + padding: EdgeInsets.all(2), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(100), + boxShadow: [ + BoxShadow( + color: Colors.grey, + offset: Offset(0, 3), + spreadRadius: 4, + blurRadius: 6) + ]), + child: ClipOval(child: Image.asset("assets/img/u1.png")), + ); + } + + Widget _getMap() { + return Stack( + children: [ + GoogleMap( + initialCameraPosition: _cameraPosition!, + mapType: MapType.normal, + onMapCreated: (GoogleMapController controller) { + if (!_googleMapController.isCompleted) { + _googleMapController.complete(controller); + } + }, + polylines: _polylines, + markers: _markers, + ), + Positioned.fill( + child: Align(alignment: Alignment.center, child: _getMarker())) + ], + ); + } +} diff --git a/web/index.html b/web/index.html index 04a3091..ac02418 100644 --- a/web/index.html +++ b/web/index.html @@ -26,6 +26,9 @@ + + +