Merge remote-tracking branch 'origin/refactor_dark_mood_repository'

This commit is contained in:
amirrezaghabeli
2025-08-10 08:38:08 +03:30
43 changed files with 1977 additions and 837 deletions
+41 -6
View File
@@ -1,5 +1,4 @@
import 'package:flutter/material.dart';
import '../core/utils/result.dart';
import '../data/models/user_model.dart';
import '../data/repositories/auth_repository.dart';
@@ -8,8 +7,25 @@ class AuthViewModel with ChangeNotifier {
final AuthRepository _authRepository;
AuthViewModel({required AuthRepository authRepository})
: _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;
UserModel? _loggedInUser;
@@ -18,25 +34,44 @@ class AuthViewModel with ChangeNotifier {
String? get errorMessage => _errorMessage;
UserModel? get loggedInUser => _loggedInUser;
Future<void> login(String email, String password) async {
void togglePasswordVisibility() {
_obscurePassword = !_obscurePassword;
notifyListeners();
}
void _onTextChanged() {
notifyListeners();
}
Future<void> login() async {
_isLoading = true;
_errorMessage = null;
notifyListeners();
final result = await _authRepository.login(email, password);
final result = await _authRepository.login(
usernameController.text.trim(),
passwordController.text.trim(),
);
switch (result) {
case Ok<UserModel>():
_loggedInUser = result.value;
// موفقیت‌آمیز
break;
case Error<UserModel>():
_errorMessage = result.error.toString();
// خطا
break;
}
_isLoading = false;
notifyListeners();
}
@override
void dispose() {
usernameController.dispose();
passwordController.dispose();
usernameFocus.dispose();
passwordFocus.dispose();
super.dispose();
}
}
-42
View File
@@ -1,42 +0,0 @@
// lib/view_models/login_view_model.dart
import 'package:flutter/material.dart';
class LoginViewModel with ChangeNotifier {
final TextEditingController usernameController = TextEditingController();
final TextEditingController passwordController = TextEditingController();
final FocusNode usernameFocus = FocusNode();
final FocusNode passwordFocus = FocusNode();
bool _obscurePassword = true;
LoginViewModel() {
usernameController.addListener(_onTextChanged);
passwordController.addListener(_onTextChanged);
usernameFocus.addListener(_onTextChanged);
passwordFocus.addListener(_onTextChanged);
}
bool get obscurePassword => _obscurePassword;
bool get isLoginEnabled =>
usernameController.text.isNotEmpty &&
passwordController.text.isNotEmpty;
void togglePasswordVisibility() {
_obscurePassword = !_obscurePassword;
notifyListeners();
}
void _onTextChanged() {
notifyListeners();
}
@override
void dispose() {
usernameController.dispose();
passwordController.dispose();
usernameFocus.dispose();
passwordFocus.dispose();
super.dispose();
}
}
@@ -0,0 +1,40 @@
import 'package:flutter/material.dart';
import 'package:tm_app/core/utils/result.dart';
import 'package:tm_app/data/repositories/tender_detail_repository.dart';
import 'package:tm_app/data/services/model/tender_detail_request/tender_detail_request.dart';
import 'package:tm_app/data/services/model/tender_detail_response/tender_detail_response_model.dart';
class TenderDetailViewModel with ChangeNotifier {
final TenderDetailRepository _tenderDetailRepository;
TenderDetailViewModel({required TenderDetailRepository tenderDetailRepository})
: _tenderDetailRepository = tenderDetailRepository;
bool _isLoading = false;
String? _errorMessage;
TenderDetailResponseModel? _tenderDetail;
bool get isLoading => _isLoading;
String? get errorMessage => _errorMessage;
TenderDetailResponseModel? get tenderDetail => _tenderDetail;
Future<void> getTenderDetail({required String id}) async {
_isLoading = true;
_errorMessage = null;
notifyListeners();
final request = TenderDetailRequest(id: id);
final result = await _tenderDetailRepository.getTenderDetail(request: request);
switch (result) {
case Ok<TenderDetailResponseModel>():
_tenderDetail = result.value;
break;
case Error<TenderDetailResponseModel>():
_errorMessage = result.error.toString();
break;
}
_isLoading = false;
notifyListeners();
}
}