Preisanzeige in der App entfernen und Auftragsbezeichnungen vereinheitlichen. Stationsabschlüsse und Benachrichtigungen absichern sowie Historie um Aufgabenbeschreibungen und ausführende Nutzer erweitern. Regressionstests ergänzen und App sowie Backend auf Version 0.9.24 anheben.
163 lines
4.3 KiB
Dart
163 lines
4.3 KiB
Dart
import 'chat_message.dart';
|
|
|
|
enum ChatType { general, jobSpecific }
|
|
|
|
class Chat {
|
|
final String id;
|
|
final String title;
|
|
final String? receiver;
|
|
final ChatType type;
|
|
final String? jobId; // only for job-specific chats
|
|
final String? jobNumber; // only for job-specific chats
|
|
final List<ChatMessage> messages;
|
|
final DateTime lastMessageTime;
|
|
final String lastMessagePreview;
|
|
|
|
Chat({
|
|
required this.id,
|
|
required this.title,
|
|
this.receiver,
|
|
required this.type,
|
|
this.jobId,
|
|
this.jobNumber,
|
|
required this.messages,
|
|
required this.lastMessageTime,
|
|
required this.lastMessagePreview,
|
|
});
|
|
|
|
factory Chat.fromJson(Map<String, dynamic> json) {
|
|
final messagesList = json['messages'] as List? ?? [];
|
|
final messages =
|
|
messagesList
|
|
.map(
|
|
(messageJson) =>
|
|
ChatMessage.fromJson(messageJson as Map<String, dynamic>),
|
|
)
|
|
.toList();
|
|
|
|
return Chat(
|
|
id: json['id']?.toString() ?? '',
|
|
title: json['title']?.toString() ?? '',
|
|
receiver: json['receiver']?.toString(),
|
|
type:
|
|
json['type'] == 'jobSpecific'
|
|
? ChatType.jobSpecific
|
|
: ChatType.general,
|
|
jobId: json['jobId']?.toString(),
|
|
jobNumber: json['jobNumber']?.toString(),
|
|
messages: messages,
|
|
lastMessageTime: _resolveLastMessageTime(json, messages),
|
|
lastMessagePreview: _resolveLastMessagePreview(json, messages),
|
|
);
|
|
}
|
|
|
|
Map<String, dynamic> toJson() {
|
|
return {
|
|
'id': id,
|
|
'title': title,
|
|
'receiver': receiver,
|
|
'type': type == ChatType.jobSpecific ? 'jobSpecific' : 'general',
|
|
'jobId': jobId,
|
|
'jobNumber': jobNumber,
|
|
'messages': messages.map((message) => message.toJson()).toList(),
|
|
'lastMessageTime': lastMessageTime.toIso8601String(),
|
|
'lastMessagePreview': lastMessagePreview,
|
|
};
|
|
}
|
|
|
|
// Factory constructor for general chat
|
|
factory Chat.general({
|
|
required String id,
|
|
required String title,
|
|
String? receiver,
|
|
required List<ChatMessage> messages,
|
|
}) {
|
|
final lastMessage = messages.isNotEmpty ? messages.last : null;
|
|
return Chat(
|
|
id: id,
|
|
title: title,
|
|
receiver: receiver,
|
|
type: ChatType.general,
|
|
messages: messages,
|
|
lastMessageTime: lastMessage?.createdAt ?? DateTime.now(),
|
|
lastMessagePreview:
|
|
lastMessage != null
|
|
? _previewForMessage(lastMessage)
|
|
: 'Noch keine Nachrichten',
|
|
);
|
|
}
|
|
|
|
// Factory constructor for job-specific chat
|
|
factory Chat.jobSpecific({
|
|
required String id,
|
|
required String jobId,
|
|
required String jobNumber,
|
|
String? receiver,
|
|
required List<ChatMessage> messages,
|
|
}) {
|
|
final lastMessage = messages.isNotEmpty ? messages.last : null;
|
|
return Chat(
|
|
id: id,
|
|
title: 'Auftrag $jobNumber',
|
|
receiver: receiver,
|
|
type: ChatType.jobSpecific,
|
|
jobId: jobId,
|
|
jobNumber: jobNumber,
|
|
messages: messages,
|
|
lastMessageTime: lastMessage?.createdAt ?? DateTime.now(),
|
|
lastMessagePreview:
|
|
lastMessage != null
|
|
? _previewForMessage(lastMessage)
|
|
: 'Noch keine Nachrichten',
|
|
);
|
|
}
|
|
|
|
static DateTime _resolveLastMessageTime(
|
|
Map<String, dynamic> json,
|
|
List<ChatMessage> messages,
|
|
) {
|
|
if (messages.isNotEmpty) {
|
|
return messages.last.createdAt;
|
|
}
|
|
final raw = json['lastMessageTime']?.toString();
|
|
if (raw != null) {
|
|
final parsed = DateTime.tryParse(raw);
|
|
if (parsed != null) {
|
|
return parsed;
|
|
}
|
|
}
|
|
return DateTime.now();
|
|
}
|
|
|
|
static String _resolveLastMessagePreview(
|
|
Map<String, dynamic> json,
|
|
List<ChatMessage> messages,
|
|
) {
|
|
if (messages.isNotEmpty) {
|
|
return _previewForMessage(messages.last);
|
|
}
|
|
return json['lastMessagePreview']?.toString() ?? 'Noch keine Nachrichten';
|
|
}
|
|
|
|
static String _previewForMessage(ChatMessage message) {
|
|
if (message.contentType == ChatContentType.image) {
|
|
return '[Bild]';
|
|
}
|
|
return message.content;
|
|
}
|
|
|
|
@override
|
|
String toString() {
|
|
return 'Chat(id: $id, title: $title, type: $type, jobId: $jobId, messagesCount: ${messages.length})';
|
|
}
|
|
|
|
@override
|
|
bool operator ==(Object other) {
|
|
if (identical(this, other)) return true;
|
|
return other is Chat && other.id == id;
|
|
}
|
|
|
|
@override
|
|
int get hashCode => id.hashCode;
|
|
}
|