🚑 objectbox devs are losers

pull/5/head
remrem 1 year ago
parent 00d7ba9b5a
commit a01a2f328e

@ -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<void> 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<User>().username = user.username;
context.watch<User>().email = user.email;
context.watch<User>().token = user.token;
context.watch<User>().listActivity = userActivities;
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("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(

@ -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<bool> 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<void> 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 {

@ -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<DbDummy> create() async {
return DbDummy._create();
}
@override
Future<void> 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<ActivityOfUser> getAllActivities() {
throw Exception();
}
// ==== CONFIG ====
@override
void initConfig() {
throw Exception();
}
@override
void setSaveLocally(bool saveLocally) {
throw Exception();
}
@override
bool getSaveLocally() {
throw Exception();
}
}

@ -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<DbImpl> create();
Future<void> 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<ActivityOfUser> getAllActivities();
// ==== CONFIG ====
void initConfig();
void setSaveLocally(bool saveLocally);
bool getSaveLocally();
}

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

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

@ -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<ObjectBox> create() async {
ObjectBox();
@override
Future<ObjectBox> create() async {
final docsDir = await getApplicationDocumentsDirectory();
final store = await openStore(directory: p.join(docsDir.path, "database"));
return ObjectBox._create(store);
}
init() async {
@override
Future<void> init() async {
applicationDocumentDir = await getApplicationDocumentsDirectory();
userBox = store.box<User>();
activityBox = store.box<Activity>();
configBox = store.box<Config>();
userBox = store.box<db.User>();
activityBox = store.box<db.Activity>();
configBox = store.box<db.Config>();
}
// ===== 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<Activity> getAllActivities() {
// TODO: Transform db.Activity to ActivityOfUser
throw Exception("Not implemented yet");
}
@override
void removeAllActivities() {
activityBox.removeAll();
}
// ===== FIT Files =====
List<ActivityOfUser> loadActivities() {
@override
List<ActivityOfUser> getAllActivities() {
List<dynamic> activityDBList = activityBox.getAll();
List<ActivityOfUser> 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;
}

@ -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<Tuple2> getInfoUser(String token) async {
final User user = localDB.userBox.get(1);
final User user = localDB.getUser();
Map<String, String> json = {"email": user.email, "username": user.username};
return Tuple2(true, jsonEncode(json));
}
@ -27,15 +28,15 @@ class RequestLocal implements IDataStrategy {
@override
Future<Tuple2> getFiles(String token) async {
final List<dynamic> activities = localDB.activityBox.getAll();
final List<ActivityOfUser> activities = localDB.getAllActivities();
List<Map<String, dynamic>> jsonList = List.empty(growable: true);
for (Activity act in activities) {
for (ActivityOfUser act in activities) {
Map<String, dynamic> 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);
}

@ -9,6 +9,10 @@ class User extends ChangeNotifier {
List<ActivityOfUser> 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();

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

@ -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<MobileLoginView> {
"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(

@ -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<WebLoginView> {
"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(

@ -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<ProfileViewAllPlatforme> {
bool isNative = !kIsWeb;
@override
Widget build(BuildContext context) {
String username = context.watch<User>().username;
@ -58,8 +61,11 @@ class _ProfileViewAllPlatforme extends State<ProfileViewAllPlatforme> {
),
// 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,
),

@ -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<MobileChangeEmailView> {
if (res) {
Provider.of<User>(context, listen: false).email =
controllerTextEmail.text;
localDB.setUserMail(controllerTextEmail.text);
if (!kIsWeb)
localDB.setUserMail(controllerTextEmail.text);
}
setState(() {});
}),

@ -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<MobileChangeUsernameView> {
if (res) {
Provider.of<User>(context, listen: false)
.username = controllerTextUsername.text;
localDB.setUserName(controllerTextUsername.text);
if (!kIsWeb)
localDB
.setUserName(controllerTextUsername.text);
}
setState(() {});
}),

@ -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<WebChangeEmailView> {
if (res) {
Provider.of<User>(context, listen: false).email =
controllerTextEmail.text;
localDB.setUserMail(controllerTextEmail.text);
if (!kIsWeb)
localDB.setUserMail(controllerTextEmail.text);
}
setState(() {});
}),

@ -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<WebChangeUsernameView> {
if (res) {
Provider.of<User>(context, listen: false)
.username = controllerTextUsername.text;
localDB.setUserName(controllerTextUsername.text);
if (!kIsWeb)
localDB
.setUserName(controllerTextUsername.text);
}
setState(() {});
}),

Loading…
Cancel
Save