import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '../../core/network/api_client.dart'; import '../../config/app_config.dart'; import '../../main.dart'; import '../documents/pending_documents_provider.dart'; class AuthNotifier extends StateNotifier { AuthNotifier(this._ref) : super(false); final Ref _ref; Future checkLoginState() async { final prefs = await SharedPreferences.getInstance(); final token = prefs.getString('auth_token'); if (token != null) { state = true; try { final apiClient = _ref.read(apiClientProvider); final response = await apiClient.client.get('/auth/me'); if (response.data is Map && response.data['data'] is Map) { final profile = response.data['data']['profile']; if (profile != null) { await prefs.setString('nama_toko', profile['namaToko'] ?? ''); await prefs.setString('kode_toko', profile['kodeToko'] ?? ''); } } } catch (e) { // If unauthorized, perform clean logout if (e.toString().contains('401') || e.toString().contains('Unauthorized')) { await logout(); return false; } } return true; } state = false; return false; } Future login(String username, String password) async { final apiClient = _ref.read(apiClientProvider); try { final response = await apiClient.client.post( AppConfig.loginEndpoint, data: { 'username': username, 'password': password, }, ); if (response.data is! Map || response.data['data'] is! Map) { throw Exception("Format respon server tidak valid (bukan JSON)"); } final token = response.data['data']['token']; final profile = response.data['data']['profile']; if (token == null) { throw Exception("Token otentikasi tidak ditemukan dalam respon"); } // Clear any pre-existing local data before saving the new token/profile final localStorage = _ref.read(localStorageProvider); await localStorage.clearAll(); _ref.read(pendingDocumentsProvider.notifier).clearQueue(); final prefs = await SharedPreferences.getInstance(); await prefs.setString('auth_token', token); if (profile != null) { await prefs.setString('nama_toko', profile['namaToko'] ?? ''); await prefs.setString('kode_toko', profile['kodeToko'] ?? ''); } state = true; } catch (e) { state = false; rethrow; } } Future logout() async { final prefs = await SharedPreferences.getInstance(); await prefs.remove('auth_token'); await prefs.remove('nama_toko'); await prefs.remove('kode_toko'); final localStorage = _ref.read(localStorageProvider); await localStorage.clearAll(); // Clear pending documents queue in memory _ref.read(pendingDocumentsProvider.notifier).clearQueue(); state = false; } } final authProvider = StateNotifierProvider((ref) { return AuthNotifier(ref); });