Enhance authentication flow and user role management

- Updated AuthViewModel to hydrate user data from storage on initialization.
- Added method to AuthRepository for retrieving stored customer data.
- Enhanced AuthService to save and retrieve customer data from SharedPreferences.
- Refactored UI components to use context.watch for user role updates in MeetingTimeDialog, TenderDetailActions, and TendersPage.
- Improved navigation logic in final completion pages to handle user interactions more effectively.
This commit is contained in:
amirrezaghabeli
2025-10-14 12:24:04 +03:30
parent a343cf2469
commit 38222afcfa
9 changed files with 80 additions and 8 deletions
@@ -1,3 +1,4 @@
import 'package:tm_app/data/services/model/customer/customer.dart';
import 'package:tm_app/data/services/model/forgot_password_response/forgot_password_response_model.dart';
import 'package:tm_app/data/services/model/login_response/login_response_model.dart';
import 'package:tm_app/data/services/model/verify_otp_response/verify_otp_response_model.dart';
@@ -51,4 +52,8 @@ class AuthRepository {
Future<Result<bool>> checkIsLoggedIn() async {
return _authService.checkIsLoggedIn();
}
Future<Customer?> getStoredCustomer() async {
return _authService.getStoredCustomer();
}
}
+32 -1
View File
@@ -6,6 +6,7 @@ import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:tm_app/core/utils/logger.dart';
import 'package:tm_app/data/services/api/auth_api.dart';
import 'package:tm_app/data/services/model/customer/customer.dart';
import 'package:tm_app/data/services/model/forgot_password_response/forgot_password_response_model.dart';
import 'package:tm_app/data/services/model/login_response/login_response_model.dart';
import 'package:tm_app/data/services/model/logout_response/logout_response.dart';
@@ -55,9 +56,17 @@ class AuthService {
final token = result.value.data.accessToken;
AppLogger().info('🔑 Bearer token: $token');
final refreshToken = result.value.data.refreshToken;
final customer = result.value.data.customer;
await prefs.setString('bearer', token!);
await prefs.setString('refresh_token', refreshToken!);
// Save customer data as JSON string
if (customer != null) {
final customerJson = jsonEncode(customer.toJson());
await prefs.setString('customer_data', customerJson);
AppLogger().info('👤 Customer data saved to preferences');
}
}
return result;
}
@@ -68,6 +77,12 @@ class AuthService {
method: 'DELETE',
(json) => LogoutResponse.fromJson(json),
);
// Clear local data after successful logout
if (result is Ok<LogoutResponse>) {
await localLogout();
}
return result;
}
@@ -89,7 +104,8 @@ class AuthService {
final prefs = await SharedPreferences.getInstance();
await prefs.remove('bearer');
await prefs.remove('refresh_token');
appLogger.info('tokens cleared!');
await prefs.remove('customer_data');
appLogger.info('tokens and customer data cleared!');
}
Future<Result<ForgotPasswordResponseModel>> forgotPassword({
@@ -131,4 +147,19 @@ class AuthService {
}
return const Result.ok(true);
}
Future<Customer?> getStoredCustomer() async {
final prefs = await SharedPreferences.getInstance();
final customerJson = prefs.getString('customer_data');
if (customerJson == null) {
return null;
}
try {
final customerMap = jsonDecode(customerJson) as Map<String, dynamic>;
return Customer.fromJson(customerMap);
} catch (e) {
AppLogger().error('❌ Failed to parse stored customer data: $e');
return null;
}
}
}