import 'package:flutter/material.dart'; import '../core/utils/result.dart'; import '../data/repositories/auth_repository.dart'; import '../data/services/model/login_response/login_response_model.dart'; import '../data/services/model/logout_response/logout_response.dart'; import '../data/services/model/user/user.dart'; class AuthViewModel with ChangeNotifier { final AuthRepository _authRepository; AuthViewModel({required AuthRepository authRepository}) : _authRepository = authRepository { usernameController.addListener(_onTextChanged); passwordController.addListener(_onTextChanged); usernameFocus.addListener(_onTextChanged); passwordFocus.addListener(_onTextChanged); } final TextEditingController usernameController = TextEditingController(); final TextEditingController passwordController = TextEditingController(); final FocusNode usernameFocus = FocusNode(); final FocusNode passwordFocus = FocusNode(); bool _obscurePassword = true; bool get obscurePassword => _obscurePassword; bool get isLoginEnabled => usernameController.text.isNotEmpty && passwordController.text.isNotEmpty; // Auth state bool _isLoading = false; String? _errorMessage; User? _loggedInUser; bool get isLoading => _isLoading; String? get errorMessage => _errorMessage; User? get loggedInUser => _loggedInUser; void togglePasswordVisibility() { _obscurePassword = !_obscurePassword; notifyListeners(); } void _onTextChanged() { notifyListeners(); } Future login() async { _isLoading = true; _errorMessage = null; notifyListeners(); final result = await _authRepository.login( username: usernameController.text.trim(), password: passwordController.text.trim(), ); switch (result) { case Ok(): _loggedInUser = result.value.data.user; break; case Error(): _errorMessage = result.error.toString(); break; } _isLoading = false; notifyListeners(); _errorMessage = null; notifyListeners(); } Future logout() async { _errorMessage = null; notifyListeners(); final result = await _authRepository.logout(); switch (result) { case Ok(): _loggedInUser = null; break; case Error(): _errorMessage = result.error.toString(); break; } notifyListeners(); _errorMessage = null; notifyListeners(); } @override void dispose() { usernameController.dispose(); passwordController.dispose(); usernameFocus.dispose(); passwordFocus.dispose(); super.dispose(); } }