From ebec27b630a942730a30afa804ee11b5d084ef41 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Tue, 2 Sep 2025 17:28:02 +0330 Subject: [PATCH] feat: save module --- .../service/local_storage_service.dart | 84 +++++++++++++++++++ lib/main.dart | 2 + lib/presentation/pages/splash/logic.dart | 60 +++++++------ .../model/local/target_page/target_page.dart | 17 ++++ .../local/target_page/target_page.g.dart | 44 ++++++++++ packages/core/lib/hive_registrar.g.dart | 3 + .../core/lib/utils/local/local_utils.dart | 15 ++-- 7 files changed, 192 insertions(+), 33 deletions(-) create mode 100644 lib/infrastructure/service/local_storage_service.dart create mode 100644 packages/core/lib/data/model/local/target_page/target_page.dart create mode 100644 packages/core/lib/data/model/local/target_page/target_page.g.dart diff --git a/lib/infrastructure/service/local_storage_service.dart b/lib/infrastructure/service/local_storage_service.dart new file mode 100644 index 0000000..f31e32b --- /dev/null +++ b/lib/infrastructure/service/local_storage_service.dart @@ -0,0 +1,84 @@ +import 'package:rasadyar_app/presentation/routes/app_pages.dart'; +import 'package:rasadyar_chicken/data/di/chicken_di.dart'; +import 'package:rasadyar_chicken/presentation/routes/routes.dart'; +import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_core/data/model/local/target_page/target_page.dart'; +import 'package:rasadyar_core/hive_registrar.g.dart'; +import 'package:rasadyar_inspection/injection/inspection_di.dart'; +import 'package:rasadyar_inspection/inspection.dart'; +import 'package:rasadyar_livestock/injection/live_stock_di.dart'; +import 'package:rasadyar_livestock/presentation/routes/app_pages.dart'; + +class LocalStorageService extends GetxService { + static const String _targetPageBox = 'targetPageBox'; + + final HiveLocalStorage _localStorage = diCore.get(); + late Box _targetBox; + + Future init() async { + Hive.registerAdapters(); + await _localStorage.init(); + await _localStorage.openBox(_targetPageBox); + } + + Future seedTargetPage() async { + var existing = getTargetPage(null); + if (existing == null) { + _localStorage.addAll( + boxName: _targetPageBox, + values: [ + TargetPage( + route: InspectionRoutes.init, + module: Module.inspection, + functions: ["setupInspectionDI"], + ), + TargetPage( + route: LiveStockRoutes.init, + module: Module.liveStocks, + functions: ["setupLiveStockDI"], + ), + TargetPage( + route: ChickenRoutes.initSteward, + module: Module.chicken, + functions: ["setupChickenDI"], + ), + TargetPage(route: AppPaths.moduleList), + ], + ); + } + } + + TargetPage? getTargetPage(Module? module) { + var res = _localStorage + .readBox(boxName: _targetPageBox) + ?.firstWhereOrNull((element) => element.module == module); + return res; + } + + Future saveTargetPage(TargetPage targetPage) async { + await _localStorage.add(boxName: _targetPageBox, value: targetPage); + } + + Iterable? getFunctionsList(List? functions) { + return functions?.map((e) => getFunctionByName(e)); + } + + Future? getFunctionByName(String? name) { + switch (name) { + case "setupInspectionDI": + return setupInspectionDI(); + case "removeInspectionDI": + return removeInspectionDI(); + case "setupLiveStockDI": + return setupLiveStockDI(); + case "removeLiveStockDI": + return removeLiveStockDI(); + case "setupChickenDI": + return setupChickenDI(); + case "removeChickenDI": + return removeChickenDI(); + default: + return null; + } + } +} diff --git a/lib/main.dart b/lib/main.dart index 7b63ac2..2912a8a 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -3,6 +3,7 @@ import 'package:rasadyar_app/infrastructure/service/app_navigation_observer.dart import 'package:rasadyar_app/presentation/routes/app_pages.dart'; import 'package:rasadyar_core/core.dart'; import 'infrastructure/di/di.dart'; +import 'infrastructure/service/local_storage_service.dart'; import 'presentation/routes/auth_route_resolver_impl.dart'; @@ -11,6 +12,7 @@ Future main() async { await Hive.initFlutter(); await setupPreInjection(); Get.put(TokenStorageService()); + Get.put(LocalStorageService()); await Get.find().init(); Get.put(AppAuthRouteResolver()); Get.put(AuthMiddleware()); diff --git a/lib/presentation/pages/splash/logic.dart b/lib/presentation/pages/splash/logic.dart index 562829a..d15b7cb 100644 --- a/lib/presentation/pages/splash/logic.dart +++ b/lib/presentation/pages/splash/logic.dart @@ -3,7 +3,7 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:rasadyar_app/data/model/app_info_model.dart'; -import 'package:rasadyar_app/presentation/routes/app_pages.dart'; +import 'package:rasadyar_app/infrastructure/service/local_storage_service.dart'; import 'package:rasadyar_core/core.dart'; class SplashLogic extends GetxController with GetTickerProviderStateMixin { @@ -18,6 +18,7 @@ class SplashLogic extends GetxController with GetTickerProviderStateMixin { final platform = MethodChannel('apk_installer'); final Dio _dio = Dio(); var tokenService = Get.find(); + var localService = Get.find(); AppInfoModel? appInfoModel; @override @@ -86,25 +87,26 @@ class SplashLogic extends GetxController with GetTickerProviderStateMixin { children: [ const Text('در حال دانلود بروزرسانی برنامه...'), Obx( - () => Row( - spacing: 8, - children: [ - Expanded( - child: LinearProgressIndicator( - value: percent.value, - color: AppColor.greenNormal, - minHeight: 4, - ), + () => + Row( + spacing: 8, + children: [ + Expanded( + child: LinearProgressIndicator( + value: percent.value, + color: AppColor.greenNormal, + minHeight: 4, + ), + ), + SizedBox( + width: 55.w, + child: Text( + '${(percent.value * 100).toStringAsFixed(2)}%', + textAlign: TextAlign.center, + ), + ), + ], ), - SizedBox( - width: 55.w, - child: Text( - '${(percent.value * 100).toStringAsFixed(2)}%', - textAlign: TextAlign.center, - ), - ), - ], - ), ), Row( @@ -117,9 +119,9 @@ class SplashLogic extends GetxController with GetTickerProviderStateMixin { height: 40.h, onPressed: data.value != null ? () { - installApk(); - Get.back(); - } + installApk(); + Get.back(); + } : null, text: 'نصب', ); @@ -154,11 +156,17 @@ class SplashLogic extends GetxController with GetTickerProviderStateMixin { if (isUpdateNeeded) return; tokenService.getModule(); final module = tokenService.appModule.value; - final target = getTargetModule(module); - if (target.values.first != null) { - await target.values.first; + final target = localService.getTargetPage(module); + + if (target != null) { + var funs = localService.getFunctionsList(target.functions); + await Future.wait(funs ?? []); + + Get.offAndToNamed(target.route!); + } - Get.offAndToNamed(target.keys.first); + + } catch (e, st) { debugPrint("onReady error: $e\n$st"); } diff --git a/packages/core/lib/data/model/local/target_page/target_page.dart b/packages/core/lib/data/model/local/target_page/target_page.dart new file mode 100644 index 0000000..ffaf3d9 --- /dev/null +++ b/packages/core/lib/data/model/local/target_page/target_page.dart @@ -0,0 +1,17 @@ +import 'package:rasadyar_core/core.dart'; + +part 'target_page.g.dart'; + +@HiveType(typeId: targetPageTypeId) +class TargetPage extends HiveObject { + @HiveField(0) + String? route; + + @HiveField(1) + List? functions; + + @HiveField(2) + Module? module; + + TargetPage({required this.route, this.functions, this.module}); +} diff --git a/packages/core/lib/data/model/local/target_page/target_page.g.dart b/packages/core/lib/data/model/local/target_page/target_page.g.dart new file mode 100644 index 0000000..08e5cd3 --- /dev/null +++ b/packages/core/lib/data/model/local/target_page/target_page.g.dart @@ -0,0 +1,44 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'target_page.dart'; + +// ************************************************************************** +// TypeAdapterGenerator +// ************************************************************************** + +class TargetPageAdapter extends TypeAdapter { + @override + final typeId = 2; + + @override + TargetPage read(BinaryReader reader) { + final numOfFields = reader.readByte(); + final fields = { + for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), + }; + return TargetPage( + route: fields[0] as String, + functions: (fields[1] as List?)?.cast(), + ); + } + + @override + void write(BinaryWriter writer, TargetPage obj) { + writer + ..writeByte(2) + ..writeByte(0) + ..write(obj.route) + ..writeByte(1) + ..write(obj.functions); + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is TargetPageAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} diff --git a/packages/core/lib/hive_registrar.g.dart b/packages/core/lib/hive_registrar.g.dart index b5b6dfa..b07242d 100644 --- a/packages/core/lib/hive_registrar.g.dart +++ b/packages/core/lib/hive_registrar.g.dart @@ -3,11 +3,13 @@ // Check in to version control import 'package:hive_ce/hive.dart'; +import 'package:rasadyar_core/data/model/local/target_page/target_page.dart'; import 'package:rasadyar_core/data/model/local/user_local/user_local_model.dart'; extension HiveRegistrar on HiveInterface { void registerAdapters() { registerAdapter(ModuleAdapter()); + registerAdapter(TargetPageAdapter()); registerAdapter(UserLocalModelAdapter()); } } @@ -15,6 +17,7 @@ extension HiveRegistrar on HiveInterface { extension IsolatedHiveRegistrar on IsolatedHiveInterface { void registerAdapters() { registerAdapter(ModuleAdapter()); + registerAdapter(TargetPageAdapter()); registerAdapter(UserLocalModelAdapter()); } } diff --git a/packages/core/lib/utils/local/local_utils.dart b/packages/core/lib/utils/local/local_utils.dart index d6cf456..22a09de 100644 --- a/packages/core/lib/utils/local/local_utils.dart +++ b/packages/core/lib/utils/local/local_utils.dart @@ -1,15 +1,16 @@ //Auth const int authUserLocalModelTypeId = 0; const int authModuleTypeId = 1; +const int targetPageTypeId = 2; //chicken -const int chickenWidelyUsedLocalModelTypeId = 2; -const int chickenWidelyUsedLocalItemTypeId = 3; +const int chickenWidelyUsedLocalModelTypeId = 3; +const int chickenWidelyUsedLocalItemTypeId = 4; //liveStock -const int liveStockDataLocalModelTypeId = 4; -const int liveStockDataRancherLocalModelTypeId = 5; -const int liveStockDataHerdLocalModelTypeId = 6; -const int liveStockDataLocationLocalModelTypeId = 7; -const int liveStockDataLivestockLocalModelTypeId = 8; \ No newline at end of file +const int liveStockDataLocalModelTypeId = 5; +const int liveStockDataRancherLocalModelTypeId = 6; +const int liveStockDataHerdLocalModelTypeId = 7; +const int liveStockDataLocationLocalModelTypeId = 8; +const int liveStockDataLivestockLocalModelTypeId = 9; \ No newline at end of file