178 lines
5.4 KiB
Dart
178 lines
5.4 KiB
Dart
import 'dart:convert';
|
|
import 'package:get/get.dart';
|
|
import 'package:shared_preferences/shared_preferences.dart';
|
|
import '../models/user.dart';
|
|
import 'api_service.dart';
|
|
import '../../l10n/l10n_x.dart';
|
|
|
|
class AuthService extends GetxController {
|
|
static AuthService get to => Get.find();
|
|
|
|
final _isAuthenticated = false.obs;
|
|
final _isLoading = true.obs;
|
|
final _currentUser = Rxn<User>();
|
|
final _token = Rxn<String>();
|
|
final _apiService = ApiService();
|
|
|
|
RxBool get isAuthenticated => _isAuthenticated;
|
|
RxBool get isLoading => _isLoading;
|
|
Rxn<User> get currentUser => _currentUser;
|
|
Rxn<String> get token => _token;
|
|
|
|
@override
|
|
void onInit() {
|
|
super.onInit();
|
|
_loadStoredAuth();
|
|
}
|
|
|
|
Future<void> _loadStoredAuth() async {
|
|
try {
|
|
final prefs = await SharedPreferences.getInstance();
|
|
final storedToken = prefs.getString('auth_token');
|
|
final storedUser = prefs.getString('user_data');
|
|
|
|
print('Stored token: ${storedToken != null ? 'exists' : 'null'}');
|
|
print('Stored user: ${storedUser != null ? 'exists' : 'null'}');
|
|
|
|
if (storedToken != null && storedUser != null) {
|
|
_token.value = storedToken;
|
|
try {
|
|
// Parse the stored user data properly - it's stored as a JSON string
|
|
final userMap = jsonDecode(storedUser) as Map<String, dynamic>;
|
|
print('Parsed user data: $userMap');
|
|
_currentUser.value = User.fromJson(userMap);
|
|
_isAuthenticated.value = true;
|
|
print('Successfully loaded stored auth data');
|
|
} catch (e) {
|
|
print('Error parsing stored user data: $e');
|
|
print('Raw stored user data: $storedUser');
|
|
// Clear corrupted data
|
|
final prefs = await SharedPreferences.getInstance();
|
|
await prefs.remove('user_data');
|
|
await prefs.remove('auth_token');
|
|
print('Cleared corrupted auth data');
|
|
}
|
|
} else {
|
|
print('No stored auth data found');
|
|
}
|
|
} catch (e) {
|
|
print('Error loading stored auth: $e');
|
|
} finally {
|
|
_isLoading.value = false;
|
|
}
|
|
}
|
|
|
|
Future<bool> signup(String mobileNumber, String fullName, String password, {String? email, String? address, String? emergencyContact}) async {
|
|
try {
|
|
_isLoading.value = true;
|
|
|
|
final response = await _apiService.signup(
|
|
mobileNumber,
|
|
fullName,
|
|
password,
|
|
email: email,
|
|
address: address,
|
|
emergencyContact: emergencyContact,
|
|
);
|
|
|
|
if (response['success']) {
|
|
final userData = response['data']['user'] as Map<String, dynamic>;
|
|
final token = response['data']['token'] as String;
|
|
final user = User.fromJson(userData);
|
|
|
|
await _saveAuthData(token, user);
|
|
|
|
_token.value = token;
|
|
_currentUser.value = user;
|
|
_isAuthenticated.value = true;
|
|
|
|
return true;
|
|
} else {
|
|
Get.snackbar(L10nSvc.of().signupFailedTitle, response['message']);
|
|
return false;
|
|
}
|
|
} catch (e) {
|
|
print('Signup error: $e');
|
|
Get.snackbar(L10nSvc.of().snackTitleError, L10nSvc.of().signupFailedGeneric);
|
|
return false;
|
|
} finally {
|
|
_isLoading.value = false;
|
|
}
|
|
}
|
|
|
|
Future<bool> login(String mobileNumber, String password) async {
|
|
try {
|
|
_isLoading.value = true;
|
|
|
|
final response = await _apiService.login(mobileNumber, password);
|
|
|
|
if (response['success']) {
|
|
final userData = response['data']['user'] as Map<String, dynamic>;
|
|
final token = response['data']['token'] as String;
|
|
final user = User.fromJson(userData);
|
|
|
|
await _saveAuthData(token, user);
|
|
|
|
_token.value = token;
|
|
_currentUser.value = user;
|
|
_isAuthenticated.value = true;
|
|
|
|
return true;
|
|
} else {
|
|
Get.snackbar(L10nSvc.of().loginFailedTitle, response['message']);
|
|
return false;
|
|
}
|
|
} catch (e) {
|
|
print('Login error: $e');
|
|
Get.snackbar(L10nSvc.of().snackTitleError, L10nSvc.of().loginFailedGeneric);
|
|
return false;
|
|
} finally {
|
|
_isLoading.value = false;
|
|
}
|
|
}
|
|
|
|
Future<void> _saveAuthData(String token, User user) async {
|
|
final prefs = await SharedPreferences.getInstance();
|
|
await prefs.setString('auth_token', token);
|
|
await prefs.setString('user_data', jsonEncode(user.toJson()));
|
|
}
|
|
|
|
Future<void> logout() async {
|
|
try {
|
|
await _apiService.logout();
|
|
|
|
final prefs = await SharedPreferences.getInstance();
|
|
await prefs.remove('auth_token');
|
|
await prefs.remove('user_data');
|
|
|
|
_token.value = null;
|
|
_currentUser.value = null;
|
|
_isAuthenticated.value = false;
|
|
} catch (e) {
|
|
print('Logout error: $e');
|
|
}
|
|
}
|
|
|
|
Future<bool> changePassword(String currentPassword, String newPassword) async {
|
|
try {
|
|
_isLoading.value = true;
|
|
|
|
final response = await _apiService.changePassword(currentPassword, newPassword);
|
|
|
|
if (response['success']) {
|
|
Get.snackbar(L10nSvc.of().snackTitleSuccess, L10nSvc.of().passwordChangedSuccess);
|
|
return true;
|
|
} else {
|
|
Get.snackbar(L10nSvc.of().snackTitleError, response['message']);
|
|
return false;
|
|
}
|
|
} catch (e) {
|
|
print('Change password error: $e');
|
|
Get.snackbar(L10nSvc.of().snackTitleError, L10nSvc.of().failedChangePassword);
|
|
return false;
|
|
} finally {
|
|
_isLoading.value = false;
|
|
}
|
|
}
|
|
}
|