feat : role And permission
This commit is contained in:
@@ -1,77 +0,0 @@
|
|||||||
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_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<HiveLocalStorage>();
|
|
||||||
|
|
||||||
|
|
||||||
Future<void> init() async {
|
|
||||||
await _localStorage.openBox<TargetPage>(_targetPageBox);
|
|
||||||
seedTargetPage();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> seedTargetPage() async {
|
|
||||||
var existing = getTargetPage(null);
|
|
||||||
if (existing == null) {
|
|
||||||
_localStorage.addAll<TargetPage>(
|
|
||||||
boxName: _targetPageBox,
|
|
||||||
values: <TargetPage>[
|
|
||||||
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<TargetPage>(boxName: _targetPageBox)
|
|
||||||
?.firstWhereOrNull((element) => element.module == module);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> saveTargetPage(TargetPage targetPage) async {
|
|
||||||
await _localStorage.add(boxName: _targetPageBox, value: targetPage);
|
|
||||||
}
|
|
||||||
|
|
||||||
Iterable<Future>? getFunctionsList(List<String>? functions) {
|
|
||||||
return functions?.map((e) async => getFunctionByName(e));
|
|
||||||
}
|
|
||||||
|
|
||||||
Future? getFunctionByName(String? name) {
|
|
||||||
switch (name) {
|
|
||||||
case "setupInspectionDI":
|
|
||||||
return setupInspectionDI();
|
|
||||||
case "setupLiveStockDI":
|
|
||||||
return setupLiveStockDI();
|
|
||||||
case "setupChickenDI":
|
|
||||||
return setupChickenDI();
|
|
||||||
default:
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
51
lib/infrastructure/utils/local_storage_utils.dart
Normal file
51
lib/infrastructure/utils/local_storage_utils.dart
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
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_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';
|
||||||
|
|
||||||
|
Future<void> seedTargetPage() async {
|
||||||
|
var box = Hive.box<AppModel>("appBox");
|
||||||
|
AppModel appModel = AppModel(
|
||||||
|
targetPages: [
|
||||||
|
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),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
|
||||||
|
box.add(appModel);
|
||||||
|
}
|
||||||
|
|
||||||
|
Iterable<Future>? getFunctionsList(List<String>? functions) {
|
||||||
|
return functions?.map((e) async => getFunctionByName(e));
|
||||||
|
}
|
||||||
|
|
||||||
|
Future? getFunctionByName(String? name) {
|
||||||
|
switch (name) {
|
||||||
|
case "setupInspectionDI":
|
||||||
|
return setupInspectionDI();
|
||||||
|
case "setupLiveStockDI":
|
||||||
|
return setupLiveStockDI();
|
||||||
|
case "setupChickenDI":
|
||||||
|
return setupChickenDI();
|
||||||
|
default:
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,20 +1,25 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:rasadyar_app/infrastructure/service/app_navigation_observer.dart';
|
import 'package:rasadyar_app/infrastructure/service/app_navigation_observer.dart';
|
||||||
|
import 'package:rasadyar_app/infrastructure/utils/local_storage_utils.dart';
|
||||||
import 'package:rasadyar_app/presentation/routes/app_pages.dart';
|
import 'package:rasadyar_app/presentation/routes/app_pages.dart';
|
||||||
import 'package:rasadyar_core/core.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';
|
|
||||||
|
|
||||||
|
import 'infrastructure/di/di.dart';
|
||||||
|
import 'presentation/routes/auth_route_resolver_impl.dart';
|
||||||
|
|
||||||
Future<void> main() async {
|
Future<void> main() async {
|
||||||
WidgetsFlutterBinding.ensureInitialized();
|
WidgetsFlutterBinding.ensureInitialized();
|
||||||
await Hive.initFlutter();
|
await Hive.initFlutter();
|
||||||
await setupPreInjection();
|
await setupPreInjection();
|
||||||
|
Get.put(GService());
|
||||||
|
var gService = Get.find<GService>();
|
||||||
|
await gService.init();
|
||||||
|
if (gService.isFirstTime()) {
|
||||||
|
await seedTargetPage();
|
||||||
|
await gService.setIsNotFirstTime();
|
||||||
|
}
|
||||||
Get.put(TokenStorageService());
|
Get.put(TokenStorageService());
|
||||||
await Get.find<TokenStorageService>().init();
|
await Get.find<TokenStorageService>().init();
|
||||||
Get.put(LocalStorageService());
|
|
||||||
await Get.find<LocalStorageService>().init();
|
|
||||||
Get.put<AuthRouteResolver>(AppAuthRouteResolver());
|
Get.put<AuthRouteResolver>(AppAuthRouteResolver());
|
||||||
Get.put(AuthMiddleware());
|
Get.put(AuthMiddleware());
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import 'dart:io';
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:rasadyar_app/data/model/app_info_model.dart';
|
import 'package:rasadyar_app/data/model/app_info_model.dart';
|
||||||
import 'package:rasadyar_app/infrastructure/service/local_storage_service.dart';
|
import 'package:rasadyar_app/infrastructure/utils/local_storage_utils.dart';
|
||||||
import 'package:rasadyar_core/core.dart';
|
import 'package:rasadyar_core/core.dart';
|
||||||
|
|
||||||
class SplashLogic extends GetxController with GetTickerProviderStateMixin {
|
class SplashLogic extends GetxController with GetTickerProviderStateMixin {
|
||||||
@@ -17,8 +17,9 @@ class SplashLogic extends GetxController with GetTickerProviderStateMixin {
|
|||||||
final RxnString _updateFilePath = RxnString();
|
final RxnString _updateFilePath = RxnString();
|
||||||
final platform = MethodChannel('apk_installer');
|
final platform = MethodChannel('apk_installer');
|
||||||
final Dio _dio = Dio();
|
final Dio _dio = Dio();
|
||||||
|
var gService = Get.find<GService>();
|
||||||
var tokenService = Get.find<TokenStorageService>();
|
var tokenService = Get.find<TokenStorageService>();
|
||||||
var localService = Get.find<LocalStorageService>();
|
|
||||||
AppInfoModel? appInfoModel;
|
AppInfoModel? appInfoModel;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -153,18 +154,20 @@ class SplashLogic extends GetxController with GetTickerProviderStateMixin {
|
|||||||
try {
|
try {
|
||||||
final isUpdateNeeded = await checkVersion();
|
final isUpdateNeeded = await checkVersion();
|
||||||
if (isUpdateNeeded) return;
|
if (isUpdateNeeded) return;
|
||||||
tokenService.getModule();
|
|
||||||
final module = tokenService.appModule.value;
|
final module = gService.getSelectedModule();
|
||||||
final target = localService.getTargetPage(module);
|
final target = gService.getTargetPage(module);
|
||||||
|
if (module != null) {
|
||||||
|
tokenService.setGlobalTokenAndRefToken(module);
|
||||||
|
}
|
||||||
|
|
||||||
if (target != null) {
|
if (target != null) {
|
||||||
var funs = localService.getFunctionsList(target.functions);
|
var mFuns = getFunctionsList(target.functions);
|
||||||
await Future.wait(funs ?? []);
|
await Future.wait(mFuns ?? []);
|
||||||
|
|
||||||
Get.offAndToNamed(target.route!);
|
Get.offAndToNamed(target.route!);
|
||||||
}
|
}
|
||||||
} catch (e, st) {
|
} catch (e, st) {
|
||||||
debugPrint("onReady error: $e\n$st");
|
eLog("onReady error: $e\n$st");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -239,11 +242,9 @@ class SplashLogic extends GetxController with GetTickerProviderStateMixin {
|
|||||||
Future<void> installApk() async {
|
Future<void> installApk() async {
|
||||||
try {
|
try {
|
||||||
eLog(_updateFilePath.value);
|
eLog(_updateFilePath.value);
|
||||||
|
|
||||||
final dir = await getApplicationDocumentsDirectory();
|
|
||||||
await platform.invokeMethod('apk_installer', {'appPath': _updateFilePath.value});
|
await platform.invokeMethod('apk_installer', {'appPath': _updateFilePath.value});
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
print("خطا در نصب: $e");
|
eLog(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
import 'package:rasadyar_chicken/presentation/routes/routes.dart';
|
||||||
|
|
||||||
String getFaUserRole(String? role) {
|
String getFaUserRole(String? role) {
|
||||||
switch (role) {
|
switch (role) {
|
||||||
case "Admin":
|
case "Admin":
|
||||||
@@ -76,3 +78,83 @@ String getFaUserRole(String? role) {
|
|||||||
return "نامشخص";
|
return "نامشخص";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Map<String, String?> getFaUserRoleWithOnTap(String? role) {
|
||||||
|
switch (role) {
|
||||||
|
case "Admin":
|
||||||
|
return {"ادمین استان": null};
|
||||||
|
case "CityOperator":
|
||||||
|
return {"تعاونی": null};
|
||||||
|
case "Poultry":
|
||||||
|
return {"مرغدار": null};
|
||||||
|
case "ProvinceOperator":
|
||||||
|
return {"مدیر اجرایی": null};
|
||||||
|
case "ProvinceFinancial":
|
||||||
|
return {"مالی اتحادیه": null};
|
||||||
|
case "KillHouse":
|
||||||
|
return {"کشتارگاه": null};
|
||||||
|
case "KillHouseVet":
|
||||||
|
return {"دامپزشک کشتارگاه": null};
|
||||||
|
case "VetFarm":
|
||||||
|
return {"دامپزشک فارم": null};
|
||||||
|
case "Driver":
|
||||||
|
return {"راننده": null};
|
||||||
|
case "ProvinceInspector":
|
||||||
|
return {"بازرس اتحادیه": null};
|
||||||
|
case "VetSupervisor":
|
||||||
|
return {"دامپزشک کل": null};
|
||||||
|
case "Jahad":
|
||||||
|
return {"جهاد کشاورزی استان": null};
|
||||||
|
case "CityJahad":
|
||||||
|
return {"جهاد کشاورزی شهرستان": null};
|
||||||
|
case "ProvincialGovernment":
|
||||||
|
return {"استانداری": null};
|
||||||
|
case "Guilds":
|
||||||
|
return {"صنف": null};
|
||||||
|
case "Commerce":
|
||||||
|
return {"معاونت بازرگانی استان": null};
|
||||||
|
case "CityCommerce":
|
||||||
|
return {"بازرگانی شهرستان": null};
|
||||||
|
case "UnitWindow":
|
||||||
|
return {"پنجره واحد": null};
|
||||||
|
case "CityVet":
|
||||||
|
return {"دامپزشک شهرستان": null};
|
||||||
|
case "Observatory":
|
||||||
|
return {"رصدخانه": null};
|
||||||
|
case "ProvinceSupervisor":
|
||||||
|
return {"ناظر استان": null};
|
||||||
|
case "GuildRoom":
|
||||||
|
return {"اتاق اصناف": null};
|
||||||
|
case "PosCompany":
|
||||||
|
return {"شرکت psp": null};
|
||||||
|
case "LiveStockSupport":
|
||||||
|
return {"پشتیبانی امور دام": null};
|
||||||
|
case "SuperAdmin":
|
||||||
|
return {"ادمین کل": null};
|
||||||
|
case "ChainCompany":
|
||||||
|
return {"شرکت زنجیره": null};
|
||||||
|
case "AdminX":
|
||||||
|
return {"ادمین ایکس": null};
|
||||||
|
case "Supporter":
|
||||||
|
return {"پشتیبان سامانه": null};
|
||||||
|
case "Dispenser":
|
||||||
|
return {"پخش کننده": null};
|
||||||
|
case "CityPoultry":
|
||||||
|
return {"طیور شهرستان": null};
|
||||||
|
case "ParentCompany":
|
||||||
|
return {"شرکت مادر": null};
|
||||||
|
case "ColdHouseSteward":
|
||||||
|
return {"مباشر سردخانه": null};
|
||||||
|
case "CityGuild":
|
||||||
|
return {"اتحادیه پروتئینی": null};
|
||||||
|
case "LiveStockProvinceJahad":
|
||||||
|
return {"جهاد استان": null};
|
||||||
|
case "Steward":
|
||||||
|
return {"مباشر": ChickenRoutes.initSteward};
|
||||||
|
case "PoultryScience":
|
||||||
|
return {"کارشناس طیور": ChickenRoutes.initPoultryScience
|
||||||
|
};
|
||||||
|
default:
|
||||||
|
return {"نامشخص": null};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -15,7 +15,11 @@ import 'package:rasadyar_core/core.dart';
|
|||||||
GetIt diChicken = GetIt.asNewInstance();
|
GetIt diChicken = GetIt.asNewInstance();
|
||||||
|
|
||||||
Future<void> setupChickenDI() async {
|
Future<void> setupChickenDI() async {
|
||||||
|
if (diChicken.isRegistered<DioErrorHandler>()) {
|
||||||
|
await diChicken.unregister<DioErrorHandler>();
|
||||||
|
}
|
||||||
diChicken.registerSingleton(DioErrorHandler());
|
diChicken.registerSingleton(DioErrorHandler());
|
||||||
|
|
||||||
var tokenService = Get.find<TokenStorageService>();
|
var tokenService = Get.find<TokenStorageService>();
|
||||||
|
|
||||||
diChicken.registerLazySingleton<AppInterceptor>(
|
diChicken.registerLazySingleton<AppInterceptor>(
|
||||||
@@ -23,10 +27,10 @@ Future<void> setupChickenDI() async {
|
|||||||
// سامانه مرغ فعلاً رفرش توکن ندارد
|
// سامانه مرغ فعلاً رفرش توکن ندارد
|
||||||
refreshTokenCallback: () async => null,
|
refreshTokenCallback: () async => null,
|
||||||
saveTokenCallback: (String newToken) async {
|
saveTokenCallback: (String newToken) async {
|
||||||
await tokenService.saveAccessToken(newToken);
|
await tokenService.saveAccessToken(Module.chicken, newToken);
|
||||||
},
|
},
|
||||||
clearTokenCallback: () async {
|
clearTokenCallback: () async {
|
||||||
await tokenService.deleteTokens();
|
await tokenService.deleteAllTokens();
|
||||||
Get.offAllNamed(ChickenRoutes.auth, arguments: Module.chicken);
|
Get.offAllNamed(ChickenRoutes.auth, arguments: Module.chicken);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
@@ -69,7 +73,7 @@ Future<void> newSetupAuthDI(String newUrl) async {
|
|||||||
var tokenService = Get.find<TokenStorageService>();
|
var tokenService = Get.find<TokenStorageService>();
|
||||||
|
|
||||||
// همیشه baseUrl جدید رو ذخیره کن
|
// همیشه baseUrl جدید رو ذخیره کن
|
||||||
await tokenService.saveBaseUrl(newUrl);
|
await tokenService.saveBaseUrl(Module.chicken, newUrl);
|
||||||
|
|
||||||
// Re-register AppInterceptor
|
// Re-register AppInterceptor
|
||||||
if (diChicken.isRegistered<AppInterceptor>(instanceName: 'chickenInterceptor')) {
|
if (diChicken.isRegistered<AppInterceptor>(instanceName: 'chickenInterceptor')) {
|
||||||
@@ -79,10 +83,10 @@ Future<void> newSetupAuthDI(String newUrl) async {
|
|||||||
() => AppInterceptor(
|
() => AppInterceptor(
|
||||||
refreshTokenCallback: () async => null,
|
refreshTokenCallback: () async => null,
|
||||||
saveTokenCallback: (String newToken) async {
|
saveTokenCallback: (String newToken) async {
|
||||||
await tokenService.saveAccessToken(newToken);
|
// await tokenService.saveAccessToken(newToken);
|
||||||
},
|
},
|
||||||
clearTokenCallback: () async {
|
clearTokenCallback: () async {
|
||||||
await tokenService.deleteTokens();
|
await tokenService.deleteAllTokens();
|
||||||
Get.offAllNamed(ChickenRoutes.auth, arguments: Module.chicken);
|
Get.offAllNamed(ChickenRoutes.auth, arguments: Module.chicken);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
import 'package:rasadyar_core/core.dart';
|
||||||
|
|
||||||
|
class ChickenStorageService extends GetxService {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,12 +1,12 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:rasadyar_chicken/chicken.dart';
|
|
||||||
import 'package:rasadyar_chicken/data/common/dio_error_handler.dart';
|
import 'package:rasadyar_chicken/data/common/dio_error_handler.dart';
|
||||||
import 'package:rasadyar_chicken/data/di/chicken_di.dart';
|
import 'package:rasadyar_chicken/data/di/chicken_di.dart';
|
||||||
import 'package:rasadyar_chicken/data/models/response/user_info/user_info_model.dart';
|
import 'package:rasadyar_chicken/data/models/response/user_info/user_info_model.dart';
|
||||||
import 'package:rasadyar_chicken/data/models/response/user_profile_model/user_profile_model.dart';
|
import 'package:rasadyar_chicken/data/models/response/user_profile_model/user_profile_model.dart';
|
||||||
import 'package:rasadyar_chicken/data/repositories/auth/auth_repository.dart';
|
import 'package:rasadyar_chicken/data/repositories/auth/auth_repository.dart';
|
||||||
|
import 'package:rasadyar_chicken/presentation/routes/routes.dart';
|
||||||
import 'package:rasadyar_chicken/presentation/widget/captcha/logic.dart';
|
import 'package:rasadyar_chicken/presentation/widget/captcha/logic.dart';
|
||||||
import 'package:rasadyar_core/core.dart';
|
import 'package:rasadyar_core/core.dart';
|
||||||
|
|
||||||
@@ -18,7 +18,6 @@ enum OtpStatus { init, sent, verified, reSend }
|
|||||||
|
|
||||||
class AuthLogic extends GetxController with GetTickerProviderStateMixin {
|
class AuthLogic extends GetxController with GetTickerProviderStateMixin {
|
||||||
GlobalKey<FormState> formKey = GlobalKey<FormState>();
|
GlobalKey<FormState> formKey = GlobalKey<FormState>();
|
||||||
|
|
||||||
late AnimationController _textAnimationController;
|
late AnimationController _textAnimationController;
|
||||||
late Animation<double> textAnimation;
|
late Animation<double> textAnimation;
|
||||||
RxBool showCard = false.obs;
|
RxBool showCard = false.obs;
|
||||||
@@ -36,6 +35,8 @@ class AuthLogic extends GetxController with GetTickerProviderStateMixin {
|
|||||||
RxnString phoneNumber = RxnString(null);
|
RxnString phoneNumber = RxnString(null);
|
||||||
RxBool isLoading = false.obs;
|
RxBool isLoading = false.obs;
|
||||||
RxBool isDisabled = true.obs;
|
RxBool isDisabled = true.obs;
|
||||||
|
|
||||||
|
GService gService = Get.find<GService>();
|
||||||
TokenStorageService tokenStorageService = Get.find<TokenStorageService>();
|
TokenStorageService tokenStorageService = Get.find<TokenStorageService>();
|
||||||
|
|
||||||
Rx<AuthType> authType = AuthType.useAndPass.obs;
|
Rx<AuthType> authType = AuthType.useAndPass.obs;
|
||||||
@@ -54,21 +55,16 @@ class AuthLogic extends GetxController with GetTickerProviderStateMixin {
|
|||||||
super.onInit();
|
super.onInit();
|
||||||
|
|
||||||
_textAnimationController =
|
_textAnimationController =
|
||||||
AnimationController(vsync: this, duration: const Duration(milliseconds: 1200))
|
AnimationController(vsync: this, duration: const Duration(milliseconds: 1200))
|
||||||
..repeat(reverse: true, count: 2).whenComplete(() {
|
..repeat(reverse: true, count: 2).whenComplete(() {
|
||||||
showCard.value = true;
|
showCard.value = true;
|
||||||
});
|
});
|
||||||
|
|
||||||
textAnimation = CurvedAnimation(parent: _textAnimationController, curve: Curves.easeInOut);
|
textAnimation = CurvedAnimation(parent: _textAnimationController, curve: Curves.easeInOut);
|
||||||
|
|
||||||
initUserPassData();
|
initUserPassData();
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
void onReady() {
|
|
||||||
super.onReady();
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void onClose() {
|
void onClose() {
|
||||||
_textAnimationController.dispose();
|
_textAnimationController.dispose();
|
||||||
@@ -110,27 +106,36 @@ class AuthLogic extends GetxController with GetTickerProviderStateMixin {
|
|||||||
AuthRepository authTmp = diChicken.get<AuthRepository>();
|
AuthRepository authTmp = diChicken.get<AuthRepository>();
|
||||||
isLoading.value = true;
|
isLoading.value = true;
|
||||||
await safeCall<UserProfileModel?>(
|
await safeCall<UserProfileModel?>(
|
||||||
call: () => authTmp.login(
|
call: () =>
|
||||||
authRequest: {
|
authTmp.login(
|
||||||
"username": usernameController.value.text,
|
authRequest: {
|
||||||
"password": passwordController.value.text,
|
"username": usernameController.value.text,
|
||||||
},
|
"password": passwordController.value.text,
|
||||||
),
|
},
|
||||||
|
),
|
||||||
onSuccess: (result) async {
|
onSuccess: (result) async {
|
||||||
|
await gService.saveSelectedModule(_module);
|
||||||
await tokenStorageService.saveModule(_module);
|
await tokenStorageService.saveModule(_module);
|
||||||
await tokenStorageService.saveAccessToken(result?.accessToken ?? '');
|
await tokenStorageService.saveAccessToken(_module, result?.accessToken ?? '');
|
||||||
await tokenStorageService.saveRefreshToken(result?.accessToken ?? '');
|
await tokenStorageService.saveRefreshToken(_module, result?.accessToken ?? '');
|
||||||
|
var tmpRoles = result?.role
|
||||||
|
?.where((element) => element == 'PoultryScience' || element == 'Steward')
|
||||||
|
.toList();
|
||||||
|
await tokenStorageService.saveRoles(_module, tmpRoles ?? []);
|
||||||
if (rememberMe.value) {
|
if (rememberMe.value) {
|
||||||
await tokenStorageService.saveUserPass(
|
await tokenStorageService.saveUserPass(
|
||||||
UserLocalModel(
|
_module,
|
||||||
username: usernameController.value.text,
|
usernameController.value.text,
|
||||||
password: passwordController.value.text,
|
passwordController.value.text,
|
||||||
module: _module,
|
|
||||||
),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Get.offAndToNamed(ChickenRoutes.role);
|
if (tmpRoles!.length > 1) {
|
||||||
|
Get.offAndToNamed(ChickenRoutes.role);
|
||||||
|
} else {
|
||||||
|
Get.offAllNamed(ChickenRoutes.initSteward);
|
||||||
|
}
|
||||||
|
|
||||||
},
|
},
|
||||||
onError: (error, stackTrace) {
|
onError: (error, stackTrace) {
|
||||||
if (error is DioException) {
|
if (error is DioException) {
|
||||||
@@ -149,8 +154,6 @@ class AuthLogic extends GetxController with GetTickerProviderStateMixin {
|
|||||||
onSuccess: (result) async {
|
onSuccess: (result) async {
|
||||||
if (result != null) {
|
if (result != null) {
|
||||||
await newSetupAuthDI(result.backend ?? '');
|
await newSetupAuthDI(result.backend ?? '');
|
||||||
await tokenStorageService.saveApiKey(result.apiKey ?? '');
|
|
||||||
await tokenStorageService.saveBaseUrl(result.backend ?? '');
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onError: (error, stackTrace) {
|
onError: (error, stackTrace) {
|
||||||
@@ -164,10 +167,10 @@ class AuthLogic extends GetxController with GetTickerProviderStateMixin {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void initUserPassData() {
|
void initUserPassData() {
|
||||||
UserLocalModel? userPass = tokenStorageService.getUserPass(_module);
|
UserLocalModel? userLocalModel = tokenStorageService.getUserLocal(Module.chicken);
|
||||||
if (userPass != null) {
|
if (userLocalModel?.username != null && userLocalModel?.password != null) {
|
||||||
usernameController.value.text = userPass.username ?? '';
|
usernameController.value.text = userLocalModel?.username ?? '';
|
||||||
passwordController.value.text = userPass.password ?? '';
|
passwordController.value.text = userLocalModel?.password ?? '';
|
||||||
rememberMe.value = true;
|
rememberMe.value = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,19 @@
|
|||||||
|
|
||||||
|
|
||||||
import 'package:rasadyar_core/core.dart';
|
import 'package:rasadyar_core/core.dart';
|
||||||
|
|
||||||
class RoleLogic extends GetxController {
|
class RoleLogic extends GetxController {
|
||||||
|
TokenStorageService tokenService = Get.find<TokenStorageService>();
|
||||||
|
GService gService = Get.find<GService>();
|
||||||
|
RxList<String> roles = <String>[].obs;
|
||||||
|
|
||||||
|
@override
|
||||||
|
void onInit() {
|
||||||
|
super.onInit();
|
||||||
|
List<String> items = tokenService.getUserLocal(Module.chicken)!.roles ?? [];
|
||||||
|
if (items.isNotEmpty ?? false) {
|
||||||
|
roles.assignAll(items);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void onReady() {
|
void onReady() {
|
||||||
// TODO: implement onReady
|
// TODO: implement onReady
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import 'dart:ui';
|
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:rasadyar_chicken/data/common/fa_user_role.dart';
|
||||||
|
import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart';
|
||||||
import 'package:rasadyar_core/core.dart';
|
import 'package:rasadyar_core/core.dart';
|
||||||
|
|
||||||
import 'logic.dart';
|
import 'logic.dart';
|
||||||
@@ -10,7 +10,42 @@ class RolePage extends GetView<RoleLogic> {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Scaffold(
|
return BasePage(
|
||||||
|
hasSearch: true,
|
||||||
|
hasBack: false,
|
||||||
|
isBase: true,
|
||||||
|
routes: ['انتخاب نقش'],
|
||||||
|
widgets: [
|
||||||
|
ObxValue((data) {
|
||||||
|
return Expanded(
|
||||||
|
child: GridView.builder(
|
||||||
|
physics: BouncingScrollPhysics(),
|
||||||
|
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
|
||||||
|
crossAxisCount: 3,
|
||||||
|
mainAxisSpacing: 12.h,
|
||||||
|
crossAxisSpacing: 12.w,
|
||||||
|
childAspectRatio: 2,
|
||||||
|
),
|
||||||
|
itemCount: data.length,
|
||||||
|
hitTestBehavior: HitTestBehavior.opaque,
|
||||||
|
itemBuilder: (BuildContext context, int index) {
|
||||||
|
Map role = getFaUserRoleWithOnTap(data[index]);
|
||||||
|
return roleCard(
|
||||||
|
title: role.keys.first,
|
||||||
|
onTap: () async {
|
||||||
|
String route = role.values.first;
|
||||||
|
await controller.gService.saveSelectedRole(route);
|
||||||
|
Get.offAllNamed(route);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}, controller.roles),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
|
||||||
|
/* return Scaffold(
|
||||||
body: Stack(
|
body: Stack(
|
||||||
alignment: Alignment.center,
|
alignment: Alignment.center,
|
||||||
children: [
|
children: [
|
||||||
@@ -32,33 +67,37 @@ class RolePage extends GetView<RoleLogic> {
|
|||||||
'انتخاب نقش',
|
'انتخاب نقش',
|
||||||
style: AppFonts.yekan20Bold.copyWith(color: AppColor.textColor),
|
style: AppFonts.yekan20Bold.copyWith(color: AppColor.textColor),
|
||||||
),
|
),
|
||||||
Expanded(
|
ObxValue((data) {
|
||||||
child: GridView.builder(
|
return Expanded(
|
||||||
physics: BouncingScrollPhysics(),
|
child: GridView.builder(
|
||||||
gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
|
physics: BouncingScrollPhysics(),
|
||||||
maxCrossAxisExtent: 250,
|
gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
|
||||||
mainAxisSpacing: 12,
|
maxCrossAxisExtent: 250,
|
||||||
crossAxisSpacing: 12,
|
mainAxisSpacing: 12,
|
||||||
childAspectRatio: 1.5,
|
crossAxisSpacing: 12,
|
||||||
|
childAspectRatio: 1.5,
|
||||||
|
),
|
||||||
|
itemCount: data.length,
|
||||||
|
hitTestBehavior: HitTestBehavior.opaque,
|
||||||
|
itemBuilder: (BuildContext context, int index) {
|
||||||
|
return roleCard(title: getFaUserRole(data[index]), onTap: () {});
|
||||||
|
},
|
||||||
),
|
),
|
||||||
itemCount: 3,
|
);
|
||||||
hitTestBehavior: HitTestBehavior.opaque,
|
}, controller.roles),
|
||||||
itemBuilder: (BuildContext context, int index) {
|
|
||||||
return roleCard(title: index == 0 ? 'نasdsadasdقش $index' : "wlsp", onTap: null);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
);*/
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget roleCard({required String title, Function()? onTap}) {
|
Widget roleCard({required String title, Function()? onTap}) {
|
||||||
return Container(
|
return Container(
|
||||||
|
width: 128.w,
|
||||||
|
height: 48.h,
|
||||||
margin: EdgeInsets.all(8.w),
|
margin: EdgeInsets.all(8.w),
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
borderRadius: BorderRadius.circular(8.r),
|
borderRadius: BorderRadius.circular(8.r),
|
||||||
@@ -67,7 +106,7 @@ class RolePage extends GetView<RoleLogic> {
|
|||||||
child: InkWell(
|
child: InkWell(
|
||||||
onTap: onTap,
|
onTap: onTap,
|
||||||
child: Center(
|
child: Center(
|
||||||
child: Text(title, style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal)),
|
child: Text(title, style: AppFonts.yekan12Bold.copyWith(color: AppColor.blueNormal)),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -613,7 +613,7 @@ class ProfilePage extends GetView<ProfileLogic> {
|
|||||||
text: 'خروج',
|
text: 'خروج',
|
||||||
backgroundColor: AppColor.error,
|
backgroundColor: AppColor.error,
|
||||||
onPressed: () async {
|
onPressed: () async {
|
||||||
await controller.rootLogic.tokenService.deleteTokens().then((value){
|
await controller.rootLogic.tokenService.deleteAllTokens().then((value){
|
||||||
Get.back();
|
Get.back();
|
||||||
Get.offAllNamed(ChickenRoutes.auth, arguments: Module.chicken);
|
Get.offAllNamed(ChickenRoutes.auth, arguments: Module.chicken);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -2,15 +2,12 @@ import 'dart:async';
|
|||||||
|
|
||||||
import 'package:flutter/widgets.dart';
|
import 'package:flutter/widgets.dart';
|
||||||
import 'package:rasadyar_chicken/data/data_source/local/chicken_local.dart';
|
import 'package:rasadyar_chicken/data/data_source/local/chicken_local.dart';
|
||||||
import 'package:rasadyar_chicken/data/data_source/local/chicken_local_imp.dart';
|
|
||||||
import 'package:rasadyar_chicken/data/di/chicken_di.dart';
|
import 'package:rasadyar_chicken/data/di/chicken_di.dart';
|
||||||
import 'package:rasadyar_chicken/data/models/local/widely_used_local_model.dart';
|
import 'package:rasadyar_chicken/data/models/local/widely_used_local_model.dart';
|
||||||
import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model.dart';
|
import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model.dart';
|
||||||
import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart';
|
import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart';
|
||||||
import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart';
|
import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart';
|
||||||
import 'package:rasadyar_chicken/data/repositories/chicken/chicken_repository.dart';
|
import 'package:rasadyar_chicken/data/repositories/chicken/chicken_repository.dart';
|
||||||
import 'package:rasadyar_chicken/data/repositories/chicken/chicken_repository_imp.dart';
|
|
||||||
|
|
||||||
import 'package:rasadyar_chicken/presentation/pages/steward/buy/view.dart';
|
import 'package:rasadyar_chicken/presentation/pages/steward/buy/view.dart';
|
||||||
import 'package:rasadyar_chicken/presentation/pages/steward/home/view.dart';
|
import 'package:rasadyar_chicken/presentation/pages/steward/home/view.dart';
|
||||||
import 'package:rasadyar_chicken/presentation/pages/steward/profile/view.dart';
|
import 'package:rasadyar_chicken/presentation/pages/steward/profile/view.dart';
|
||||||
@@ -53,8 +50,6 @@ class StewardRootLogic extends GetxController {
|
|||||||
/*localDatasource.openBox().then((value) async {
|
/*localDatasource.openBox().then((value) async {
|
||||||
widelyUsedList.value = localDatasource.getAllWidely();
|
widelyUsedList.value = localDatasource.getAllWidely();
|
||||||
});*/
|
});*/
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -72,6 +67,7 @@ class StewardRootLogic extends GetxController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (widelyUsedList.value?.hasInit != true) {
|
if (widelyUsedList.value?.hasInit != true) {
|
||||||
|
//TODO
|
||||||
localDatasource.initWidleyUsed().then((value) => localDatasource.getAllWidely());
|
localDatasource.initWidleyUsed().then((value) => localDatasource.getAllWidely());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -118,7 +114,7 @@ class StewardRootLogic extends GetxController {
|
|||||||
|
|
||||||
void rootErrorHandler(DioException error) {
|
void rootErrorHandler(DioException error) {
|
||||||
handleGeneric(error, () {
|
handleGeneric(error, () {
|
||||||
tokenService.deleteTokens();
|
tokenService.deleteAllTokens();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -158,5 +154,4 @@ class StewardRootLogic extends GetxController {
|
|||||||
onError: (error, stacktrace) {},
|
onError: (error, stacktrace) {},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
61
packages/core/lib/data/model/local/app_model/app_model.dart
Normal file
61
packages/core/lib/data/model/local/app_model/app_model.dart
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
import 'package:rasadyar_core/core.dart';
|
||||||
|
|
||||||
|
part 'app_model.g.dart';
|
||||||
|
|
||||||
|
@HiveType(typeId: appModelTypeId)
|
||||||
|
class AppModel extends HiveObject {
|
||||||
|
@HiveField(0, defaultValue: true)
|
||||||
|
bool? isFirstRun;
|
||||||
|
|
||||||
|
@HiveField(1)
|
||||||
|
bool? isDarkMode;
|
||||||
|
|
||||||
|
@HiveField(2)
|
||||||
|
Module? selectedModule;
|
||||||
|
|
||||||
|
@HiveField(3)
|
||||||
|
List<TargetPage>? targetPages;
|
||||||
|
|
||||||
|
AppModel({this.isFirstRun, this.isDarkMode, this.selectedModule, this.targetPages});
|
||||||
|
|
||||||
|
AppModel copyWith({
|
||||||
|
bool? isFirstRun,
|
||||||
|
bool? isDarkMode,
|
||||||
|
Module? selectedModule,
|
||||||
|
List<TargetPage>? targetPages,
|
||||||
|
}) {
|
||||||
|
return AppModel(
|
||||||
|
isFirstRun: isFirstRun ?? this.isFirstRun,
|
||||||
|
isDarkMode: isDarkMode ?? this.isDarkMode,
|
||||||
|
selectedModule: selectedModule ?? this.selectedModule,
|
||||||
|
targetPages: targetPages ?? this.targetPages,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return 'AppModel{isFirstRun: $isFirstRun, isDarkMode: $isDarkMode, selectedModule: $selectedModule, targetPages: $targetPages}';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@HiveType(typeId: targetTypeId)
|
||||||
|
class TargetPage extends HiveObject {
|
||||||
|
@HiveField(0)
|
||||||
|
String? route;
|
||||||
|
|
||||||
|
@HiveField(1)
|
||||||
|
List<String>? functions;
|
||||||
|
|
||||||
|
@HiveField(2)
|
||||||
|
Module? module;
|
||||||
|
|
||||||
|
TargetPage({required this.route, this.functions, this.module});
|
||||||
|
|
||||||
|
TargetPage copyWith({String? route, List<String>? functions, Module? module}) {
|
||||||
|
return TargetPage(
|
||||||
|
route: route ?? this.route,
|
||||||
|
functions: functions ?? this.functions,
|
||||||
|
module: module ?? this.module,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,90 @@
|
|||||||
|
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||||
|
|
||||||
|
part of 'app_model.dart';
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
|
// TypeAdapterGenerator
|
||||||
|
// **************************************************************************
|
||||||
|
|
||||||
|
class AppModelAdapter extends TypeAdapter<AppModel> {
|
||||||
|
@override
|
||||||
|
final typeId = 0;
|
||||||
|
|
||||||
|
@override
|
||||||
|
AppModel read(BinaryReader reader) {
|
||||||
|
final numOfFields = reader.readByte();
|
||||||
|
final fields = <int, dynamic>{
|
||||||
|
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
|
||||||
|
};
|
||||||
|
return AppModel(
|
||||||
|
isFirstRun: fields[0] == null ? true : fields[0] as bool?,
|
||||||
|
isDarkMode: fields[1] as bool?,
|
||||||
|
selectedModule: fields[2] as Module?,
|
||||||
|
targetPages: (fields[3] as List?)?.cast<TargetPage>(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void write(BinaryWriter writer, AppModel obj) {
|
||||||
|
writer
|
||||||
|
..writeByte(4)
|
||||||
|
..writeByte(0)
|
||||||
|
..write(obj.isFirstRun)
|
||||||
|
..writeByte(1)
|
||||||
|
..write(obj.isDarkMode)
|
||||||
|
..writeByte(2)
|
||||||
|
..write(obj.selectedModule)
|
||||||
|
..writeByte(3)
|
||||||
|
..write(obj.targetPages);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
int get hashCode => typeId.hashCode;
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) =>
|
||||||
|
identical(this, other) ||
|
||||||
|
other is AppModelAdapter &&
|
||||||
|
runtimeType == other.runtimeType &&
|
||||||
|
typeId == other.typeId;
|
||||||
|
}
|
||||||
|
|
||||||
|
class TargetPageAdapter extends TypeAdapter<TargetPage> {
|
||||||
|
@override
|
||||||
|
final typeId = 1;
|
||||||
|
|
||||||
|
@override
|
||||||
|
TargetPage read(BinaryReader reader) {
|
||||||
|
final numOfFields = reader.readByte();
|
||||||
|
final fields = <int, dynamic>{
|
||||||
|
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
|
||||||
|
};
|
||||||
|
return TargetPage(
|
||||||
|
route: fields[0] as String?,
|
||||||
|
functions: (fields[1] as List?)?.cast<String>(),
|
||||||
|
module: fields[2] as Module?,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void write(BinaryWriter writer, TargetPage obj) {
|
||||||
|
writer
|
||||||
|
..writeByte(3)
|
||||||
|
..writeByte(0)
|
||||||
|
..write(obj.route)
|
||||||
|
..writeByte(1)
|
||||||
|
..write(obj.functions)
|
||||||
|
..writeByte(2)
|
||||||
|
..write(obj.module);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
int get hashCode => typeId.hashCode;
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) =>
|
||||||
|
identical(this, other) ||
|
||||||
|
other is TargetPageAdapter &&
|
||||||
|
runtimeType == other.runtimeType &&
|
||||||
|
typeId == other.typeId;
|
||||||
|
}
|
||||||
@@ -1,11 +1,12 @@
|
|||||||
import 'package:rasadyar_core/core.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:rasadyar_core/core.dart';
|
||||||
|
|
||||||
part 'module_model.freezed.dart';
|
part 'module_model.freezed.dart';
|
||||||
|
|
||||||
|
//این برای صفحه اول لیست ماژول هاست.
|
||||||
|
|
||||||
@freezed
|
@freezed
|
||||||
abstract class ModuleModel with _$ModuleModel{
|
abstract class ModuleModel with _$ModuleModel {
|
||||||
factory ModuleModel({
|
factory ModuleModel({
|
||||||
required String title,
|
required String title,
|
||||||
required String icon,
|
required String icon,
|
||||||
@@ -14,5 +15,4 @@ abstract class ModuleModel with _$ModuleModel{
|
|||||||
required Color titleColor,
|
required Color titleColor,
|
||||||
Module? module,
|
Module? module,
|
||||||
}) = _ModuleModel;
|
}) = _ModuleModel;
|
||||||
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,17 +0,0 @@
|
|||||||
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<String>? functions;
|
|
||||||
|
|
||||||
@HiveField(2)
|
|
||||||
Module? module;
|
|
||||||
|
|
||||||
TargetPage({required this.route, this.functions, this.module});
|
|
||||||
}
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
|
||||||
|
|
||||||
part of 'target_page.dart';
|
|
||||||
|
|
||||||
// **************************************************************************
|
|
||||||
// TypeAdapterGenerator
|
|
||||||
// **************************************************************************
|
|
||||||
|
|
||||||
class TargetPageAdapter extends TypeAdapter<TargetPage> {
|
|
||||||
@override
|
|
||||||
final typeId = 2;
|
|
||||||
|
|
||||||
@override
|
|
||||||
TargetPage read(BinaryReader reader) {
|
|
||||||
final numOfFields = reader.readByte();
|
|
||||||
final fields = <int, dynamic>{
|
|
||||||
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
|
|
||||||
};
|
|
||||||
return TargetPage(
|
|
||||||
route: fields[0] as String,
|
|
||||||
functions: (fields[1] as List?)?.cast<String>(),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
@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;
|
|
||||||
}
|
|
||||||
@@ -6,17 +6,25 @@ part 'user_local_model.g.dart';
|
|||||||
class UserLocalModel extends HiveObject {
|
class UserLocalModel extends HiveObject {
|
||||||
@HiveField(0)
|
@HiveField(0)
|
||||||
String? username;
|
String? username;
|
||||||
|
|
||||||
@HiveField(1)
|
@HiveField(1)
|
||||||
String? password;
|
String? password;
|
||||||
|
|
||||||
@HiveField(2)
|
@HiveField(2)
|
||||||
String? token;
|
String? token;
|
||||||
|
|
||||||
@HiveField(3)
|
@HiveField(3)
|
||||||
String? refreshToken;
|
String? refreshToken;
|
||||||
|
|
||||||
@HiveField(5)
|
@HiveField(5)
|
||||||
Module? module;
|
Module? module;
|
||||||
|
|
||||||
@HiveField(6)
|
@HiveField(6)
|
||||||
String? backend;
|
String? backend;
|
||||||
|
|
||||||
|
@HiveField(7)
|
||||||
|
List<String>? roles;
|
||||||
|
|
||||||
UserLocalModel({
|
UserLocalModel({
|
||||||
this.username,
|
this.username,
|
||||||
this.password,
|
this.password,
|
||||||
@@ -24,6 +32,7 @@ class UserLocalModel extends HiveObject {
|
|||||||
this.refreshToken,
|
this.refreshToken,
|
||||||
this.module,
|
this.module,
|
||||||
this.backend,
|
this.backend,
|
||||||
|
this.roles,
|
||||||
});
|
});
|
||||||
|
|
||||||
UserLocalModel copyWith({
|
UserLocalModel copyWith({
|
||||||
@@ -33,6 +42,7 @@ class UserLocalModel extends HiveObject {
|
|||||||
String? refreshToken,
|
String? refreshToken,
|
||||||
Module? module,
|
Module? module,
|
||||||
String? backend,
|
String? backend,
|
||||||
|
List<String>? roles,
|
||||||
}) {
|
}) {
|
||||||
return UserLocalModel(
|
return UserLocalModel(
|
||||||
username: username ?? this.username,
|
username: username ?? this.username,
|
||||||
@@ -41,11 +51,17 @@ class UserLocalModel extends HiveObject {
|
|||||||
refreshToken: refreshToken ?? this.refreshToken,
|
refreshToken: refreshToken ?? this.refreshToken,
|
||||||
module: module ?? this.module,
|
module: module ?? this.module,
|
||||||
backend: backend ?? this.backend,
|
backend: backend ?? this.backend,
|
||||||
|
roles: roles ?? this.roles,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return 'UserLocalModel{username: $username, password: $password, token: $token, refreshToken: $refreshToken, module: $module, backend: $backend, roles: $roles}';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@HiveType(typeId: authModuleTypeId)
|
@HiveType(typeId: moduleTypeId)
|
||||||
enum Module {
|
enum Module {
|
||||||
@HiveField(0)
|
@HiveField(0)
|
||||||
liveStocks,
|
liveStocks,
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ part of 'user_local_model.dart';
|
|||||||
|
|
||||||
class UserLocalModelAdapter extends TypeAdapter<UserLocalModel> {
|
class UserLocalModelAdapter extends TypeAdapter<UserLocalModel> {
|
||||||
@override
|
@override
|
||||||
final typeId = 0;
|
final typeId = 2;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
UserLocalModel read(BinaryReader reader) {
|
UserLocalModel read(BinaryReader reader) {
|
||||||
@@ -23,13 +23,14 @@ class UserLocalModelAdapter extends TypeAdapter<UserLocalModel> {
|
|||||||
refreshToken: fields[3] as String?,
|
refreshToken: fields[3] as String?,
|
||||||
module: fields[5] as Module?,
|
module: fields[5] as Module?,
|
||||||
backend: fields[6] as String?,
|
backend: fields[6] as String?,
|
||||||
|
roles: (fields[7] as List?)?.cast<String>(),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void write(BinaryWriter writer, UserLocalModel obj) {
|
void write(BinaryWriter writer, UserLocalModel obj) {
|
||||||
writer
|
writer
|
||||||
..writeByte(6)
|
..writeByte(7)
|
||||||
..writeByte(0)
|
..writeByte(0)
|
||||||
..write(obj.username)
|
..write(obj.username)
|
||||||
..writeByte(1)
|
..writeByte(1)
|
||||||
@@ -41,7 +42,9 @@ class UserLocalModelAdapter extends TypeAdapter<UserLocalModel> {
|
|||||||
..writeByte(5)
|
..writeByte(5)
|
||||||
..write(obj.module)
|
..write(obj.module)
|
||||||
..writeByte(6)
|
..writeByte(6)
|
||||||
..write(obj.backend);
|
..write(obj.backend)
|
||||||
|
..writeByte(7)
|
||||||
|
..write(obj.roles);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -57,7 +60,7 @@ class UserLocalModelAdapter extends TypeAdapter<UserLocalModel> {
|
|||||||
|
|
||||||
class ModuleAdapter extends TypeAdapter<Module> {
|
class ModuleAdapter extends TypeAdapter<Module> {
|
||||||
@override
|
@override
|
||||||
final typeId = 1;
|
final typeId = 3;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Module read(BinaryReader reader) {
|
Module read(BinaryReader reader) {
|
||||||
|
|||||||
@@ -2,3 +2,4 @@
|
|||||||
export 'pagination_model/pagination_model.dart';
|
export 'pagination_model/pagination_model.dart';
|
||||||
export 'local/module/module_model.dart';
|
export 'local/module/module_model.dart';
|
||||||
export 'local/user_local/user_local_model.dart';
|
export 'local/user_local/user_local_model.dart';
|
||||||
|
export 'local/app_model/app_model.dart';
|
||||||
|
|||||||
58
packages/core/lib/data/services/g_service.dart
Normal file
58
packages/core/lib/data/services/g_service.dart
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
import 'package:rasadyar_core/core.dart';
|
||||||
|
import 'package:rasadyar_core/hive_registrar.g.dart';
|
||||||
|
|
||||||
|
class GService extends GetxService {
|
||||||
|
final String _boxName = "appBox";
|
||||||
|
|
||||||
|
late final Box<AppModel> box;
|
||||||
|
|
||||||
|
Future<void> init() async {
|
||||||
|
Hive.registerAdapters();
|
||||||
|
box = await Hive.openBox<AppModel>(_boxName);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isFirstTime() {
|
||||||
|
return box.values.isEmpty;
|
||||||
|
}
|
||||||
|
|
||||||
|
Module? getSelectedModule() {
|
||||||
|
if (isFirstTime()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
var res = box.values.first.selectedModule;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> saveSelectedModule(Module module) async {
|
||||||
|
AppModel model = box.values.first;
|
||||||
|
model
|
||||||
|
..isFirstRun = false
|
||||||
|
..selectedModule = module;
|
||||||
|
|
||||||
|
await model.save();
|
||||||
|
}
|
||||||
|
|
||||||
|
TargetPage? getTargetPage(Module? module) {
|
||||||
|
if (isFirstTime()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
var res = box.values.first.targetPages?.firstWhereOrNull((element) => element.module == module);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> saveSelectedRole(String route) async {
|
||||||
|
AppModel model = box.values.first;
|
||||||
|
model.targetPages?.first.route = route;
|
||||||
|
|
||||||
|
await model.save();
|
||||||
|
AppModel model2 = box.values.first;
|
||||||
|
|
||||||
|
iLog("Saved route: $model2");
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> setIsNotFirstTime() async {
|
||||||
|
AppModel model = AppModel(isFirstRun: false);
|
||||||
|
|
||||||
|
await box.add(model);
|
||||||
|
}
|
||||||
|
}
|
||||||
24
packages/core/lib/data/services/local_storage_service.dart
Normal file
24
packages/core/lib/data/services/local_storage_service.dart
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
/*
|
||||||
|
import 'package:rasadyar_core/core.dart';
|
||||||
|
import 'package:rasadyar_core/data/model/local/target_page/target_page.dart';
|
||||||
|
|
||||||
|
class LocalStorageService extends GetxService {
|
||||||
|
static const String _targetPageBox = 'targetPageBox';
|
||||||
|
static const String _appBoxName = 'AppBox';
|
||||||
|
|
||||||
|
final HiveLocalStorage _localStorage = diCore.get<HiveLocalStorage>();
|
||||||
|
|
||||||
|
@override
|
||||||
|
void onInit() async {
|
||||||
|
super.onInit();
|
||||||
|
await _localStorage.openBox<TargetPage>(_targetPageBox);
|
||||||
|
await _localStorage.openBox(_appBoxName);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Future<void> saveTargetPage(TargetPage targetPage) async {
|
||||||
|
await _localStorage.add(boxName: _targetPageBox, value: targetPage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
@@ -1,2 +1,4 @@
|
|||||||
export 'auth_middelware.dart';
|
export 'auth_middelware.dart';
|
||||||
export 'token_storage_service.dart';
|
export 'token_storage_service.dart';
|
||||||
|
export 'local_storage_service.dart';
|
||||||
|
export 'g_service.dart';
|
||||||
|
|||||||
@@ -1,17 +1,9 @@
|
|||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
|
|
||||||
import 'package:rasadyar_core/core.dart';
|
import 'package:rasadyar_core/core.dart';
|
||||||
import 'package:rasadyar_core/hive_registrar.g.dart';
|
|
||||||
|
|
||||||
class TokenStorageService extends GetxService {
|
class TokenStorageService extends GetxService {
|
||||||
static const String _tokenBoxName = 'TokenBox';
|
static const String _tokenBoxName = 'TokenBox';
|
||||||
static const String _userPassBox = 'UserPassBox';
|
|
||||||
static const String _appBoxName = 'AppBox';
|
|
||||||
static const String _accessTokenKey = 'accessToken';
|
|
||||||
static const String _refreshTokenKey = 'refreshToken';
|
|
||||||
static const String _baseUrlKey = 'baseUrl';
|
|
||||||
static const String _apiKey = 'apiKey';
|
|
||||||
static const String _moduleKey = 'moduleSelected';
|
|
||||||
|
|
||||||
final FlutterSecureStorage _secureStorage = FlutterSecureStorage();
|
final FlutterSecureStorage _secureStorage = FlutterSecureStorage();
|
||||||
final HiveLocalStorage _localStorage = diCore.get<HiveLocalStorage>();
|
final HiveLocalStorage _localStorage = diCore.get<HiveLocalStorage>();
|
||||||
@@ -22,8 +14,6 @@ class TokenStorageService extends GetxService {
|
|||||||
Rxn<Module> appModule = Rxn(null);
|
Rxn<Module> appModule = Rxn(null);
|
||||||
|
|
||||||
Future<void> init() async {
|
Future<void> init() async {
|
||||||
Hive.registerAdapters();
|
|
||||||
|
|
||||||
final String? encryptedKey = await _secureStorage.read(key: 'hive_enc_key');
|
final String? encryptedKey = await _secureStorage.read(key: 'hive_enc_key');
|
||||||
final encryptionKey = encryptedKey != null
|
final encryptionKey = encryptedKey != null
|
||||||
? base64Url.decode(encryptedKey)
|
? base64Url.decode(encryptedKey)
|
||||||
@@ -32,73 +22,106 @@ class TokenStorageService extends GetxService {
|
|||||||
if (encryptedKey == null) {
|
if (encryptedKey == null) {
|
||||||
await _secureStorage.write(key: 'hive_enc_key', value: base64UrlEncode(encryptionKey));
|
await _secureStorage.write(key: 'hive_enc_key', value: base64UrlEncode(encryptionKey));
|
||||||
}
|
}
|
||||||
|
await _localStorage.openBox<UserLocalModel>(
|
||||||
await _localStorage.init();
|
_tokenBoxName,
|
||||||
await _localStorage.openBox(_tokenBoxName, encryptionCipher: HiveAesCipher(encryptionKey));
|
encryptionCipher: HiveAesCipher(encryptionKey),
|
||||||
await _localStorage.openBox(_appBoxName);
|
);
|
||||||
await _localStorage.openBox<UserLocalModel>(_userPassBox);
|
|
||||||
|
|
||||||
accessToken.value = _localStorage.read<String?>(boxName: _tokenBoxName, key: _accessTokenKey);
|
|
||||||
refreshToken.value = _localStorage.read<String?>(boxName: _tokenBoxName, key: _refreshTokenKey);
|
|
||||||
appModule.value = getModule();
|
|
||||||
baseurl.value = _localStorage.read<String?>(boxName: _appBoxName, key: _baseUrlKey);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> saveAccessToken(String token) async {
|
Future<void> saveAccessToken(Module module, String token) async {
|
||||||
await _localStorage.save(boxName: _tokenBoxName, key: _accessTokenKey, value: token);
|
UserLocalModel? user = getUserLocal(module);
|
||||||
|
user?.token = token;
|
||||||
|
await user?.save();
|
||||||
|
|
||||||
accessToken.value = token;
|
accessToken.value = token;
|
||||||
accessToken.refresh();
|
accessToken.refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> saveRefreshToken(String token) async {
|
Future<void> saveRefreshToken(Module module, String token) async {
|
||||||
await _localStorage.save(boxName: _tokenBoxName, key: _refreshTokenKey, value: token);
|
UserLocalModel? user = getUserLocal(module);
|
||||||
|
user?.refreshToken = token;
|
||||||
|
|
||||||
|
await user?.save();
|
||||||
|
|
||||||
refreshToken.value = token;
|
refreshToken.value = token;
|
||||||
refreshToken.refresh();
|
refreshToken.refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> saveModule(Module input) async {
|
Future<void> saveModule(Module input) async {
|
||||||
await _localStorage.save(boxName: _tokenBoxName, key: _moduleKey, value: input);
|
UserLocalModel? user = getUserLocal(input);
|
||||||
appModule.value = input;
|
appModule.value = input;
|
||||||
appModule.refresh();
|
appModule.refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
Module? getModule() {
|
void setGlobalTokenAndRefToken(Module input) {
|
||||||
return _localStorage.read<Module?>(boxName: _tokenBoxName, key: _moduleKey);
|
UserLocalModel? user = getUserLocal(input);
|
||||||
|
accessToken.value = user?.token;
|
||||||
|
refreshToken.value = user?.refreshToken;
|
||||||
|
baseurl.value = user?.backend;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> deleteTokens() async {
|
Future<void> deleteAllTokens() async {
|
||||||
await _localStorage.clear(_tokenBoxName);
|
await _localStorage.clear(_tokenBoxName);
|
||||||
accessToken.value = null;
|
accessToken.value = null;
|
||||||
refreshToken.value = null;
|
refreshToken.value = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> saveBaseUrl(String url) async {
|
Future<void> deleteModuleTokens(Module module) async {
|
||||||
await _localStorage.save(boxName: _appBoxName, key: _baseUrlKey, value: url);
|
UserLocalModel? user = getUserLocal(module);
|
||||||
|
await user?.delete();
|
||||||
|
accessToken.value = null;
|
||||||
|
refreshToken.value = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> saveBaseUrl(Module module, String url) async {
|
||||||
|
UserLocalModel? user = getUserLocal(module);
|
||||||
|
if (user == null) {
|
||||||
|
user = UserLocalModel(module: module, backend: url);
|
||||||
|
await _localStorage.add<UserLocalModel>(
|
||||||
|
boxName: _tokenBoxName,
|
||||||
|
value: UserLocalModel(module: module, backend: url),
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
user.backend = url;
|
||||||
|
await user.save();
|
||||||
|
}
|
||||||
|
|
||||||
baseurl.value = url;
|
baseurl.value = url;
|
||||||
baseurl.refresh();
|
baseurl.refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
void getBaseUrl() {
|
void getBaseUrl(Module module) {
|
||||||
var url = _localStorage.read(boxName: _appBoxName, key: _baseUrlKey);
|
UserLocalModel? user = getUserLocal(module);
|
||||||
baseurl.value = url;
|
baseurl.value = user?.backend;
|
||||||
baseurl.refresh();
|
baseurl.refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> saveApiKey(String key) async {
|
Future<void> saveUserPass(Module module, String username, String password) async {
|
||||||
await _localStorage.save(boxName: _tokenBoxName, key: _apiKey, value: key);
|
UserLocalModel? user = getUserLocal(module);
|
||||||
|
|
||||||
|
user
|
||||||
|
?..username = username
|
||||||
|
..password = password;
|
||||||
|
|
||||||
|
user?.save();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> saveUserPass(UserLocalModel model) async {
|
Future<void> saveRoles(Module module, List<String> roles) async {
|
||||||
await _localStorage.save<UserLocalModel>(
|
UserLocalModel? user = getUserLocal(module);
|
||||||
boxName: _userPassBox,
|
|
||||||
key: model.module!.name,
|
user?.roles = roles;
|
||||||
value: model,
|
user?.save();
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
UserLocalModel? getUserPass(Module module) {
|
Future<void> savePassword(Module module, String password) async {
|
||||||
|
UserLocalModel? user = getUserLocal(module);
|
||||||
|
user?.password = password;
|
||||||
|
await user?.save();
|
||||||
|
}
|
||||||
|
|
||||||
|
UserLocalModel? getUserLocal(Module module) {
|
||||||
return _localStorage
|
return _localStorage
|
||||||
.readBox<UserLocalModel>(boxName: _userPassBox)
|
.readBox<UserLocalModel>(boxName: _tokenBoxName)
|
||||||
?.firstWhereOrNull((element) => element.module == module);
|
?.firstWhereOrNull((element) => element.module == module);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,11 +3,12 @@
|
|||||||
// Check in to version control
|
// Check in to version control
|
||||||
|
|
||||||
import 'package:hive_ce/hive.dart';
|
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/app_model/app_model.dart';
|
||||||
import 'package:rasadyar_core/data/model/local/user_local/user_local_model.dart';
|
import 'package:rasadyar_core/data/model/local/user_local/user_local_model.dart';
|
||||||
|
|
||||||
extension HiveRegistrar on HiveInterface {
|
extension HiveRegistrar on HiveInterface {
|
||||||
void registerAdapters() {
|
void registerAdapters() {
|
||||||
|
registerAdapter(AppModelAdapter());
|
||||||
registerAdapter(ModuleAdapter());
|
registerAdapter(ModuleAdapter());
|
||||||
registerAdapter(TargetPageAdapter());
|
registerAdapter(TargetPageAdapter());
|
||||||
registerAdapter(UserLocalModelAdapter());
|
registerAdapter(UserLocalModelAdapter());
|
||||||
@@ -16,6 +17,7 @@ extension HiveRegistrar on HiveInterface {
|
|||||||
|
|
||||||
extension IsolatedHiveRegistrar on IsolatedHiveInterface {
|
extension IsolatedHiveRegistrar on IsolatedHiveInterface {
|
||||||
void registerAdapters() {
|
void registerAdapters() {
|
||||||
|
registerAdapter(AppModelAdapter());
|
||||||
registerAdapter(ModuleAdapter());
|
registerAdapter(ModuleAdapter());
|
||||||
registerAdapter(TargetPageAdapter());
|
registerAdapter(TargetPageAdapter());
|
||||||
registerAdapter(UserLocalModelAdapter());
|
registerAdapter(UserLocalModelAdapter());
|
||||||
|
|||||||
@@ -13,9 +13,6 @@ Future<void> setupAllCoreProvider() async {
|
|||||||
//max 500MB Map Cashing
|
//max 500MB Map Cashing
|
||||||
await FMTCObjectBoxBackend().initialise();
|
await FMTCObjectBoxBackend().initialise();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
await diCore.allReady();
|
await diCore.allReady();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -24,7 +21,8 @@ Future<void> _setUpLogger() async {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _setupLocalStorage() async {
|
Future<void> _setupLocalStorage() async {
|
||||||
diCore.registerSingleton<HiveLocalStorage>(HiveLocalStorage());
|
var localStorage = diCore.registerSingleton<HiveLocalStorage>(HiveLocalStorage());
|
||||||
|
await localStorage.init();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _setupRemote() async {
|
Future<void> _setupRemote() async {
|
||||||
|
|||||||
@@ -1,16 +1,18 @@
|
|||||||
//Auth
|
// app
|
||||||
const int authUserLocalModelTypeId = 0;
|
const int appModelTypeId = 0;
|
||||||
const int authModuleTypeId = 1;
|
const int targetTypeId = 1;
|
||||||
const int targetPageTypeId = 2;
|
|
||||||
|
|
||||||
//chicken
|
// auth
|
||||||
const int chickenWidelyUsedLocalModelTypeId = 3;
|
const int authUserLocalModelTypeId = 2;
|
||||||
const int chickenWidelyUsedLocalItemTypeId = 4;
|
const int moduleTypeId = 3;
|
||||||
|
|
||||||
//liveStock
|
// chicken
|
||||||
|
const int chickenWidelyUsedLocalModelTypeId = 4;
|
||||||
|
const int chickenWidelyUsedLocalItemTypeId = 5;
|
||||||
|
|
||||||
const int liveStockDataLocalModelTypeId = 5;
|
// liveStock
|
||||||
const int liveStockDataRancherLocalModelTypeId = 6;
|
const int liveStockDataLocalModelTypeId = 6;
|
||||||
const int liveStockDataHerdLocalModelTypeId = 7;
|
const int liveStockDataRancherLocalModelTypeId = 7;
|
||||||
const int liveStockDataLocationLocalModelTypeId = 8;
|
const int liveStockDataHerdLocalModelTypeId = 8;
|
||||||
const int liveStockDataLivestockLocalModelTypeId = 9;
|
const int liveStockDataLocationLocalModelTypeId = 9;
|
||||||
|
const int liveStockDataLivestockLocalModelTypeId = 10;
|
||||||
|
|||||||
@@ -15,17 +15,17 @@ Future<void> setupInspectionDI() async {
|
|||||||
diInspection.registerSingleton(DioErrorHandler());
|
diInspection.registerSingleton(DioErrorHandler());
|
||||||
var tokenService = Get.find<TokenStorageService>();
|
var tokenService = Get.find<TokenStorageService>();
|
||||||
if (tokenService.baseurl.value == null) {
|
if (tokenService.baseurl.value == null) {
|
||||||
await tokenService.saveBaseUrl('https://bazrasbackend.rasadyaar.ir/');
|
await tokenService.saveBaseUrl(Module.inspection,'https://bazrasbackend.rasadyaar.ir/');
|
||||||
}
|
}
|
||||||
diInspection.registerLazySingleton<AppInterceptor>(
|
diInspection.registerLazySingleton<AppInterceptor>(
|
||||||
() => AppInterceptor(
|
() => AppInterceptor(
|
||||||
//TODO : Update the base URL to the correct one for inspection module
|
//TODO : Update the base URL to the correct one for inspection module
|
||||||
refreshTokenCallback: () async => null,
|
refreshTokenCallback: () async => null,
|
||||||
saveTokenCallback: (String newToken) async {
|
saveTokenCallback: (String newToken) async {
|
||||||
await tokenService.saveAccessToken(newToken);
|
// await tokenService.saveAccessToken(newToken);
|
||||||
},
|
},
|
||||||
clearTokenCallback: () async {
|
clearTokenCallback: () async {
|
||||||
await tokenService.deleteTokens();
|
await tokenService.deleteAllTokens();
|
||||||
Get.offAllNamed(InspectionRoutes.auth, arguments: Module.inspection);
|
Get.offAllNamed(InspectionRoutes.auth, arguments: Module.inspection);
|
||||||
},
|
},
|
||||||
authArguments: Module.inspection,
|
authArguments: Module.inspection,
|
||||||
|
|||||||
@@ -125,7 +125,7 @@ class AuthLogic extends GetxController with GetTickerProviderStateMixin {
|
|||||||
call: () async => authRepository.login(authRequest: loginRequestModel.toJson()),
|
call: () async => authRepository.login(authRequest: loginRequestModel.toJson()),
|
||||||
onSuccess: (result) async {
|
onSuccess: (result) async {
|
||||||
await tokenStorageService.saveModule(_module);
|
await tokenStorageService.saveModule(_module);
|
||||||
await tokenStorageService.saveRefreshToken(result?.refresh ?? '');
|
/*await tokenStorageService.saveRefreshToken(result?.refresh ?? '');
|
||||||
await tokenStorageService.saveAccessToken(result?.access ?? '');
|
await tokenStorageService.saveAccessToken(result?.access ?? '');
|
||||||
if (rememberMe.value) {
|
if (rememberMe.value) {
|
||||||
await tokenStorageService.saveUserPass(
|
await tokenStorageService.saveUserPass(
|
||||||
@@ -135,7 +135,7 @@ class AuthLogic extends GetxController with GetTickerProviderStateMixin {
|
|||||||
module: _module,
|
module: _module,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}*/
|
||||||
|
|
||||||
Get.offAllNamed(InspectionRoutes.init);
|
Get.offAllNamed(InspectionRoutes.init);
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -11,7 +11,12 @@ class AuthPage extends GetView<AuthLogic> {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
body: Stack(
|
body:PopScope(
|
||||||
|
canPop: false,
|
||||||
|
onPopInvokedWithResult: (didPop, result) {
|
||||||
|
Get.back(result: -1);
|
||||||
|
},
|
||||||
|
child: Stack(
|
||||||
alignment: Alignment.center,
|
alignment: Alignment.center,
|
||||||
fit: StackFit.expand,
|
fit: StackFit.expand,
|
||||||
|
|
||||||
@@ -98,7 +103,7 @@ class AuthPage extends GetView<AuthLogic> {
|
|||||||
);
|
);
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
),
|
)),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ Future<void> setupLiveStockDI() async {
|
|||||||
final tokenService = Get.find<TokenStorageService>();
|
final tokenService = Get.find<TokenStorageService>();
|
||||||
|
|
||||||
if (tokenService.baseurl.value == null) {
|
if (tokenService.baseurl.value == null) {
|
||||||
await tokenService.saveBaseUrl('https://api.dam.rasadyar.net/');
|
await tokenService.saveBaseUrl(Module.inspection,'https://api.dam.rasadyar.net/');
|
||||||
}
|
}
|
||||||
|
|
||||||
// First register AppInterceptor with lazy callbacks
|
// First register AppInterceptor with lazy callbacks
|
||||||
@@ -42,10 +42,10 @@ Future<void> setupLiveStockDI() async {
|
|||||||
return null;
|
return null;
|
||||||
},
|
},
|
||||||
saveTokenCallback: (String newToken) async {
|
saveTokenCallback: (String newToken) async {
|
||||||
await tokenService.saveAccessToken(newToken);
|
// await tokenService.saveAccessToken(newToken);
|
||||||
},
|
},
|
||||||
clearTokenCallback: () async {
|
clearTokenCallback: () async {
|
||||||
await tokenService.deleteTokens();
|
await tokenService.deleteAllTokens();
|
||||||
Get.offAllNamed(LiveStockRoutes.auth, arguments: Module.liveStocks);
|
Get.offAllNamed(LiveStockRoutes.auth, arguments: Module.liveStocks);
|
||||||
},
|
},
|
||||||
authArguments: Module.liveStocks,
|
authArguments: Module.liveStocks,
|
||||||
|
|||||||
@@ -126,7 +126,7 @@ class AuthLogic extends GetxController with GetTickerProviderStateMixin {
|
|||||||
call: () async => await authRepository.login(authRequest: loginRequestModel.toJson()),
|
call: () async => await authRepository.login(authRequest: loginRequestModel.toJson()),
|
||||||
onSuccess: (result) async {
|
onSuccess: (result) async {
|
||||||
await tokenStorageService.saveModule(_module);
|
await tokenStorageService.saveModule(_module);
|
||||||
await tokenStorageService.saveRefreshToken(result?.refresh ?? '');
|
/* await tokenStorageService.saveRefreshToken(result?.refresh ?? '');
|
||||||
await tokenStorageService.saveAccessToken(result?.access ?? '');
|
await tokenStorageService.saveAccessToken(result?.access ?? '');
|
||||||
if (rememberMe.value) {
|
if (rememberMe.value) {
|
||||||
await tokenStorageService.saveUserPass(
|
await tokenStorageService.saveUserPass(
|
||||||
@@ -136,7 +136,7 @@ class AuthLogic extends GetxController with GetTickerProviderStateMixin {
|
|||||||
module: _module,
|
module: _module,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}*/
|
||||||
|
|
||||||
Get.offAllNamed(LiveStockRoutes.init);
|
Get.offAllNamed(LiveStockRoutes.init);
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -11,7 +11,12 @@ class AuthPage extends GetView<AuthLogic> {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
body: Stack(
|
body:PopScope(
|
||||||
|
canPop: false,
|
||||||
|
onPopInvokedWithResult: (didPop, result) {
|
||||||
|
Get.back(result: -1);
|
||||||
|
},
|
||||||
|
child: Stack(
|
||||||
alignment: Alignment.center,
|
alignment: Alignment.center,
|
||||||
fit: StackFit.expand,
|
fit: StackFit.expand,
|
||||||
children: [
|
children: [
|
||||||
@@ -97,7 +102,7 @@ class AuthPage extends GetView<AuthLogic> {
|
|||||||
);
|
);
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
),
|
)),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -683,7 +683,7 @@ class ProfilePage extends GetView<ProfileLogic> {
|
|||||||
text: 'خروج',
|
text: 'خروج',
|
||||||
backgroundColor: AppColor.error,
|
backgroundColor: AppColor.error,
|
||||||
onPressed: () async {
|
onPressed: () async {
|
||||||
await controller.rootLogic.tokenService.deleteTokens().then((value) {
|
await controller.rootLogic.tokenService.deleteAllTokens().then((value) {
|
||||||
Get.back();
|
Get.back();
|
||||||
Get.offAllNamed(LiveStockRoutes.auth, arguments: Module.chicken);
|
Get.offAllNamed(LiveStockRoutes.auth, arguments: Module.chicken);
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user