diff --git a/lib/main.dart b/lib/main.dart index 5495005..1277346 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,21 +1,26 @@ import 'dart:io'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:smartfit_app_mobile/modele/local_db/model.dart' as db; +import 'package:smartfit_app_mobile/modele/local_db/db_impl.dart'; +import 'package:smartfit_app_mobile/modele/local_db/get_web_db.dart' + if (dart.library.io) 'package:smartfit_app_mobile/modele/local_db/get_native_db.dart'; import 'package:provider/provider.dart'; -import 'package:smartfit_app_mobile/modele/local_db/objectbox.dart'; import 'package:smartfit_app_mobile/modele/user.dart'; import 'package:smartfit_app_mobile/common/colo_extension.dart'; import 'package:smartfit_app_mobile/view/login/signup_view.dart'; import 'package:smartfit_app_mobile/view/main_tab/main_tab_view.dart'; -late ObjectBox localDB; +late DbImpl localDB; Future main() async { - // ObjectBox WidgetsFlutterBinding.ensureInitialized(); - localDB = await ObjectBox.create(); - await localDB.init(); - localDB.configBox.put(db.Config(0, true)); + + if (!kIsWeb) { + DbImpl tmp = getDbImpl(); + localDB = await tmp.create(); + await localDB.init(); + localDB.initConfig(); + } runApp(ChangeNotifierProvider( create: (context) => User(), child: const MyApp())); @@ -29,21 +34,23 @@ class MyApp extends StatelessWidget { Widget viewToDisplay = const SignUpView(); // Skip sign-up + fill provider if user already connected - if (localDB.hasUser()) { - final db.User user = localDB.userBox.get(1); - final userActivities = localDB.loadActivities(); + if (!kIsWeb) { + if (localDB.hasUser()) { + final User user = localDB.getUser(); + final userActivities = localDB.getAllActivities(); - context.watch().username = user.username; - context.watch().email = user.email; - context.watch().token = user.token; - context.watch().listActivity = userActivities; + context.watch().username = user.username; + context.watch().email = user.email; + context.watch().token = user.token; + context.watch().listActivity = userActivities; - stdout.write("===== USER =====\n"); - stdout.write("Username: ${user.username}\n"); - stdout.write("Email: ${user.email}\n"); - stdout.write("Token: ${user.token}\n"); + stdout.write("===== USER =====\n"); + stdout.write("Username: ${user.username}\n"); + stdout.write("Email: ${user.email}\n"); + stdout.write("Token: ${user.token}\n"); - viewToDisplay = const MainTabView(); + viewToDisplay = const MainTabView(); + } } return MaterialApp( diff --git a/lib/modele/api/api_wrapper.dart b/lib/modele/api/api_wrapper.dart index 2070a59..9ea6fd3 100644 --- a/lib/modele/api/api_wrapper.dart +++ b/lib/modele/api/api_wrapper.dart @@ -1,5 +1,6 @@ import 'dart:typed_data'; +import 'package:flutter/foundation.dart'; import 'package:smartfit_app_mobile/modele/activity_info/activity_info.dart'; import 'package:smartfit_app_mobile/modele/api/i_data_strategy.dart'; import 'package:smartfit_app_mobile/modele/api/request_api.dart'; @@ -18,6 +19,7 @@ class ApiWrapper { "It seems like you are lost far away in the universe, no connection found :)"; // HELPERS + // TODO: Change check online for flutterWeb Future isOnline() async { try { final result = await InternetAddress.lookup('example.com') @@ -27,15 +29,23 @@ class ApiWrapper { } } on SocketException catch (_) { return false; + } on UnsupportedError catch (_) { + return true; } return true; } Future init() async { + // TODO: Fait à la pisse en despi (je voulais juste dormir) + if (kIsWeb) { + api = RequestApi(); + return; + } + if (await isOnline()) { stdout.write("(API) "); api = RequestApi(); - } else if (localDB.getSaveLocally()) { + } else if (!kIsWeb && localDB.getSaveLocally()) { stdout.write("(LOCAL) "); api = RequestLocal(); } else { diff --git a/lib/modele/local_db/db_dummy.dart b/lib/modele/local_db/db_dummy.dart new file mode 100644 index 0000000..d214cc2 --- /dev/null +++ b/lib/modele/local_db/db_dummy.dart @@ -0,0 +1,95 @@ +import 'package:smartfit_app_mobile/modele/activity.dart'; +import 'package:smartfit_app_mobile/modele/local_db/db_impl.dart'; +import 'package:smartfit_app_mobile/modele/user.dart'; + +class DbDummy implements DbImpl { + DbDummy._create(); + DbDummy(); + @override + Future create() async { + return DbDummy._create(); + } + + @override + Future init() { + throw Exception(); + } + + // ==== USER ==== + @override + void addUser(String username, String email, String token) { + throw Exception(); + } + + @override + User getUser() { + throw Exception(); + } + + @override + bool hasUser() { + throw Exception(); + } + + @override + void deleteUser() { + throw Exception(); + } + + @override + void setUserMail(String email) { + throw Exception(); + } + + @override + void setUserName(String username) { + throw Exception(); + } + + @override + void setUserToken(String token) { + throw Exception(); + } + + // ==== ACTIVITY ==== + @override + void addActivity(String uuid, String filename, String category, String info) { + throw Exception(); + } + + @override + void removeActivity(String uuid) { + throw Exception(); + } + + @override + void removeAllActivities() { + throw Exception(); + } + + @override + String getActivityFilenameByUuid(String uuid) { + throw Exception(); + } + + @override + List getAllActivities() { + throw Exception(); + } + + // ==== CONFIG ==== + @override + void initConfig() { + throw Exception(); + } + + @override + void setSaveLocally(bool saveLocally) { + throw Exception(); + } + + @override + bool getSaveLocally() { + throw Exception(); + } +} diff --git a/lib/modele/local_db/db_impl.dart b/lib/modele/local_db/db_impl.dart new file mode 100644 index 0000000..cc15d1f --- /dev/null +++ b/lib/modele/local_db/db_impl.dart @@ -0,0 +1,31 @@ +import 'package:smartfit_app_mobile/modele/user.dart'; +import 'package:smartfit_app_mobile/modele/activity.dart'; + +abstract class DbImpl { + DbImpl._create(); + + Future create(); + + Future init(); + + // ==== USER ==== + void addUser(String username, String email, String token); + User getUser(); + bool hasUser(); + void deleteUser(); + void setUserMail(String email); + void setUserName(String username); + void setUserToken(String token); + + // ==== ACTIVITY ==== + void addActivity(String uuid, String filename, String category, String info); + void removeActivity(String uuid); + void removeAllActivities(); + String getActivityFilenameByUuid(String uuid); + List getAllActivities(); + + // ==== CONFIG ==== + void initConfig(); + void setSaveLocally(bool saveLocally); + bool getSaveLocally(); +} diff --git a/lib/modele/local_db/get_native_db.dart b/lib/modele/local_db/get_native_db.dart new file mode 100644 index 0000000..62a2750 --- /dev/null +++ b/lib/modele/local_db/get_native_db.dart @@ -0,0 +1,7 @@ +import 'package:smartfit_app_mobile/modele/local_db/db_impl.dart'; +import 'package:smartfit_app_mobile/modele/local_db/objectbox.dart'; + +DbImpl getDbImpl() { + DbImpl db = ObjectBox(); + return db; +} diff --git a/lib/modele/local_db/get_web_db.dart b/lib/modele/local_db/get_web_db.dart new file mode 100644 index 0000000..85cb326 --- /dev/null +++ b/lib/modele/local_db/get_web_db.dart @@ -0,0 +1,7 @@ +import 'package:smartfit_app_mobile/modele/local_db/db_impl.dart'; +import 'package:smartfit_app_mobile/modele/local_db/db_dummy.dart'; + +DbImpl getDbImpl() { + DbImpl db = DbDummy(); + return db; +} diff --git a/lib/modele/local_db/objectbox.dart b/lib/modele/local_db/objectbox.dart index 1faca92..8245880 100644 --- a/lib/modele/local_db/objectbox.dart +++ b/lib/modele/local_db/objectbox.dart @@ -1,14 +1,16 @@ import 'dart:convert'; import 'dart:io'; +import 'package:smartfit_app_mobile/modele/user.dart'; import 'package:smartfit_app_mobile/modele/activity.dart'; import 'package:smartfit_app_mobile/modele/activity_info/activity_info.dart'; import 'package:smartfit_app_mobile/objectbox.g.dart'; import 'package:path/path.dart' as p; import 'package:path_provider/path_provider.dart'; -import 'package:smartfit_app_mobile/modele/local_db/model.dart'; +import 'package:smartfit_app_mobile/modele/local_db/model.dart' as db; +import 'package:smartfit_app_mobile/modele/local_db/db_impl.dart'; -class ObjectBox { +class ObjectBox implements DbImpl { late final Store store; late final Box userBox; late final Box activityBox; @@ -17,54 +19,75 @@ class ObjectBox { ObjectBox._create(this.store); - static Future create() async { + ObjectBox(); + + @override + Future create() async { final docsDir = await getApplicationDocumentsDirectory(); final store = await openStore(directory: p.join(docsDir.path, "database")); return ObjectBox._create(store); } - init() async { + @override + Future init() async { applicationDocumentDir = await getApplicationDocumentsDirectory(); - userBox = store.box(); - activityBox = store.box(); - configBox = store.box(); + userBox = store.box(); + activityBox = store.box(); + configBox = store.box(); } // ===== USER ===== + @override bool hasUser() { return !userBox.isEmpty(); } + @override + User getUser() { + db.User userRes = userBox.get(1); + + return User.create(userRes.username, userRes.email, userRes.token); + } + + @override void setUserMail(String email) { - User user = userBox.get(1); + db.User user = userBox.get(1); user.email = email; userBox.put(user); } + @override void setUserName(String username) { - User user = userBox.get(1); + db.User user = userBox.get(1); user.username = username; userBox.put(user); } + @override void setUserToken(String token) { - User user = userBox.get(1); + db.User user = userBox.get(1); user.token = token; userBox.put(user); } + @override void deleteUser() { userBox.removeAll(); } + @override void addUser(String username, String email, String token) { - userBox.put(User(0, username, email, token)); + userBox.put(db.User(0, username, email, token)); } // ===== Activity ===== - void addActivity(Activity newActivity) { + @override + void addActivity(String uuid, String filename, String category, String info) { + db.Activity act = + db.Activity(0, uuid, filename, category, jsonEncode(info)); + try { - activityBox.put(newActivity); + activityBox.put(act); } on ObjectBoxException { print("Activity already exists"); } catch (e) { @@ -73,35 +96,34 @@ class ObjectBox { } // TODO: try catch + @override void removeActivity(String uuid) { final Query query = activityBox.query(Activity_.uuid.equals(uuid)).build(); - final Activity act = query.findFirst(); + final db.Activity act = query.findFirst(); activityBox.remove(act.id); } + @override String getActivityFilenameByUuid(String uuid) { final Query query = activityBox.query(Activity_.uuid.equals(uuid)).build(); - final Activity act = query.findFirst(); + final db.Activity act = query.findFirst(); return act.filename; } - List getAllActivities() { - // TODO: Transform db.Activity to ActivityOfUser - throw Exception("Not implemented yet"); - } - + @override void removeAllActivities() { activityBox.removeAll(); } // ===== FIT Files ===== - List loadActivities() { + @override + List getAllActivities() { List activityDBList = activityBox.getAll(); List userActivityList = List.empty(growable: true); - for (Activity act in activityDBList) { + for (db.Activity act in activityDBList) { ActivityInfo actInfo = ActivityInfo.fromJson(jsonDecode(act.info)); userActivityList .add(ActivityOfUser(actInfo, act.category, act.uuid, act.filename)); @@ -111,15 +133,23 @@ class ObjectBox { } // ===== Config ===== + @override + void initConfig() { + db.Config config = db.Config(0, true); + configBox.put(config); + } + + @override void setSaveLocally(bool saveLocally) { - Config config = configBox.get(1); + db.Config config = configBox.get(1); config.saveLocally = saveLocally; configBox.put(config); stdout.write("(Config) setSaveLocally: $saveLocally\n"); } + @override bool getSaveLocally() { - Config config = configBox.get(1); + db.Config config = configBox.get(1); stdout.write("(Config) getSaveLocally: ${config.saveLocally}\n"); return config.saveLocally; } diff --git a/lib/modele/local_db/request_local.dart b/lib/modele/local_db/request_local.dart index 4e9bad3..b10bd5f 100644 --- a/lib/modele/local_db/request_local.dart +++ b/lib/modele/local_db/request_local.dart @@ -1,9 +1,10 @@ import 'dart:convert'; +import 'package:smartfit_app_mobile/modele/activity.dart'; import 'package:smartfit_app_mobile/modele/activity_info/activity_info.dart'; import 'package:smartfit_app_mobile/modele/activity_saver.dart'; 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 'package:smartfit_app_mobile/modele/user.dart'; import 'dart:io'; import 'dart:typed_data'; import 'package:smartfit_app_mobile/main.dart'; @@ -11,7 +12,7 @@ import 'package:smartfit_app_mobile/main.dart'; class RequestLocal implements IDataStrategy { @override Future getInfoUser(String token) async { - final User user = localDB.userBox.get(1); + final User user = localDB.getUser(); Map json = {"email": user.email, "username": user.username}; return Tuple2(true, jsonEncode(json)); } @@ -27,15 +28,15 @@ class RequestLocal implements IDataStrategy { @override Future getFiles(String token) async { - final List activities = localDB.activityBox.getAll(); + final List activities = localDB.getAllActivities(); List> jsonList = List.empty(growable: true); - for (Activity act in activities) { + for (ActivityOfUser act in activities) { Map json = { - "uuid": act.uuid, - "filename": act.filename, + "uuid": act.fileUuid, + "filename": act.nameFile, "category": act.category, - "info": act.info + "info": act.activityInfo }; jsonList.add(json); } diff --git a/lib/modele/user.dart b/lib/modele/user.dart index d2129d8..79f68e4 100644 --- a/lib/modele/user.dart +++ b/lib/modele/user.dart @@ -9,6 +9,10 @@ class User extends ChangeNotifier { List listActivity = List.empty(growable: true); ManagerSelectedActivity managerSelectedActivity = ManagerSelectedActivity(); + User(); + + User.create(String username, String email, String token); + void addActivity(ActivityOfUser activity) { listActivity.add(activity); notifyListeners(); diff --git a/lib/modele/utile/list_activity/list_activity_utile.dart b/lib/modele/utile/list_activity/list_activity_utile.dart index e2570a6..4b06c67 100644 --- a/lib/modele/utile/list_activity/list_activity_utile.dart +++ b/lib/modele/utile/list_activity/list_activity_utile.dart @@ -1,8 +1,8 @@ +import 'package:flutter/foundation.dart'; 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'; @@ -74,8 +74,9 @@ class ListActivityUtile { element["filename"].toString())); // Save to local db - localDB.addActivity(db.Activity(0, element["uuid"], element["filename"], - element["category"], jsonEncode(element["info"]))); + if (!kIsWeb) + localDB.addActivity(element["uuid"], element["filename"], + element["category"], jsonEncode(element["info"])); } return const Tuple2(true, "Yeah"); } diff --git a/lib/view/login/mobile/android_login_view.dart b/lib/view/login/mobile/android_login_view.dart index f7edbfc..e3d5dd3 100644 --- a/lib/view/login/mobile/android_login_view.dart +++ b/lib/view/login/mobile/android_login_view.dart @@ -1,3 +1,4 @@ +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:smartfit_app_mobile/common/colo_extension.dart'; @@ -165,8 +166,9 @@ class _MobileLoginView extends State { "Impossible de récupéré les données de l'utilisateur - {$infoUser.item2}"); } else { util.fillUser(context, infoUser.item2, result.item2); - localDB.addUser(infoUser.item2["username"], - infoUser.item2["email"], result.item2); + if (!kIsWeb) + localDB.addUser(infoUser.item2["username"], + infoUser.item2["email"], result.item2); Navigator.push( context, MaterialPageRoute( diff --git a/lib/view/login/web/web_login_view.dart b/lib/view/login/web/web_login_view.dart index ccd7910..899bdad 100644 --- a/lib/view/login/web/web_login_view.dart +++ b/lib/view/login/web/web_login_view.dart @@ -1,3 +1,4 @@ +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:smartfit_app_mobile/common/colo_extension.dart'; @@ -170,8 +171,9 @@ class _WebLoginView extends State { "Impossible de récupéré les données de l'utilisateur - {$infoUser.item2}"); } else { util.fillUser(context, infoUser.item2, result.item2); - localDB.addUser(infoUser.item2["username"], - infoUser.item2["email"], result.item2); + if (!kIsWeb) + localDB.addUser(infoUser.item2["username"], + infoUser.item2["email"], result.item2); Navigator.push( context, MaterialPageRoute( diff --git a/lib/view/profile/all_platforme/profile_view_allplatforme.dart b/lib/view/profile/all_platforme/profile_view_allplatforme.dart index d6e6d6c..64d0514 100644 --- a/lib/view/profile/all_platforme/profile_view_allplatforme.dart +++ b/lib/view/profile/all_platforme/profile_view_allplatforme.dart @@ -1,3 +1,4 @@ +import 'package:flutter/foundation.dart'; import 'package:smartfit_app_mobile/common_widget/container/profile/profile_switch.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -21,6 +22,8 @@ class ProfileViewAllPlatforme extends StatefulWidget { } class _ProfileViewAllPlatforme extends State { + bool isNative = !kIsWeb; + @override Widget build(BuildContext context) { String username = context.watch().username; @@ -58,8 +61,11 @@ class _ProfileViewAllPlatforme extends State { ), // TODO: Download/Delete (local) all users files on toggle ? // TODO: Display size of download in Mo - const ProfileSwitch( - "Offline mode", "Save your files locally", "local_save.png"), + Visibility( + visible: isNative, + child: const ProfileSwitch("Offline mode", + "Save your files locally", "local_save.png"), + ), const SizedBox( height: 25, ), diff --git a/lib/view/profile/mobile/mobile_change_email.dart b/lib/view/profile/mobile/mobile_change_email.dart index 36eba41..b82edf7 100644 --- a/lib/view/profile/mobile/mobile_change_email.dart +++ b/lib/view/profile/mobile/mobile_change_email.dart @@ -1,3 +1,4 @@ +import 'package:flutter/foundation.dart'; import 'package:smartfit_app_mobile/main.dart'; import 'package:flutter/material.dart'; import 'package:smartfit_app_mobile/modele/api/api_wrapper.dart'; @@ -119,7 +120,8 @@ class _MobileChangeEmailViewState extends State { if (res) { Provider.of(context, listen: false).email = controllerTextEmail.text; - localDB.setUserMail(controllerTextEmail.text); + if (!kIsWeb) + localDB.setUserMail(controllerTextEmail.text); } setState(() {}); }), diff --git a/lib/view/profile/mobile/mobile_change_username.dart b/lib/view/profile/mobile/mobile_change_username.dart index 3bdb747..c494cf9 100644 --- a/lib/view/profile/mobile/mobile_change_username.dart +++ b/lib/view/profile/mobile/mobile_change_username.dart @@ -1,3 +1,4 @@ +import 'package:flutter/foundation.dart'; import 'package:smartfit_app_mobile/main.dart'; import 'package:provider/provider.dart'; import 'package:flutter/material.dart'; @@ -118,7 +119,9 @@ class _MobileChangeUsernameViewState extends State { if (res) { Provider.of(context, listen: false) .username = controllerTextUsername.text; - localDB.setUserName(controllerTextUsername.text); + if (!kIsWeb) + localDB + .setUserName(controllerTextUsername.text); } setState(() {}); }), diff --git a/lib/view/profile/web/web_change_email.dart b/lib/view/profile/web/web_change_email.dart index 2ee2205..1818559 100644 --- a/lib/view/profile/web/web_change_email.dart +++ b/lib/view/profile/web/web_change_email.dart @@ -1,3 +1,4 @@ +import 'package:flutter/foundation.dart'; import 'package:smartfit_app_mobile/main.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -117,7 +118,8 @@ class _WebChangeEmailViewState extends State { if (res) { Provider.of(context, listen: false).email = controllerTextEmail.text; - localDB.setUserMail(controllerTextEmail.text); + if (!kIsWeb) + localDB.setUserMail(controllerTextEmail.text); } setState(() {}); }), diff --git a/lib/view/profile/web/web_change_username.dart b/lib/view/profile/web/web_change_username.dart index a785873..25ee3be 100644 --- a/lib/view/profile/web/web_change_username.dart +++ b/lib/view/profile/web/web_change_username.dart @@ -1,3 +1,4 @@ +import 'package:flutter/foundation.dart'; import 'package:smartfit_app_mobile/main.dart'; import 'package:flutter/material.dart'; import 'package:smartfit_app_mobile/modele/user.dart'; @@ -119,7 +120,9 @@ class _WebChangeUsernameViewState extends State { if (res) { Provider.of(context, listen: false) .username = controllerTextUsername.text; - localDB.setUserName(controllerTextUsername.text); + if (!kIsWeb) + localDB + .setUserName(controllerTextUsername.text); } setState(() {}); }),