102 lines
4.6 KiB
Dart
102 lines
4.6 KiB
Dart
import 'package:hive_ce/hive.dart';
|
||
import '../utils/id_generator.dart';
|
||
|
||
// Указываем Hive, что это модель для хранения в базе данных
|
||
// typeId: 3 - уникальный идентификатор типа для Hive (у нас уже есть 0,1,2)
|
||
part 'user.g.dart';
|
||
|
||
@HiveType(typeId: 1003)
|
||
/// Модель пользователя приложения
|
||
/// Содержит основную информацию для идентификации пользователя
|
||
class User {
|
||
/// Уникальный идентификатор пользователя
|
||
@HiveField(0) // Поле 0 в Hive - первое поле модели
|
||
final String id;
|
||
|
||
/// Имя пользователя для отображения в интерфейсе
|
||
@HiveField(1) // Поле 1 в Hive - второе поле модели
|
||
final String name;
|
||
|
||
/// Email пользователя (может использоваться для входа в будущем)
|
||
@HiveField(2) // Поле 2 в Hive - третье поле модели
|
||
final String email;
|
||
|
||
@HiveField(3) // Поле 3 в Hive - язык пользователя
|
||
final String languageCode; // Переименовано с 'language' на 'languageCode'
|
||
|
||
@HiveField(4)
|
||
/// Дата и время последнего обновления объекта
|
||
final DateTime updatedAt;
|
||
|
||
@HiveField(5) // Новое поле для режима темы (светлая/темная)
|
||
final bool isDarkMode;
|
||
|
||
@HiveField(6) // Новое поле для валюты по умолчанию
|
||
final String defaultCurrency;
|
||
|
||
/// Конструктор пользователя
|
||
/// id генерируется автоматически, если не передан
|
||
User({
|
||
String? id, // Опциональный параметр - если null, сгенерируется автоматически
|
||
required this.name, // Обязательный параметр
|
||
required this.email, // Обязательный параметр
|
||
this.languageCode = 'ru', // Язык по умолчанию - русский
|
||
DateTime? updatedAt, // Добавлено поле updatedAt, теперь необязательное
|
||
this.isDarkMode = false, // По умолчанию светлая тема
|
||
this.defaultCurrency = 'RUB', // Валюта по умолчанию - RUB
|
||
}) : id = id ?? IdGenerator.generateId(), // Если id не передан, генерируем новый
|
||
updatedAt = updatedAt ?? DateTime.now(); // Устанавливаем текущее время по умолчанию
|
||
|
||
/// Преобразование объекта в Map для сохранения в JSON или передачи по сети
|
||
Map<String, dynamic> toMap() {
|
||
return {
|
||
'id': id,
|
||
'name': name,
|
||
'email': email,
|
||
'languageCode': languageCode, // Обновлено имя поля
|
||
'updatedAt': updatedAt.toIso8601String(), // Добавлено updatedAt в Map
|
||
'isDarkMode': isDarkMode,
|
||
'defaultCurrency': defaultCurrency,
|
||
};
|
||
}
|
||
|
||
/// Создание объекта User из Map (например, при загрузке из JSON)
|
||
factory User.fromMap(Map<String, dynamic> map) {
|
||
return User(
|
||
id: map['id'],
|
||
name: map['name'],
|
||
email: map['email'],
|
||
languageCode: map['languageCode'] ?? 'ru', // Обновлено имя поля
|
||
updatedAt: DateTime.parse(map['updatedAt']), // Добавлено updatedAt при создании из Map
|
||
isDarkMode: map['isDarkMode'] ?? false,
|
||
defaultCurrency: map['defaultCurrency'] ?? 'RUB',
|
||
);
|
||
}
|
||
|
||
/// Переопределяем toString для удобного отображения в логах
|
||
@override
|
||
String toString() {
|
||
return 'User(id: $id, name: $name, email: $email, languageCode: $languageCode, isDarkMode: $isDarkMode, defaultCurrency: $defaultCurrency)';
|
||
}
|
||
|
||
/// Метод для создания копии объекта с возможностью изменения полей
|
||
User copyWith({
|
||
String? id,
|
||
String? name,
|
||
String? email,
|
||
String? languageCode, // Обновлено имя поля
|
||
bool? isDarkMode,
|
||
String? defaultCurrency,
|
||
}) {
|
||
return User(
|
||
id: id ?? this.id,
|
||
name: name ?? this.name,
|
||
email: email ?? this.email,
|
||
languageCode: languageCode ?? this.languageCode, // Обновлено имя поля
|
||
updatedAt: DateTime.now(), // Обновляем updatedAt при каждом копировании
|
||
isDarkMode: isDarkMode ?? this.isDarkMode,
|
||
defaultCurrency: defaultCurrency ?? this.defaultCurrency,
|
||
);
|
||
}
|
||
}
|