diff --git a/.drone.yml b/.drone.yml index ca59f89..e380b6d 100644 --- a/.drone.yml +++ b/.drone.yml @@ -18,6 +18,16 @@ steps: - curl -F "file=@$sfm_apk" https://anonfiles.me/api/v1/upload > upload.json - cat upload.json | cut -d '"' -f 12 + - name: build-web + image: ghcr.io/cirruslabs/flutter:3.13.9 + environment: + FIREBASE_TOKEN: + from_secret: firebase_token + commands: + - flutter build web --web-renderer canvaskit + - curl -sL https://firebase.tools | bash + - firebase deploy --token $${FIREBASE_TOKEN} + - name: code-analysis image: ghcr.io/cirruslabs/flutter:3.13.9 environment: @@ -31,4 +41,4 @@ steps: - export PATH=$SONAR_SCANNER_HOME/bin:$PATH - export SONAR_SCANNER_OPTS="-server" - sonar-scanner -D sonar.projectKey=SmartFit_Mobile -D sonar.sources=. -D sonar.host.url=https://codefirst.iut.uca.fr/sonar -D sonar.login=$${SONAR_TOKEN} - depends_on: [ build-apk ] \ No newline at end of file + depends_on: [ build-apk, build-web ] diff --git a/.firebaserc b/.firebaserc new file mode 100644 index 0000000..e3ee79c --- /dev/null +++ b/.firebaserc @@ -0,0 +1,5 @@ +{ + "projects": { + "default": "smartfit-9b86c" + } +} diff --git a/.gitignore b/.gitignore index bea03cd..db7fc69 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,9 @@ .history .svn/ +# Firebase +.firebase/ + # IntelliJ related *.iml *.ipr @@ -125,4 +128,4 @@ linux/flutter/generated_plugins.cmake windows/flutter/generated_plugin_registrant.cc windows/flutter/generated_plugins.cmake -flutter/ \ No newline at end of file +flutter/ diff --git a/README.md b/README.md index 8ddf340..5cb1409 100644 --- a/README.md +++ b/README.md @@ -3,13 +3,13 @@ TODO: Description ## Getting Started -This project is a starting point for a Flutter application. +### Web +We host a **[SmartFit Web](https://smartfit-9b86c.web.app/)** instance on Firebase. +TODO: Build -A few resources to get you started if this is your first Flutter project: +### Mobile +TODO: Installation and Build -- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) -- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) - -For help getting started with Flutter development, view the -[online documentation](https://docs.flutter.dev/), which offers tutorials, -samples, guidance on mobile development, and a full API reference. +## Docs +You can find **[here](https://codefirst.iut.uca.fr/documentation/SmartFit/SmartFit_Docs/docusaurus/)** +the docusaurus for SmartFit! diff --git a/firebase.json b/firebase.json new file mode 100644 index 0000000..6603732 --- /dev/null +++ b/firebase.json @@ -0,0 +1,16 @@ +{ + "hosting": { + "public": "build/web", + "ignore": [ + "firebase.json", + "**/.*", + "**/node_modules/**" + ], + "rewrites": [ + { + "source": "**", + "destination": "/index.html" + } + ] + } +} diff --git a/lib/common_widget/container/workout_row.dart b/lib/common_widget/container/workout_row.dart index 8f16a5b..e4d5f85 100644 --- a/lib/common_widget/container/workout_row.dart +++ b/lib/common_widget/container/workout_row.dart @@ -16,7 +16,7 @@ class WorkoutRow extends StatelessWidget { required this.isFirstActivity, }) : super(key: key); - @override + @override Widget build(BuildContext context) { return InkWell( onTap: onClick, @@ -24,17 +24,22 @@ class WorkoutRow extends StatelessWidget { margin: const EdgeInsets.symmetric(vertical: 8, horizontal: 2), decoration: BoxDecoration( border: Border.all( - color: isFirstActivity ? Color.fromARGB(255, 144, 252, 148) : Colors.transparent, + color: isFirstActivity + ? Color.fromARGB(255, 144, 252, 148) + : Colors.transparent, width: 2.0, ), - borderRadius: BorderRadius.circular(10), + borderRadius: BorderRadius.circular(10), ), child: Material( - - color: isFirstActivity ? Color.fromARGB(255, 240, 255, 240) : Colors.transparent, + color: isFirstActivity + ? Color.fromARGB(255, 240, 255, 240) + : Colors.transparent, child: InkWell( - borderRadius: BorderRadius.circular(10), // Utiliser le même borderRadius - splashColor: Color.fromARGB(255, 42, 94, 44).withOpacity(0.3), // Couleur du fond au survol + borderRadius: + BorderRadius.circular(10), // Utiliser le même borderRadius + splashColor: Color.fromARGB(255, 42, 94, 44) + .withOpacity(0.3), // Couleur du fond au survol onTap: onClick, child: Padding( padding: const EdgeInsets.symmetric(vertical: 15, horizontal: 15), diff --git a/lib/common_widget/graph/altitude_by_time.dart b/lib/common_widget/graph/altitude_by_time.dart index ff8c2b7..fcdd9ca 100644 --- a/lib/common_widget/graph/altitude_by_time.dart +++ b/lib/common_widget/graph/altitude_by_time.dart @@ -28,6 +28,9 @@ class _GraphAltitudeByTime extends State { LineChartBarData( spots: widget.data.altitudeSeconde, isCurved: false, + gradient: LinearGradient( + colors: TColor.primaryG, + ), dotData: const FlDotData(show: false)) ]; @@ -43,7 +46,7 @@ class _GraphAltitudeByTime extends State { gridData: FlGridData( drawVerticalLine: false, drawHorizontalLine: true, - horizontalInterval: 1, + horizontalInterval: (maxY - minY) / 5, getDrawingHorizontalLine: (value) { return FlLine( color: TColor.gray.withOpacity(0.15), @@ -56,10 +59,10 @@ class _GraphAltitudeByTime extends State { bottomTitles: const AxisTitles(), rightTitles: AxisTitles( sideTitles: SideTitles( - reservedSize: 50, + reservedSize: 60, showTitles: true, getTitlesWidget: (value, meta) { - return Text("${value.toInt()} m"); + return Text("${double.parse(value.toStringAsFixed(2))} m"); }, )), )))); diff --git a/lib/common_widget/stats.dart b/lib/common_widget/stats.dart index 2fcb512..1591d68 100644 --- a/lib/common_widget/stats.dart +++ b/lib/common_widget/stats.dart @@ -13,7 +13,8 @@ class Stats extends StatelessWidget { .getTotalCalorie(); String heartrate = Provider.of(context, listen: false) .listActivity[0] - .getTotalAvgHeartRate(); + .getAvgBpm() + .toString(); String time = Provider.of(context, listen: false) .listActivity[0] .getTotalTime(); @@ -152,8 +153,6 @@ class InfoStat extends StatelessWidget { } } - - class StatIcon extends StatelessWidget { const StatIcon({ Key? key, diff --git a/lib/main.dart b/lib/main.dart index 276dc73..049d2fc 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -2,7 +2,6 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:smartfit_app_mobile/modele/user.dart'; import 'package:smartfit_app_mobile/common/colo_extension.dart'; -import 'package:smartfit_app_mobile/view/home/no_activity_view.dart'; import 'package:smartfit_app_mobile/view/main_tab/main_tab_view.dart'; void main() { @@ -16,7 +15,7 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( - title: 'SmartFit 3 in 1', + title: 'SmartFit', debugShowCheckedModeBanner: false, theme: ThemeData( // This is the theme of your application. diff --git a/lib/modele/activity.dart b/lib/modele/activity.dart index bb525cb..6e7d6ca 100644 --- a/lib/modele/activity.dart +++ b/lib/modele/activity.dart @@ -1,4 +1,5 @@ import 'package:fl_chart/fl_chart.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:smartfit_app_mobile/common_widget/graph/graph.dart'; class ActivityOfUser { @@ -27,6 +28,7 @@ class ActivityOfUser { return 0; } + // ----------------- BPM ------------------ // List getHeartRateWithTime() { List result = List.empty(growable: true); int firtTimeStamp = 0; @@ -53,6 +55,35 @@ class ActivityOfUser { return result; } + int getMaxBpm() { + for (int i = 0; i < _contentActivity[_dataSession].length; i++) { + if (_contentActivity[_dataSession][i] == "max_heart_rate") { + return _contentActivity[_dataSession][i + 1]; + } + } + return 0; + } + + int getMinBpm() { + for (int i = 0; i < _contentActivity[_dataSession].length; i++) { + if (_contentActivity[_dataSession][i] == "min_heart_rate") { + return _contentActivity[_dataSession][i + 1]; + } + } + return 0; + } + + int getAvgBpm() { + for (int i = 0; i < _contentActivity[_dataSession].length; i++) { + if (_contentActivity[_dataSession][i] == "avg_heart_rate") { + return _contentActivity[_dataSession][i + 1]; + } + } + return 0; + } + // -------------------------- FIN BPM ---------------------- // + + // ---------------------- Distance ---------------------- // List getDistanceWithTime() { List result = List.empty(growable: true); int firtTimeStamp = 0; @@ -70,6 +101,18 @@ class ActivityOfUser { return result; } + String getTotalDistance() { + for (int i = 0; i < _contentActivity[_dataSession].length; i++) { + if (_contentActivity[_dataSession][i] == "total_distance") { + return _contentActivity[_dataSession][i + 1].toString(); + } + } + return "null"; + } + + // ---------------------- FIN Distance ---------------------- // + + // ---------------------- Calories ---------------------- // List getCalories() { List result = List.empty(growable: true); int firtTimeStamp = 0; @@ -88,41 +131,6 @@ class ActivityOfUser { return result; } - String getTotalSteps() { - for (int i = 0; i < _contentActivity[_dataSession].length; i++) { - if (_contentActivity[_dataSession][i] == "total_strides") { - return _contentActivity[_dataSession][i + 1].toString(); - } - } - return "null"; - } - - String getMaxBpm() { - for (int i = 0; i < _contentActivity[_dataSession].length; i++) { - if (_contentActivity[_dataSession][i] == "max_heart_rate") { - return _contentActivity[_dataSession][i + 1].toString(); - } - } - return "null"; - } - String getMinBpm() { - for (int i = 0; i < _contentActivity[_dataSession].length; i++) { - if (_contentActivity[_dataSession][i] == "min_heart_rate") { - return _contentActivity[_dataSession][i + 1].toString(); - } - } - return "null"; - } - - String getAvgBpm() { - for (int i = 0; i < _contentActivity[_dataSession].length; i++) { - if (_contentActivity[_dataSession][i] == "avg_heart_rate") { - return _contentActivity[_dataSession][i + 1].toString(); - } - } - return "null"; - } - String getTotalCalorie() { for (int i = 0; i < _contentActivity[_dataSession].length; i++) { if (_contentActivity[_dataSession][i] == "total_calories") { @@ -132,15 +140,20 @@ class ActivityOfUser { return "null"; } - String getTotalAvgHeartRate() { + // ---------------------- FIN Calories ---------------------- // + + // ---------------------- Step ------------------------------// + String getTotalSteps() { for (int i = 0; i < _contentActivity[_dataSession].length; i++) { - if (_contentActivity[_dataSession][i] == "avg_heart_rate") { + if (_contentActivity[_dataSession][i] == "total_strides") { return _contentActivity[_dataSession][i + 1].toString(); } } return "null"; } + // ----------------------- FIN Step ------------------------ // + // ------------------------- Time ----------------------------- // String getTotalTime() { for (int i = 0; i < _contentActivity[_dataSession].length; i++) { if (_contentActivity[_dataSession][i] == "total_elapsed_time") { @@ -149,15 +162,7 @@ class ActivityOfUser { } return "null"; } - - String getTotalDistance() { - for (int i = 0; i < _contentActivity[_dataSession].length; i++) { - if (_contentActivity[_dataSession][i] == "total_distance") { - return _contentActivity[_dataSession][i + 1].toString(); - } - } - return "null"; - } + // ---------------------------- FIN time -------------------- // // ---------------------------------------- Altitude -------------------- // List getAltitudeWithTime() { @@ -196,6 +201,8 @@ class ActivityOfUser { } // -------------------------- FIN altitude ---------------------- // + // -------------------------- Speed ---------------------- // + List getSpeedWithTime() { List result = List.empty(growable: true); int firtTimeStamp = 0; @@ -244,6 +251,41 @@ class ActivityOfUser { return result; } + double getMaxSpeed() { + for (int i = 4; i < _contentActivity[_dataSession].length; i++) { + if (_contentActivity[_dataSession][i] == "max_speed") { + return _contentActivity[_dataSession][i + 1]; + } + } + return 0.0; + } + + double getAvgSpeed() { + for (int i = 4; i < _contentActivity[_dataSession].length; i++) { + if (_contentActivity[_dataSession][i] == "avg_speed") { + return _contentActivity[_dataSession][i + 1]; + } + } + return 0.0; + } + + // -------------------------- FIN Speed ---------------------- // + + // -------------------------- Localisation ------------------- // + + List getPosition() { + List list = List.empty(growable: true); + + for (List ligne in _contentActivity) { + if (ligne[0] == "Data" && ligne[6] == "position_lat") { + list.add(LatLng(ligne[7], ligne[10])); + } + } + return list; + } + + // -------------------------- FIN Localisation ---------------------- // + Map toMap() { return { 'nomActivite': _nomActivite, diff --git a/lib/modele/utile/maps/maps_utile.dart b/lib/modele/utile/maps/maps_utile.dart new file mode 100644 index 0000000..e74c450 --- /dev/null +++ b/lib/modele/utile/maps/maps_utile.dart @@ -0,0 +1,16 @@ +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:provider/provider.dart'; +import 'package:smartfit_app_mobile/modele/user.dart'; + +class MapUtil { + Set initPolines(BuildContext context, int largueur, Color couleur) { + Set _polylines = {}; + _polylines.add(Polyline( + polylineId: const PolylineId("Polyline"), + color: couleur, + points: context.watch().listActivity[0].getPosition(), + width: largueur)); + return _polylines; + } +} diff --git a/lib/view/activity/mobile/mobile_Activity_view.dart b/lib/view/activity/mobile/mobile_Activity_view.dart index 273f6be..d21df8c 100644 --- a/lib/view/activity/mobile/mobile_Activity_view.dart +++ b/lib/view/activity/mobile/mobile_Activity_view.dart @@ -1,4 +1,3 @@ -import 'package:provider/provider.dart'; import 'package:smartfit_app_mobile/common_widget/steps.dart'; import 'package:smartfit_app_mobile/common_widget/graph/graph.dart'; import 'package:smartfit_app_mobile/common_widget/info.dart' hide Stats; diff --git a/lib/view/activity/web/web_list_activity.dart b/lib/view/activity/web/web_list_activity.dart index 734d06d..aef0e23 100644 --- a/lib/view/activity/web/web_list_activity.dart +++ b/lib/view/activity/web/web_list_activity.dart @@ -1,4 +1,3 @@ -import 'dart:convert'; import 'dart:typed_data'; import 'package:flutter/material.dart'; import 'package:smartfit_app_mobile/modele/manager_file.dart'; @@ -27,7 +26,6 @@ class _WebListActivityState extends State { //late File x = File(file.path); - void readFile(html.File file) async { ManagerFile x = ManagerFile(); final reader = html.FileReader(); @@ -47,7 +45,7 @@ class _WebListActivityState extends State { @override Widget build(BuildContext context) { var media = MediaQuery.of(context).size; - + return Scaffold( backgroundColor: TColor.white, body: SingleChildScrollView( @@ -107,7 +105,7 @@ class _WebListActivityState extends State { ), ) ]) - : Material( + : Material( color: Colors.transparent, child: ListView.builder( padding: EdgeInsets.zero, diff --git a/lib/view/home/mobile/mobile_homeview.dart b/lib/view/home/mobile/mobile_homeview.dart index f8a23cc..b051c31 100644 --- a/lib/view/home/mobile/mobile_homeview.dart +++ b/lib/view/home/mobile/mobile_homeview.dart @@ -24,9 +24,18 @@ class _MobileHomeView extends State { @override Widget build(BuildContext context) { var media = MediaQuery.of(context).size; - String maxBpm = context.watch().listActivity[0].getMaxBpm(); - String minBpm = context.watch().listActivity[0].getMinBpm(); - String avgBpm = context.watch().listActivity[0].getAvgBpm(); + // -- BPM -- // + int maxBpm = context.watch().listActivity[0].getMaxBpm(); + int minBpm = context.watch().listActivity[0].getMinBpm(); + int avgBpm = context.watch().listActivity[0].getAvgBpm(); + // -- Altitude -- // + double minAltitude = context.watch().listActivity[0].getMinAltitude(); + double maxAltitude = context.watch().listActivity[0].getMaxAltitude(); + double avgAltitude = (maxAltitude + minAltitude) / 2; + // -- Speed -- // + double maxSpeed = context.watch().listActivity[0].getMaxSpeed(); + double avgSpeed = context.watch().listActivity[0].getAvgSpeed(); + data = HomeViewUtil().initData(context); return Scaffold( @@ -57,9 +66,9 @@ class _MobileHomeView extends State { height: media.width * 0.05, ), LigneContainerStats( - "$minBpm BPM", - "$maxBpm BPM", - "$avgBpm BPM", + "${minBpm.toString()} BPM", + "${maxBpm.toString()} BPM", + "${avgBpm.toString()} BPM", "Minimum", "Maximum", "Moyenne", @@ -85,10 +94,36 @@ class _MobileHomeView extends State { SizedBox( height: media.width * 0.05, ), - const LigneContainerStats( - "30 BPM", - "90 BPM", - "290 BPM", + LigneContainerStats( + "${double.parse(maxSpeed.toStringAsFixed(2))} KM/H", + "${double.parse(avgSpeed.toStringAsFixed(2))} km/H", + "${avgBpm.toString()} BPM", + "Max Speed", + "Moyenne Speed", + "Moyenne BPM", + Icons.trending_down, + Icons.trending_up, + Icons.favorite_outline), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "Altitude", + style: TextStyle( + color: TColor.black, + fontSize: 16, + fontWeight: FontWeight.w700), + ), + ], + ), + SizedBox( + height: media.width * 0.05, + ), + GraphAltitudeByTime(media, data), + LigneContainerStats( + "${minAltitude.toInt()} M", + "${maxAltitude.toInt()} M", + "${avgAltitude.toInt()} M", "Minimum", "Maximum", "Moyenne", @@ -98,7 +133,6 @@ class _MobileHomeView extends State { SizedBox( height: media.width * 0.05, ), - GraphAltitudeByTime(media, data) ], ), ), diff --git a/lib/view/home/no_activity_view.dart b/lib/view/home/no_activity_view.dart index 206cda6..698b7ee 100644 --- a/lib/view/home/no_activity_view.dart +++ b/lib/view/home/no_activity_view.dart @@ -2,9 +2,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import '../../common/colo_extension.dart'; -import '../../common_widget/button/round_button.dart'; -import '../main_tab/main_tab_view.dart'; - class NoActivityView extends StatefulWidget { const NoActivityView({super.key}); @@ -20,13 +17,15 @@ class _NoActivityViewState extends State { return Scaffold( backgroundColor: TColor.white, body: SafeArea( - child: Center( // Utilisation du widget Center pour centrer verticalement + child: Center( + // Utilisation du widget Center pour centrer verticalement child: Container( width: media.width, padding: const EdgeInsets.symmetric(vertical: 15, horizontal: 25), child: Column( crossAxisAlignment: CrossAxisAlignment.center, - mainAxisSize: MainAxisSize.min, // Utilisation de MainAxisSize.min pour que la colonne prenne la hauteur minimale nécessaire + mainAxisSize: MainAxisSize + .min, // Utilisation de MainAxisSize.min pour que la colonne prenne la hauteur minimale nécessaire children: [ SizedBox( height: media.height * 0.1, diff --git a/lib/view/home/web/web_homeview.dart b/lib/view/home/web/web_homeview.dart index 0976901..7ce47de 100644 --- a/lib/view/home/web/web_homeview.dart +++ b/lib/view/home/web/web_homeview.dart @@ -24,9 +24,17 @@ class _WebHomeView extends State { @override Widget build(BuildContext context) { var media = MediaQuery.of(context).size; - String maxBpm = context.watch().listActivity[0].getMaxBpm(); - String minBpm = context.watch().listActivity[0].getMinBpm(); - String avgBpm = context.watch().listActivity[0].getAvgBpm(); + // -- BPM -- // + int maxBpm = context.watch().listActivity[0].getMaxBpm(); + int minBpm = context.watch().listActivity[0].getMinBpm(); + int avgBpm = context.watch().listActivity[0].getAvgBpm(); + // -- Altitude -- // + double minAltitude = context.watch().listActivity[0].getMinAltitude(); + double maxAltitude = context.watch().listActivity[0].getMaxAltitude(); + double avgAltitude = (maxAltitude + minAltitude) / 2; + // -- Speed -- // + double maxSpeed = context.watch().listActivity[0].getMaxSpeed(); + double avgSpeed = context.watch().listActivity[0].getAvgSpeed(); data = HomeViewUtil().initData(context); @@ -61,9 +69,9 @@ class _WebHomeView extends State { height: media.width * 0.05, ), LigneContainerStats( - "$minBpm BPM", - "$maxBpm BPM", - "$avgBpm BPM", + "${minBpm.toString()} BPM", + "${maxBpm.toString()} BPM", + "${avgBpm.toString()} BPM", "Minimum", "Maximum", "Moyenne", @@ -92,10 +100,24 @@ class _WebHomeView extends State { SizedBox( height: media.width * 0.05, ), - const LigneContainerStats( - "30 BPM", - "90 BPM", - "290 BPM", + LigneContainerStats( + "${double.parse(maxSpeed.toStringAsFixed(2))} KM/H", + "${double.parse(avgSpeed.toStringAsFixed(2))} km/H", + "${avgBpm.toString()} BPM", + "Minimum", + "Maximum", + "Moyenne", + Icons.trending_down, + Icons.trending_up, + Icons.favorite_outline), + SizedBox( + height: media.width * 0.05, + ), + GraphAltitudeByTime(media, data), + LigneContainerStats( + "${minAltitude.toInt()} M", + "${maxAltitude.toInt()} M", + "${avgAltitude.toInt()} M", "Minimum", "Maximum", "Moyenne", @@ -105,7 +127,6 @@ class _WebHomeView extends State { SizedBox( height: media.width * 0.05, ), - GraphAltitudeByTime(media, data) ], ), ), diff --git a/lib/view/login/web/web_login_view.dart b/lib/view/login/web/web_login_view.dart index 743048e..83d83ca 100644 --- a/lib/view/login/web/web_login_view.dart +++ b/lib/view/login/web/web_login_view.dart @@ -76,7 +76,7 @@ class _WebLoginView extends State { body: SingleChildScrollView( child: SafeArea( child: Container( - padding: const EdgeInsets.symmetric(horizontal: 20), + padding: const EdgeInsets.symmetric(horizontal: 300), height: media.height, child: Column( crossAxisAlignment: CrossAxisAlignment.center, @@ -182,25 +182,7 @@ class _WebLoginView extends State { SizedBox( height: media.width * 0.04, ), - Row( - // crossAxisAlignment: CrossAxisAlignment., - children: [ - Expanded( - child: Container( - height: 1, - color: TColor.gray.withOpacity(0.5), - )), - Text( - " Or ", - style: TextStyle(color: TColor.black, fontSize: 12), - ), - Expanded( - child: Container( - height: 1, - color: TColor.gray.withOpacity(0.5), - )), - ], - ), + SizedBox( height: media.width * 0.04, ), diff --git a/lib/view/login/web/web_signup_view.dart b/lib/view/login/web/web_signup_view.dart index d026b90..1f457f8 100644 --- a/lib/view/login/web/web_signup_view.dart +++ b/lib/view/login/web/web_signup_view.dart @@ -93,10 +93,13 @@ class _WebSignUpView extends State { body: SingleChildScrollView( child: SafeArea( child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 20), + padding: const EdgeInsets.symmetric(horizontal: 300), child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ + SizedBox( + height: media.width * 0.04, + ), Text( "Bienvenue,", style: TextStyle(color: TColor.gray, fontSize: 16), @@ -170,15 +173,13 @@ class _WebSignUpView extends State { ) ], ), - SizedBox( - height: media.width * 0.05, - ), + Visibility( visible: _errorCreateUser, child: Text("Error - $_msgError", style: TextStyle(color: TColor.red))), SizedBox( - height: media.width * 0.4, + height: media.width * 0.05, ), RoundButton( title: "Créer un compte", @@ -206,78 +207,7 @@ class _WebSignUpView extends State { SizedBox( height: media.width * 0.04, ), - Row( - // crossAxisAlignment: CrossAxisAlignment., - children: [ - Expanded( - child: Container( - height: 1, - color: TColor.gray.withOpacity(0.5), - )), - Text( - " Ou ", - style: TextStyle(color: TColor.black, fontSize: 12), - ), - Expanded( - child: Container( - height: 1, - color: TColor.gray.withOpacity(0.5), - )), - ], - ), - SizedBox( - height: media.width * 0.04, - ), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - GestureDetector( - onTap: () {}, - child: Container( - width: 50, - height: 50, - alignment: Alignment.center, - decoration: BoxDecoration( - color: TColor.white, - border: Border.all( - width: 1, - color: TColor.gray.withOpacity(0.4), - ), - borderRadius: BorderRadius.circular(15), - ), - child: Image.asset( - "assets/img/google.png", - width: 20, - height: 20, - ), - ), - ), - SizedBox( - width: media.width * 0.04, - ), - GestureDetector( - onTap: () {}, - child: Container( - width: 50, - height: 50, - alignment: Alignment.center, - decoration: BoxDecoration( - color: TColor.white, - border: Border.all( - width: 1, - color: TColor.gray.withOpacity(0.4), - ), - borderRadius: BorderRadius.circular(15), - ), - child: Image.asset( - "assets/img/suunto.png", - width: 35, - height: 35, - ), - ), - ) - ], - ), + SizedBox( height: media.width * 0.04, ), diff --git a/lib/view/map/mobile/mobile_my_map.dart b/lib/view/map/mobile/mobile_my_map.dart new file mode 100644 index 0000000..a3b35dc --- /dev/null +++ b/lib/view/map/mobile/mobile_my_map.dart @@ -0,0 +1,46 @@ +import 'dart:async'; +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:smartfit_app_mobile/common/colo_extension.dart'; +import 'package:smartfit_app_mobile/modele/utile/maps/maps_utile.dart'; + +class MobileMyMaps extends StatefulWidget { + const MobileMyMaps({super.key}); + + @override + State createState() => _MobileMyMaps(); +} + +class _MobileMyMaps extends State { + final Completer _googleMapController = Completer(); + CameraPosition? _cameraPosition; + Set _polylines = {}; + + @override + Widget build(BuildContext context) { + _polylines = MapUtil().initPolines(context, 10, TColor.primaryColor1); + _cameraPosition = + CameraPosition(target: _polylines.first.points.first, zoom: 18); + + return Scaffold( + body: _getMap(), + ); + } + + Widget _getMap() { + return Stack( + children: [ + GoogleMap( + initialCameraPosition: _cameraPosition!, + mapType: MapType.normal, + onMapCreated: (GoogleMapController controller) { + if (!_googleMapController.isCompleted) { + _googleMapController.complete(controller); + } + }, + polylines: _polylines, + ) + ], + ); + } +} diff --git a/lib/view/map/my_map.dart b/lib/view/map/my_map.dart index 272fe38..64b3609 100644 --- a/lib/view/map/my_map.dart +++ b/lib/view/map/my_map.dart @@ -1,154 +1,29 @@ -import 'dart:async'; - import 'package:flutter/material.dart'; -import 'package:google_maps_flutter/google_maps_flutter.dart'; -import 'package:location/location.dart'; -import 'package:smartfit_app_mobile/common/colo_extension.dart'; +import 'package:provider/provider.dart'; +import 'package:responsive_builder/responsive_builder.dart'; +import 'package:smartfit_app_mobile/modele/user.dart'; +import 'package:smartfit_app_mobile/view/map/mobile/mobile_my_map.dart'; +import 'package:smartfit_app_mobile/view/map/web/web_my_map.dart'; +import 'package:smartfit_app_mobile/view/profile/profile_view.dart'; class MyMap extends StatefulWidget { - const MyMap({ Key? key }) : super(key: key); + const MyMap({Key? key}) : super(key: key); @override State createState() => _MyMapState(); } class _MyMapState extends State { - - Completer _googleMapController = Completer(); - CameraPosition? _cameraPosition; - Location? _location; - LocationData? _currentLocation; - List _polylineCoordinates = []; - Set _polylines = {}; - Set _markers = {}; // Add a set to store markers - - @override - void initState() { - _init(); - super.initState(); - } - - _init() async { - _location = Location(); - _cameraPosition = CameraPosition( - target: LatLng(0, 0), // this is just the example lat and lng for initializing - zoom: 20 - ); - _initLocation(); - } - - //function to listen when we move position - _initLocation() { - - _location?.getLocation().then((location) { - _currentLocation = location; - }); - - _location?.onLocationChanged.listen((newLocation) { - setState(() { - _currentLocation = newLocation; - _polylineCoordinates.add(LatLng( - _currentLocation?.latitude ?? 0, - _currentLocation?.longitude ?? 0, - )); - _updatePolyline(); - - }); - - moveToPosition(LatLng(_currentLocation?.latitude ?? 0, - _currentLocation?.longitude ?? 0)); - }); - } - - _updatePolyline() { - setState(() { - _polylines.clear(); - _polylines.add(Polyline( - polylineId: PolylineId("polyline"), - color: TColor.primaryColor1, - points: _polylineCoordinates, - width: 10, - )); - }); - } - - // Updated _updateMarker to use the custom marker - _updateMarker(LatLng position) async { - final markerId = MarkerId('marker'); - final marker = Marker( - markerId: markerId, - position: position - ); - _markers.clear(); - _markers.add(marker); -} - - - moveToPosition(LatLng latLng) async { - GoogleMapController mapController = await _googleMapController.future; - mapController.animateCamera( - CameraUpdate.newCameraPosition( - CameraPosition( - target: latLng, - zoom: 15 - ) - ) - ); - } - @override Widget build(BuildContext context) { - return Scaffold( - body: _buildBody(), - ); - } - - Widget _buildBody() { - return _getMap(); - } - - Widget _getMarker() { - return Container( - width: 25, - height: 25, - padding: EdgeInsets.all(2), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(100), - boxShadow: [ - BoxShadow( - color: Colors.grey, - offset: Offset(0,3), - spreadRadius: 4, - blurRadius: 6 - ) - ] - ), - child: ClipOval(child: Image.asset("assets/img/u1.png")), - ); - } - - Widget _getMap() { - return Stack( - children: [ - GoogleMap( - initialCameraPosition: _cameraPosition!, - mapType: MapType.normal, - onMapCreated: (GoogleMapController controller) { - if (!_googleMapController.isCompleted) { - _googleMapController.complete(controller); - } - }, - polylines: _polylines, - markers: _markers, - ), - Positioned.fill( - child: Align( - alignment: Alignment.center, - child: _getMarker() + return context.watch().listActivity.isEmpty + ? ScreenTypeLayout.builder( + mobile: (_) => const ProfileView(), + desktop: (_) => const ProfileView(), ) - ) - ], - ); + : ScreenTypeLayout.builder( + mobile: (_) => const MobileMyMaps(), + desktop: (_) => const WebMyMaps(), + ); } } diff --git a/lib/view/map/web/web_my_map.dart b/lib/view/map/web/web_my_map.dart new file mode 100644 index 0000000..6c4517a --- /dev/null +++ b/lib/view/map/web/web_my_map.dart @@ -0,0 +1,47 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:smartfit_app_mobile/common/colo_extension.dart'; +import 'package:smartfit_app_mobile/modele/utile/maps/maps_utile.dart'; + +class WebMyMaps extends StatefulWidget { + const WebMyMaps({super.key}); + + @override + State createState() => _WebMyMaps(); +} + +class _WebMyMaps extends State { + final Completer _googleMapController = Completer(); + CameraPosition? _cameraPosition; + Set _polylines = {}; + + @override + Widget build(BuildContext context) { + _polylines = MapUtil().initPolines(context, 10, TColor.primaryColor1); + _cameraPosition = + CameraPosition(target: _polylines.first.points.first, zoom: 18); + + return Scaffold( + body: _getMap(), + ); + } + + Widget _getMap() { + return Stack( + children: [ + GoogleMap( + initialCameraPosition: _cameraPosition!, + mapType: MapType.normal, + onMapCreated: (GoogleMapController controller) { + if (!_googleMapController.isCompleted) { + _googleMapController.complete(controller); + } + }, + polylines: _polylines, + ) + ], + ); + } +} diff --git a/lib/view/ne_pas_supprimer/map.txt b/lib/view/ne_pas_supprimer/map.txt new file mode 100644 index 0000000..c1e6fa5 --- /dev/null +++ b/lib/view/ne_pas_supprimer/map.txt @@ -0,0 +1,131 @@ +import 'dart:async'; +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:location/location.dart'; +import 'package:smartfit_app_mobile/common/colo_extension.dart'; + +class MobileMyMaps extends StatefulWidget { + const MobileMyMaps({super.key}); + + @override + State createState() => _MobileMyMaps(); +} + +class _MobileMyMaps extends State { + Completer _googleMapController = Completer(); + CameraPosition? _cameraPosition; + Location? _location; + LocationData? _currentLocation; + List _polylineCoordinates = []; + Set _polylines = {}; + Set _markers = {}; // Add a set to store markers + + @override + void initState() { + _init(); + super.initState(); + } + + _init() async { + _location = Location(); + _cameraPosition = const CameraPosition( + target: LatLng( + 0, 0), // this is just the example lat and lng for initializing + zoom: 20); + _initLocation(); + } + + //function to listen when we move position + _initLocation() { + _location?.getLocation().then((location) { + _currentLocation = location; + }); + + _location?.onLocationChanged.listen((newLocation) { + setState(() { + _currentLocation = newLocation; + _polylineCoordinates.add(LatLng( + _currentLocation?.latitude ?? 0, + _currentLocation?.longitude ?? 0, + )); + _updatePolyline(); + }); + + moveToPosition(LatLng( + _currentLocation?.latitude ?? 0, _currentLocation?.longitude ?? 0)); + }); + } + + _updatePolyline() { + setState(() { + _polylines.clear(); + _polylines.add(Polyline( + polylineId: PolylineId("polyline"), + color: TColor.primaryColor1, + points: _polylineCoordinates, + width: 10, + )); + }); + } + + /* + // Updated _updateMarker to use the custom marker + _updateMarker(LatLng position) async { + final markerId = MarkerId('marker'); + final marker = Marker(markerId: markerId, position: position); + _markers.clear(); + _markers.add(marker); + }*/ + + moveToPosition(LatLng latLng) async { + GoogleMapController mapController = await _googleMapController.future; + mapController.animateCamera(CameraUpdate.newCameraPosition( + CameraPosition(target: latLng, zoom: 15))); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: _getMap(), + ); + } + + Widget _getMarker() { + return Container( + width: 25, + height: 25, + padding: EdgeInsets.all(2), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(100), + boxShadow: [ + BoxShadow( + color: Colors.grey, + offset: Offset(0, 3), + spreadRadius: 4, + blurRadius: 6) + ]), + child: ClipOval(child: Image.asset("assets/img/u1.png")), + ); + } + + Widget _getMap() { + return Stack( + children: [ + GoogleMap( + initialCameraPosition: _cameraPosition!, + mapType: MapType.normal, + onMapCreated: (GoogleMapController controller) { + if (!_googleMapController.isCompleted) { + _googleMapController.complete(controller); + } + }, + polylines: _polylines, + markers: _markers, + ), + Positioned.fill( + child: Align(alignment: Alignment.center, child: _getMarker())) + ], + ); + } +} diff --git a/lib/view/profile/web/web_profile_view.dart b/lib/view/profile/web/web_profile_view.dart index 045bb46..db18ebb 100644 --- a/lib/view/profile/web/web_profile_view.dart +++ b/lib/view/profile/web/web_profile_view.dart @@ -4,7 +4,6 @@ import 'package:smartfit_app_mobile/common/colo_extension.dart'; import 'package:smartfit_app_mobile/common_widget/button/round_button.dart'; import 'package:smartfit_app_mobile/common_widget/setting_row.dart'; import 'package:smartfit_app_mobile/common_widget/title_subtitle_cell.dart'; -import 'package:smartfit_app_mobile/view/home/notification_view.dart'; import 'package:smartfit_app_mobile/view/profile/change_password.dart'; import 'package:smartfit_app_mobile/view/profile/change_email.dart'; import 'package:smartfit_app_mobile/view/profile/change_username.dart'; diff --git a/web/index.html b/web/index.html index 04a3091..ac02418 100644 --- a/web/index.html +++ b/web/index.html @@ -26,6 +26,9 @@ + + +