import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '../services/auth_service.dart'; class AuthProvider extends ChangeNotifier { AuthService? _service; bool _loading = false; bool get loading => _loading; bool initialized = false; String? _token; Map? _user; String? get token => _token; Map? get user => _user; bool get isLoggedIn => _token != null && _token!.isNotEmpty; // Inject context after provider initializes void initContext(BuildContext context) { _service = AuthService(context); } AuthProvider() { _loadFromPrefs(); } // ---------------------- NEW FIX: SAFE INIT ----------------------- Future init() async { if (!initialized) { await _loadFromPrefs(); } } // ---------------------- LOAD FROM PREFS ----------------------- Future _loadFromPrefs() async { final prefs = await SharedPreferences.getInstance(); _token = prefs.getString('token'); final userJson = prefs.getString('user'); if (userJson != null) { try { _user = Map.from(jsonDecode(userJson)); } catch (_) { _user = null; } } initialized = true; notifyListeners(); } // -------------------------- LOGIN ----------------------------- Future> login( BuildContext context, String loginId, String password) async { _service ??= AuthService(context); _loading = true; notifyListeners(); final res = await _service!.login(loginId, password); _loading = false; if (res['success'] == true) { final token = res['token']?.toString(); final userMap = res['user'] is Map ? Map.from(res['user']) : null; if (token != null && userMap != null) { final prefs = await SharedPreferences.getInstance(); await prefs.setString("saved_login_id", loginId); await prefs.setString("saved_password", password); await _saveSession(token, userMap); } } notifyListeners(); return res; } // --------------------- SAVE SESSION --------------------------- Future _saveSession( String token, Map userMap) async { final prefs = await SharedPreferences.getInstance(); await prefs.setString('token', token); await prefs.setString('user', jsonEncode(userMap)); _token = token; _user = userMap; notifyListeners(); } // ----------------------- LOGOUT ------------------------------- Future logout(BuildContext context) async { _service ??= AuthService(context); try { await _service!.logout(); } catch (_) {} final prefs = await SharedPreferences.getInstance(); await prefs.remove('token'); await prefs.remove('user'); _token = null; _user = null; notifyListeners(); } // -------------------- AUTO LOGIN ------------------------------ Future autoLoginFromSavedCredentials(BuildContext context) async { final prefs = await SharedPreferences.getInstance(); final loginId = prefs.getString('saved_login_id'); final password = prefs.getString('saved_password'); if (loginId == null || password == null) return false; final res = await login(context, loginId, password); return res['success'] == true; } Future forceLogout(BuildContext context) async { debugPrint('🚪🚪🚪 [AUTH] Force logout triggered'); final prefs = await SharedPreferences.getInstance(); await prefs.remove('token'); await prefs.remove('user'); await prefs.remove('saved_login_id'); await prefs.remove('saved_password'); _token = null; _user = null; notifyListeners(); // Redirect to login & clear navigation stack Navigator.of(context).pushNamedAndRemoveUntil( '/login', (route) => false, ); } }