80 lines
3.8 KiB
Dart
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();
|
|
}
|
|
}
|