/opt/canhelp/apps/mobile/lib/models
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(),
};
}
}