Merge branch 'othmane4'

pull/4/head
Enzo 1 year ago
commit d77982c9ce

@ -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),
);
}
}

@ -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),
);
}
}

@ -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,
),
),
],
),
)
],
),
);
}
}

@ -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),
],
);
}
}

@ -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,
),
),
],
),
)
],
),
);
}
}

@ -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),
],
);
}
}

@ -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<GraphAltitudeByTime> {
@override
@override
Widget build(BuildContext context) {
final double maxY =
context.watch<User>().listActivity[0].getMaxAltitude() + 2;
final double minY =
context.watch<User>().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),
);
}
}
}

@ -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<GraphBpmAndSpeedByTime> {
TextEditingController bpmController = TextEditingController();
List<int> 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<LineChartBarData> 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<int> 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<LineBarSpot> 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),
);
}
}
}

@ -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<GraphBpmByTime> createState() => _GraphBpmByTime();
State<BpmByTime> createState() => _BpmByTime();
}
class _GraphBpmByTime extends State<GraphBpmByTime> {
TextEditingController bpmController = TextEditingController();
// Il faut chercher à le suprimer
List<int> showingTooltipOnSpots = [0];
List<LineChartBarData> 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<BpmByTime> {
@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<int> 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<LineBarSpot> 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),
);
}
}
}

@ -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<MobileGraphAltitudeByTime> createState() => _MobileGraphAltitudeByTime();
}
class _MobileGraphAltitudeByTime extends State<MobileGraphAltitudeByTime> {
@override
Widget build(BuildContext context) {
final double maxY =
context.watch<User>().listActivity[0].getMaxAltitude() + 2;
final double minY =
context.watch<User>().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");
},
)),
))));
}
}

@ -0,0 +1,238 @@
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 MobileGraphBpmAndSpeedByTime extends StatefulWidget {
final Size media;
final DataHomeView data;
const MobileGraphBpmAndSpeedByTime(this.media, this.data, {Key? key})
: super(key: key);
@override
State<MobileGraphBpmAndSpeedByTime> createState() => _MobileGraphBpmAndSpeedByTime();
}
class _MobileGraphBpmAndSpeedByTime extends State<MobileGraphBpmAndSpeedByTime> {
TextEditingController bpmController = TextEditingController();
List<int> 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<LineChartBarData> 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 double maxY =
context.watch<User>().listActivity[0].getMaxBpm() + 2;
final double minY =
context.watch<User>().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: 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<int> 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<LineBarSpot> lineBarsSpot) {
return lineBarsSpot.map((lineBarSpot) {
return LineTooltipItem(
"Seconde ${lineBarSpot.x.toInt() } ",
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: SideTitles(
reservedSize: 70,
showTitles: true,
getTitlesWidget: (value, meta) {
return Text("${double.parse(value.toStringAsFixed(2))} BPM");
},
))),
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,
);
}),
borderData: FlBorderData(
show: true,
border: Border.all(
color: Colors.transparent,
),
),
),
));
}
}

@ -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<MobileBpmByTime> createState() => _MobileBpmByTime();
}
class _MobileBpmByTime extends State<MobileBpmByTime> {
@override
Widget build(BuildContext context) {
final double maxY =
context.watch<User>().listActivity[0].getMaxBpm() + 2;
final double minY =
context.watch<User>().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");
},
)),
))));
}
}

@ -0,0 +1,81 @@
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<WebGraphAltitudeByTime> createState() => _WebGraphAltitudeByTime();
}
class _WebGraphAltitudeByTime extends State<WebGraphAltitudeByTime> {
@override
Widget build(BuildContext context) {
final double maxX =
widget.data.bpmSecondes[widget.data.bpmSecondes.length - 1].x;
final double minX =
0.0;
final double maxY =
context.watch<User>().listActivity[0].getMaxAltitude() + 2;
final double minY =
context.watch<User>().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: AxisTitles(
sideTitles: SideTitles(
reservedSize: 20,
showTitles: true,
getTitlesWidget: (value, meta) {
return Text("${double.parse((value/10).toStringAsFixed(2))}s");
},
)),
rightTitles: AxisTitles(
sideTitles: SideTitles(
reservedSize: 60,
showTitles: true,
getTitlesWidget: (value, meta) {
return Text("${double.parse(value.toStringAsFixed(2))} m");
},
)),
))));
}
}

@ -0,0 +1,254 @@
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 WebGraphBpmAndSpeedByTime extends StatefulWidget {
final Size media;
final DataHomeView data;
const WebGraphBpmAndSpeedByTime(this.media, this.data, {Key? key})
: super(key: key);
@override
State<WebGraphBpmAndSpeedByTime> createState() => _WebGraphBpmAndSpeedByTime();
}
class _WebGraphBpmAndSpeedByTime extends State<WebGraphBpmAndSpeedByTime> {
TextEditingController bpmController = TextEditingController();
List<int> 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<LineChartBarData> 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 double maxY =
context.watch<User>().listActivity[0].getMaxBpm() + 2;
final double minY =
context.watch<User>().listActivity[0].getMinBpm() - 2;
final double maxY1 =
context.watch<User>().listActivity[0].getMaxBpm() + 2;
final double minY2 =
context.watch<User>().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: 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<int> 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<LineBarSpot> 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: AxisTitles(
sideTitles: SideTitles(
reservedSize: 20,
showTitles: true,
getTitlesWidget: (value, meta) {
return Text("${double.parse((value/10).toStringAsFixed(2))}s");
},
)),
rightTitles: AxisTitles(
sideTitles: SideTitles(
reservedSize: 70,
showTitles: true,
getTitlesWidget: (value, meta) {
return Text("${double.parse(value.toStringAsFixed(2))} BPM");
},
))),
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,
);
}),
borderData: FlBorderData(
show: true,
border: Border.all(
color: Colors.transparent,
),
),
),
));
}
}

@ -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<WebBpmByTime> createState() => _WebBpmByTime();
}
class _WebBpmByTime extends State<WebBpmByTime> {
@override
Widget build(BuildContext context) {
final double maxY =
context.watch<User>().listActivity[0].getMaxBpm() + 2;
final double minY =
context.watch<User>().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");
},
)),
))));
}
}

@ -174,7 +174,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),
);
}
}

@ -2,10 +2,7 @@ import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:smartfit_app_mobile/modele/user.dart';
import 'package:smartfit_app_mobile/common/colo_extension.dart';
import 'package:smartfit_app_mobile/modele/utile/signup_user.dart';
import 'package:smartfit_app_mobile/view/login/login_view.dart';
import 'package:smartfit_app_mobile/view/login/signup_view.dart';
import 'package:smartfit_app_mobile/view/test/page_test.dart';
void main() {
runApp(ChangeNotifierProvider(

@ -183,6 +183,7 @@ class ActivityOfUser {
}
}
return 0;
return 0;
}
// ---------------------------- FIN time -------------------- //

@ -11,12 +11,9 @@ class HomeViewUtil {
ManagerFile _managerFile = ManagerFile();
ActivityOfUser activity = Provider.of<User>(context).listActivity[0];
//List<FlSpot> bpmSecondes = activity.getHeartRateWithTime();
List<FlSpot> bpmSecondes = activity.getXWithTime(_managerFile.fielBPM);
//List<FlSpot> vitesseSecondes = activity.getSpeedWithTime();
List<FlSpot> vitesseSecondes =
activity.getXWithTime(_managerFile.fieldSpeed);
//List<FlSpot> altitudeSeconde = activity.getAltitudeWithTime();
List<FlSpot> altitudeSeconde =
activity.getXWithTime(_managerFile.fieldAltitude);

@ -61,7 +61,7 @@ class _MobileHomeView extends State<MobileHomeView> {
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<MobileHomeView> {
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",

@ -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<WebHomeView> {
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<WebHomeView> {
),
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<WebHomeView> {
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<WebHomeView> {
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<WebHomeView> {
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<WebHomeView> {
"${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<WebHomeView> {
Icons.trending_down,
Icons.trending_up,
Icons.favorite_outline),
SizedBox(
height: media.width * 0.05,
),
]),
],
),
),

@ -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<MainTabView> {
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(),
);
}
}
}

@ -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<MobileMainTabView> createState() => _MobileMainTabViewState();
}
class _MobileMainTabViewState extends State<MobileMainTabView> {
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(() {});
}
})
],
),
)),
);
}
}

@ -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<WebMainTabView> createState() => _WebMainTabViewState();
}
class _WebMainTabViewState extends State<WebMainTabView> {
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: <Widget>[
// 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;
});
}
}
Loading…
Cancel
Save