From 6843973c4ff56ebbc7fe43b3c1ee3946226b293e Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sat, 17 May 2025 17:07:44 +0330 Subject: [PATCH] fix : login api call --- lib/domain/entity/user/user_entity.dart | 6 - lib/infrastructure/di/di.dart | 2 +- lib/infrastructure/service/auth_service.dart | 34 ++++ lib/main.dart | 3 + packages/auth/lib/auth.dart | 1 - packages/auth/lib/data/di/auth_di.dart | 2 - .../lib/data/services/auth_middelware.dart | 5 +- .../auth/lib/data/services/auth_service.dart | 9 - .../data/services/token_storage_service.dart | 56 ++++-- .../lib/presentation/pages/auth/logic.dart | 8 +- .../lib/presentation/pages/auth/view.dart | 182 +++++++++--------- packages/core/lib/injection/di.dart | 2 +- 12 files changed, 180 insertions(+), 130 deletions(-) delete mode 100644 lib/domain/entity/user/user_entity.dart create mode 100644 lib/infrastructure/service/auth_service.dart delete mode 100644 packages/auth/lib/data/services/auth_service.dart diff --git a/lib/domain/entity/user/user_entity.dart b/lib/domain/entity/user/user_entity.dart deleted file mode 100644 index 1988ce3..0000000 --- a/lib/domain/entity/user/user_entity.dart +++ /dev/null @@ -1,6 +0,0 @@ -class UserEntity { - String? token; - String? refreshToken; - - UserEntity({this.token, this.refreshToken}); -} diff --git a/lib/infrastructure/di/di.dart b/lib/infrastructure/di/di.dart index db60b78..b7107fb 100644 --- a/lib/infrastructure/di/di.dart +++ b/lib/infrastructure/di/di.dart @@ -6,7 +6,7 @@ final di = GetIt.instance; Future setupInjection() async{ await setupAuthDI(); - await setupAllProvider(); + await setupAllCoreProvider(); } diff --git a/lib/infrastructure/service/auth_service.dart b/lib/infrastructure/service/auth_service.dart new file mode 100644 index 0000000..786ce8e --- /dev/null +++ b/lib/infrastructure/service/auth_service.dart @@ -0,0 +1,34 @@ +import 'package:rasadyar_auth/auth.dart'; +import 'package:rasadyar_auth/data/services/token_storage_service.dart'; +import 'package:rasadyar_core/core.dart'; + +class AuthService extends GetxService { + var tokenService = diAuth.get(); + RxBool accessRes = false.obs; + RxBool refAccessRes = false.obs; + @override + void onInit() { + super.onInit(); + + ever(tokenService.accessToken, (callback) { + iLog('Access token callback: $callback, value: ${tokenService.accessToken.value}'); + accessRes.value = (callback != null); + }); + + // رصد تغییرات refreshToken + ever(tokenService.refreshToken, (callback) { + fLog('Refresh token callback: $callback, value: ${tokenService.refreshToken.value}'); + refAccessRes.value = (callback != null); + }); + + // بررسی اینکه هر دو مقدار دارند + everAll([accessRes, refAccessRes], (_) { + if (accessRes.value && refAccessRes.value) { + fLog('Both accessToken and refreshToken are available: accessToken=${tokenService.accessToken.value}, refreshToken=${tokenService.refreshToken.value}'); + } else { + fLog('One or both tokens are missing: accessToken=${tokenService.accessToken.value}, refreshToken=${tokenService.refreshToken.value}'); + } + }); + + } +} diff --git a/lib/main.dart b/lib/main.dart index bd6d7db..708bf7c 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,12 +1,15 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_app/presentation/routes/app_pages.dart'; + import 'package:rasadyar_core/core.dart'; import 'infrastructure/di/di.dart'; +import 'infrastructure/service/auth_service.dart'; Future main() async { WidgetsFlutterBinding.ensureInitialized(); await setupInjection(); + Get.put(AuthService()); runApp(MyApp()); // runApp(DevicePreview(builder: (context) => ForDevicePreview(),)); diff --git a/packages/auth/lib/auth.dart b/packages/auth/lib/auth.dart index 8007b45..9e7c1c4 100644 --- a/packages/auth/lib/auth.dart +++ b/packages/auth/lib/auth.dart @@ -4,5 +4,4 @@ library; export 'data/services/auth_middelware.dart'; -export 'data/services/auth_service.dart'; export 'data/di/auth_di.dart'; diff --git a/packages/auth/lib/data/di/auth_di.dart b/packages/auth/lib/data/di/auth_di.dart index d654ef1..10802b1 100644 --- a/packages/auth/lib/data/di/auth_di.dart +++ b/packages/auth/lib/data/di/auth_di.dart @@ -1,7 +1,6 @@ import 'package:rasadyar_auth/data/common/constant.dart'; import 'package:rasadyar_auth/data/common/dio_error_handler.dart'; import 'package:rasadyar_auth/data/repositories/auth_repository_imp.dart'; -import 'package:rasadyar_auth/data/services/auth_service.dart'; import 'package:rasadyar_auth/data/services/token_storage_service.dart'; import 'package:rasadyar_core/core.dart'; @@ -17,7 +16,6 @@ Future setupAuthDI() async { diAuth.registerCachedFactory( () => AuthRepositoryImpl(dioRemote), ); - diAuth.registerLazySingleton(() => AuthService()); diAuth.registerLazySingleton(() => TokenStorageService()); diAuth.registerLazySingleton(() => DioErrorHandler()); } diff --git a/packages/auth/lib/data/services/auth_middelware.dart b/packages/auth/lib/data/services/auth_middelware.dart index e34c326..56c0bb4 100644 --- a/packages/auth/lib/data/services/auth_middelware.dart +++ b/packages/auth/lib/data/services/auth_middelware.dart @@ -10,9 +10,8 @@ class AuthMiddleware extends GetMiddleware { @override RouteSettings? redirect(String? route) { - eLog('redirect'); - final refreshToken = tokenService.getRefreshToken(); - final accessToken = tokenService.getAccessToken(); + final refreshToken = tokenService.refreshToken.value; + final accessToken = tokenService.accessToken.value; if (refreshToken == null || accessToken == null) { return RouteSettings(name: AuthPaths.moduleList); diff --git a/packages/auth/lib/data/services/auth_service.dart b/packages/auth/lib/data/services/auth_service.dart deleted file mode 100644 index b1dffa5..0000000 --- a/packages/auth/lib/data/services/auth_service.dart +++ /dev/null @@ -1,9 +0,0 @@ -import 'package:rasadyar_core/core.dart'; - -class AuthService extends GetxService{ - - - Future initService() async { - - } -} \ No newline at end of file diff --git a/packages/auth/lib/data/services/token_storage_service.dart b/packages/auth/lib/data/services/token_storage_service.dart index b73122c..78fc35b 100644 --- a/packages/auth/lib/data/services/token_storage_service.dart +++ b/packages/auth/lib/data/services/token_storage_service.dart @@ -2,14 +2,18 @@ import 'dart:convert'; import 'package:rasadyar_core/core.dart'; - class TokenStorageService extends GetxService { static const String _boxName = 'secureBox'; static const String _accessTokenKey = 'accessToken'; static const String _refreshTokenKey = 'refreshToken'; + final FlutterSecureStorage _secureStorage = FlutterSecureStorage(); final HiveLocalStorage _localStorage = diCore.get(); + RxnString accessToken = RxnString(); + RxnString refreshToken = RxnString(); + RxnString tsss = RxnString(); + Future init() async { final String? encryptedKey = await _secureStorage.read(key: 'hive_enc_key'); final encryptionKey = @@ -29,26 +33,40 @@ class TokenStorageService extends GetxService { _boxName, encryptionCipher: HiveAesCipher(encryptionKey), ); + + accessToken.value = _localStorage.read( + boxName: _boxName, + key: _accessTokenKey, + ); + refreshToken.value = _localStorage.read( + boxName: _boxName, + key: _refreshTokenKey, + ); } - Future saveAccessToken(String token) async => await _localStorage.save( - boxName: _boxName, - key: _accessTokenKey, - value: token, - ); - - Future saveRefreshToken(String token) async => await _localStorage.save( - boxName: _boxName, - key: _refreshTokenKey, - value: token, - ); - - String? getAccessToken() => - _localStorage.read(boxName: _boxName, key: _accessTokenKey); - String? getRefreshToken() => - _localStorage.read(boxName: _boxName, key: _refreshTokenKey); - - Future deleteTokens() async => await _localStorage.clear(_boxName); + Future saveAccessToken(String token) async { + await _localStorage.save( + boxName: _boxName, + key: _accessTokenKey, + value: token, + ); + accessToken.value = token; + accessToken.refresh(); + } + Future saveRefreshToken(String token) async { + await _localStorage.save( + boxName: _boxName, + key: _refreshTokenKey, + value: token, + ); + refreshToken.value = token; + refreshToken.refresh(); + } + Future deleteTokens() async { + await _localStorage.clear(_boxName); + accessToken.value = null; + refreshToken.value = null; + } } diff --git a/packages/auth/lib/presentation/pages/auth/logic.dart b/packages/auth/lib/presentation/pages/auth/logic.dart index 66a8887..3e885a7 100644 --- a/packages/auth/lib/presentation/pages/auth/logic.dart +++ b/packages/auth/lib/presentation/pages/auth/logic.dart @@ -38,6 +38,7 @@ class AuthLogic extends GetxController { Rx otpStatus = OtpStatus.init.obs; RxInt secondsRemaining = 120.obs; + int wsd = 120; Timer? _timer; AuthRepositoryImpl authRepository = diAuth.get(); @@ -111,7 +112,7 @@ class AuthLogic extends GetxController { isLoading.value = true; await safeCall( call: () => authRepository.login(authRequest: loginRequestModel.toJson()), - onSuccess: (result) async{ + onSuccess: (result) async { await tokenStorageService.saveRefreshToken(result!.refresh!); await tokenStorageService.saveAccessToken(result!.access!); //Get.offAndToNamed(Routes.home); @@ -125,4 +126,9 @@ class AuthLogic extends GetxController { ); isLoading.value = false; } + + adder() { + tokenStorageService.tsss.value = (wsd++).toString(); + + } } diff --git a/packages/auth/lib/presentation/pages/auth/view.dart b/packages/auth/lib/presentation/pages/auth/view.dart index 674a796..4125915 100644 --- a/packages/auth/lib/presentation/pages/auth/view.dart +++ b/packages/auth/lib/presentation/pages/auth/view.dart @@ -38,7 +38,8 @@ class AuthPage extends GetView { ), ), TextSpan( - recognizer: TapGestureRecognizer()..onTap = () {}, + recognizer: TapGestureRecognizer() + ..onTap = () {}, text: 'حریم خصوصی', style: AppFonts.yekan14.copyWith( color: AppColor.blueNormal, @@ -55,22 +56,22 @@ class AuthPage extends GetView { children: [ TextSpan( recognizer: - TapGestureRecognizer() - ..onTap = () { - if (controller.authType.value == AuthType.otp) { - controller.authType.value = AuthType.useAndPass; - if (controller.otpStatus.value != - OtpStatus.init) { - controller.otpStatus.value = OtpStatus.init; - } - } else { - controller.authType.value = AuthType.otp; - } - }, + TapGestureRecognizer() + ..onTap = () { + if (controller.authType.value == AuthType.otp) { + controller.authType.value = AuthType.useAndPass; + if (controller.otpStatus.value != + OtpStatus.init) { + controller.otpStatus.value = OtpStatus.init; + } + } else { + controller.authType.value = AuthType.otp; + } + }, text: - controller.authType.value == AuthType.otp - ? 'ورود با رمز ثابت' - : 'ورود با رمز یکبار مصرف', + controller.authType.value == AuthType.otp + ? 'ورود با رمز ثابت' + : 'ورود با رمز یکبار مصرف', style: AppFonts.yekan14.copyWith( color: AppColor.blueNormal, @@ -94,84 +95,88 @@ class AuthPage extends GetView { child: Column( children: [ ObxValue( - (phoneController) => RTextField( - label: 'نام کاربری', - maxLength: 11, - maxLines: 1, - controller: phoneController.value, - keyboardType: TextInputType.number, - initText: phoneController.value.text, - onChanged: (value) { - phoneController.value.text = value; - phoneController.refresh(); - }, - prefixIcon: Padding( - padding: const EdgeInsets.fromLTRB(0, 8, 6, 8), - child: vecWidget(Assets.vecCallSvg), - ), - suffixIcon: - phoneController.value.text.trim().isNotEmpty + (phoneController) => + RTextField( + label: 'نام کاربری', + maxLength: 11, + maxLines: 1, + controller: phoneController.value, + keyboardType: TextInputType.number, + initText: phoneController.value.text, + onChanged: (value) { + phoneController.value.text = value; + phoneController.refresh(); + }, + prefixIcon: Padding( + padding: const EdgeInsets.fromLTRB(0, 8, 6, 8), + child: vecWidget(Assets.vecCallSvg), + ), + suffixIcon: + phoneController.value.text + .trim() + .isNotEmpty ? clearButton(() { - phoneController.value.clear(); - phoneController.refresh(); - }) + phoneController.value.clear(); + phoneController.refresh(); + }) : null, - validator: (value) { - if (value == null || value.isEmpty) { - return '⚠️ شماره موبایل را وارد کنید'; - } - /*else if (value.length < 11) { + validator: (value) { + if (value == null || value.isEmpty) { + return '⚠️ شماره موبایل را وارد کنید'; + } + /*else if (value.length < 11) { return '⚠️ شماره موبایل باید 11 رقم باشد'; }*/ - return null; - }, - style: AppFonts.yekan13, - errorStyle: AppFonts.yekan13.copyWith( - color: AppColor.redNormal, - ), - labelStyle: AppFonts.yekan13, - boxConstraints: const BoxConstraints( - maxHeight: 40, - minHeight: 40, - maxWidth: 40, - minWidth: 40, - ), - ), + return null; + }, + style: AppFonts.yekan13, + errorStyle: AppFonts.yekan13.copyWith( + color: AppColor.redNormal, + ), + labelStyle: AppFonts.yekan13, + boxConstraints: const BoxConstraints( + maxHeight: 40, + minHeight: 40, + maxWidth: 40, + minWidth: 40, + ), + ), controller.phoneNumberController, ), const SizedBox(height: 26), ObxValue( - (passwordController) => RTextField( - label: 'رمز عبور', - filled: false, - controller: passwordController.value, - variant: RTextFieldVariant.password, - initText: passwordController.value.text, - onChanged: (value) { - passwordController.refresh(); - }, - validator: (value) { - if (value == null || value.isEmpty) { - return '⚠️ رمز عبور را وارد کنید'; - } - return null; - }, - style: AppFonts.yekan13, - errorStyle: AppFonts.yekan13.copyWith( - color: AppColor.redNormal, - ), - labelStyle: AppFonts.yekan13, - prefixIcon: Padding( - padding: const EdgeInsets.fromLTRB(0, 8, 8, 8), - child: vecWidget(Assets.vecKeySvg), - ), - boxConstraints: const BoxConstraints( - maxHeight: 34, - minHeight: 34, - maxWidth: 34, - minWidth: 34, - ), - ), + (passwordController) => + RTextField( + label: 'رمز عبور', + filled: false, + controller: passwordController.value, + variant: RTextFieldVariant.password, + initText: passwordController.value.text, + onChanged: (value) { + passwordController.refresh(); + }, + validator: (value) { + if (value == null || value.isEmpty) { + return '⚠️ رمز عبور را وارد کنید'; + } + return null; + }, + style: AppFonts.yekan13, + errorStyle: AppFonts.yekan13.copyWith( + color: AppColor.redNormal, + ), + labelStyle: AppFonts.yekan13, + prefixIcon: Padding( + padding: const EdgeInsets.fromLTRB(0, 8, 8, 8), + child: vecWidget(Assets.vecKeySvg), + ), + boxConstraints: const BoxConstraints( + maxHeight: 34, + minHeight: 34, + maxWidth: 34, + minWidth: 34, + ), + ), controller.passwordController, ), SizedBox(height: 26), @@ -188,13 +193,16 @@ class AuthPage extends GetView { height: 48, ); }, controller.isLoading), + FloatingActionButton(onPressed: () { + controller.adder(); + }, child: Icon(Icons.add),) ], ), ), ); } - /* +/* Widget sendCodeForm() { return ObxValue((data) { return Form( diff --git a/packages/core/lib/injection/di.dart b/packages/core/lib/injection/di.dart index 95949c8..8e1c1b2 100644 --- a/packages/core/lib/injection/di.dart +++ b/packages/core/lib/injection/di.dart @@ -4,7 +4,7 @@ import 'package:rasadyar_core/infrastructure/local/hive_local_storage.dart'; final diCore = GetIt.instance; -Future setupAllProvider() async { +Future setupAllCoreProvider() async { await _setUpLogger(); await _setupLocalStorage(); await _setupRemote();