1+ import 'package:flutter/foundation.dart' ;
12import 'package:flutter/material.dart' ;
23import 'package:resellio/core/models/models.dart' ;
34import 'package:resellio/core/repositories/repositories.dart' ;
45import 'package:resellio/core/utils/jwt_decoder.dart' ;
6+ import 'package:resellio/core/services/storage_service.dart' ;
57import 'package:resellio/presentation/common_widgets/adaptive_navigation.dart' ;
68
7- class UserModel {
8- final int userId;
9- final String email;
10- final String name;
11- final UserRole role;
12- final int roleId;
13-
14- UserModel (
15- {required this .userId,
16- required this .email,
17- required this .name,
18- required this .role,
19- required this .roleId});
20-
21- factory UserModel .fromJwt (Map <String , dynamic > jwtData) {
22- UserRole role;
23- switch (jwtData['role' ]) {
24- case 'organizer' :
25- role = UserRole .organizer;
26- break ;
27- case 'administrator' :
28- role = UserRole .admin;
29- break ;
30- default :
31- role = UserRole .customer;
32- }
33-
34- return UserModel (
35- userId: jwtData['user_id' ],
36- email: jwtData['sub' ],
37- name: jwtData['name' ] ?? 'User' ,
38- role: role,
39- roleId: jwtData['role_id' ],
40- );
41- }
42- }
439
4410class AuthService extends ChangeNotifier {
4511 final AuthRepository _authRepository;
@@ -48,15 +14,64 @@ class AuthService extends ChangeNotifier {
4814 UserModel ? _user;
4915 UserProfile ? _detailedProfile;
5016
51- AuthService (this ._authRepository, this ._userRepository);
17+ static const String _tokenKey = 'resellio_auth_token' ;
18+
19+ AuthService (this ._authRepository, this ._userRepository) {
20+ _loadStoredToken ();
21+ }
5222
5323 bool get isLoggedIn => _token != null ;
5424 UserModel ? get user => _user;
5525 UserProfile ? get detailedProfile => _detailedProfile;
5626
27+ Future <void > _loadStoredToken () async {
28+ try {
29+ final storedToken = StorageService .instance.getItem (_tokenKey);
30+ if (storedToken != null && storedToken.isNotEmpty) {
31+ final jwtData = tryDecodeJwt (storedToken);
32+ if (jwtData != null ) {
33+ final exp = jwtData['exp' ];
34+ if (exp != null ) {
35+ final expiryDate = DateTime .fromMillisecondsSinceEpoch (exp * 1000 );
36+ if (expiryDate.isAfter (DateTime .now ())) {
37+ _token = storedToken;
38+ _user = UserModel .fromJwt (jwtData);
39+
40+ try {
41+ _detailedProfile = await _userRepository.getUserProfile ();
42+ } catch (e) {
43+ debugPrint ("Failed to fetch detailed profile on token restore: $e " );
44+ }
45+
46+ notifyListeners ();
47+ return ;
48+ }
49+ }
50+ }
51+ await _clearStoredToken ();
52+ }
53+ } catch (e) {
54+ debugPrint ("Error loading stored token: $e " );
55+ await _clearStoredToken ();
56+ }
57+ }
58+
59+ void _storeToken (String token) {
60+ StorageService .instance.setItem (_tokenKey, token);
61+ }
62+
63+ Future <void > _clearStoredToken () async {
64+ StorageService .instance.removeItem (_tokenKey);
65+ _token = null ;
66+ _user = null ;
67+ _detailedProfile = null ;
68+ }
69+
5770 Future <void > _setTokenAndUser (String token) async {
5871 _token = token;
59- _detailedProfile = null ; // Clear old profile data
72+ _storeToken (token);
73+ _detailedProfile = null ;
74+
6075 final jwtData = tryDecodeJwt (token);
6176 if (jwtData != null ) {
6277 _user = UserModel .fromJwt (jwtData);
@@ -76,7 +91,7 @@ class AuthService extends ChangeNotifier {
7691
7792 Future <String > registerCustomer (Map <String , dynamic > data) async {
7893 final message = await _authRepository.registerCustomer (data);
79- return message;
94+ return message;
8095 }
8196
8297 Future <void > registerOrganizer (Map <String , dynamic > data) async {
@@ -93,9 +108,22 @@ class AuthService extends ChangeNotifier {
93108
94109 Future <void > logout () async {
95110 await _authRepository.logout ();
96- _token = null ;
97- _user = null ;
98- _detailedProfile = null ;
111+ await _clearStoredToken ();
99112 notifyListeners ();
100113 }
114+
115+ Future <void > refreshUserData () async {
116+ if (_token != null && _user != null ) {
117+ try {
118+ _detailedProfile = await _userRepository.getUserProfile ();
119+ notifyListeners ();
120+ } catch (e) {
121+ debugPrint ("Failed to refresh user data: $e " );
122+ // If refresh fails due to invalid token, logout
123+ if (e.toString ().contains ('401' ) || e.toString ().contains ('403' )) {
124+ await logout ();
125+ }
126+ }
127+ }
128+ }
101129}
0 commit comments