diff --git a/lib/core/local_storage_service.dart b/lib/core/local_storage_service.dart index a943ff2..5b0a2c1 100644 --- a/lib/core/local_storage_service.dart +++ b/lib/core/local_storage_service.dart @@ -29,12 +29,12 @@ class LocalStorageService { // Tasks Future saveTask(TaskModel task) async { - await _tasksBox.put(task.id, task.toFirestore()); + await _tasksBox.put(task.id, task.toMap()); // Используем toMap() для Hive } Future saveTasks(List tasks) async { for (final task in tasks) { - await _tasksBox.put(task.id, task.toFirestore()); + await _tasksBox.put(task.id, task.toMap()); } } @@ -121,7 +121,7 @@ class LocalStorageService { // Merge: remote takes precedence final merged = {...localMap, ...remoteMap}; - + await _tasksBox.clear(); for (final task in merged.values) { await _tasksBox.put(task.id, task.toFirestore()); diff --git a/lib/models/task_model.dart b/lib/models/task_model.dart index c73b4df..cd6343e 100644 --- a/lib/models/task_model.dart +++ b/lib/models/task_model.dart @@ -103,8 +103,12 @@ class TaskModel { factory TaskModel.fromFirestore(DocumentSnapshot doc) { final data = doc.data() as Map; + return TaskModel.fromMap(data); + } + + factory TaskModel.fromMap(Map data) { return TaskModel( - id: doc.id, + id: data['id'] ?? '', title: data['title'] ?? '', description: data['description'], projectId: data['projectId'] ?? '', @@ -121,13 +125,19 @@ class TaskModel { creatorId: data['creatorId'], tags: List.from(data['tags'] ?? []), dueDate: data['dueDate'] != null - ? (data['dueDate'] as Timestamp).toDate() + ? (data['dueDate'] is Timestamp + ? (data['dueDate'] as Timestamp).toDate() + : DateTime.parse(data['dueDate'])) : null, startDate: data['startDate'] != null - ? (data['startDate'] as Timestamp).toDate() + ? (data['startDate'] is Timestamp + ? (data['startDate'] as Timestamp).toDate() + : DateTime.parse(data['startDate'])) : null, completedDate: data['completedDate'] != null - ? (data['completedDate'] as Timestamp).toDate() + ? (data['completedDate'] is Timestamp + ? (data['completedDate'] as Timestamp).toDate() + : DateTime.parse(data['completedDate'])) : null, alarms: (data['alarms'] as List?) ?.map((a) => AlarmData.fromMap(a as Map)) @@ -136,8 +146,12 @@ class TaskModel { estimatedHours: data['estimatedHours'] ?? 0, spentHours: data['spentHours'] ?? 0, aiMetadata: data['aiMetadata'] ?? {}, - createdAt: (data['createdAt'] as Timestamp).toDate(), - updatedAt: (data['updatedAt'] as Timestamp).toDate(), + createdAt: data['createdAt'] is Timestamp + ? (data['createdAt'] as Timestamp).toDate() + : DateTime.parse(data['createdAt']), + updatedAt: data['updatedAt'] is Timestamp + ? (data['updatedAt'] as Timestamp).toDate() + : DateTime.parse(data['updatedAt']), ); } @@ -165,6 +179,31 @@ class TaskModel { }; } + // Для сохранения в Hive (конвертируем Timestamp в строки) + Map toMap() { + return { + 'id': id, + 'title': title, + 'description': description, + 'projectId': projectId, + 'parentTaskId': parentTaskId, + 'status': status.name, + 'priority': priority.name, + 'assigneeId': assigneeId, + 'creatorId': creatorId, + 'tags': tags, + 'dueDate': dueDate?.toIso8601String(), + 'startDate': startDate?.toIso8601String(), + 'completedDate': completedDate?.toIso8601String(), + 'alarms': alarms.map((a) => a.toMap()).toList(), + 'estimatedHours': estimatedHours, + 'spentHours': spentHours, + 'aiMetadata': aiMetadata, + 'createdAt': createdAt.toIso8601String(), + 'updatedAt': updatedAt.toIso8601String(), + }; + } + TaskModel copyWith({ String? id, String? title,