list activity

profile
Enzo 1 year ago
parent c5b38871a5
commit 682ba07aa3

@ -60,7 +60,14 @@ class WorkoutRow extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text( Text(
wObj["nomActivite"].toString(), wObj["categorie"].toString(),
style: TextStyle(
color: TColor.black,
fontSize: 12,
),
),
Text(
wObj["date"].toString(),
style: TextStyle( style: TextStyle(
color: TColor.black, color: TColor.black,
fontSize: 12, fontSize: 12,

@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:smartfit_app_mobile/modele/user.dart'; import 'package:smartfit_app_mobile/modele/user.dart';
import 'package:smartfit_app_mobile/common/colo_extension.dart'; import 'package:smartfit_app_mobile/common/colo_extension.dart';
import 'package:smartfit_app_mobile/view/main_tab/main_tab_view.dart'; import 'package:smartfit_app_mobile/view/login/signup_view.dart';
void main() { void main() {
runApp(ChangeNotifierProvider( runApp(ChangeNotifierProvider(
@ -36,7 +36,7 @@ class MyApp extends StatelessWidget {
primaryColor: TColor.primaryColor1, primaryColor: TColor.primaryColor1,
fontFamily: "Poppins"), fontFamily: "Poppins"),
//home: const StartedView(), //home: const StartedView(),
home: const MainTabView(), home: const SignUpView(),
); );
} }
} }

@ -3,18 +3,40 @@ import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:smartfit_app_mobile/common_widget/graph/graph.dart'; import 'package:smartfit_app_mobile/common_widget/graph/graph.dart';
class ActivityOfUser { class ActivityOfUser {
late String _nomActivite; // A afficher
late String _categorie;
late String _date;
late String _fileUuid;
late String _nameFile;
// ------------ //
late String _imageName; late String _imageName;
late List<dynamic> _contentActivity; late List<dynamic> _contentActivity;
late int _dataSession; late int _dataSession;
// -- Getter/Setter -- //
List<dynamic> get contentActivity => _contentActivity; List<dynamic> get contentActivity => _contentActivity;
set contentActivity(List<dynamic> content) {
_contentActivity = content;
_dataSession = getDataSession();
}
String get fileUuid => _fileUuid;
String get nameFile => _nameFile;
ActivityOfUser(
String date, String categorie, String fileUuid, String nameFile) {
_categorie = categorie;
_date = date;
_fileUuid = fileUuid;
_nameFile = nameFile;
ActivityOfUser(String nom, List<dynamic> listeDynamic) { // Mettre dans une fonction appart
_nomActivite = nom; if (categorie == "Walking") {
_imageName = "assets/img/workout1.svg"; _imageName = "assets/img/workout1.svg";
_contentActivity = listeDynamic; } else {
_dataSession = getDataSession(); // Mettre des conditions pour d'autre type d'activité
_imageName = "assets/img/workout1.svg";
}
} }
// ----- Retourne l'indice de la ligne qui contient les données de la session -- // // ----- Retourne l'indice de la ligne qui contient les données de la session -- //
@ -287,9 +309,6 @@ class ActivityOfUser {
// -------------------------- FIN Localisation ---------------------- // // -------------------------- FIN Localisation ---------------------- //
Map<String, dynamic> toMap() { Map<String, dynamic> toMap() {
return { return {'categorie': _categorie, 'image': _imageName, 'date': _date};
'nomActivite': _nomActivite,
'image': _imageName,
};
} }
} }

@ -73,7 +73,8 @@ class RequestApi extends IDataStrategy {
headers: <String, String>{'Authorization': token}); headers: <String, String>{'Authorization': token});
if (response.statusCode == 200) { if (response.statusCode == 200) {
return Tuple2(true, response.body); return Tuple2(true,
(json.decode(response.body) as List).cast<Map<String, dynamic>>());
} }
if (response.statusCode == 401) { if (response.statusCode == 401) {
return const Tuple2(false, "401 - UNAUTHORIZED"); return const Tuple2(false, "401 - UNAUTHORIZED");
@ -120,37 +121,6 @@ class RequestApi extends IDataStrategy {
return const Tuple2(false, "Fail"); return const Tuple2(false, "Fail");
} }
/*
@override
Future<bool> updateEmail(String token, String email) async {
final response = await http.put(Uri.parse('$urlApi/$token/email'),
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
body: jsonEncode(<String, String>{'email': email}));
if (response.statusCode == 200) {
return true;
} else {
return false;
}
}
@override
Future<bool> updateUsername(String token, String username) async {
final response = await http.put(Uri.parse('$urlApi/$token/username'),
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
body: jsonEncode(<String, String>{'username': username}));
if (response.statusCode == 200) {
return true;
} else {
return false;
}
}*/
@override @override
Future<Tuple2> modifAttribut( Future<Tuple2> modifAttribut(
String token, String nameAttribut, String newValue) async { String token, String nameAttribut, String newValue) async {

@ -27,10 +27,18 @@ class ManagerFile {
return fitFile.toRows(); return fitFile.toRows();
} }
Future<List<dynamic>> readFitFileWhithFile(File file) async {
final bytes = await file.readAsBytes();
final fitFile = FitFile.fromBytes(bytes);
return fitFile.toRows();
}
List<dynamic> readFitFileWeb(Uint8List bytes) { List<dynamic> readFitFileWeb(Uint8List bytes) {
final fitFile = FitFile.fromBytes(bytes); final fitFile = FitFile.fromBytes(bytes);
return fitFile.toRows(); return fitFile.toRows();
} }
// ------------- Get The path of application --- // // ------------- Get The path of application --- //
Future<String> get localPath async { Future<String> get localPath async {
final directory = await getApplicationDocumentsDirectory(); final directory = await getApplicationDocumentsDirectory();

@ -0,0 +1,6 @@
class AttributUser {
final String _email = "email";
final String _username = "username";
String get email => _email;
String get username => _username;
}

@ -0,0 +1,3 @@
class AttributFileFit {
// Ajouter une variable privé qui contient le champs + un getter
}

@ -1,5 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:smartfit_app_mobile/modele/activity.dart'; import 'package:smartfit_app_mobile/modele/activity.dart';
import 'package:smartfit_app_mobile/modele/utile/list_activity.dart/list_activity_utile.dart';
class User extends ChangeNotifier { class User extends ChangeNotifier {
String username = "VOID"; String username = "VOID";
@ -22,4 +23,10 @@ class User extends ChangeNotifier {
listActivity.insert(index, activity); listActivity.insert(index, activity);
notifyListeners(); notifyListeners();
} }
void insertActivityTop(ActivityOfUser activity, BuildContext context) {
listActivity.insert(0, activity);
ListActivityUtile().getContentOnTheFirstFile(context);
notifyListeners();
}
} }

@ -0,0 +1,31 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:smartfit_app_mobile/modele/api/i_data_strategy.dart';
import 'package:smartfit_app_mobile/modele/api/request_api.dart';
import 'package:smartfit_app_mobile/modele/manager_file.dart';
import 'package:smartfit_app_mobile/modele/user.dart';
import 'package:tuple/tuple.dart';
class ListActivityUtile {
final IDataStrategy _strategy = RequestApi();
final ManagerFile _managerFile = ManagerFile();
Future<void> getContentOnTheFirstFile(BuildContext context) async {
Tuple2 result = await _strategy.getFile(
Provider.of<User>(context, listen: false).token,
Provider.of<User>(context, listen: false).listActivity[0].fileUuid);
if (result.item1 == false) {
//Erreur
//print(result);
return;
}
File file = File(
"${await _managerFile.localPath}/${Provider.of<User>(context, listen: false).listActivity[0].nameFile}");
await file.create();
await file.writeAsBytes(result.item2);
Provider.of<User>(context, listen: false).listActivity[0].contentActivity =
await _managerFile.readFitFileWhithFile(file);
}
}

@ -26,12 +26,9 @@ class Login {
return Tuple2(true, result.item2); return Tuple2(true, result.item2);
} }
void fillUser(BuildContext context, Map<String, dynamic> map, String token) { void fillUser(BuildContext context, Map<dynamic, dynamic> map, String token) {
print(map);
context.read<User>().email = map["email"]; context.read<User>().email = map["email"];
context.read<User>().username = map["username"]; context.read<User>().username = map["username"];
context.read<User>().token = token; context.read<User>().token = token;
context.read<User>().listActivity = List.empty(growable: true);
} }
} }

@ -0,0 +1,10 @@
import 'package:smartfit_app_mobile/modele/api/i_data_strategy.dart';
import 'package:smartfit_app_mobile/modele/api/request_api.dart';
class ProfileUtil {
final IDataStrategy _dataStrategy = RequestApi();
void modifyDataUser(String token, String attribut, String newUsername) {
_dataStrategy.modifAttribut(token, attribut, newUsername);
}
}

@ -1,3 +1,5 @@
import 'dart:io';
import 'package:file_picker/file_picker.dart'; import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@ -5,9 +7,10 @@ import 'package:smartfit_app_mobile/common/colo_extension.dart';
import 'package:smartfit_app_mobile/modele/activity.dart'; import 'package:smartfit_app_mobile/modele/activity.dart';
import 'package:smartfit_app_mobile/modele/api/i_data_strategy.dart'; import 'package:smartfit_app_mobile/modele/api/i_data_strategy.dart';
import 'package:smartfit_app_mobile/modele/api/request_api.dart'; import 'package:smartfit_app_mobile/modele/api/request_api.dart';
import 'package:smartfit_app_mobile/modele/manager_file.dart';
import 'package:smartfit_app_mobile/modele/user.dart'; import 'package:smartfit_app_mobile/modele/user.dart';
import 'package:smartfit_app_mobile/common_widget/container/workout_row.dart'; import 'package:smartfit_app_mobile/common_widget/container/workout_row.dart';
import 'package:smartfit_app_mobile/modele/utile/list_activity.dart/list_activity_utile.dart';
import 'package:tuple/tuple.dart';
class MobileListActivity extends StatefulWidget { class MobileListActivity extends StatefulWidget {
const MobileListActivity({Key? key}) : super(key: key); const MobileListActivity({Key? key}) : super(key: key);
@ -19,8 +22,9 @@ class MobileListActivity extends StatefulWidget {
class _MobileListActivity extends State<MobileListActivity> { class _MobileListActivity extends State<MobileListActivity> {
FilePickerResult? result; FilePickerResult? result;
IDataStrategy strategy = RequestApi(); IDataStrategy strategy = RequestApi();
ManagerFile _managerFile = ManagerFile(); final ListActivityUtile _utile = ListActivityUtile();
/*
Future<void> readFile(String nom) async { Future<void> readFile(String nom) async {
PlatformFile t = result!.files.single; PlatformFile t = result!.files.single;
String? y = t.path; String? y = t.path;
@ -28,18 +32,61 @@ class _MobileListActivity extends State<MobileListActivity> {
print("t"); print("t");
} else { } else {
List<dynamic> result = await _managerFile.readFitFile(y!); List<dynamic> result = await _managerFile.readFitFile(y!);
// Upload the file and Syncronise (getFiles())
strategy.uploadFile(context.watch<User>().token, File(y));
Provider.of<User>(context, listen: false)
.addActivity(ActivityOfUser("Random date", "$nom categorie !"));
Provider.of<User>(context, listen: false) Provider.of<User>(context, listen: false)
.addActivity(ActivityOfUser(nom, result)); .listActivity
.last
.contentActivity = result;
} }
}*/
void addFile(String path) async {
Tuple2<bool, String> result = await strategy.uploadFile(
Provider.of<User>(context, listen: false).token, File(path));
if (result.item1 == false) {
// Afficher msg d'erreur
print("Upload - ${result.item2}");
return;
}
getFiles();
} }
List lastWorkoutArr = []; void getFiles() async {
Tuple2 result = await strategy
.getFiles(Provider.of<User>(context, listen: false).token);
if (result.item1 == false) {
print("GetFiles - ${result.item2}");
// Afficher une message d'erreur
return;
}
Provider.of<User>(context, listen: false).listActivity.clear();
for (Map<String, dynamic> element in result.item2) {
Provider.of<User>(context, listen: false).addActivity(ActivityOfUser(
element["creation_date"].toString(),
element["category"].toString(),
element["uuid"].toString(),
element["filename"].toString()));
}
_utile.getContentOnTheFirstFile(context);
return;
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
var media = MediaQuery.of(context).size; var media = MediaQuery.of(context).size;
int firstActivityIndex = 0; int firstActivityIndex = 0;
if (Provider.of<User>(context).listActivity.isNotEmpty) {
_utile.getContentOnTheFirstFile(context);
}
return Scaffold( return Scaffold(
backgroundColor: TColor.white, backgroundColor: TColor.white,
body: SingleChildScrollView( body: SingleChildScrollView(
@ -60,16 +107,23 @@ class _MobileListActivity extends State<MobileListActivity> {
fontSize: 16, fontSize: 16,
fontWeight: FontWeight.w700), fontWeight: FontWeight.w700),
), ),
TextButton(
onPressed: getFiles,
child: Text("Get activity",
style: TextStyle(
color: TColor.gray,
fontSize: 14,
fontWeight: FontWeight.w700))),
TextButton( TextButton(
onPressed: () async { onPressed: () async {
result = await FilePicker.platform.pickFiles(); FilePickerResult? result =
if (result == null) { await FilePicker.platform.pickFiles();
print("No file selected"); if (result != null) {
addFile(result.files.single.path!);
} else { } else {
for (var element in result!.files) { print("Picker");
readFile(element.name); // msg d'erreur
print(element.name); // User canceled the picker
}
} }
}, },
child: Text( child: Text(
@ -86,7 +140,7 @@ class _MobileListActivity extends State<MobileListActivity> {
? Column( ? Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
SizedBox(height: 20), const SizedBox(height: 20),
Text( Text(
"Vous n'avez pas d'activités pour le moment, veuillez en ajouter.", "Vous n'avez pas d'activités pour le moment, veuillez en ajouter.",
style: TextStyle( style: TextStyle(
@ -109,7 +163,7 @@ class _MobileListActivity extends State<MobileListActivity> {
itemBuilder: (context, index) { itemBuilder: (context, index) {
var activityObj = var activityObj =
Provider.of<User>(context, listen: true) Provider.of<User>(context, listen: true)
.listActivity[index] as ActivityOfUser; .listActivity[index];
var activityMap = activityObj.toMap(); var activityMap = activityObj.toMap();
bool isFirstActivity = false; bool isFirstActivity = false;
@ -136,7 +190,7 @@ class _MobileListActivity extends State<MobileListActivity> {
Provider.of<User>(context, listen: false) Provider.of<User>(context, listen: false)
.removeActivity(activityObj); .removeActivity(activityObj);
Provider.of<User>(context, listen: false) Provider.of<User>(context, listen: false)
.insertActivity(0, activityObj); .insertActivityTop(activityObj, context);
}, },
isFirstActivity: isFirstActivity, isFirstActivity: isFirstActivity,
), ),

@ -24,8 +24,6 @@ class _WebListActivityState extends State<WebListActivity> {
IDataStrategy strategy = RequestApi(); IDataStrategy strategy = RequestApi();
int firstActivityIndex = 0; int firstActivityIndex = 0;
//late File x = File(file.path);
void readFile(html.File file) async { void readFile(html.File file) async {
ManagerFile x = ManagerFile(); ManagerFile x = ManagerFile();
final reader = html.FileReader(); final reader = html.FileReader();
@ -34,14 +32,16 @@ class _WebListActivityState extends State<WebListActivity> {
if (reader.readyState == html.FileReader.DONE) { if (reader.readyState == html.FileReader.DONE) {
Uint8List bytes = reader.result as Uint8List; Uint8List bytes = reader.result as Uint8List;
List<dynamic> result = x.readFitFileWeb(bytes); List<dynamic> result = x.readFitFileWeb(bytes);
Provider.of<User>(context, listen: false).addActivity(
ActivityOfUser("Date random", "${file.name} Categorie", "", ""));
Provider.of<User>(context, listen: false) Provider.of<User>(context, listen: false)
.addActivity(ActivityOfUser(file.name, result)); .listActivity
.last
.contentActivity = result;
} }
}); });
} }
List lastWorkoutArr = [];
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
var media = MediaQuery.of(context).size; var media = MediaQuery.of(context).size;

Loading…
Cancel
Save