import 'dart:io'; import 'package:flutter/material.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '../../repositories/auth_repository.dart'; import '../../models/user_model.dart'; import '../../core/cache_manager.dart'; import '../../services/reminder_service.dart'; class AuthProvider extends ChangeNotifier { final AuthRepository _repository = AuthRepository(); UserModel? _user; UserModel? get user => _user; bool _isLoading = false; bool get isLoading => _isLoading; String? _errorMessage; String? get errorMessage => _errorMessage; bool get isLoggedIn => _user != null; Future login(String email, String password) async { _isLoading = true; _errorMessage = null; notifyListeners(); try { final result = await _repository.login(email, password); if (result['success'] == true) { final data = result['data']; final token = data['token']; final userData = data['user']; await CacheManager.authBox.put('auth_token', token); await CacheManager.authBox.put('user_data', userData); _user = UserModel.fromJson(userData); _isLoading = false; notifyListeners(); return true; } else { _errorMessage = result['message'] ?? 'Login gagal'; _isLoading = false; notifyListeners(); return false; } } catch (e) { _errorMessage = e.toString(); _isLoading = false; notifyListeners(); return false; } } Future refreshUser() async { try { final userData = await _repository.getUser(); if (userData['success'] == true && userData['data'] != null) { _user = UserModel.fromJson(userData['data']); await CacheManager.authBox.put('user_data', userData['data']); notifyListeners(); } } catch (e) { } } Future changePassword(String currentPassword, String newPassword, String confirmPassword) async { _isLoading = true; _errorMessage = null; notifyListeners(); try { final result = await _repository.changePassword( currentPassword, newPassword, confirmPassword ); _isLoading = false; if (result['success'] == true) { notifyListeners(); return true; } else { _errorMessage = result['message'] ?? 'Gagal mengubah password'; notifyListeners(); return false; } } catch (e) { _isLoading = false; _errorMessage = e.toString(); notifyListeners(); return false; } } Future updateProfile({String? noTelp, String? alamat, File? foto}) async { _isLoading = true; _errorMessage = null; notifyListeners(); try { final result = await _repository.updateProfile( noTelp: noTelp, alamat: alamat, foto: foto, ); _isLoading = false; if (result['success'] == true) { await refreshUser(); notifyListeners(); return true; } else { _errorMessage = result['message'] ?? 'Gagal memperbarui profil'; notifyListeners(); return false; } } catch (e) { _isLoading = false; _errorMessage = e.toString(); notifyListeners(); return false; } } Future logout() async { // Langkah 1: Beritahu server untuk invalidasi token API dan hapus FCM token try { final token = CacheManager.authBox.get('auth_token'); if (token != null) { await _repository.logout(); } } catch (_) {} // MB-23: Langkah 2: Bersihkan SELURUH data lokal secara menyeluruh // Hive boxes await CacheManager.authBox.clear(); if (CacheManager.settingsBox.isOpen) { await CacheManager.settingsBox.clear(); } // SharedPreferences – pastikan semua key terhapus final prefs = await SharedPreferences.getInstance(); await prefs.clear(); // Langkah 3: Reset state provider _user = null; _errorMessage = null; // Langkah 4: Batalkan semua reminder lokal ReminderService().cancelAll(); notifyListeners(); } }