/opt/canhelp/apps/mobile/lib/models
NameSizeModeActions
app_notification.dart24230644editdlrm
availability.dart7590644editdlrm
category.dart12940644editdlrm
chat_room.dart57590644editdlrm
dashboard_data.dart40160644editdlrm
location.dart14310644editdlrm
offer.dart26480644editdlrm
portfolio_item.dart9470644editdlrm
price_list.dart39330644editdlrm
review.dart15750644editdlrm
specialist_card.dart52650644editdlrm
task.dart62600644editdlrm
user.dart64170644editdlrm
Edit: /opt/canhelp/apps/mobile/lib/models/task.dart (6260B)
enum TaskStatus { draft, open, inProgress, completed, cancelled } TaskStatus _parseTaskStatus(String? value) { switch (value) { case 'draft': return TaskStatus.draft; case 'open': return TaskStatus.open; case 'in_progress': case 'inProgress': return TaskStatus.inProgress; case 'completed': return TaskStatus.completed; case 'cancelled': return TaskStatus.cancelled; default: return TaskStatus.open; } } String _taskStatusToJson(TaskStatus status) { switch (status) { case TaskStatus.draft: return 'draft'; case TaskStatus.open: return 'open'; case TaskStatus.inProgress: return 'in_progress'; case TaskStatus.completed: return 'completed'; case TaskStatus.cancelled: return 'cancelled'; } } class Task { final String id; final String title; final String description; final TaskStatus status; final double? budget; final bool budgetNegotiable; final String currency; final String? category; final String? location; final String? district; final String? street; final String? houseNumber; final String? timeSlot; final String? confidentialNote; final List? images; final DateTime? deadline; final DateTime? expiresAt; final String customerId; final DateTime createdAt; final DateTime updatedAt; // Customer info (populated from detail endpoint) final String? customerName; final String? customerImage; final String? customerRating; // Offer counts (populated from /tasks/my endpoint) final int offerCount; final int declinedCount; // Localized fields (populated by auto-translation) final String? originalLocale; final String? titleEl; final String? titleEn; final String? titleRu; final String? descriptionEl; final String? descriptionEn; final String? descriptionRu; Task({ required this.id, required this.title, required this.description, this.status = TaskStatus.open, this.budget, this.budgetNegotiable = false, this.currency = 'EUR', this.category, this.location, this.district, this.street, this.houseNumber, this.timeSlot, this.confidentialNote, this.images, this.deadline, this.expiresAt, required this.customerId, required this.createdAt, required this.updatedAt, this.customerName, this.customerImage, this.customerRating, this.offerCount = 0, this.declinedCount = 0, this.originalLocale, this.titleEl, this.titleEn, this.titleRu, this.descriptionEl, this.descriptionEn, this.descriptionRu, }); /// Returns the best available title for the given locale. String localizedTitle(String locale) { switch (locale) { case 'el': return titleEl ?? title; case 'ru': return titleRu ?? title; default: return titleEn ?? title; } } /// Returns the best available description for the given locale. String localizedDescription(String locale) { switch (locale) { case 'el': return descriptionEl ?? description; case 'ru': return descriptionRu ?? description; default: return descriptionEn ?? description; } } factory Task.fromJson( Map json, { Map? customer, }) { return Task( id: json['id'] as String? ?? json['_id'] as String, title: json['title'] as String, description: json['description'] as String? ?? '', status: _parseTaskStatus(json['status'] as String?), budget: json['budget'] != null ? (json['budget'] is num ? (json['budget'] as num).toDouble() : double.tryParse(json['budget'].toString())) : null, budgetNegotiable: json['budgetNegotiable'] as bool? ?? false, currency: json['currency'] as String? ?? 'EUR', category: json['category'] as String?, location: json['location'] as String?, district: json['district'] as String?, street: json['street'] as String?, houseNumber: json['houseNumber'] as String?, timeSlot: json['timeSlot'] as String?, confidentialNote: json['confidentialNote'] as String?, images: (json['images'] as List?) ?.map((e) => e as String) .toList(), deadline: json['deadline'] != null ? DateTime.parse(json['deadline'] as String) : null, expiresAt: json['expiresAt'] != null ? DateTime.parse(json['expiresAt'] as String) : null, customerId: json['customerId'] as String? ?? json['customer'] as String? ?? '', createdAt: json['createdAt'] != null ? DateTime.parse(json['createdAt'] as String) : DateTime.now(), updatedAt: json['updatedAt'] != null ? DateTime.parse(json['updatedAt'] as String) : DateTime.now(), customerName: customer?['name'] as String? ?? (customer?['firstName'] != null ? '${customer!['firstName']} ${customer['lastName'] ?? ''}'.trim() : null), customerImage: customer?['image'] as String?, customerRating: customer?['rating']?.toString(), originalLocale: json['originalLocale'] as String?, titleEl: json['titleEl'] as String?, titleEn: json['titleEn'] as String?, titleRu: json['titleRu'] as String?, descriptionEl: json['descriptionEl'] as String?, descriptionEn: json['descriptionEn'] as String?, descriptionRu: json['descriptionRu'] as String?, offerCount: (json['offerCount'] as num?)?.toInt() ?? 0, declinedCount: (json['declinedCount'] as num?)?.toInt() ?? 0, ); } Map toJson() { return { 'title': title, 'description': description, 'status': _taskStatusToJson(status), if (budget != null) 'budget': budget, 'currency': currency, if (category != null) 'category': category, if (location != null) 'location': location, if (images != null) 'images': images, if (deadline != null) 'deadline': deadline!.toIso8601String(), if (expiresAt != null) 'expiresAt': expiresAt!.toIso8601String(), }; } }