From 75cf385d53cd3999c4ddebeb28381fe01316f004 Mon Sep 17 00:00:00 2001 From: otbenjello Date: Mon, 27 Nov 2023 11:15:13 +0100 Subject: [PATCH] home page with all graphs --- .../container/container_stats.dart | 57 +---- .../container/ligne_container_stats.dart | 54 +---- .../mobile/mobile_container_stats.dart | 64 +++++ .../mobile/mobile_ligne_container_stats.dart | 71 ++++++ .../container/web/web_container_stats.dart | 64 +++++ .../web/web_ligne_container_stats.dart | 69 ++++++ lib/common_widget/graph/altitude_by_time.dart | 58 +---- .../graph/bpm_and_speed_by_time.dart | 213 +---------------- lib/common_widget/graph/bpm_by_time.dart | 213 +---------------- .../graph/mobile/mobile_altitude_by_time.dart | 70 ++++++ .../graph/mobile/mobile_bpm_by_time.dart | 83 +++++++ .../graph/web/web_altitude_by_time.dart | 70 ++++++ .../graph/web/web_bpm_and_speed_by_time.dart | 225 ++++++++++++++++++ .../graph/web/web_bpm_by_time.dart | 83 +++++++ lib/common_widget/stats.dart | 4 +- lib/main.dart | 1 + lib/modele/activity.dart | 33 ++- .../utile/home_view/home_view_util.dart | 3 +- lib/view/home/mobile/mobile_homeview.dart | 6 +- lib/view/home/web/web_homeview.dart | 54 +++-- lib/view/main_tab/main_tab_view.dart | 109 +-------- .../main_tab/mobile/mobile_main_tab_view.dart | 121 ++++++++++ lib/view/main_tab/web/web_main_tab_view.dart | 141 +++++++++++ 23 files changed, 1191 insertions(+), 675 deletions(-) create mode 100644 lib/common_widget/container/mobile/mobile_container_stats.dart create mode 100644 lib/common_widget/container/mobile/mobile_ligne_container_stats.dart create mode 100644 lib/common_widget/container/web/web_container_stats.dart create mode 100644 lib/common_widget/container/web/web_ligne_container_stats.dart create mode 100644 lib/common_widget/graph/mobile/mobile_altitude_by_time.dart create mode 100644 lib/common_widget/graph/mobile/mobile_bpm_by_time.dart create mode 100644 lib/common_widget/graph/web/web_altitude_by_time.dart create mode 100644 lib/common_widget/graph/web/web_bpm_and_speed_by_time.dart create mode 100644 lib/common_widget/graph/web/web_bpm_by_time.dart create mode 100644 lib/view/main_tab/mobile/mobile_main_tab_view.dart create mode 100644 lib/view/main_tab/web/web_main_tab_view.dart diff --git a/lib/common_widget/container/container_stats.dart b/lib/common_widget/container/container_stats.dart index ff2ddbb..e4e5548 100644 --- a/lib/common_widget/container/container_stats.dart +++ b/lib/common_widget/container/container_stats.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; -import 'package:smartfit_app_mobile/common/colo_extension.dart'; -import 'package:smartfit_app_mobile/common_widget/stats.dart'; +import 'package:responsive_builder/responsive_builder.dart'; +import 'package:smartfit_app_mobile/common_widget/container/mobile/mobile_container_stats.dart'; +import 'package:smartfit_app_mobile/common_widget/container/web/web_container_stats.dart'; class ContainerStats extends StatelessWidget { const ContainerStats(this.value, this.designation, this.icon, {Key? key}) @@ -10,55 +11,11 @@ class ContainerStats extends StatelessWidget { final String designation; final IconData icon; - @override + @override Widget build(BuildContext context) { - return Container( - height: 100, - width: 100, - 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: [ - StatIcon( - icon: icon, - iconColor: TColor.white, - iconBackground: TColor.secondaryColor1, - ), - 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, - ), - ), - ], - ), - ) - ], - ), + return ScreenTypeLayout.builder( + mobile: (_) => MobileContainerStats(this.value, this.designation, this.icon), + desktop: (_) => WebContainerStats(this.value, this.designation, this.icon), ); } } diff --git a/lib/common_widget/container/ligne_container_stats.dart b/lib/common_widget/container/ligne_container_stats.dart index 3f536ff..97cae33 100644 --- a/lib/common_widget/container/ligne_container_stats.dart +++ b/lib/common_widget/container/ligne_container_stats.dart @@ -1,6 +1,8 @@ + 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'; +import 'package:responsive_builder/responsive_builder.dart'; +import 'package:smartfit_app_mobile/common_widget/container/mobile/mobile_ligne_container_stats.dart'; +import 'package:smartfit_app_mobile/common_widget/container/web/web_ligne_container_stats.dart'; class LigneContainerStats extends StatelessWidget { const LigneContainerStats(this.value1, this.value2, this.value3, @@ -21,51 +23,11 @@ class LigneContainerStats extends StatelessWidget { final IconData icon2; final IconData icon3; - - @override + @override Widget build(BuildContext context) { - return Column( - children: [ - 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), - SingleChildScrollView( - scrollDirection: Axis.horizontal, - child:Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - ContainerStats(value1, designation1, icon1), - const SizedBox(width: 20), - ContainerStats(value2, designation2, icon2), - const SizedBox(width: 20), - ContainerStats(value3, designation3, icon3), - ],) - ), - Divider(height: 30), - ], + return ScreenTypeLayout.builder( + mobile: (_) => MobileLigneContainerStats(value1, value2, value3, designation1, designation2, designation3, icon1, icon2, icon3), + desktop: (_) => WebLigneContainerStats(value1, value2, value3, designation1, designation2, designation3, icon1, icon2, icon3), ); - - } } diff --git a/lib/common_widget/container/mobile/mobile_container_stats.dart b/lib/common_widget/container/mobile/mobile_container_stats.dart new file mode 100644 index 0000000..355f624 --- /dev/null +++ b/lib/common_widget/container/mobile/mobile_container_stats.dart @@ -0,0 +1,64 @@ +import 'package:flutter/material.dart'; +import 'package:smartfit_app_mobile/common/colo_extension.dart'; +import 'package:smartfit_app_mobile/common_widget/stats.dart'; + +class MobileContainerStats extends StatelessWidget { + const MobileContainerStats(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) { + return Container( + height: 100, + width: 100, + 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: [ + StatIcon( + icon: icon, + iconColor: TColor.white, + iconBackground: TColor.secondaryColor1, + ), + 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/container/mobile/mobile_ligne_container_stats.dart b/lib/common_widget/container/mobile/mobile_ligne_container_stats.dart new file mode 100644 index 0000000..157016a --- /dev/null +++ b/lib/common_widget/container/mobile/mobile_ligne_container_stats.dart @@ -0,0 +1,71 @@ +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 MobileLigneContainerStats extends StatelessWidget { + const MobileLigneContainerStats(this.value1, this.value2, this.value3, + this.designation1, this.designation2, this.designation3, + this.icon1, this.icon2, this.icon3, + {Key? key}) + : super(key: key); + + final String value1; + final String value2; + final String value3; + + final String designation1; + final String designation2; + final String designation3; + + final IconData icon1; + final IconData icon2; + final IconData icon3; + + + @override + Widget build(BuildContext context) { + return Column( + children: [ + 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), + SingleChildScrollView( + scrollDirection: Axis.horizontal, + child:Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + 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/container/web/web_container_stats.dart b/lib/common_widget/container/web/web_container_stats.dart new file mode 100644 index 0000000..89aa241 --- /dev/null +++ b/lib/common_widget/container/web/web_container_stats.dart @@ -0,0 +1,64 @@ +import 'package:flutter/material.dart'; +import 'package:smartfit_app_mobile/common/colo_extension.dart'; +import 'package:smartfit_app_mobile/common_widget/stats.dart'; + +class WebContainerStats extends StatelessWidget { + const WebContainerStats(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) { + return Container( + height: 70, + width: 70, + 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: [ + StatIcon( + icon: icon, + iconColor: TColor.white, + iconBackground: TColor.secondaryColor1, + ), + Align( + alignment: Alignment.bottomLeft, + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + designation, + style: const TextStyle(fontSize: 8), + ), + Text( + value, + style: const TextStyle( + fontSize: 12, + fontWeight: FontWeight.w800, + ), + ), + ], + ), + ) + ], + ), + ); + } +} diff --git a/lib/common_widget/container/web/web_ligne_container_stats.dart b/lib/common_widget/container/web/web_ligne_container_stats.dart new file mode 100644 index 0000000..c0e9836 --- /dev/null +++ b/lib/common_widget/container/web/web_ligne_container_stats.dart @@ -0,0 +1,69 @@ +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 WebLigneContainerStats extends StatelessWidget { + const WebLigneContainerStats(this.value1, this.value2, this.value3, + this.designation1, this.designation2, this.designation3, + this.icon1, this.icon2, this.icon3, + {Key? key}) + : super(key: key); + + final String value1; + final String value2; + final String value3; + + final String designation1; + final String designation2; + final String designation3; + + final IconData icon1; + final IconData icon2; + final IconData icon3; + + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 5), + child: Column( + 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), + SingleChildScrollView( + scrollDirection: Axis.horizontal, + child:Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + 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/altitude_by_time.dart b/lib/common_widget/graph/altitude_by_time.dart index fcdd9ca..63a9885 100644 --- a/lib/common_widget/graph/altitude_by_time.dart +++ b/lib/common_widget/graph/altitude_by_time.dart @@ -1,7 +1,10 @@ import 'package:fl_chart/fl_chart.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; +import 'package:responsive_builder/responsive_builder.dart'; import 'package:smartfit_app_mobile/common/colo_extension.dart'; +import 'package:smartfit_app_mobile/common_widget/graph/mobile/mobile_altitude_by_time.dart'; +import 'package:smartfit_app_mobile/common_widget/graph/web/web_altitude_by_time.dart'; import 'package:smartfit_app_mobile/modele/user.dart'; import 'package:smartfit_app_mobile/modele/utile/home_view/data_home_view.dart'; @@ -17,54 +20,11 @@ class GraphAltitudeByTime extends StatefulWidget { } class _GraphAltitudeByTime extends State { - @override + @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, - gradient: LinearGradient( - colors: TColor.primaryG, - ), - 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: (maxY - minY) / 5, - 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: 60, - showTitles: true, - getTitlesWidget: (value, meta) { - return Text("${double.parse(value.toStringAsFixed(2))} m"); - }, - )), - )))); + return ScreenTypeLayout.builder( + mobile: (_) => MobileGraphAltitudeByTime(widget.media, widget.data), + desktop: (_) => WebGraphAltitudeByTime(widget.media, widget.data), + ); } -} +} \ No newline at end of file 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 8b2c717..2232b27 100644 --- a/lib/common_widget/graph/bpm_and_speed_by_time.dart +++ b/lib/common_widget/graph/bpm_and_speed_by_time.dart @@ -1,6 +1,9 @@ import 'package:fl_chart/fl_chart.dart'; import 'package:flutter/material.dart'; +import 'package:responsive_builder/responsive_builder.dart'; import 'package:smartfit_app_mobile/common/colo_extension.dart'; +import 'package:smartfit_app_mobile/common_widget/graph/mobile/mobile_bpm_and_speed_by_time.dart'; +import 'package:smartfit_app_mobile/common_widget/graph/web/web_bpm_and_speed_by_time.dart'; import 'package:smartfit_app_mobile/modele/utile/home_view/data_home_view.dart'; class GraphBpmAndSpeedByTime extends StatefulWidget { @@ -15,209 +18,11 @@ class GraphBpmAndSpeedByTime extends StatefulWidget { } 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 + @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.3, - 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, - ), - ), - ), - )); + return ScreenTypeLayout.builder( + mobile: (_) => MobileGraphBpmAndSpeedByTime(widget.media, widget.data), + desktop: (_) => WebGraphBpmAndSpeedByTime(widget.media, widget.data), + ); } -} +} \ No newline at end of file diff --git a/lib/common_widget/graph/bpm_by_time.dart b/lib/common_widget/graph/bpm_by_time.dart index 5be0ab6..968d0e1 100644 --- a/lib/common_widget/graph/bpm_by_time.dart +++ b/lib/common_widget/graph/bpm_by_time.dart @@ -1,213 +1,26 @@ -import 'package:fl_chart/fl_chart.dart'; import 'package:flutter/material.dart'; -import 'package:smartfit_app_mobile/common/colo_extension.dart'; +import 'package:responsive_builder/responsive_builder.dart'; +import 'package:smartfit_app_mobile/common_widget/graph/mobile/mobile_bpm_by_time.dart'; +import 'package:smartfit_app_mobile/common_widget/graph/web/web_bpm_by_time.dart'; import 'package:smartfit_app_mobile/modele/utile/home_view/data_home_view.dart'; -class GraphBpmByTime extends StatefulWidget { +class BpmByTime extends StatefulWidget { final Size media; final DataHomeView data; - const GraphBpmByTime(this.media, this.data, {Key? key}) : super(key: key); + const BpmByTime(this.media, this.data, {Key? key}) + : super(key: key); @override - State createState() => _GraphBpmByTime(); + State createState() => _BpmByTime(); } -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 +class _BpmByTime extends State { + @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.height * 0.3, - 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, - ), - ), - ), - ) - ], - ), - ), + return ScreenTypeLayout.builder( + mobile: (_) => MobileBpmByTime(widget.media, widget.data), + desktop: (_) => WebBpmByTime(widget.media, widget.data), ); } -} +} \ No newline at end of file diff --git a/lib/common_widget/graph/mobile/mobile_altitude_by_time.dart b/lib/common_widget/graph/mobile/mobile_altitude_by_time.dart new file mode 100644 index 0000000..d484510 --- /dev/null +++ b/lib/common_widget/graph/mobile/mobile_altitude_by_time.dart @@ -0,0 +1,70 @@ +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 MobileGraphAltitudeByTime extends StatefulWidget { + final Size media; + final DataHomeView data; + + const MobileGraphAltitudeByTime(this.media, this.data, {Key? key}) + : super(key: key); + + @override + State createState() => _MobileGraphAltitudeByTime(); +} + +class _MobileGraphAltitudeByTime 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, + gradient: LinearGradient( + colors: TColor.primaryG, + ), + dotData: const FlDotData(show: false)) + ]; + + return Container( + padding: const EdgeInsets.only(left: 15), + height: widget.media.width * 0.3, + width: double.maxFinite, + child: LineChart(LineChartData( + lineBarsData: lineBarsData, + borderData: FlBorderData(show: false), + maxY: maxY, + minY: minY, + gridData: FlGridData( + drawVerticalLine: false, + drawHorizontalLine: true, + horizontalInterval: (maxY - minY) / 5, + getDrawingHorizontalLine: (value) { + return FlLine( + color: TColor.gray.withOpacity(0.15), + strokeWidth: 1, + ); + }), + titlesData: FlTitlesData( + leftTitles: const AxisTitles(), + topTitles: const AxisTitles(), + bottomTitles: const AxisTitles(), + rightTitles: AxisTitles( + sideTitles: SideTitles( + reservedSize: 60, + showTitles: true, + getTitlesWidget: (value, meta) { + return Text("${double.parse(value.toStringAsFixed(2))} m"); + }, + )), + )))); + } +} diff --git a/lib/common_widget/graph/mobile/mobile_bpm_by_time.dart b/lib/common_widget/graph/mobile/mobile_bpm_by_time.dart new file mode 100644 index 0000000..6f52792 --- /dev/null +++ b/lib/common_widget/graph/mobile/mobile_bpm_by_time.dart @@ -0,0 +1,83 @@ +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 MobileBpmByTime extends StatefulWidget { + final Size media; + final DataHomeView data; + + const MobileBpmByTime(this.media, this.data, {Key? key}) + : super(key: key); + + @override + State createState() => _MobileBpmByTime(); +} + +class _MobileBpmByTime extends State { + @override + Widget build(BuildContext context) { + final double maxY = + context.watch().listActivity[0].getMaxBpm() + 2; + final double minY = + context.watch().listActivity[0].getMinBpm() - 2; + final double maxX = + widget.data.bpmSecondes[widget.data.bpmSecondes.length - 1].x; + final double minX = + 0.0; + final lineBarsData = [ + LineChartBarData( + spots: widget.data.bpmSecondes, + isCurved: true, + gradient: LinearGradient( + colors: TColor.primaryG, + ), + dotData: const FlDotData(show: false)) + ]; + + return Container( + padding: const EdgeInsets.only(left: 15), + height: widget.media.width * 0.4, + width: double.maxFinite, + child: LineChart(LineChartData( + lineBarsData: lineBarsData, + borderData: FlBorderData(show: false), + maxY: maxY, + minY: minY, + maxX: maxX, + minX: minX, + gridData: FlGridData( + drawVerticalLine: true, + drawHorizontalLine: true, + horizontalInterval: (maxY - minY) / 5, + verticalInterval: (maxX - minX) / 4, + getDrawingHorizontalLine: (value) { + return FlLine( + color: TColor.gray.withOpacity(0.15), + strokeWidth: 1, + ); + }), + titlesData: FlTitlesData( + leftTitles: const AxisTitles(), + topTitles: const AxisTitles(), + bottomTitles: AxisTitles( + sideTitles: SideTitles( + reservedSize: 20, + showTitles: true, + getTitlesWidget: (value, meta) { + return Text("${double.parse(value.toStringAsFixed(2))}s"); + }, + )), + rightTitles: AxisTitles( + sideTitles: SideTitles( + reservedSize: 70, + showTitles: true, + getTitlesWidget: (value, meta) { + return Text("${double.parse(value.toStringAsFixed(2))} BPM"); + }, + )), + )))); + } +} diff --git a/lib/common_widget/graph/web/web_altitude_by_time.dart b/lib/common_widget/graph/web/web_altitude_by_time.dart new file mode 100644 index 0000000..8203c40 --- /dev/null +++ b/lib/common_widget/graph/web/web_altitude_by_time.dart @@ -0,0 +1,70 @@ +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 WebGraphAltitudeByTime extends StatefulWidget { + final Size media; + final DataHomeView data; + + const WebGraphAltitudeByTime(this.media, this.data, {Key? key}) + : super(key: key); + + @override + State createState() => _WebGraphAltitudeByTime(); +} + +class _WebGraphAltitudeByTime 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, + gradient: LinearGradient( + colors: TColor.primaryG, + ), + dotData: const FlDotData(show: false)) + ]; + + return Container( + padding: const EdgeInsets.only(left: 15), + height: widget.media.width * 0.20, + width: widget.media.width * 0.35, + child: LineChart(LineChartData( + lineBarsData: lineBarsData, + borderData: FlBorderData(show: false), + maxY: maxY, + minY: minY, + gridData: FlGridData( + drawVerticalLine: false, + drawHorizontalLine: true, + horizontalInterval: (maxY - minY) / 5, + getDrawingHorizontalLine: (value) { + return FlLine( + color: TColor.gray.withOpacity(0.15), + strokeWidth: 1, + ); + }), + titlesData: FlTitlesData( + leftTitles: const AxisTitles(), + topTitles: const AxisTitles(), + bottomTitles: const AxisTitles(), + rightTitles: AxisTitles( + sideTitles: SideTitles( + reservedSize: 60, + showTitles: true, + getTitlesWidget: (value, meta) { + return Text("${double.parse(value.toStringAsFixed(2))} m"); + }, + )), + )))); + } +} diff --git a/lib/common_widget/graph/web/web_bpm_and_speed_by_time.dart b/lib/common_widget/graph/web/web_bpm_and_speed_by_time.dart new file mode 100644 index 0000000..0521114 --- /dev/null +++ b/lib/common_widget/graph/web/web_bpm_and_speed_by_time.dart @@ -0,0 +1,225 @@ +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 WebGraphBpmAndSpeedByTime extends StatefulWidget { + final Size media; + final DataHomeView data; + + const WebGraphBpmAndSpeedByTime(this.media, this.data, {Key? key}) + : super(key: key); + + @override + State createState() => _WebGraphBpmAndSpeedByTime(); +} + +class _WebGraphBpmAndSpeedByTime 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.20, + width: widget.media.width * 0.35, + 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: AxisTitles( + sideTitles: rightTitles, + ), + 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/web/web_bpm_by_time.dart b/lib/common_widget/graph/web/web_bpm_by_time.dart new file mode 100644 index 0000000..95938a6 --- /dev/null +++ b/lib/common_widget/graph/web/web_bpm_by_time.dart @@ -0,0 +1,83 @@ +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 WebBpmByTime extends StatefulWidget { + final Size media; + final DataHomeView data; + + const WebBpmByTime(this.media, this.data, {Key? key}) + : super(key: key); + + @override + State createState() => _WebBpmByTime(); +} + +class _WebBpmByTime extends State { + @override + Widget build(BuildContext context) { + final double maxY = + context.watch().listActivity[0].getMaxBpm() + 2; + final double minY = + context.watch().listActivity[0].getMinBpm() - 2; + final double maxX = + widget.data.bpmSecondes[widget.data.bpmSecondes.length - 1].x; + final double minX = + 0.0; + final lineBarsData = [ + LineChartBarData( + spots: widget.data.bpmSecondes, + isCurved: true, + gradient: LinearGradient( + colors: TColor.primaryG, + ), + dotData: const FlDotData(show: false)) + ]; + + return Container( + padding: const EdgeInsets.only(left: 15), + height: widget.media.width * 0.20, + width: widget.media.width * 0.35, + child: LineChart(LineChartData( + lineBarsData: lineBarsData, + borderData: FlBorderData(show: false), + maxY: maxY, + minY: minY, + maxX: maxX, + minX: minX, + gridData: FlGridData( + drawVerticalLine: true, + drawHorizontalLine: true, + horizontalInterval: (maxY - minY) / 5, + verticalInterval: (maxX - minX) / 4, + getDrawingHorizontalLine: (value) { + return FlLine( + color: TColor.gray.withOpacity(0.15), + strokeWidth: 1, + ); + }), + titlesData: FlTitlesData( + leftTitles: const AxisTitles(), + topTitles: const AxisTitles(), + bottomTitles: AxisTitles( + sideTitles: SideTitles( + reservedSize: 20, + showTitles: true, + getTitlesWidget: (value, meta) { + return Text("${double.parse(value.toStringAsFixed(2))}s"); + }, + )), + rightTitles: AxisTitles( + sideTitles: SideTitles( + reservedSize: 70, + showTitles: true, + getTitlesWidget: (value, meta) { + return Text("${double.parse(value.toStringAsFixed(2))} BPM"); + }, + )), + )))); + } +} diff --git a/lib/common_widget/stats.dart b/lib/common_widget/stats.dart index 1591d68..08132f0 100644 --- a/lib/common_widget/stats.dart +++ b/lib/common_widget/stats.dart @@ -17,7 +17,7 @@ class Stats extends StatelessWidget { .toString(); String time = Provider.of(context, listen: false) .listActivity[0] - .getTotalTime(); + .getTotalTime().toString(); return Column( children: [ @@ -173,7 +173,7 @@ class StatIcon extends StatelessWidget { color: iconBackground, borderRadius: BorderRadius.circular(9), ), - child: Icon(icon, size: 15, color: iconColor), + child: Icon(icon, size: 8, color: iconColor), ); } } diff --git a/lib/main.dart b/lib/main.dart index 049d2fc..a53fd63 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/common/colo_extension.dart'; import 'package:smartfit_app_mobile/view/main_tab/main_tab_view.dart'; +import 'package:smartfit_app_mobile/view/on_boarding/started_view.dart'; void main() { runApp(ChangeNotifierProvider( diff --git a/lib/modele/activity.dart b/lib/modele/activity.dart index 6e7d6ca..36ec822 100644 --- a/lib/modele/activity.dart +++ b/lib/modele/activity.dart @@ -33,6 +33,32 @@ class ActivityOfUser { List result = List.empty(growable: true); int firtTimeStamp = 0; + for (List ligne in _contentActivity) { + if (ligne[0] == "Data") { + if (ligne.length >= 10 && ligne[9] == "heart_rate") { + if (firtTimeStamp == 0) { + firtTimeStamp = ligne[4]; + } + //result.add([(ligne[4] - firtTimeStamp) ~/ 100, ligne[10]]); + result.add( + FlSpot((ligne[4] - firtTimeStamp) / 1000, ligne[10].toDouble())); + } else if (ligne.length >= 16 && ligne[15] == "heart_rate") { + if (firtTimeStamp == 0) { + firtTimeStamp = ligne[4]; + } + //result.add([(ligne[4] - firtTimeStamp) ~/ 100, ligne[17]]); + result.add( + FlSpot((ligne[4] - firtTimeStamp) / 1000, ligne[16].toDouble())); + } + } + } + return result; + } + + List getHeartRateWithTime2() { + List result = List.empty(growable: true); + int firtTimeStamp = 0; + for (List ligne in _contentActivity) { if (ligne[0] == "Data") { if (ligne.length >= 10 && ligne[9] == "heart_rate") { @@ -64,6 +90,7 @@ class ActivityOfUser { return 0; } + int getMinBpm() { for (int i = 0; i < _contentActivity[_dataSession].length; i++) { if (_contentActivity[_dataSession][i] == "min_heart_rate") { @@ -154,13 +181,13 @@ class ActivityOfUser { // ----------------------- FIN Step ------------------------ // // ------------------------- Time ----------------------------- // - String getTotalTime() { + double getTotalTime() { for (int i = 0; i < _contentActivity[_dataSession].length; i++) { if (_contentActivity[_dataSession][i] == "total_elapsed_time") { - return _contentActivity[_dataSession][i + 1].toString(); + return _contentActivity[_dataSession][i + 1]; } } - return "null"; + return 0; } // ---------------------------- FIN time -------------------- // diff --git a/lib/modele/utile/home_view/home_view_util.dart b/lib/modele/utile/home_view/home_view_util.dart index f6591d5..543447f 100644 --- a/lib/modele/utile/home_view/home_view_util.dart +++ b/lib/modele/utile/home_view/home_view_util.dart @@ -12,8 +12,7 @@ class HomeViewUtil { List bpmSecondes = activity.getHeartRateWithTime(); List vitesseSecondes = activity.getSpeedWithTime(); List altitudeSeconde = activity.getAltitudeWithTime(); - - List bpmSecondes2 = List.from(bpmSecondes); + List bpmSecondes2 = activity.getHeartRateWithTime2(); return DataHomeView(bpmSecondes, normaliserDeuxiemeElement(bpmSecondes2), normaliserDeuxiemeElement(vitesseSecondes), altitudeSeconde); diff --git a/lib/view/home/mobile/mobile_homeview.dart b/lib/view/home/mobile/mobile_homeview.dart index b051c31..c0c3f07 100644 --- a/lib/view/home/mobile/mobile_homeview.dart +++ b/lib/view/home/mobile/mobile_homeview.dart @@ -61,7 +61,7 @@ class _MobileHomeView extends State { SizedBox( height: media.width * 0.02, ), - GraphBpmByTime(media, data), + BpmByTime(media, data), SizedBox( height: media.width * 0.05, ), @@ -95,8 +95,8 @@ class _MobileHomeView extends State { height: media.width * 0.05, ), LigneContainerStats( - "${double.parse(maxSpeed.toStringAsFixed(2))} KM/H", - "${double.parse(avgSpeed.toStringAsFixed(2))} km/H", + "${double.parse(maxSpeed.toStringAsFixed(2))} m/s", + "${double.parse(avgSpeed.toStringAsFixed(2))} m/s", "${avgBpm.toString()} BPM", "Max Speed", "Moyenne Speed", diff --git a/lib/view/home/web/web_homeview.dart b/lib/view/home/web/web_homeview.dart index 47c60d7..457e3b3 100644 --- a/lib/view/home/web/web_homeview.dart +++ b/lib/view/home/web/web_homeview.dart @@ -1,3 +1,5 @@ +import 'dart:js_util'; + import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:smartfit_app_mobile/common_widget/container/ligne_container_stats.dart'; @@ -43,7 +45,7 @@ class _WebHomeView extends State { body: SingleChildScrollView( child: SafeArea( child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 200), + padding: const EdgeInsets.symmetric(horizontal: 50), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -52,8 +54,14 @@ class _WebHomeView extends State { ), const EnteteHomeView(), SizedBox( - height: media.width * 0.05, + height: media.width * 0.03, ), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ Text( "Status d'activité", style: TextStyle( @@ -64,9 +72,11 @@ class _WebHomeView extends State { SizedBox( height: media.width * 0.02, ), - GraphBpmByTime(media, data), + Row( + children: [ + BpmByTime(media, data), SizedBox( - height: media.width * 0.05, + width: media.width * 0.01, ), LigneContainerStats( "${minBpm.toString()} BPM", @@ -78,12 +88,13 @@ class _WebHomeView extends State { Icons.trending_down, Icons.trending_up, Icons.favorite_outline), + ]),]), SizedBox( height: media.width * 0.05, ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ Text( "Rythme cardique et vitesse", style: TextStyle( @@ -91,11 +102,13 @@ class _WebHomeView extends State { fontSize: 16, fontWeight: FontWeight.w700), ), - ], - ), + SizedBox( - height: media.width * 0.05, + height: media.width * 0.02, ), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ GraphBpmAndSpeedByTime(media, data), SizedBox( height: media.width * 0.05, @@ -105,14 +118,27 @@ class _WebHomeView extends State { "${double.parse(avgSpeed.toStringAsFixed(2))} m/s", "${avgBpm.toString()} BPM", "Max vitesse", - "Moyenne vitesse", - "Moyenne Bpm", + "Moy vitesse", + "Moy Bpm", Icons.trending_up, Icons.bolt, Icons.favorite_outline), SizedBox( height: media.width * 0.05, + ),]),]),]), + SizedBox( + height: media.width * 0.02, ), + Text( + "Altitude", + style: TextStyle( + color: TColor.black, + fontSize: 16, + fontWeight: FontWeight.w700), + ), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ GraphAltitudeByTime(media, data), LigneContainerStats( "${minAltitude.toInt()} m", @@ -124,9 +150,7 @@ class _WebHomeView extends State { Icons.trending_down, Icons.trending_up, Icons.favorite_outline), - SizedBox( - height: media.width * 0.05, - ), + ]), ], ), ), diff --git a/lib/view/main_tab/main_tab_view.dart b/lib/view/main_tab/main_tab_view.dart index 3d6d211..1d894c2 100644 --- a/lib/view/main_tab/main_tab_view.dart +++ b/lib/view/main_tab/main_tab_view.dart @@ -1,9 +1,12 @@ +import 'package:responsive_builder/responsive_builder.dart'; 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/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'; +import 'package:smartfit_app_mobile/view/main_tab/mobile/mobile_main_tab_view.dart'; +import 'package:smartfit_app_mobile/view/main_tab/web/web_main_tab_view.dart'; import 'package:smartfit_app_mobile/view/map/my_map.dart'; import 'package:smartfit_app_mobile/view/profile/profile_view.dart'; @@ -15,107 +18,11 @@ class MainTabView extends StatefulWidget { } class _MainTabViewState extends State { - int selectTab = -1; - final PageStorageBucket pageBucket = PageStorageBucket(); - Widget currentTab = const ListActivity(); - @override +@override Widget build(BuildContext context) { - return Scaffold( - backgroundColor: TColor.white, - body: PageStorage(bucket: pageBucket, child: currentTab), - floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked, - floatingActionButton: SizedBox( - width: 70, - height: 70, - child: InkWell( - onTap: () { - selectTab = 4; - currentTab = const ListActivity(); - if (mounted) { - setState(() {}); - } - }, - child: Container( - width: 65, - height: 65, - decoration: BoxDecoration( - gradient: LinearGradient( - colors: TColor.primaryG, - ), - borderRadius: BorderRadius.circular(35), - boxShadow: const [ - BoxShadow( - color: Colors.black12, - blurRadius: 2, - ) - ]), - child: Icon( - Icons.search, - color: TColor.white, - size: 35, - ), - ), - ), - ), - bottomNavigationBar: BottomAppBar( - child: Container( - decoration: BoxDecoration(color: TColor.white, boxShadow: const [ - BoxShadow(color: Colors.black12, blurRadius: 2, offset: Offset(0, -2)) - ]), - height: kToolbarHeight, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - TabButton( - icon: "assets/img/Home_tab.svg", - selectIcon: "assets/img/Home_tab_select.svg", - isActive: selectTab == 0, - onTap: () { - selectTab = 0; - currentTab = const HomeView(); - if (mounted) { - setState(() {}); - } - }), - TabButton( - icon: "assets/img/Activity_tab.svg", - selectIcon: "assets/img/Activity_tab_select.svg", - isActive: selectTab == 1, - onTap: () { - selectTab = 1; - currentTab = const Activity(); - if (mounted) { - setState(() {}); - } - }), - const SizedBox( - width: 40, - ), - TabButton( - icon: "assets/img/Camera_tab.svg", - selectIcon: "assets/img/Camera_tab_select.svg", - isActive: selectTab == 2, - onTap: () { - selectTab = 2; - currentTab = const MyMap(); - if (mounted) { - setState(() {}); - } - }), - TabButton( - icon: "assets/img/Profile_tab.svg", - selectIcon: "assets/img/Profile_tab_select.svg", - isActive: selectTab == 3, - onTap: () { - selectTab = 3; - currentTab = const ProfileView(); - if (mounted) { - setState(() {}); - } - }) - ], - ), - )), + return ScreenTypeLayout.builder( + mobile: (_) => const MobileMainTabView(), + desktop: (_) => const WebMainTabView(), ); } -} +} \ No newline at end of file diff --git a/lib/view/main_tab/mobile/mobile_main_tab_view.dart b/lib/view/main_tab/mobile/mobile_main_tab_view.dart new file mode 100644 index 0000000..7b0c1c5 --- /dev/null +++ b/lib/view/main_tab/mobile/mobile_main_tab_view.dart @@ -0,0 +1,121 @@ +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/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'; +import 'package:smartfit_app_mobile/view/map/my_map.dart'; +import 'package:smartfit_app_mobile/view/profile/profile_view.dart'; + +class MobileMainTabView extends StatefulWidget { + const MobileMainTabView({super.key}); + + @override + State createState() => _MobileMainTabViewState(); +} + +class _MobileMainTabViewState extends State { + int selectTab = -1; + final PageStorageBucket pageBucket = PageStorageBucket(); + Widget currentTab = const ListActivity(); + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: TColor.white, + body: PageStorage(bucket: pageBucket, child: currentTab), + floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked, + floatingActionButton: SizedBox( + width: 70, + height: 70, + child: InkWell( + onTap: () { + selectTab = 4; + currentTab = const ListActivity(); + if (mounted) { + setState(() {}); + } + }, + child: Container( + width: 65, + height: 65, + decoration: BoxDecoration( + gradient: LinearGradient( + colors: TColor.primaryG, + ), + borderRadius: BorderRadius.circular(35), + boxShadow: const [ + BoxShadow( + color: Colors.black12, + blurRadius: 2, + ) + ]), + child: Icon( + Icons.search, + color: TColor.white, + size: 35, + ), + ), + ), + ), + bottomNavigationBar: BottomAppBar( + child: Container( + decoration: BoxDecoration(color: TColor.white, boxShadow: const [ + BoxShadow(color: Colors.black12, blurRadius: 2, offset: Offset(0, -2)) + ]), + height: kToolbarHeight, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + TabButton( + icon: "assets/img/Home_tab.svg", + selectIcon: "assets/img/Home_tab_select.svg", + isActive: selectTab == 0, + onTap: () { + selectTab = 0; + currentTab = const HomeView(); + if (mounted) { + setState(() {}); + } + }), + TabButton( + icon: "assets/img/Activity_tab.svg", + selectIcon: "assets/img/Activity_tab_select.svg", + isActive: selectTab == 1, + onTap: () { + selectTab = 1; + currentTab = const Activity(); + if (mounted) { + setState(() {}); + } + }), + const SizedBox( + width: 40, + ), + TabButton( + icon: "assets/img/Camera_tab.svg", + selectIcon: "assets/img/Camera_tab_select.svg", + isActive: selectTab == 2, + onTap: () { + selectTab = 2; + currentTab = const MyMap(); + if (mounted) { + setState(() {}); + } + }), + TabButton( + icon: "assets/img/Profile_tab.svg", + selectIcon: "assets/img/Profile_tab_select.svg", + isActive: selectTab == 3, + onTap: () { + selectTab = 3; + currentTab = const ProfileView(); + if (mounted) { + setState(() {}); + } + }) + ], + ), + )), + ); + } +} diff --git a/lib/view/main_tab/web/web_main_tab_view.dart b/lib/view/main_tab/web/web_main_tab_view.dart new file mode 100644 index 0000000..271fed6 --- /dev/null +++ b/lib/view/main_tab/web/web_main_tab_view.dart @@ -0,0 +1,141 @@ +import 'package:flutter/material.dart'; +import 'package:smartfit_app_mobile/common/colo_extension.dart'; +import 'package:smartfit_app_mobile/common_widget/button/tab_button.dart'; +import 'package:smartfit_app_mobile/view/activity/list_activity.dart'; +import 'package:smartfit_app_mobile/view/activity/activity.dart'; +import 'package:smartfit_app_mobile/view/home/home_view.dart'; +import 'package:smartfit_app_mobile/view/map/my_map.dart'; +import 'package:smartfit_app_mobile/view/profile/profile_view.dart'; + +class WebMainTabView extends StatefulWidget { + const WebMainTabView({Key? key}) : super(key: key); + + @override + State createState() => _WebMainTabViewState(); +} + +class _WebMainTabViewState extends State { + int selectTab = 4; // Définissez l'onglet initial ici + late Widget currentTab; + + @override + void initState() { + super.initState(); + currentTab = const HomeView(); // Onglet initial - HomeView + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: TColor.white, + body: Row( + children: [ + // La barre latérale verticale + Container( + width: 70, // Largeur de la barre latérale + color: TColor.white, // Couleur de la barre latérale + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + sideBarButton( + icon: "assets/img/Home_tab.svg", + selectIcon: "assets/img/Home_tab_select.svg", + index: 0, + onTap: () => updateTab(0, const HomeView()), + ), + sideBarButton( + icon: "assets/img/Activity_tab.svg", + selectIcon: "assets/img/Activity_tab_select.svg", + index: 1, + onTap: () => updateTab(1, const Activity()), + ), + InkWell( + onTap: () { + updateTab(4, const ListActivity()); + }, + child: Container( + width: 65, + height: 65, + decoration: BoxDecoration( + gradient: LinearGradient( + colors: TColor.primaryG, + ), + borderRadius: BorderRadius.circular(35), + boxShadow: const [ + BoxShadow( + color: Colors.black12, + blurRadius: 2, + ), + ], + ), + child: Icon( + Icons.search, + color: TColor.white, + size: 35, + ), + ), + ), + sideBarButton( + icon: "assets/img/Camera_tab.svg", + selectIcon: "assets/img/Camera_tab_select.svg", + index: 2, + onTap: () => updateTab(2, const MyMap()), + ), + sideBarButton( + icon: "assets/img/Profile_tab.svg", + selectIcon: "assets/img/Profile_tab_select.svg", + index: 3, + onTap: () => updateTab(3, const ProfileView()), + ), + ], + ), + ), + Expanded( + child: Container( + decoration: BoxDecoration( + color: TColor.white, + boxShadow: [ + BoxShadow( + color: Colors.black12, + blurRadius: 2, + offset: const Offset(-2, 0), // Ajout d'une ombre sur le côté + ), + ], + ), + child: Scaffold( + backgroundColor: TColor.white, + body: currentTab, + floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked, + floatingActionButton: SizedBox( + width: 70, + height: 70, + ), + ), + ), + ), + ], + ), + ); + } + + Widget sideBarButton({ + required String icon, + required String selectIcon, + required int index, + required VoidCallback onTap, + }) { + return TabButton( + icon: icon, + selectIcon: selectIcon, + isActive: selectTab == index, + onTap: onTap, + ); + } + + void updateTab(int index, Widget tabWidget) { + setState(() { + selectTab = index; + currentTab = tabWidget; + }); + } +}