💥 local api in progress + lots of things

pull/4/head
remrem 1 year ago
parent 76b32e69ff
commit 49bc2bdd16

@ -1,7 +1,9 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:smartfit_app_mobile/common_widget/container/workout_row.dart';
import 'package:smartfit_app_mobile/modele/api/api_wrapper.dart';
import 'package:smartfit_app_mobile/modele/user.dart';
import 'package:smartfit_app_mobile/modele/utile/info_message.dart';
import 'package:smartfit_app_mobile/modele/utile/list_activity/list_activity_utile.dart';
import 'package:tuple/tuple.dart';
@ -13,6 +15,8 @@ class ListActivity extends StatefulWidget {
}
class _ListActivity extends State<ListActivity> {
final ApiWrapper api = ApiWrapper();
final InfoMessage infoManager = InfoMessage();
final ListActivityUtile _utile = ListActivityUtile();
@override
@ -34,9 +38,10 @@ class _ListActivity extends State<ListActivity> {
child: WorkoutRow(
wObj: activityMap,
onDelete: () async {
if (await _utile.deleteFileOnBDD(
if (await api.deleteFile(
Provider.of<User>(context, listen: false).token,
activityObj.fileUuid)) {
activityObj.fileUuid,
infoManager)) {
if (!Provider.of<User>(context, listen: false)
.managerSelectedActivity
.fileNotSelected(activityObj.fileUuid)) {

@ -1,4 +1,6 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:smartfit_app_mobile/modele/local_db/model.dart' as db;
import 'package:provider/provider.dart';
import 'package:smartfit_app_mobile/modele/local_db/objectbox.dart';
import 'package:smartfit_app_mobile/modele/user.dart';
@ -12,7 +14,7 @@ Future<void> main() async {
// ObjectBox
WidgetsFlutterBinding.ensureInitialized();
localDB = await ObjectBox.create();
localDB.init();
await localDB.init();
runApp(ChangeNotifierProvider(
create: (context) => User(), child: const MyApp()));
@ -24,7 +26,24 @@ class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
Widget viewToDisplay = const SignUpView();
if (localDB.hasUser()) viewToDisplay = const MainTabView();
// Skip sign-up + fill provider if user already connected
if (localDB.hasUser()) {
final db.User user = localDB.userBox.get(1);
final userActivities = localDB.loadActivities();
context.watch<User>().username = user.username;
context.watch<User>().email = user.email;
context.watch<User>().token = user.token;
context.watch<User>().listActivity = userActivities;
stdout.write("===== USER =====\n");
stdout.write("Username: ${user.username}\n");
stdout.write("Username: ${user.email}\n");
stdout.write("Username: ${user.token}\n");
viewToDisplay = const MainTabView();
}
return MaterialApp(
title: 'SmartFit',
@ -48,7 +67,6 @@ class MyApp extends StatelessWidget {
primaryColor: TColor.primaryColor1,
fontFamily: "Poppins"),
home: viewToDisplay,
//home: const ProfileView(),
);
}
}

@ -1,3 +1,5 @@
import 'package:flutter/foundation.dart';
class ActivityOfUser {
// A afficher
late String _categorie;
@ -12,6 +14,8 @@ class ActivityOfUser {
String get fileUuid => _fileUuid;
String get nameFile => _nameFile;
String get categorie => _categorie;
String get date => _date;
Map<String, int> get enteteCSV => _enteteCSV;
// -- Getter/Setter -- Ancien //

@ -0,0 +1,32 @@
import 'dart:io';
import 'dart:typed_data';
import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart' as p;
import 'package:smartfit_app_mobile/modele/helper.dart';
class ActivitySaver {
String saveDirectory = "activities";
late final Directory applicationDocumentsDir;
ActivitySaver._create(this.applicationDocumentsDir);
static Future<ActivitySaver> create() async {
final appDir = await getApplicationDocumentsDirectory();
return ActivitySaver._create(appDir);
}
Future<void> saveActivity(Uint8List activityFile, String filename) async {
final file = await File(
p.join(applicationDocumentsDir.path, saveDirectory, filename))
.create(recursive: true); // To create dir if not exists
file.writeAsBytesSync(activityFile);
}
File getActivity(String filename) {
final file =
File(p.join(applicationDocumentsDir.path, saveDirectory, filename));
return file;
}
}

@ -1,22 +1,91 @@
import 'dart:typed_data';
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/local_db/request_local.dart';
import 'package:smartfit_app_mobile/modele/utile/info_message.dart';
import 'package:email_validator/email_validator.dart';
import 'package:tuple/tuple.dart';
import 'dart:convert';
import 'package:crypto/crypto.dart';
import 'dart:io';
class ApiWrapper {
IDataStrategy api = RequestApi();
late IDataStrategy api;
String noConnectionMessage =
"It seems like you are lost far away in the universe, no connection found :)";
// HELPERS
Future<bool> isOnline() async {
try {
final result = await InternetAddress.lookup('example.com')
.timeout(const Duration(seconds: 2));
if (result.isNotEmpty && result[0].rawAddress.isNotEmpty) {
return true;
}
} on SocketException catch (_) {
return false;
}
return true;
}
Future<void> init() async {
if (await isOnline()) {
stdout.write("(API) ");
api = RequestApi();
} else {
stdout.write("(LOCAL) ");
api = RequestLocal();
}
}
bool handleOffline(InfoMessage infoManager) {
if (api is RequestLocal) {
infoManager.displayMessage(noConnectionMessage, true);
return true;
}
return false;
}
// BOTH (ONLINE + OFFLINE)
Future<Tuple2> getUserInfo(String token) async {
await init();
Tuple2 res = await api.getInfoUser(token);
stdout.write("getUserInfo: ${res.item1}\n");
return res;
}
Future<Tuple2> getFile(String token, String fileUuid) async {
await init();
Tuple2 res = await api.getFile(token, fileUuid);
stdout.write("getFile: ${res.item1}\n");
return res;
}
Future<Tuple2> getFiles(String token) async {
await init();
Tuple2 res = await api.getFiles(token);
stdout.write("getFiles: ${res.item1}\n");
return res;
}
Future<bool> modifyUserInfo(String infoToModify, String value, String token,
// ONLINE
Future<bool> updateUserInfo(String infoToModify, String value, String token,
InfoMessage infoManager) async {
await init();
if (handleOffline(infoManager)) return false;
if (infoToModify == 'email' && EmailValidator.validate(value) ||
infoToModify == 'password' ||
infoToModify == 'username') {
Tuple2<bool, String> res =
await api.modifAttribut(token, infoToModify, value);
if (res.item1 == true) {
stdout.write("updateUserInfo: ${res.item1}\n");
if (res.item1) {
infoManager.displayMessage(
"${infoToModify.capitalize()} modified succesfully !", false);
return true;
@ -34,17 +103,80 @@ class ApiWrapper {
Future<Tuple2<bool, String>> login(
String password, String email, InfoMessage infoManager) async {
await init();
if (handleOffline(infoManager)) return const Tuple2(false, "offline");
String hash = sha256.convert(utf8.encode(password)).toString();
Tuple2<bool, String> res = await api.connexion(email, hash);
stdout.write("login: ${res.item1}");
if (res.item1) {
return Tuple2(true, res.item2); // return token
return Tuple2(true, res.item2);
} else {
infoManager.displayMessage(
"Authentification failed! Enter your actual password carefully.",
true);
return const Tuple2(false, "An error occured during connexion!");
} // need to be better
}
}
Future<Tuple2<bool, String>> deleteUser(
String token, InfoMessage infoManager) async {
await init();
if (handleOffline(infoManager)) return const Tuple2(false, "offline");
Tuple2<bool, String> res = await api.deleteUser(token);
stdout.write("deleteUser: ${res.item1}");
return res;
}
Future<Tuple2<bool, String>> createUser(String email, String hash,
String username, InfoMessage infoManager) async {
await init();
if (handleOffline(infoManager)) return const Tuple2(false, "offline");
Tuple2<bool, String> res = await api.postUser(email, hash, username);
stdout.write("createUser: ${res.item1}");
return res;
}
Future<Tuple2<bool, String>> uploadFile(
String token, File file, InfoMessage infoManager) async {
await init();
if (handleOffline(infoManager)) return const Tuple2(false, "offline");
Tuple2<bool, String> res = await api.uploadFile(token, file);
stdout.write("uploadFile: ${res.item1}");
return res;
}
Future<Tuple2<bool, String>> uploadFileByte(
String token,
Uint8List contentFile,
String filename,
String category,
String date,
InfoMessage infoManager) async {
await init();
if (handleOffline(infoManager)) return const Tuple2(false, "offline");
Tuple2<bool, String> res =
await api.uploadFileByte(token, contentFile, filename, category, date);
stdout.write("uploadFileByte: ${res.item1}");
return res;
}
Future<bool> deleteFile(
String token, String fileUuid, InfoMessage infoManager) async {
await init();
if (handleOffline(infoManager)) return false;
bool res = await api.deleteFile(token, fileUuid);
stdout.write("deleteFile: ${res}");
return res;
}
}

@ -14,29 +14,26 @@ abstract class IDataStrategy {
// Get Token validate
Future<Tuple2<bool, String>> connexion(String email, String hash);
// Get all files for user
// Get all files for user (LOCAL OK)
Future<Tuple2> getFiles(String token);
// Upload file on BDD
Future<Tuple2<bool, String>> uploadFile(String token, File file);
// Upload file as bytes
Future<Tuple2<bool, String>> uploadFileByte(String token,
Uint8List contentFile, String nameFile, String category, String date);
// Get one file by id
// Get one file by id (LOCAL OK)
Future<Tuple2> getFile(String token, String fileUuid);
// Delete one file on BDD
Future<Tuple2<bool, String>> deleteFile(String token, String fileUuid);
Future<bool> deleteFile(String token, String fileUuid);
// Get info on user (LOCAL OK)
Future<Tuple2> getInfoUser(String token);
/* -> Modification attribut
// Update email
Future<void> updateEmail(String token, String email);
// Update username
Future<void> updateUsername(String token, String username);
*/
// Update email, password, username
Future<Tuple2<bool, String>> modifAttribut(
String token, String nameAttribut, String newValue);
}

@ -36,21 +36,21 @@ class RequestApi extends IDataStrategy {
}
@override
Future<Tuple2<bool, String>> deleteFile(String token, String fileUuid) async {
Future<bool> deleteFile(String token, String fileUuid) async {
final response = await http.delete(
Uri.parse('$urlApi/user/files/$fileUuid'),
headers: <String, String>{'Authorization': token});
if (response.statusCode == 200) {
return const Tuple2(true, "Successful");
return true;
}
if (response.statusCode == 401) {
return const Tuple2(false, "401 - UNAUTHORIZED");
return false;
}
if (response.statusCode == 404) {
return const Tuple2(false, "404 - NOT FOUND");
return false;
}
return const Tuple2(false, "Fail");
return false;
}
@override
@ -227,7 +227,6 @@ class RequestApi extends IDataStrategy {
Future<Tuple2> getInfoUser(String token) async {
final response = await http.get(Uri.parse('$urlApi/user/info'),
headers: <String, String>{'Authorization': token});
if (response.statusCode == 200) {
Map<String, dynamic> json = jsonDecode(response.body);
return Tuple2(true, json);
@ -238,6 +237,6 @@ class RequestApi extends IDataStrategy {
if (response.statusCode == 401) {
return const Tuple2(false, "401 - UNAUTHORIZED");
}
return const Tuple2(false, "Fail ");
return const Tuple2(false, "Fail");
}
}

@ -0,0 +1,10 @@
import 'package:flutter/foundation.dart';
class Helper {
static bool isPlatformWeb() {
if (kIsWeb) {
return true;
}
return false;
}
}

@ -2,6 +2,7 @@ import 'package:objectbox/objectbox.dart';
@Entity()
class User {
@Id()
int id = 0;
String username;
String email;
@ -13,11 +14,14 @@ class User {
@Entity()
class Activity {
int id;
@Index()
@Unique()
String uuid;
String filename;
String category;
DateTime date;
String info;
Activity(this.id, this.uuid, this.filename, this.category, this.date);
Activity(
this.id, this.uuid, this.filename, this.category, this.date, this.info);
}

@ -1,3 +1,9 @@
import 'dart:convert';
import 'dart:io';
import 'dart:typed_data';
import 'package:csv/csv.dart';
import 'package:smartfit_app_mobile/modele/activity.dart';
import 'package:smartfit_app_mobile/objectbox.g.dart';
import 'package:path/path.dart' as p;
import 'package:path_provider/path_provider.dart';
@ -7,23 +13,103 @@ class ObjectBox {
late final Store store;
late final Box userBox;
late final Box activityBox;
late final String activitiesSavePath = "activities";
late final Directory applicationDocumentDir;
ObjectBox._create(this.store);
static Future<ObjectBox> create() async {
final docsDir = await getApplicationDocumentsDirectory();
// Future<Store> openStore() {...} is defined in the generated objectbox.g.dart
final store =
await openStore(directory: p.join(docsDir.path, "obx-example"));
final store = await openStore(directory: p.join(docsDir.path, "database"));
return ObjectBox._create(store);
}
init() {
init() async {
applicationDocumentDir = await getApplicationDocumentsDirectory();
userBox = store.box<User>();
activityBox = store.box<Activity>();
}
// ===== USER =====
bool hasUser() {
return !userBox.isEmpty();
}
void setUserMail(String email) {
User user = userBox.get(1);
user.email = email;
userBox.put(user);
}
void setUserName(String username) {
User user = userBox.get(1);
user.username = username;
userBox.put(user);
}
void setUserToken(String token) {
User user = userBox.get(1);
user.token = token;
userBox.put(user);
}
void deleteUser() {
userBox.removeAll();
}
void addUser(String username, String email, String token) {
userBox.put(User(1, username, email, token));
}
// ===== Activity =====
void addActivity(Activity newActivity) {
try {
activityBox.put(newActivity);
} on ObjectBoxException {
print("Activity already exists");
} catch (e) {
print("Unknown exception");
}
}
void removeActivity(int uuid) {
activityBox.remove(uuid);
}
List<Activity> getAllActivities() {
// TODO: Transform db.Activity to ActivityOfUser
throw Exception("Not implemented yet");
}
void removeAllActivities() {
activityBox.removeAll();
}
// ===== FIT Files =====
Future<void> saveActivityFile(List<List<dynamic>> activityFile) async {
String csv = const ListToCsvConverter().convert(activityFile);
Uint8List csvAsBytes = Uint8List.fromList(utf8.encode(csv));
final file =
await File(p.join(applicationDocumentDir.path, activitiesSavePath))
.create();
file.writeAsBytesSync(csvAsBytes);
}
File getActivityFile(String filename) {
final file =
File(p.join(applicationDocumentDir.path, activitiesSavePath, filename));
return file;
}
List<ActivityOfUser> loadActivities() {
List<dynamic> activityDBList = activityBox.getAll();
List<ActivityOfUser> userActivityList = List.empty(growable: true);
for (Activity act in activityDBList) {
userActivityList.add(ActivityOfUser(
act.date.toString(), act.category, act.uuid, act.filename));
}
return userActivityList;
}
}

@ -0,0 +1,83 @@
import 'dart:convert';
import 'package:smartfit_app_mobile/modele/api/i_data_strategy.dart';
import 'package:smartfit_app_mobile/modele/local_db/model.dart';
import 'package:tuple/tuple.dart';
import 'dart:io';
import 'dart:typed_data';
import 'package:smartfit_app_mobile/main.dart';
class RequestLocal implements IDataStrategy {
@override
Future<Tuple2> getInfoUser(String token) async {
final User user = localDB.userBox.get(1);
Map<String, String> json = {"email": user.email, "username": user.username};
return Tuple2(true, jsonEncode(json));
}
// need to save file on request_api.upload() beforehand.
@override
Future<Tuple2> getFile(String token, String fileUuid) async {
return const Tuple2(true, "to implement");
}
@override
Future<Tuple2> getFiles(String token) async {
final List<dynamic> activities = localDB.activityBox.getAll();
List<Map<String, dynamic>> jsonList = List.empty(growable: true);
for (Activity act in activities) {
Map<String, dynamic> json = {
"uuid": act.uuid,
"filename": act.filename,
"category": act.category,
"creation_date": act.date,
"info": act.info
};
jsonList.add(json);
}
return Tuple2(true, jsonEncode(activities));
}
@override
Future<Tuple2<bool, String>> modifAttribut(
String token, String nameAttribut, String newValue) async {
return const Tuple2(false, "not implemented");
}
@override
Future<Tuple2<bool, String>> postUser(
String email, String hash, String username) async {
return const Tuple2(false, "not implemented");
}
@override
Future<Tuple2<bool, String>> deleteUser(String token) async {
return const Tuple2(false, "not implemented");
}
@override
Future<Tuple2<bool, String>> connexion(String email, String hash) async {
return const Tuple2(false, "not implemented");
}
@override
Future<Tuple2<bool, String>> uploadFile(String token, File file) async {
return const Tuple2(false, "not implemented");
}
@override
Future<Tuple2<bool, String>> uploadFileByte(
String token,
Uint8List contentFile,
String nameFile,
String category,
String date) async {
return const Tuple2(false, "not implemented");
}
@override
Future<bool> deleteFile(String token, String fileUuid) async {
throw Exception("Not Implemented");
}
}

@ -1,3 +1,8 @@
import 'package:smartfit_app_mobile/main.dart';
import 'package:smartfit_app_mobile/modele/api/api_wrapper.dart';
import 'package:smartfit_app_mobile/modele/activity_saver.dart';
import 'package:smartfit_app_mobile/modele/helper.dart';
import 'package:smartfit_app_mobile/modele/local_db/model.dart' as db;
import 'dart:convert';
import 'dart:io';
import 'dart:typed_data';
@ -5,19 +10,18 @@ import 'package:csv/csv.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:smartfit_app_mobile/modele/activity.dart';
import 'package:smartfit_app_mobile/modele/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:smartfit_app_mobile/modele/utile/info_message.dart';
import 'package:tuple/tuple.dart';
class ListActivityUtile {
final IDataStrategy _strategy = RequestApi();
final ApiWrapper api = ApiWrapper();
final ManagerFile _managerFile = ManagerFile();
Future<Tuple2<bool, String>> getContentActivity(
BuildContext context, ActivityOfUser activityOfUser) async {
Tuple2 result = await _strategy.getFile(
Tuple2 result = await api.getFile(
Provider.of<User>(context, listen: false).token,
activityOfUser.fileUuid);
if (result.item1 == false) {
@ -27,6 +31,9 @@ class ListActivityUtile {
activityOfUser.contentActivity =
List.from(_managerFile.convertByteIntoCSV(result.item2));
// TODO: Not sure this line as an utility
// localDB.saveActivityFile(activityOfUser.contentActivity);
Provider.of<User>(context, listen: false)
.managerSelectedActivity
.addSelectedActivity(activityOfUser);
@ -36,13 +43,13 @@ class ListActivityUtile {
Future<Tuple2<bool, String>> getFiles(
String token, BuildContext context) async {
bool notZero = false;
Tuple2 result = await _strategy
.getFiles(Provider.of<User>(context, listen: false).token);
Tuple2 result =
await api.getFiles(Provider.of<User>(context, listen: false).token);
if (result.item1 == false) {
return Tuple2(result.item1, result.item2);
}
for (Map<String, dynamic> element in result.item2) {
for (var element in result.item2) {
if (!notZero) {
Provider.of<User>(context, listen: false).listActivity.clear();
notZero = true;
@ -52,6 +59,16 @@ class ListActivityUtile {
element["category"].toString(),
element["uuid"].toString(),
element["filename"].toString()));
// Save to local db
localDB.addActivity(db.Activity(
0,
element["uuid"],
element["filename"],
element["category"],
DateTime.parse(element["creation_date"]),
element["info"]
.toString())); // Do not remove toString(), it do not work w/o it, idk why
}
/*
if (notZero) {
@ -60,41 +77,39 @@ class ListActivityUtile {
return const Tuple2(true, "Yeah");
}
Future<Tuple2<bool, String>> addFile(
Uint8List bytes, String filename, String token) async {
Future<Tuple2<bool, String>> addFile(Uint8List bytes, String filename,
String token, InfoMessage infoManager) async {
// -- Transormer le fit en CSV
List<List<String>> csv = _managerFile.convertBytesFitFileIntoCSVList(bytes);
String csvString = const ListToCsvConverter().convert(csv);
Uint8List byteCSV = Uint8List.fromList(utf8.encode(csvString));
// --- Save Local
// --- Api
// Save on local storage if plateform not browser
if (!Helper.isPlatformWeb()) {
ActivitySaver actSaver = await ActivitySaver.create();
actSaver.saveActivity(byteCSV, filename);
}
String categoryActivity = filename.split("_").first.toLowerCase();
String dateActivity = filename.split("_")[1].split("T").first;
Tuple2<bool, String> result = await _strategy.uploadFileByte(
token, byteCSV, filename, categoryActivity, dateActivity);
Tuple2<bool, String> result = await api.uploadFileByte(
token, byteCSV, filename, categoryActivity, dateActivity, infoManager);
if (result.item1 == false) {
return Tuple2(false, result.item2);
}
return const Tuple2(true, "Yeah");
}
Future<bool> deleteFileOnBDD(String token, String fileUuid) async {
Tuple2<bool, String> result = await _strategy.deleteFile(token, fileUuid);
if (!result.item1) {
return false;
}
return true;
}
void addFileMobile(
String path, String token, String filename, BuildContext context) async {
Tuple2<bool, String> resultAdd =
await addFile(await File(path).readAsBytes(), filename, token);
void addFileMobile(String path, String token, String filename,
BuildContext context, InfoMessage infoManager) async {
Tuple2<bool, String> resultAdd = await addFile(
await File(path).readAsBytes(), filename, token, infoManager);
if (!resultAdd.item1) {
//print("Message error");
return;
}
// TODO: What is that ?
Tuple2<bool, String> resultGet = await getFiles(token, context);
if (!resultGet.item1) {
//print("Message error");

@ -1,10 +0,0 @@
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);
}
}

@ -4,6 +4,7 @@ import 'package:provider/provider.dart';
import 'package:smartfit_app_mobile/common/colo_extension.dart';
import 'package:smartfit_app_mobile/common_widget/container/list/list_activity.dart';
import 'package:smartfit_app_mobile/modele/user.dart';
import 'package:smartfit_app_mobile/modele/utile/info_message.dart';
import 'package:smartfit_app_mobile/modele/utile/list_activity/list_activity_utile.dart';
class MobileListActivity extends StatefulWidget {
@ -16,6 +17,7 @@ class MobileListActivity extends StatefulWidget {
class _MobileListActivity extends State<MobileListActivity> {
FilePickerResult? result;
final ListActivityUtile _utile = ListActivityUtile();
final InfoMessage infoManager = InfoMessage();
@override
Widget build(BuildContext context) {
@ -60,9 +62,9 @@ class _MobileListActivity extends State<MobileListActivity> {
result.files.single.path!,
Provider.of<User>(context, listen: false).token,
result.files.single.name,
context);
context,
infoManager);
} else {
print("Picker");
// msg d'erreur
// User canceled the picker
}
@ -77,6 +79,10 @@ class _MobileListActivity extends State<MobileListActivity> {
)
],
),
Visibility(
visible: infoManager.isVisible,
child: Text(infoManager.message,
style: TextStyle(color: infoManager.messageColor))),
Provider.of<User>(context, listen: true).listActivity.isEmpty
? Column(
crossAxisAlignment: CrossAxisAlignment.start,

@ -1,15 +1,13 @@
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:smartfit_app_mobile/modele/utile/info_message.dart';
import 'package:smartfit_app_mobile/modele/utile/list_activity/list_activity_utile.dart';
import 'package:smartfit_app_mobile/view/activity/list_activity.dart';
import 'package:tuple/tuple.dart';
import 'package:universal_html/html.dart' as html;
import 'package:file_picker/file_picker.dart';
import 'package:provider/provider.dart';
import 'package:smartfit_app_mobile/common/colo_extension.dart';
import 'package:smartfit_app_mobile/modele/api/i_data_strategy.dart';
import 'package:smartfit_app_mobile/modele/api/request_api.dart';
import 'package:smartfit_app_mobile/modele/user.dart';
class WebListActivity extends StatefulWidget {
@ -21,8 +19,8 @@ class WebListActivity extends StatefulWidget {
class _WebListActivityState extends State<WebListActivity> {
FilePickerResult? result;
IDataStrategy strategy = RequestApi();
final ListActivityUtile _utile = ListActivityUtile();
final InfoMessage infoManager = InfoMessage();
void addFileWeb(html.File file, String token) async {
final reader = html.FileReader();
@ -32,7 +30,7 @@ class _WebListActivityState extends State<WebListActivity> {
if (reader.readyState == html.FileReader.DONE) {
Uint8List bytes = reader.result as Uint8List;
Tuple2<bool, String> resultAdd =
await _utile.addFile(bytes, file.name, token);
await _utile.addFile(bytes, file.name, token, infoManager);
if (!resultAdd.item1) {
return;
}

@ -228,59 +228,6 @@ class _MobileSignUpView extends State<MobileSignUpView> {
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,
),
TextButton(
onPressed: () {
Navigator.push(

@ -6,14 +6,15 @@ import 'package:smartfit_app_mobile/common_widget/container/profile/profile_ente
import 'package:smartfit_app_mobile/common_widget/container/profile/profile_info_user.dart';
import 'package:smartfit_app_mobile/common_widget/container/profile/profile_notification.dart';
import 'package:smartfit_app_mobile/common_widget/container/profile/profile_other.dart';
import 'package:smartfit_app_mobile/modele/api/api_wrapper.dart';
import 'package:smartfit_app_mobile/modele/user.dart';
class ProfileViewAllPlatforme extends StatefulWidget {
const ProfileViewAllPlatforme(this.positive, this.accountArr, this.otherArr,
{super.key});
final bool positive;
final List accountArr;
final List otherArr;
const ProfileViewAllPlatforme(this.positive, this.accountArr, this.otherArr,
{super.key});
@override
State<ProfileViewAllPlatforme> createState() => _ProfileViewAllPlatforme();

@ -1,3 +1,4 @@
import 'package:smartfit_app_mobile/main.dart';
import 'package:flutter/material.dart';
import 'package:smartfit_app_mobile/modele/api/api_wrapper.dart';
import 'package:smartfit_app_mobile/modele/user.dart';
@ -110,7 +111,7 @@ class _MobileChangeEmailViewState extends State<MobileChangeEmailView> {
RoundButton(
title: "Confirmer",
onPressed: () async {
bool res = await api.modifyUserInfo(
bool res = await api.updateUserInfo(
'email',
controllerTextEmail.text,
Provider.of<User>(context, listen: false).token,
@ -118,6 +119,7 @@ class _MobileChangeEmailViewState extends State<MobileChangeEmailView> {
if (res) {
Provider.of<User>(context, listen: false).email =
controllerTextEmail.text;
localDB.setUserMail(controllerTextEmail.text);
}
setState(() {});
}),

@ -111,7 +111,7 @@ class _MobileChangePasswordViewState extends State<MobileChangePasswordView> {
if (res.item1) {
if (controllerNewPasswd.text ==
controllerNewPasswd2.text) {
await api.modifyUserInfo(
await api.updateUserInfo(
'password',
sha256
.convert(utf8

@ -1,3 +1,4 @@
import 'package:smartfit_app_mobile/main.dart';
import 'package:provider/provider.dart';
import 'package:flutter/material.dart';
import 'package:smartfit_app_mobile/modele/api/api_wrapper.dart';
@ -109,7 +110,7 @@ class _MobileChangeUsernameViewState extends State<MobileChangeUsernameView> {
RoundButton(
title: "Confirmer",
onPressed: () async {
bool res = await api.modifyUserInfo(
bool res = await api.updateUserInfo(
'username',
controllerTextUsername.text,
Provider.of<User>(context, listen: false).token,
@ -117,6 +118,7 @@ class _MobileChangeUsernameViewState extends State<MobileChangeUsernameView> {
if (res) {
Provider.of<User>(context, listen: false)
.username = controllerTextUsername.text;
localDB.setUserName(controllerTextUsername.text);
}
setState(() {});
}),

@ -1,3 +1,4 @@
import 'package:smartfit_app_mobile/main.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:smartfit_app_mobile/modele/api/api_wrapper.dart';
@ -108,7 +109,7 @@ class _WebChangeEmailViewState extends State<WebChangeEmailView> {
RoundButton(
title: "Confirmer",
onPressed: () async {
bool res = await apiWrapper.modifyUserInfo(
bool res = await apiWrapper.updateUserInfo(
'email',
controllerTextEmail.text,
Provider.of<User>(context, listen: false).token,
@ -116,6 +117,7 @@ class _WebChangeEmailViewState extends State<WebChangeEmailView> {
if (res) {
Provider.of<User>(context, listen: false).email =
controllerTextEmail.text;
localDB.setUserMail(controllerTextEmail.text);
}
setState(() {});
}),

@ -114,7 +114,7 @@ class _WebChangePasswordViewState extends State<WebChangePasswordView> {
if (res.item1) {
if (controllerNewPasswd.text ==
controllerNewPasswd2.text) {
await api.modifyUserInfo(
await api.updateUserInfo(
'password',
sha256
.convert(utf8

@ -1,3 +1,4 @@
import 'package:smartfit_app_mobile/main.dart';
import 'package:flutter/material.dart';
import 'package:smartfit_app_mobile/modele/user.dart';
import 'package:provider/provider.dart';
@ -110,7 +111,7 @@ class _WebChangeUsernameViewState extends State<WebChangeUsernameView> {
RoundButton(
title: "Confirmer",
onPressed: () async {
bool res = await api.modifyUserInfo(
bool res = await api.updateUserInfo(
'username',
controllerTextUsername.text,
Provider.of<User>(context, listen: false).token,
@ -118,6 +119,7 @@ class _WebChangeUsernameViewState extends State<WebChangeUsernameView> {
if (res) {
Provider.of<User>(context, listen: false)
.username = controllerTextUsername.text;
localDB.setUserName(controllerTextUsername.text);
}
setState(() {});
}),

Loading…
Cancel
Save