import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../../../data/repositories/auth_repository.dart'; import '../../../data/models/user_model.dart'; import '../../../core/services/analytics_service.dart'; final authControllerProvider = StateNotifierProvider((ref) { return AuthController(ref.read(authRepositoryProvider)); }); final authRepositoryProvider = Provider((ref) { return AuthRepository(); }); class AuthController extends StateNotifier { final AuthRepository _authRepository; final AnalyticsService _analytics = AnalyticsService(); AuthController(this._authRepository) : super(null) { _init(); } void _init() { state = _authRepository.currentUser; _authRepository.authStateChanges.listen((user) { state = user; if (user != null) { _analytics.setUserId(user.id); } }); } bool get isAuthenticated => _authRepository.isAuthenticated; String? get currentUserId => _authRepository.currentUserId; Future isSessionValid() async { return await _authRepository.isSessionValid(); } Future refreshSession() async { await _authRepository.refreshSession(); } Future signInWithEmail(String email, String password) async { await _authRepository.signInWithEmail(email, password); _analytics.logSignIn(method: 'email'); } Future signUpWithEmail(String email, String password, String username) async { await _authRepository.signUpWithEmail(email, password, username); _analytics.logSignUp(method: 'email'); } Future signInWithGoogle() async { await _authRepository.signInWithGoogle(); _analytics.logSignIn(method: 'google'); } Future signInWithGithub() async { await _authRepository.signInWithGithub(); _analytics.logSignIn(method: 'github'); } Future signOut() async { await _authRepository.signOut(); state = null; _analytics.logSignOut(); _analytics.reset(); } Future resetPassword(String email) async { await _authRepository.resetPassword(email); } Future updateProfile({ String? username, String? bio, String? avatarUrl, bool? isPublicProfile, }) async { final updatedFields = []; if (username != null) updatedFields.add('username'); if (bio != null) updatedFields.add('bio'); if (avatarUrl != null) updatedFields.add('avatar'); if (isPublicProfile != null) { updatedFields.add('visibility'); _analytics.logProfileVisibilityChanged(isPublic: isPublicProfile); } await _authRepository.updateProfile( username: username, bio: bio, avatarUrl: avatarUrl, isPublicProfile: isPublicProfile, ); if (updatedFields.isNotEmpty) { _analytics.logProfileUpdated(fieldsUpdated: updatedFields.join(',')); } } @override void dispose() { _authRepository.dispose(); super.dispose(); } }