Files
BudgetApp/lib/services/user_service.dart
T
Sanders c638b6ee4f Основываясь на предоставленных изменениях, я предлагаю следующий коммит:
feat: добавить поддержку пользователей в приложение учета бюджета
2025-06-09 22:23:52 +03:00

65 lines
2.8 KiB
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; // Репозиторий для работы с пользователями
User? _currentUser; // Текущий активный пользователь
/// Геттер для получения текущего пользователя
User? get currentUser => _currentUser;
/// Проверяем, есть ли активный пользователь
bool get hasCurrentUser => _currentUser != null;
/// Конструктор сервиса
UserService(this._userRepository) {
_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);
await _userRepository.add(user);
await setCurrentUser(user);
}
/// Получение всех пользователей (для выбора)
Future<List<User>> getAllUsers() async {
return await _userRepository.getAll();
}
}