49 lines
1.5 KiB
Dart
49 lines
1.5 KiB
Dart
/// Represents a push notification received from the backend.
|
|
class AppNotification {
|
|
final String id;
|
|
final String type; // alert, approval, task_complete, message
|
|
final String title;
|
|
final String body;
|
|
final String? actionRoute; // deep link path, e.g. '/alerts'
|
|
final DateTime receivedAt;
|
|
final bool isRead;
|
|
|
|
const AppNotification({
|
|
required this.id,
|
|
required this.type,
|
|
required this.title,
|
|
required this.body,
|
|
this.actionRoute,
|
|
required this.receivedAt,
|
|
this.isRead = false,
|
|
});
|
|
|
|
AppNotification copyWith({bool? isRead}) {
|
|
return AppNotification(
|
|
id: id,
|
|
type: type,
|
|
title: title,
|
|
body: body,
|
|
actionRoute: actionRoute,
|
|
receivedAt: receivedAt,
|
|
isRead: isRead ?? this.isRead,
|
|
);
|
|
}
|
|
|
|
factory AppNotification.fromJson(Map<String, dynamic> json) {
|
|
return AppNotification(
|
|
id: json['id'] as String? ?? DateTime.now().millisecondsSinceEpoch.toString(),
|
|
type: json['type'] as String? ?? 'message',
|
|
title: json['title'] as String? ?? json['content'] as String? ?? '',
|
|
body: json['body'] as String? ?? json['content'] as String? ?? '',
|
|
actionRoute: json['actionRoute'] as String?,
|
|
receivedAt: json['receivedAt'] != null
|
|
? DateTime.parse(json['receivedAt'] as String)
|
|
: (json['sentAt'] != null
|
|
? DateTime.parse(json['sentAt'] as String)
|
|
: DateTime.now()),
|
|
isRead: json['isRead'] as bool? ?? false,
|
|
);
|
|
}
|
|
}
|