import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; const _kAccessToken = 'access_token'; const _kRefreshToken = 'refresh_token'; const _kUsername = 'username'; const _kRealName = 'real_name'; const _kHotelNo = 'hotel_no'; const _kHotelId = 'hotel_id'; class AuthUser { final String accessToken; final String refreshToken; final String username; final String realName; final String hotelNo; final int hotelId; const AuthUser({ required this.accessToken, required this.refreshToken, required this.username, required this.realName, required this.hotelNo, required this.hotelId, }); // Kept for ApiClient compatibility String get token => accessToken; } class AuthState { final AuthUser? user; final bool initialized; const AuthState({this.user, this.initialized = false}); bool get isLoggedIn => user != null; } class AuthNotifier extends StateNotifier { final FlutterSecureStorage _storage; AuthNotifier(this._storage) : super(const AuthState()); /// Called at app startup to restore persisted session Future restore() async { final accessToken = await _storage.read(key: _kAccessToken); final refreshToken = await _storage.read(key: _kRefreshToken); final username = await _storage.read(key: _kUsername); final realName = await _storage.read(key: _kRealName); final hotelNo = await _storage.read(key: _kHotelNo); final hotelIdStr = await _storage.read(key: _kHotelId); if (accessToken != null && refreshToken != null && username != null) { state = AuthState( initialized: true, user: AuthUser( accessToken: accessToken, refreshToken: refreshToken, username: username, realName: realName ?? username, hotelNo: hotelNo ?? '', hotelId: int.tryParse(hotelIdStr ?? '') ?? 0, ), ); } else { state = const AuthState(initialized: true); } } Future login(AuthUser user) async { await _storage.write(key: _kAccessToken, value: user.accessToken); await _storage.write(key: _kRefreshToken, value: user.refreshToken); await _storage.write(key: _kUsername, value: user.username); await _storage.write(key: _kRealName, value: user.realName); await _storage.write(key: _kHotelNo, value: user.hotelNo); await _storage.write(key: _kHotelId, value: user.hotelId.toString()); state = AuthState(initialized: true, user: user); } void updateAccessToken(String newToken) { if (state.user == null) return; _storage.write(key: _kAccessToken, value: newToken); state = AuthState( initialized: true, user: AuthUser( accessToken: newToken, refreshToken: state.user!.refreshToken, username: state.user!.username, realName: state.user!.realName, hotelNo: state.user!.hotelNo, hotelId: state.user!.hotelId, ), ); } Future logout() async { await _storage.deleteAll(); state = const AuthState(initialized: true); } } final _secureStorage = FlutterSecureStorage( mOptions: MacOsOptions(groupId: 'com.jiu.client'), ); final authStateProvider = StateNotifierProvider( (ref) => AuthNotifier(_secureStorage), );