Files
BudgetApp/lib/services/user_service.dart
T
2025-06-27 18:42:02 +03:00

80 lines
3.8 KiB
Dart

import 'package:budget_app/data/repositories/interfaces/icategory_repository.dart';
import 'package:budget_app/data/repositories/interfaces/itag_repository.dart';
import 'package:budget_app/data/repositories/interfaces/itransaction_repository.dart';
import 'package:budget_app/utils/category_utils.dart';
import 'package:budget_app/utils/tag_utils.dart';
import 'package:budget_app/utils/transaction_utils.dart';
import 'package:flutter/foundation.dart';
import 'package:hive_ce/hive.dart';
import '/models/user.dart';
import '/data/repositories/interfaces/iuser_repository.dart';
/// Сервис для управления текущим пользователем приложения
/// Использует ChangeNotifier для уведомления UI об изменениях
class UserService extends ChangeNotifier {
// Ключ для сохранения ID текущего пользователя в настройках
static const String _currentUserKey = 'currentUserId';
late final Box _settingsBox; // Box для хранения настроек
final IUserRepository _userRepository;
final ICategoryRepository _categoryRepository;
final ITagRepository _tagRepository;
final ITransactionRepository _transactionRepository;
User? _currentUser; // Текущий активный пользователь
/// Геттер для получения текущего пользователя
User? get currentUser => _currentUser;
/// Проверяем, есть ли активный пользователь
bool get hasCurrentUser => _currentUser != null;
/// Конструктор сервиса
UserService(this._userRepository, this._categoryRepository, this._tagRepository, this._transactionRepository) {
_settingsBox = Hive.box('settings');
_loadCurrentUser(); // Загружаем сохраненного пользователя при запуске
}
/// Загружаем текущего пользователя из настроек
Future<void> _loadCurrentUser() async {
final userId = _settingsBox.get(_currentUserKey);
if (userId != null) {
_currentUser = await _userRepository.getById(userId);
notifyListeners(); // Уведомляем UI об изменении
}
}
/// Устанавливаем текущего пользователя
Future<void> setCurrentUser(User user) async {
_currentUser = user;
// Сохраняем ID пользователя в настройках для следующего запуска
await _settingsBox.put(_currentUserKey, user.id);
notifyListeners(); // Уведомляем UI об изменении
}
/// Выход из аккаунта (сброс текущего пользователя)
Future<void> logout() async {
_currentUser = null;
await _settingsBox.delete(_currentUserKey);
notifyListeners(); // Уведомляем UI об изменении
}
/// Создание нового пользователя и установка его как текущего
Future<void> createAndSetUser(String name, String email) async {
final user = User(name: name, email: email, language: 'ru'); // Устанавливаем язык по умолчанию
await _userRepository.add(user);
// Добавляем начальные категории, теги и транзакции для нового пользователя
await _categoryRepository.addAll(CategoryUtils.getDefaultCategories(user.id));
await _tagRepository.addAll(TagUtils.getDefaultTags(user.id));
await _transactionRepository.addAll(TransactionUtils.getSampleTransactions(user.id));
await setCurrentUser(user);
}
/// Получение всех пользователей (для выбора)
Future<List<User>> getAllUsers() async {
return await _userRepository.getAll();
}
}