diff --git a/lib/features/notifications/models/notification_model.dart b/lib/features/notifications/models/notification_model.dart index 31d74e10..55c79e51 100644 --- a/lib/features/notifications/models/notification_model.dart +++ b/lib/features/notifications/models/notification_model.dart @@ -548,13 +548,7 @@ class PlanSubscriptionExpiredNotification implements BaseNotificationModel { @override final DateTime createdAt; - PlanSubscriptionExpiredNotification({ - required this.type, - required this.planName, - required this.customerName, - required this.isRead, - required this.createdAt, - }); + PlanSubscriptionExpiredNotification({required this.type, required this.planName, required this.customerName, required this.isRead, required this.createdAt}); factory PlanSubscriptionExpiredNotification.fromJson(Map json, NotificationType type, {bool? isRead, String? createdAt}) { return PlanSubscriptionExpiredNotification( @@ -840,7 +834,937 @@ class UnknownNotification implements BaseNotificationModel { UnknownNotification({required this.type, this.isRead = true, DateTime? createdAt}) : createdAt = createdAt ?? DateTime.fromMillisecondsSinceEpoch(0); } +class DietCancelledNotification implements BaseNotificationModel { + @override + final NotificationType type; + @override + final bool isRead; + final String dietName; + @override + final DateTime createdAt; + + DietCancelledNotification({required this.type, required this.dietName, required this.isRead, required this.createdAt}); + + factory DietCancelledNotification.fromJson(Map json, NotificationType type, {bool? isRead, String? createdAt}) { + return DietCancelledNotification( + type: type, + dietName: json['diet_name'] ?? '', + isRead: isRead ?? false, + createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), + ); + } +} + +class DietStartedNotification implements BaseNotificationModel { + @override + final NotificationType type; + @override + final bool isRead; + final String dietName; + @override + final DateTime createdAt; + + DietStartedNotification({required this.type, required this.dietName, required this.isRead, required this.createdAt}); + + factory DietStartedNotification.fromJson(Map json, NotificationType type, {bool? isRead, String? createdAt}) { + return DietStartedNotification( + type: type, + dietName: json['diet_name'] ?? '', + isRead: isRead ?? false, + createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), + ); + } +} + +class DietExpiredNotification implements BaseNotificationModel { + @override + final NotificationType type; + @override + final bool isRead; + final String dietName; + @override + final DateTime createdAt; + + DietExpiredNotification({required this.type, required this.dietName, required this.isRead, required this.createdAt}); + + factory DietExpiredNotification.fromJson(Map json, NotificationType type, {bool? isRead, String? createdAt}) { + return DietExpiredNotification( + type: type, + dietName: json['diet_name'] ?? '', + isRead: isRead ?? false, + createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), + ); + } +} + +class DietWillStartedInNotification implements BaseNotificationModel { + @override + final NotificationType type; + @override + final bool isRead; + final String dietName; + final String startDate; + @override + final DateTime createdAt; + + DietWillStartedInNotification({required this.type, required this.dietName, required this.startDate, required this.isRead, required this.createdAt}); + + factory DietWillStartedInNotification.fromJson(Map json, NotificationType type, {bool? isRead, String? createdAt}) { + return DietWillStartedInNotification( + type: type, + dietName: json['diet_name'] ?? '', + startDate: json['start_date'] ?? '', + isRead: isRead ?? false, + createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), + ); + } +} + +class DietCanNotBeStartedNotification implements BaseNotificationModel { + @override + final NotificationType type; + @override + final bool isRead; + final String dietName; + final String reason; + @override + final DateTime createdAt; + + DietCanNotBeStartedNotification({required this.type, required this.dietName, required this.reason, required this.isRead, required this.createdAt}); + + factory DietCanNotBeStartedNotification.fromJson(Map json, NotificationType type, {bool? isRead, String? createdAt}) { + return DietCanNotBeStartedNotification( + type: type, + dietName: json['diet_name'] ?? '', + reason: json['reason'] ?? '', + isRead: isRead ?? false, + createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), + ); + } +} + +class PersonalDietCreationNeededNotification implements BaseNotificationModel { + @override + final NotificationType type; + @override + final bool isRead; + final String planName; + final String clientName; + @override + final DateTime createdAt; + + PersonalDietCreationNeededNotification({required this.type, required this.planName, required this.clientName, required this.isRead, required this.createdAt}); + + factory PersonalDietCreationNeededNotification.fromJson(Map json, NotificationType type, {bool? isRead, String? createdAt}) { + return PersonalDietCreationNeededNotification( + type: type, + planName: json['plan_name'] ?? '', + clientName: json['client_name'] ?? '', + isRead: isRead ?? false, + createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), + ); + } +} + +class ChosenPlanClientLastDayFinishedNotification implements BaseNotificationModel { + @override + final NotificationType type; + @override + final bool isRead; + final String planName; + @override + final DateTime createdAt; + + ChosenPlanClientLastDayFinishedNotification({required this.type, required this.planName, required this.isRead, required this.createdAt}); + + factory ChosenPlanClientLastDayFinishedNotification.fromJson(Map json, NotificationType type, {bool? isRead, String? createdAt}) { + return ChosenPlanClientLastDayFinishedNotification( + type: type, + planName: json['plan_name'] ?? '', + isRead: isRead ?? false, + createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), + ); + } +} + +class ChosenPlanClientLastDayStartedNotification implements BaseNotificationModel { + @override + final NotificationType type; + @override + final bool isRead; + final String planName; + @override + final DateTime createdAt; + + ChosenPlanClientLastDayStartedNotification({required this.type, required this.planName, required this.isRead, required this.createdAt}); + + factory ChosenPlanClientLastDayStartedNotification.fromJson(Map json, NotificationType type, {bool? isRead, String? createdAt}) { + return ChosenPlanClientLastDayStartedNotification( + type: type, + planName: json['plan_name'] ?? '', + isRead: isRead ?? false, + createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), + ); + } +} + +class StayOnTrackToAuthorNotification implements BaseNotificationModel { + @override + final NotificationType type; + @override + final bool isRead; + final String planName; + final String clientName; + @override + final DateTime createdAt; + + StayOnTrackToAuthorNotification({required this.type, required this.planName, required this.clientName, required this.isRead, required this.createdAt}); + + factory StayOnTrackToAuthorNotification.fromJson(Map json, NotificationType type, {bool? isRead, String? createdAt}) { + return StayOnTrackToAuthorNotification( + type: type, + planName: json['plan_name'] ?? '', + clientName: json['client_name'] ?? '', + isRead: isRead ?? false, + createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), + ); + } +} + +class ClientStartPlanSubscriptionToSubscriberNotification implements BaseNotificationModel { + @override + final NotificationType type; + @override + final bool isRead; + final String planName; + @override + final DateTime createdAt; + + ClientStartPlanSubscriptionToSubscriberNotification({required this.type, required this.planName, required this.isRead, required this.createdAt}); + + factory ClientStartPlanSubscriptionToSubscriberNotification.fromJson(Map json, NotificationType type, {bool? isRead, String? createdAt}) { + return ClientStartPlanSubscriptionToSubscriberNotification( + type: type, + planName: json['plan_name'] ?? '', + isRead: isRead ?? false, + createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), + ); + } +} + +class ConsultantConfirmPlanSubscriptionToSubscriberNotification implements BaseNotificationModel { + @override + final NotificationType type; + @override + final bool isRead; + final String planName; + final String consultantName; + @override + final DateTime createdAt; + + ConsultantConfirmPlanSubscriptionToSubscriberNotification({ + required this.type, + required this.planName, + required this.consultantName, + required this.isRead, + required this.createdAt, + }); + + factory ConsultantConfirmPlanSubscriptionToSubscriberNotification.fromJson( + Map json, + NotificationType type, { + bool? isRead, + String? createdAt, + }) { + return ConsultantConfirmPlanSubscriptionToSubscriberNotification( + type: type, + planName: json['plan_name'] ?? '', + consultantName: json['consultant_name'] ?? '', + isRead: isRead ?? false, + createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), + ); + } +} + +class ClientPaidPlanSubscriptionToAuthorNotification implements BaseNotificationModel { + @override + final NotificationType type; + @override + final bool isRead; + final String planName; + final String clientName; + final double amount; + @override + final DateTime createdAt; + + ClientPaidPlanSubscriptionToAuthorNotification({ + required this.type, + required this.planName, + required this.clientName, + required this.amount, + required this.isRead, + required this.createdAt, + }); + + factory ClientPaidPlanSubscriptionToAuthorNotification.fromJson(Map json, NotificationType type, {bool? isRead, String? createdAt}) { + return ClientPaidPlanSubscriptionToAuthorNotification( + type: type, + planName: json['plan_name'] ?? '', + clientName: json['client_name'] ?? '', + amount: (json['amount'] as num?)?.toDouble() ?? 0.0, + isRead: isRead ?? false, + createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), + ); + } +} + +class ConsultantLeftDiaryCommentNotification implements BaseNotificationModel { + @override + final NotificationType type; + @override + final bool isRead; + final String planName; + final String consultantName; + final DateTime diaryDate; + @override + final DateTime createdAt; + + ConsultantLeftDiaryCommentNotification({ + required this.type, + required this.planName, + required this.consultantName, + required this.diaryDate, + required this.isRead, + required this.createdAt, + }); + + factory ConsultantLeftDiaryCommentNotification.fromJson(Map json, NotificationType type, {bool? isRead, String? createdAt}) { + return ConsultantLeftDiaryCommentNotification( + type: type, + planName: json['plan_name'] ?? '', + consultantName: json['consultant_name'] ?? '', + diaryDate: parseDate(json['diary_date'] ?? DateTime.now().toIso8601String()), + isRead: isRead ?? false, + createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), + ); + } +} + +class ConsultantConfirmPlanSubscriptionToAuthorNotification implements BaseNotificationModel { + @override + final NotificationType type; + @override + final bool isRead; + final String planName; + final String consultantName; + @override + final DateTime createdAt; + + ConsultantConfirmPlanSubscriptionToAuthorNotification({ + required this.type, + required this.planName, + required this.consultantName, + required this.isRead, + required this.createdAt, + }); + + factory ConsultantConfirmPlanSubscriptionToAuthorNotification.fromJson(Map json, NotificationType type, {bool? isRead, String? createdAt}) { + return ConsultantConfirmPlanSubscriptionToAuthorNotification( + type: type, + planName: json['plan_name'] ?? '', + consultantName: json['consultant_name'] ?? '', + isRead: isRead ?? false, + createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), + ); + } +} + +class ClientPaidPlanSubscriptionToSubscriberNotification implements BaseNotificationModel { + @override + final NotificationType type; + @override + final bool isRead; + final String planName; + final double amount; + @override + final DateTime createdAt; + + ClientPaidPlanSubscriptionToSubscriberNotification({ + required this.type, + required this.planName, + required this.amount, + required this.isRead, + required this.createdAt, + }); + + factory ClientPaidPlanSubscriptionToSubscriberNotification.fromJson(Map json, NotificationType type, {bool? isRead, String? createdAt}) { + return ClientPaidPlanSubscriptionToSubscriberNotification( + type: type, + planName: json['plan_name'] ?? '', + amount: (json['amount'] as num?)?.toDouble() ?? 0.0, + isRead: isRead ?? false, + createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), + ); + } +} + +class ClientStartPlanSubscriptionToAuthorNotification implements BaseNotificationModel { + @override + final NotificationType type; + @override + final bool isRead; + final String planName; + final String clientName; + @override + final DateTime createdAt; + + ClientStartPlanSubscriptionToAuthorNotification({ + required this.type, + required this.planName, + required this.clientName, + required this.isRead, + required this.createdAt, + }); + + factory ClientStartPlanSubscriptionToAuthorNotification.fromJson(Map json, NotificationType type, {bool? isRead, String? createdAt}) { + return ClientStartPlanSubscriptionToAuthorNotification( + type: type, + planName: json['plan_name'] ?? '', + clientName: json['client_name'] ?? '', + isRead: isRead ?? false, + createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), + ); + } +} + +class ClientCancelPlanSubscriptionToAuthorNotification implements BaseNotificationModel { + @override + final NotificationType type; + @override + final bool isRead; + final String planName; + final String clientName; + @override + final DateTime createdAt; + + ClientCancelPlanSubscriptionToAuthorNotification({ + required this.type, + required this.planName, + required this.clientName, + required this.isRead, + required this.createdAt, + }); + + factory ClientCancelPlanSubscriptionToAuthorNotification.fromJson(Map json, NotificationType type, {bool? isRead, String? createdAt}) { + return ClientCancelPlanSubscriptionToAuthorNotification( + type: type, + planName: json['plan_name'] ?? '', + clientName: json['client_name'] ?? '', + isRead: isRead ?? false, + createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), + ); + } +} + +class ClientCancelPlanSubscriptionToSubscriberNotification implements BaseNotificationModel { + @override + final NotificationType type; + @override + final bool isRead; + final String planName; + @override + final DateTime createdAt; + + ClientCancelPlanSubscriptionToSubscriberNotification({required this.type, required this.planName, required this.isRead, required this.createdAt}); + + factory ClientCancelPlanSubscriptionToSubscriberNotification.fromJson(Map json, NotificationType type, {bool? isRead, String? createdAt}) { + return ClientCancelPlanSubscriptionToSubscriberNotification( + type: type, + planName: json['plan_name'] ?? '', + isRead: isRead ?? false, + createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), + ); + } +} + +class UserDailyReportCompletedNotification implements BaseNotificationModel { + @override + final NotificationType type; + @override + final bool isRead; + final String planName; + final String clientName; + final DateTime reportDate; + @override + final DateTime createdAt; + + UserDailyReportCompletedNotification({ + required this.type, + required this.planName, + required this.clientName, + required this.reportDate, + required this.isRead, + required this.createdAt, + }); + + factory UserDailyReportCompletedNotification.fromJson(Map json, NotificationType type, {bool? isRead, String? createdAt}) { + return UserDailyReportCompletedNotification( + type: type, + planName: json['plan_name'] ?? '', + clientName: json['client_name'] ?? '', + reportDate: parseDate(json['report_date'] ?? DateTime.now().toIso8601String()), + isRead: isRead ?? false, + createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), + ); + } +} + +class StayOnTrackToCustomerNotification implements BaseNotificationModel { + @override + final NotificationType type; + @override + final bool isRead; + final String planName; + final String consultantName; + @override + final DateTime createdAt; + + StayOnTrackToCustomerNotification({required this.type, required this.planName, required this.consultantName, required this.isRead, required this.createdAt}); + + factory StayOnTrackToCustomerNotification.fromJson(Map json, NotificationType type, {bool? isRead, String? createdAt}) { + return StayOnTrackToCustomerNotification( + type: type, + planName: json['plan_name'] ?? '', + consultantName: json['consultant_name'] ?? '', + isRead: isRead ?? false, + createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), + ); + } +} + +class PhoneChangedNotification implements BaseNotificationModel { + @override + final NotificationType type; + @override + final bool isRead; + final String oldPhone; + final String newPhone; + @override + final DateTime createdAt; + + PhoneChangedNotification({required this.type, required this.oldPhone, required this.newPhone, required this.isRead, required this.createdAt}); + + factory PhoneChangedNotification.fromJson(Map json, NotificationType type, {bool? isRead, String? createdAt}) { + return PhoneChangedNotification( + type: type, + oldPhone: json['old_phone'] ?? '', + newPhone: json['new_phone'] ?? '', + isRead: isRead ?? false, + createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), + ); + } +} + +class SubscriptionNotification implements BaseNotificationModel { + @override + final NotificationType type; + @override + final bool isRead; + final String subscriptionType; + final String planName; + @override + final DateTime createdAt; + + SubscriptionNotification({required this.type, required this.subscriptionType, required this.planName, required this.isRead, required this.createdAt}); + + factory SubscriptionNotification.fromJson(Map json, NotificationType type, {bool? isRead, String? createdAt}) { + return SubscriptionNotification( + type: type, + subscriptionType: json['subscription_type'] ?? '', + planName: json['plan_name'] ?? '', + isRead: isRead ?? false, + createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), + ); + } +} + +class BadgeAwardedNotification implements BaseNotificationModel { + @override + final NotificationType type; + @override + final bool isRead; + final String badgeName; + final String badgeDescription; + @override + final DateTime createdAt; + + BadgeAwardedNotification({required this.type, required this.badgeName, required this.badgeDescription, required this.isRead, required this.createdAt}); + + factory BadgeAwardedNotification.fromJson(Map json, NotificationType type, {bool? isRead, String? createdAt}) { + return BadgeAwardedNotification( + type: type, + badgeName: json['badge_name'] ?? '', + badgeDescription: json['badge_description'] ?? '', + isRead: isRead ?? false, + createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), + ); + } +} + +class BadgeRevokedNotification implements BaseNotificationModel { + @override + final NotificationType type; + @override + final bool isRead; + final String badgeName; + final String reason; + @override + final DateTime createdAt; + + BadgeRevokedNotification({required this.type, required this.badgeName, required this.reason, required this.isRead, required this.createdAt}); + + factory BadgeRevokedNotification.fromJson(Map json, NotificationType type, {bool? isRead, String? createdAt}) { + return BadgeRevokedNotification( + type: type, + badgeName: json['badge_name'] ?? '', + reason: json['reason'] ?? '', + isRead: isRead ?? false, + createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), + ); + } +} + +class ConsultantRequestStartedNotification implements BaseNotificationModel { + @override + final NotificationType type; + @override + final bool isRead; + final String consultantName; + @override + final DateTime createdAt; + + ConsultantRequestStartedNotification({required this.type, required this.consultantName, required this.isRead, required this.createdAt}); + + factory ConsultantRequestStartedNotification.fromJson(Map json, NotificationType type, {bool? isRead, String? createdAt}) { + return ConsultantRequestStartedNotification( + type: type, + consultantName: json['consultant_name'] ?? '', + isRead: isRead ?? false, + createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), + ); + } +} + +class ClientCloseComplaintSuccessNotification implements BaseNotificationModel { + @override + final NotificationType type; + @override + final bool isRead; + final String complaintType; + final String entityName; + @override + final DateTime createdAt; + + ClientCloseComplaintSuccessNotification({ + required this.type, + required this.complaintType, + required this.entityName, + required this.isRead, + required this.createdAt, + }); + + factory ClientCloseComplaintSuccessNotification.fromJson(Map json, NotificationType type, {bool? isRead, String? createdAt}) { + return ClientCloseComplaintSuccessNotification( + type: type, + complaintType: json['complaint_type'] ?? '', + entityName: json['entity_name'] ?? '', + isRead: isRead ?? false, + createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), + ); + } +} + +class ClientRefundSuccessNotification implements BaseNotificationModel { + @override + final NotificationType type; + @override + final bool isRead; + final String planName; + final double amount; + final String reason; + @override + final DateTime createdAt; + + ClientRefundSuccessNotification({ + required this.type, + required this.planName, + required this.amount, + required this.reason, + required this.isRead, + required this.createdAt, + }); + + factory ClientRefundSuccessNotification.fromJson(Map json, NotificationType type, {bool? isRead, String? createdAt}) { + return ClientRefundSuccessNotification( + type: type, + planName: json['plan_name'] ?? '', + amount: (json['amount'] as num?)?.toDouble() ?? 0.0, + reason: json['reason'] ?? '', + isRead: isRead ?? false, + createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), + ); + } +} + +class ConsultantRefundSuccessNotification implements BaseNotificationModel { + @override + final NotificationType type; + @override + final bool isRead; + final String planName; + final String clientName; + final double amount; + @override + final DateTime createdAt; + + ConsultantRefundSuccessNotification({ + required this.type, + required this.planName, + required this.clientName, + required this.amount, + required this.isRead, + required this.createdAt, + }); + + factory ConsultantRefundSuccessNotification.fromJson(Map json, NotificationType type, {bool? isRead, String? createdAt}) { + return ConsultantRefundSuccessNotification( + type: type, + planName: json['plan_name'] ?? '', + clientName: json['client_name'] ?? '', + amount: (json['amount'] as num?)?.toDouble() ?? 0.0, + isRead: isRead ?? false, + createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), + ); + } +} + +class ClientRejectSuccessNotification implements BaseNotificationModel { + @override + final NotificationType type; + @override + final bool isRead; + final String planName; + final String reason; + @override + final DateTime createdAt; + + ClientRejectSuccessNotification({required this.type, required this.planName, required this.reason, required this.isRead, required this.createdAt}); + + factory ClientRejectSuccessNotification.fromJson(Map json, NotificationType type, {bool? isRead, String? createdAt}) { + return ClientRejectSuccessNotification( + type: type, + planName: json['plan_name'] ?? '', + reason: json['reason'] ?? '', + isRead: isRead ?? false, + createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), + ); + } +} + +class ConsultantRejectSuccessNotification implements BaseNotificationModel { + @override + final NotificationType type; + @override + final bool isRead; + final String planName; + final String clientName; + final String reason; + @override + final DateTime createdAt; + + ConsultantRejectSuccessNotification({ + required this.type, + required this.planName, + required this.clientName, + required this.reason, + required this.isRead, + required this.createdAt, + }); + + factory ConsultantRejectSuccessNotification.fromJson(Map json, NotificationType type, {bool? isRead, String? createdAt}) { + return ConsultantRejectSuccessNotification( + type: type, + planName: json['plan_name'] ?? '', + clientName: json['client_name'] ?? '', + reason: json['reason'] ?? '', + isRead: isRead ?? false, + createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), + ); + } +} + +class ScoreSubstractedNotification implements BaseNotificationModel { + @override + final NotificationType type; + @override + final bool isRead; + final String scoreKey; + final int scorableId; + final String scorableType; + final String scorableName; + final String scorableSlug; + final int scoreValue; + @override + final DateTime createdAt; + + ScoreSubstractedNotification({ + required this.type, + required this.scoreKey, + required this.scorableId, + required this.scorableType, + required this.scorableName, + required this.scorableSlug, + required this.scoreValue, + required this.isRead, + required this.createdAt, + }); + + factory ScoreSubstractedNotification.fromJson(Map json, NotificationType type, {bool? isRead, String? createdAt}) { + return ScoreSubstractedNotification( + type: type, + scoreKey: json['score_key'], + scorableId: json['scorable_id'], + scorableType: json['scorable_type'], + scorableName: json['scorable_name'] ?? '', + scorableSlug: json['scorable_slug'] ?? '', + scoreValue: json['score_value'], + isRead: isRead ?? false, + createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), + ); + } +} + +class ProductStatusUpdatedForAuthorNotification implements BaseNotificationModel { + @override + final NotificationType type; + @override + final bool isRead; + final String productName; + final String oldStatus; + final String newStatus; + @override + final DateTime createdAt; + + ProductStatusUpdatedForAuthorNotification({ + required this.type, + required this.productName, + required this.oldStatus, + required this.newStatus, + required this.isRead, + required this.createdAt, + }); + + factory ProductStatusUpdatedForAuthorNotification.fromJson(Map json, NotificationType type, {bool? isRead, String? createdAt}) { + return ProductStatusUpdatedForAuthorNotification( + type: type, + productName: json['product_name'] ?? '', + oldStatus: json['old_status'] ?? '', + newStatus: json['new_status'] ?? '', + isRead: isRead ?? false, + createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), + ); + } +} + +class DiaryReminderForUsersNotification implements BaseNotificationModel { + @override + final NotificationType type; + @override + final bool isRead; + @override + final DateTime createdAt; + + DiaryReminderForUsersNotification({required this.type, required this.isRead, required this.createdAt}); + + factory DiaryReminderForUsersNotification.fromJson(Map json, NotificationType type, {bool? isRead, String? createdAt}) { + return DiaryReminderForUsersNotification( + type: type, + isRead: isRead ?? false, + createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), + ); + } +} + enum NotificationType { + // Diet related + dietCancelled, + dietStarted, + dietExpired, + dietWillStartedIn, + dietCanNotBeStarted, + + // Plan related + personalDietCreationNeeded, + chosenPlanClientLastDayFinished, + chosenPlanConsultantLastDayStarted, + chosenPlanClientLastDayStarted, + stayOnTrackToAuthor, + chosenPlanStartedToClient, + clientStartPlanSubscriptionToSubscriber, + consultantConfirmPlanSubscriptionToSubscriber, + clientPaidPlanSubscriptionToAuthor, + chosenPlanTomorrowReminderToClient, + chosenPlanTomorrowReminderToConsultant, + chosenPlanStartedToConsultant, + consultantLeftDiaryComment, + chosenPlanFinishedToClient, + consultantConfirmPlanSubscriptionToAuthor, + clientPaidPlanSubscriptionToSubscriber, + clientStartPlanSubscriptionToAuthor, + clientCancelPlanSubscriptionToAuthor, + clientCancelPlanSubscriptionToSubscriber, + userDailyReportCompleted, + chosenPlanFinishedToConsultant, + stayOnTrackToCustomer, + + // Comments + entityCommented, + commentReplied, + + // Profile + phoneChanged, + + // Subscription + subscription, + + // Badges + badgeAwarded, + badgeRevoked, + + // Consultant + consultantRequestStarted, + + // Complaints + clientCloseComplaintSuccess, + complaintToModerationForUser, + + // Finance + clientRefundSuccess, + consultantRefundSuccess, + clientRejectSuccess, + consultantRejectSuccess, + + // Score + scoreAdded, + scoreSubstracted, + + // Product + productStatusUpdatedForAuthor, + + // Diary + diaryReminderForUsers, + + // Legacy types (keeping for backward compatibility) planSubscriptionStartedToAuthor, planSubscriptionCanceledToAuthor, chosenPlanStartedToClientNotification, @@ -848,20 +1772,11 @@ enum NotificationType { diaryReminderNotification, consultantLeftComment, personalizedDietIsDefined, - chosenPlanFinishedToClient, planSubscriptionCanceledToCustomer, chosenPlanStartedToConsultantNotification, chosenPlanTomorrowReminderToConsultantNotification, planSubscriptionPaidToAuthor, - chosenPlanFinishedToConsultant, chosenPlanLastDayFinishedForUser, - // Новые типы - chosenPlanConsultantLastDayStarted, - complaintToModerationForUser, - commentReplied, - scoreAdded, - entityCommented, - // Дополнительные типы уведомлений planSubscriptionExpired, planSubscriptionRenewed, consultantAssigned, @@ -874,10 +1789,57 @@ enum NotificationType { unknown; static NotificationType getTypeFromString(String type) => switch (type) { + // New type-based mapping + 'diet-cancelled' => NotificationType.dietCancelled, + 'entity-commented' => NotificationType.entityCommented, + 'comment-replied' => NotificationType.commentReplied, + 'phone-changed' => NotificationType.phoneChanged, + 'diet-started' => NotificationType.dietStarted, + 'personal-diet-creation-needed-to-author' => NotificationType.personalDietCreationNeeded, + 'chosen-plan-client-last-day-finished' => NotificationType.chosenPlanClientLastDayFinished, + 'chosen-plan-consultant-last-day-started' => NotificationType.chosenPlanConsultantLastDayStarted, + 'chosen-plan-client-last-day-started' => NotificationType.chosenPlanClientLastDayStarted, + 'subscription' => NotificationType.subscription, + 'badge-awarded' => NotificationType.badgeAwarded, + 'badge-revoked' => NotificationType.badgeRevoked, + 'diet-expired' => NotificationType.dietExpired, + 'consultant-request-started' => NotificationType.consultantRequestStarted, + 'diet-will-started-in' => NotificationType.dietWillStartedIn, + 'client-close-complaint-success' => NotificationType.clientCloseComplaintSuccess, + 'complaint-to-moderation-for-user' => NotificationType.complaintToModerationForUser, + 'client-refund-success' => NotificationType.clientRefundSuccess, + 'consultant-refund-success' => NotificationType.consultantRefundSuccess, + 'client-reject-success' => NotificationType.clientRejectSuccess, + 'consultant-reject-success' => NotificationType.consultantRejectSuccess, + 'score-added' => NotificationType.scoreAdded, + 'score-substracted' => NotificationType.scoreSubstracted, + 'product-status-updated-for-author' => NotificationType.productStatusUpdatedForAuthor, + 'diet-can-not-started' => NotificationType.dietCanNotBeStarted, + 'stay-on-track-to-author' => NotificationType.stayOnTrackToAuthor, + 'chosen-plan-started-to-client' => NotificationType.chosenPlanStartedToClient, + 'client-start-plan-subscription-to-subscriber' => NotificationType.clientStartPlanSubscriptionToSubscriber, + 'consultant-confirm-plan-subscription-to-subscriber' => NotificationType.consultantConfirmPlanSubscriptionToSubscriber, + 'client-paid-plan-subscription-to-author' => NotificationType.clientPaidPlanSubscriptionToAuthor, + 'chosen-plan-tomorrow-reminder-to-client' => NotificationType.chosenPlanTomorrowReminderToClient, + 'chosen-plan-tomorrow-reminder-to-consultant' => NotificationType.chosenPlanTomorrowReminderToConsultant, + 'chosen-plan-started-to-consultant' => NotificationType.chosenPlanStartedToConsultant, + 'consultant-left-diary-comment' => NotificationType.consultantLeftDiaryComment, + 'chosen-plan-finished-to-client' => NotificationType.chosenPlanFinishedToClient, + 'consultant-confirm-plan-subscription-to-author' => NotificationType.consultantConfirmPlanSubscriptionToAuthor, + 'client-paid-plan-subscription-to-subscriber' => NotificationType.clientPaidPlanSubscriptionToSubscriber, + 'client-start-plan-subscription-to-author' => NotificationType.clientStartPlanSubscriptionToAuthor, + 'client-cancel-plan-subscription-to-author' => NotificationType.clientCancelPlanSubscriptionToAuthor, + 'client-cancel-plan-subscription-to-subscriber' => NotificationType.clientCancelPlanSubscriptionToSubscriber, + 'user-daily-report-completed' => NotificationType.userDailyReportCompleted, + 'chosen-plan-finished-to-consultant' => NotificationType.chosenPlanFinishedToConsultant, + 'stay-on-track-to-customer' => NotificationType.stayOnTrackToCustomer, + 'diary-reminder-for-users' => NotificationType.diaryReminderForUsers, + + // Legacy mapping 'App\\Notifications\\Plan\\PlanSubscriptionStartedToAuthor' => NotificationType.planSubscriptionStartedToAuthor, 'App\\Notifications\\Plan\\PlanSubscriptionCanceledToAuthor' => NotificationType.planSubscriptionCanceledToAuthor, 'App\\Notifications\\Plan\\ChosenPlanStartedToClientNotification' => NotificationType.chosenPlanStartedToClientNotification, - 'App\\Notifications\\Plan\\ChosenPlanTomorrowReminderToClientNotification' => NotificationType.chosenPlanStartedToClientNotification, + 'App\\Notifications\\Plan\\ChosenPlanTomorrowReminderToClientNotification' => NotificationType.chosenPlanTomorrowReminderToClientNotification, 'App\\Notifications\\DiaryReminderNotification' => NotificationType.diaryReminderNotification, 'App\\Notifications\\Plan\\ConsultantLeftComment' => NotificationType.consultantLeftComment, 'App\\Notifications\\Plan\\PersonalizedDietIsDefined' => NotificationType.personalizedDietIsDefined, @@ -888,13 +1850,11 @@ enum NotificationType { 'App\\Notifications\\Plan\\PlanSubscriptionPaidToAuthor' => NotificationType.planSubscriptionPaidToAuthor, 'App\\Notifications\\Plan\\ChosenPlanFinishedToConsultant' => NotificationType.chosenPlanFinishedToConsultant, 'App\\Notifications\\ChosenPlan\\LastDayFinishedForUser' => NotificationType.chosenPlanLastDayFinishedForUser, - // Новые маппинги 'App\\Notifications\\ChosenPlan\\LastDayStartedForConsultant' => NotificationType.chosenPlanConsultantLastDayStarted, 'App\\Notifications\\ComplaintToModerationNotify' => NotificationType.complaintToModerationForUser, 'App\\Notifications\\Comment\\Replied' => NotificationType.commentReplied, 'App\\Notifications\\Score\\ScoreAdded' => NotificationType.scoreAdded, 'App\\Notifications\\Comment\\EntityCommented' => NotificationType.entityCommented, - // Дополнительные маппинги 'App\\Notifications\\Plan\\PlanSubscriptionExpired' => NotificationType.planSubscriptionExpired, 'App\\Notifications\\Plan\\PlanSubscriptionRenewed' => NotificationType.planSubscriptionRenewed, 'App\\Notifications\\Plan\\ConsultantAssigned' => NotificationType.consultantAssigned, diff --git a/lib/features/notifications/presentation/notifications_cubit/notifications_cubit.dart b/lib/features/notifications/presentation/notifications_cubit/notifications_cubit.dart index df921b4a..8c8c5aaa 100644 --- a/lib/features/notifications/presentation/notifications_cubit/notifications_cubit.dart +++ b/lib/features/notifications/presentation/notifications_cubit/notifications_cubit.dart @@ -66,12 +66,6 @@ class NotificationsCubit extends Cubit { isRead: isRead, createdAt: createdAt, ), - NotificationType.chosenPlanFinishedToClient => ChosenPlanFinishedToClientNotification.fromJson( - notificationJson, - type, - isRead: isRead, - createdAt: createdAt, - ), NotificationType.planSubscriptionCanceledToCustomer => PlanSubscriptionCanceledToAuthorNotification.fromJson( notificationJson, type, @@ -96,12 +90,6 @@ class NotificationsCubit extends Cubit { isRead: isRead, createdAt: createdAt, ), - NotificationType.chosenPlanFinishedToConsultant => ChosenPlanFinishedToConsultantNotification.fromJson( - notificationJson, - type, - isRead: isRead, - createdAt: createdAt, - ), NotificationType.chosenPlanLastDayFinishedForUser => ChosenPlanLastDayFinishedForUser.fromJson( notificationJson, type, @@ -123,6 +111,156 @@ class NotificationsCubit extends Cubit { NotificationType.goalAchieved => GoalAchievedNotification.fromJson(notificationJson, type, isRead: isRead, createdAt: createdAt), NotificationType.workoutReminder => WorkoutReminderNotification.fromJson(notificationJson, type, isRead: isRead, createdAt: createdAt), NotificationType.mealReminder => MealReminderNotification.fromJson(notificationJson, type, isRead: isRead, createdAt: createdAt), + // New notification types + NotificationType.dietCancelled => DietCancelledNotification.fromJson(notificationJson, type, isRead: isRead, createdAt: createdAt), + NotificationType.dietStarted => DietStartedNotification.fromJson(notificationJson, type, isRead: isRead, createdAt: createdAt), + NotificationType.dietExpired => DietExpiredNotification.fromJson(notificationJson, type, isRead: isRead, createdAt: createdAt), + NotificationType.dietWillStartedIn => DietWillStartedInNotification.fromJson(notificationJson, type, isRead: isRead, createdAt: createdAt), + NotificationType.dietCanNotBeStarted => DietCanNotBeStartedNotification.fromJson(notificationJson, type, isRead: isRead, createdAt: createdAt), + NotificationType.personalDietCreationNeeded => PersonalDietCreationNeededNotification.fromJson( + notificationJson, + type, + isRead: isRead, + createdAt: createdAt, + ), + NotificationType.chosenPlanClientLastDayFinished => ChosenPlanClientLastDayFinishedNotification.fromJson( + notificationJson, + type, + isRead: isRead, + createdAt: createdAt, + ), + NotificationType.chosenPlanClientLastDayStarted => ChosenPlanClientLastDayStartedNotification.fromJson( + notificationJson, + type, + isRead: isRead, + createdAt: createdAt, + ), + NotificationType.stayOnTrackToAuthor => StayOnTrackToAuthorNotification.fromJson(notificationJson, type, isRead: isRead, createdAt: createdAt), + NotificationType.chosenPlanStartedToClient => ChosenPlanStartedToClientNotification.fromJson( + notificationJson, + type, + isRead: isRead, + createdAt: createdAt, + ), + NotificationType.clientStartPlanSubscriptionToSubscriber => ClientStartPlanSubscriptionToSubscriberNotification.fromJson( + notificationJson, + type, + isRead: isRead, + createdAt: createdAt, + ), + NotificationType.consultantConfirmPlanSubscriptionToSubscriber => ConsultantConfirmPlanSubscriptionToSubscriberNotification.fromJson( + notificationJson, + type, + isRead: isRead, + createdAt: createdAt, + ), + NotificationType.clientPaidPlanSubscriptionToAuthor => ClientPaidPlanSubscriptionToAuthorNotification.fromJson( + notificationJson, + type, + isRead: isRead, + createdAt: createdAt, + ), + NotificationType.chosenPlanTomorrowReminderToClient => ChosenPlanTomorrowReminderToClientNotification.fromJson( + notificationJson, + type, + isRead: isRead, + createdAt: createdAt, + ), + NotificationType.chosenPlanTomorrowReminderToConsultant => ChosenPlanTomorrowReminderToConsultantNotification.fromJson( + notificationJson, + type, + isRead: isRead, + createdAt: createdAt, + ), + NotificationType.chosenPlanStartedToConsultant => ChosenPlanStartedToConsultantNotification.fromJson( + notificationJson, + type, + isRead: isRead, + createdAt: createdAt, + ), + NotificationType.consultantLeftDiaryComment => ConsultantLeftDiaryCommentNotification.fromJson( + notificationJson, + type, + isRead: isRead, + createdAt: createdAt, + ), + NotificationType.chosenPlanFinishedToClient => ChosenPlanFinishedToClientNotification.fromJson( + notificationJson, + type, + isRead: isRead, + createdAt: createdAt, + ), + NotificationType.consultantConfirmPlanSubscriptionToAuthor => ConsultantConfirmPlanSubscriptionToAuthorNotification.fromJson( + notificationJson, + type, + isRead: isRead, + createdAt: createdAt, + ), + NotificationType.clientPaidPlanSubscriptionToSubscriber => ClientPaidPlanSubscriptionToSubscriberNotification.fromJson( + notificationJson, + type, + isRead: isRead, + createdAt: createdAt, + ), + NotificationType.clientStartPlanSubscriptionToAuthor => ClientStartPlanSubscriptionToAuthorNotification.fromJson( + notificationJson, + type, + isRead: isRead, + createdAt: createdAt, + ), + NotificationType.clientCancelPlanSubscriptionToAuthor => ClientCancelPlanSubscriptionToAuthorNotification.fromJson( + notificationJson, + type, + isRead: isRead, + createdAt: createdAt, + ), + NotificationType.clientCancelPlanSubscriptionToSubscriber => ClientCancelPlanSubscriptionToSubscriberNotification.fromJson( + notificationJson, + type, + isRead: isRead, + createdAt: createdAt, + ), + NotificationType.userDailyReportCompleted => UserDailyReportCompletedNotification.fromJson( + notificationJson, + type, + isRead: isRead, + createdAt: createdAt, + ), + NotificationType.chosenPlanFinishedToConsultant => ChosenPlanFinishedToConsultantNotification.fromJson( + notificationJson, + type, + isRead: isRead, + createdAt: createdAt, + ), + NotificationType.stayOnTrackToCustomer => StayOnTrackToCustomerNotification.fromJson(notificationJson, type, isRead: isRead, createdAt: createdAt), + NotificationType.phoneChanged => PhoneChangedNotification.fromJson(notificationJson, type, isRead: isRead, createdAt: createdAt), + NotificationType.subscription => SubscriptionNotification.fromJson(notificationJson, type, isRead: isRead, createdAt: createdAt), + NotificationType.badgeAwarded => BadgeAwardedNotification.fromJson(notificationJson, type, isRead: isRead, createdAt: createdAt), + NotificationType.badgeRevoked => BadgeRevokedNotification.fromJson(notificationJson, type, isRead: isRead, createdAt: createdAt), + NotificationType.consultantRequestStarted => ConsultantRequestStartedNotification.fromJson( + notificationJson, + type, + isRead: isRead, + createdAt: createdAt, + ), + NotificationType.clientCloseComplaintSuccess => ClientCloseComplaintSuccessNotification.fromJson( + notificationJson, + type, + isRead: isRead, + createdAt: createdAt, + ), + NotificationType.clientRefundSuccess => ClientRefundSuccessNotification.fromJson(notificationJson, type, isRead: isRead, createdAt: createdAt), + NotificationType.consultantRefundSuccess => ConsultantRefundSuccessNotification.fromJson(notificationJson, type, isRead: isRead, createdAt: createdAt), + NotificationType.clientRejectSuccess => ClientRejectSuccessNotification.fromJson(notificationJson, type, isRead: isRead, createdAt: createdAt), + NotificationType.consultantRejectSuccess => ConsultantRejectSuccessNotification.fromJson(notificationJson, type, isRead: isRead, createdAt: createdAt), + NotificationType.scoreSubstracted => ScoreSubstractedNotification.fromJson(notificationJson, type, isRead: isRead, createdAt: createdAt), + NotificationType.productStatusUpdatedForAuthor => ProductStatusUpdatedForAuthorNotification.fromJson( + notificationJson, + type, + isRead: isRead, + createdAt: createdAt, + ), + NotificationType.diaryReminderForUsers => DiaryReminderForUsersNotification.fromJson(notificationJson, type, isRead: isRead, createdAt: createdAt), NotificationType.unknown => UnknownNotification(type: type), }; } catch (e) { @@ -132,8 +270,36 @@ class NotificationsCubit extends Cubit { void _handleNotification(String notificationData) { final json = jsonDecode(notificationData) as Map; - final stringifiedType = json['notification_class_name']; - final type = NotificationType.getTypeFromString(stringifiedType); + + // Улучшенная логика определения типа уведомления + String? stringifiedType; + + // Сначала проверяем поле 'type' в корне JSON + if (json.containsKey('type') && json['type'] != null) { + stringifiedType = json['type'].toString(); + log('Found type in root: $stringifiedType'); + } + // Затем проверяем поле 'notification_class_name' в корне JSON + else if (json.containsKey('notification_class_name') && json['notification_class_name'] != null) { + stringifiedType = json['notification_class_name'].toString(); + log('Found notification_class_name in root: $stringifiedType'); + } + // Если есть поле 'data', проверяем внутри него + else if (json.containsKey('data') && json['data'] is Map) { + final data = json['data'] as Map; + if (data.containsKey('type') && data['type'] != null) { + stringifiedType = data['type'].toString(); + log('Found type in data: $stringifiedType'); + } else if (data.containsKey('notification_class_name') && data['notification_class_name'] != null) { + stringifiedType = data['notification_class_name'].toString(); + log('Found notification_class_name in data: $stringifiedType'); + } + } + + // Если тип не найден, используем unknown + final type = stringifiedType != null ? NotificationType.getTypeFromString(stringifiedType) : NotificationType.unknown; + log('Final type: $type, stringifiedType: $stringifiedType'); + final notification = _parseNotification(json, type); _notifications.insert(0, notification); diff --git a/lib/features/notifications/presentation/widgets/notification_widget.dart b/lib/features/notifications/presentation/widgets/notification_widget.dart index eff047da..ed196b00 100644 --- a/lib/features/notifications/presentation/widgets/notification_widget.dart +++ b/lib/features/notifications/presentation/widgets/notification_widget.dart @@ -57,6 +57,62 @@ class NotificationWidget extends StatelessWidget { GoalAchievedNotification() => _GoalAchievedWidget(notification: notification as GoalAchievedNotification), WorkoutReminderNotification() => _WorkoutReminderWidget(notification: notification as WorkoutReminderNotification), MealReminderNotification() => _MealReminderWidget(notification: notification as MealReminderNotification), + // New notification types + DietCancelledNotification() => _DietCancelledWidget(notification: notification as DietCancelledNotification), + DietStartedNotification() => _DietStartedWidget(notification: notification as DietStartedNotification), + DietExpiredNotification() => _DietExpiredWidget(notification: notification as DietExpiredNotification), + DietWillStartedInNotification() => _DietWillStartedInWidget(notification: notification as DietWillStartedInNotification), + DietCanNotBeStartedNotification() => _DietCanNotBeStartedWidget(notification: notification as DietCanNotBeStartedNotification), + PersonalDietCreationNeededNotification() => _PersonalDietCreationNeededWidget(notification: notification as PersonalDietCreationNeededNotification), + ChosenPlanClientLastDayFinishedNotification() => _ChosenPlanClientLastDayFinishedWidget( + notification: notification as ChosenPlanClientLastDayFinishedNotification, + ), + ChosenPlanClientLastDayStartedNotification() => _ChosenPlanClientLastDayStartedWidget( + notification: notification as ChosenPlanClientLastDayStartedNotification, + ), + StayOnTrackToAuthorNotification() => _StayOnTrackToAuthorWidget(notification: notification as StayOnTrackToAuthorNotification), + ClientStartPlanSubscriptionToSubscriberNotification() => _ClientStartPlanSubscriptionToSubscriberWidget( + notification: notification as ClientStartPlanSubscriptionToSubscriberNotification, + ), + ConsultantConfirmPlanSubscriptionToSubscriberNotification() => _ConsultantConfirmPlanSubscriptionToSubscriberWidget( + notification: notification as ConsultantConfirmPlanSubscriptionToSubscriberNotification, + ), + ClientPaidPlanSubscriptionToAuthorNotification() => _ClientPaidPlanSubscriptionToAuthorWidget( + notification: notification as ClientPaidPlanSubscriptionToAuthorNotification, + ), + ConsultantLeftDiaryCommentNotification() => _ConsultantLeftDiaryCommentWidget(notification: notification as ConsultantLeftDiaryCommentNotification), + ConsultantConfirmPlanSubscriptionToAuthorNotification() => _ConsultantConfirmPlanSubscriptionToAuthorWidget( + notification: notification as ConsultantConfirmPlanSubscriptionToAuthorNotification, + ), + ClientPaidPlanSubscriptionToSubscriberNotification() => _ClientPaidPlanSubscriptionToSubscriberWidget( + notification: notification as ClientPaidPlanSubscriptionToSubscriberNotification, + ), + ClientStartPlanSubscriptionToAuthorNotification() => _ClientStartPlanSubscriptionToAuthorWidget( + notification: notification as ClientStartPlanSubscriptionToAuthorNotification, + ), + ClientCancelPlanSubscriptionToAuthorNotification() => _ClientCancelPlanSubscriptionToAuthorWidget( + notification: notification as ClientCancelPlanSubscriptionToAuthorNotification, + ), + ClientCancelPlanSubscriptionToSubscriberNotification() => _ClientCancelPlanSubscriptionToSubscriberWidget( + notification: notification as ClientCancelPlanSubscriptionToSubscriberNotification, + ), + UserDailyReportCompletedNotification() => _UserDailyReportCompletedWidget(notification: notification as UserDailyReportCompletedNotification), + StayOnTrackToCustomerNotification() => _StayOnTrackToCustomerWidget(notification: notification as StayOnTrackToCustomerNotification), + PhoneChangedNotification() => _PhoneChangedWidget(notification: notification as PhoneChangedNotification), + SubscriptionNotification() => _SubscriptionWidget(notification: notification as SubscriptionNotification), + BadgeAwardedNotification() => _BadgeAwardedWidget(notification: notification as BadgeAwardedNotification), + BadgeRevokedNotification() => _BadgeRevokedWidget(notification: notification as BadgeRevokedNotification), + ConsultantRequestStartedNotification() => _ConsultantRequestStartedWidget(notification: notification as ConsultantRequestStartedNotification), + ClientCloseComplaintSuccessNotification() => _ClientCloseComplaintSuccessWidget(notification: notification as ClientCloseComplaintSuccessNotification), + ClientRefundSuccessNotification() => _ClientRefundSuccessWidget(notification: notification as ClientRefundSuccessNotification), + ConsultantRefundSuccessNotification() => _ConsultantRefundSuccessWidget(notification: notification as ConsultantRefundSuccessNotification), + ClientRejectSuccessNotification() => _ClientRejectSuccessWidget(notification: notification as ClientRejectSuccessNotification), + ConsultantRejectSuccessNotification() => _ConsultantRejectSuccessWidget(notification: notification as ConsultantRejectSuccessNotification), + ScoreSubstractedNotification() => _ScoreSubstractedWidget(notification: notification as ScoreSubstractedNotification), + ProductStatusUpdatedForAuthorNotification() => _ProductStatusUpdatedForAuthorWidget( + notification: notification as ProductStatusUpdatedForAuthorNotification, + ), + DiaryReminderForUsersNotification() => _DiaryReminderForUsersWidget(notification: notification as DiaryReminderForUsersNotification), UnknownNotification() => _UnknownNotificationWidget(notification: notification as UnknownNotification), }; } @@ -571,3 +627,429 @@ class _MealReminderWidget extends StatelessWidget { ); } } + +// New notification widget classes +class _DietCancelledWidget extends StatelessWidget { + const _DietCancelledWidget({required this.notification}); + final DietCancelledNotification notification; + @override + Widget build(BuildContext context) { + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: 'Диета "${notification.dietName}" отменена', + createdAt: notification.createdAt, + ); + } +} + +class _DietStartedWidget extends StatelessWidget { + const _DietStartedWidget({required this.notification}); + final DietStartedNotification notification; + @override + Widget build(BuildContext context) { + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: 'Диета "${notification.dietName}" началась', + createdAt: notification.createdAt, + ); + } +} + +class _DietExpiredWidget extends StatelessWidget { + const _DietExpiredWidget({required this.notification}); + final DietExpiredNotification notification; + @override + Widget build(BuildContext context) { + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: 'Диета "${notification.dietName}" истекла', + createdAt: notification.createdAt, + ); + } +} + +class _DietWillStartedInWidget extends StatelessWidget { + const _DietWillStartedInWidget({required this.notification}); + final DietWillStartedInNotification notification; + @override + Widget build(BuildContext context) { + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: 'Диета "${notification.dietName}" начнется ${notification.startDate}', + createdAt: notification.createdAt, + ); + } +} + +class _DietCanNotBeStartedWidget extends StatelessWidget { + const _DietCanNotBeStartedWidget({required this.notification}); + final DietCanNotBeStartedNotification notification; + @override + Widget build(BuildContext context) { + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: 'Диета "${notification.dietName}" не может быть начата: ${notification.reason}', + createdAt: notification.createdAt, + ); + } +} + +class _PersonalDietCreationNeededWidget extends StatelessWidget { + const _PersonalDietCreationNeededWidget({required this.notification}); + final PersonalDietCreationNeededNotification notification; + @override + Widget build(BuildContext context) { + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: 'Требуется создание персональной диеты для клиента ${notification.clientName} по плану "${notification.planName}"', + createdAt: notification.createdAt, + ); + } +} + +class _ChosenPlanClientLastDayFinishedWidget extends StatelessWidget { + const _ChosenPlanClientLastDayFinishedWidget({required this.notification}); + final ChosenPlanClientLastDayFinishedNotification notification; + @override + Widget build(BuildContext context) { + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: 'Последний день плана "${notification.planName}" завершен', + createdAt: notification.createdAt, + ); + } +} + +class _ChosenPlanClientLastDayStartedWidget extends StatelessWidget { + const _ChosenPlanClientLastDayStartedWidget({required this.notification}); + final ChosenPlanClientLastDayStartedNotification notification; + @override + Widget build(BuildContext context) { + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: 'Последний день плана "${notification.planName}" начался', + createdAt: notification.createdAt, + ); + } +} + +class _StayOnTrackToAuthorWidget extends StatelessWidget { + const _StayOnTrackToAuthorWidget({required this.notification}); + final StayOnTrackToAuthorNotification notification; + @override + Widget build(BuildContext context) { + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: 'Клиент ${notification.clientName} остается на плане "${notification.planName}"', + createdAt: notification.createdAt, + ); + } +} + +class _ClientStartPlanSubscriptionToSubscriberWidget extends StatelessWidget { + const _ClientStartPlanSubscriptionToSubscriberWidget({required this.notification}); + final ClientStartPlanSubscriptionToSubscriberNotification notification; + @override + Widget build(BuildContext context) { + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: 'Подписка на план "${notification.planName}" началась', + createdAt: notification.createdAt, + ); + } +} + +class _ConsultantConfirmPlanSubscriptionToSubscriberWidget extends StatelessWidget { + const _ConsultantConfirmPlanSubscriptionToSubscriberWidget({required this.notification}); + final ConsultantConfirmPlanSubscriptionToSubscriberNotification notification; + @override + Widget build(BuildContext context) { + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: 'Консультант ${notification.consultantName} подтвердил подписку на план "${notification.planName}"', + createdAt: notification.createdAt, + ); + } +} + +class _ClientPaidPlanSubscriptionToAuthorWidget extends StatelessWidget { + const _ClientPaidPlanSubscriptionToAuthorWidget({required this.notification}); + final ClientPaidPlanSubscriptionToAuthorNotification notification; + @override + Widget build(BuildContext context) { + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: 'Клиент ${notification.clientName} оплатил подписку на план "${notification.planName}" на сумму ${notification.amount}', + createdAt: notification.createdAt, + ); + } +} + +class _ConsultantLeftDiaryCommentWidget extends StatelessWidget { + const _ConsultantLeftDiaryCommentWidget({required this.notification}); + final ConsultantLeftDiaryCommentNotification notification; + @override + Widget build(BuildContext context) { + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: 'Консультант ${notification.consultantName} оставил комментарий к дневнику по плану "${notification.planName}"', + createdAt: notification.createdAt, + ); + } +} + +class _ConsultantConfirmPlanSubscriptionToAuthorWidget extends StatelessWidget { + const _ConsultantConfirmPlanSubscriptionToAuthorWidget({required this.notification}); + final ConsultantConfirmPlanSubscriptionToAuthorNotification notification; + @override + Widget build(BuildContext context) { + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: 'Консультант ${notification.consultantName} подтвердил подписку на план "${notification.planName}"', + createdAt: notification.createdAt, + ); + } +} + +class _ClientPaidPlanSubscriptionToSubscriberWidget extends StatelessWidget { + const _ClientPaidPlanSubscriptionToSubscriberWidget({required this.notification}); + final ClientPaidPlanSubscriptionToSubscriberNotification notification; + @override + Widget build(BuildContext context) { + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: 'Оплачена подписка на план "${notification.planName}" на сумму ${notification.amount}', + createdAt: notification.createdAt, + ); + } +} + +class _ClientStartPlanSubscriptionToAuthorWidget extends StatelessWidget { + const _ClientStartPlanSubscriptionToAuthorWidget({required this.notification}); + final ClientStartPlanSubscriptionToAuthorNotification notification; + @override + Widget build(BuildContext context) { + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: 'Клиент ${notification.clientName} начал подписку на план "${notification.planName}"', + createdAt: notification.createdAt, + ); + } +} + +class _ClientCancelPlanSubscriptionToAuthorWidget extends StatelessWidget { + const _ClientCancelPlanSubscriptionToAuthorWidget({required this.notification}); + final ClientCancelPlanSubscriptionToAuthorNotification notification; + @override + Widget build(BuildContext context) { + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: 'Клиент ${notification.clientName} отменил подписку на план "${notification.planName}"', + createdAt: notification.createdAt, + ); + } +} + +class _ClientCancelPlanSubscriptionToSubscriberWidget extends StatelessWidget { + const _ClientCancelPlanSubscriptionToSubscriberWidget({required this.notification}); + final ClientCancelPlanSubscriptionToSubscriberNotification notification; + @override + Widget build(BuildContext context) { + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: 'Подписка на план "${notification.planName}" отменена', + createdAt: notification.createdAt, + ); + } +} + +class _UserDailyReportCompletedWidget extends StatelessWidget { + const _UserDailyReportCompletedWidget({required this.notification}); + final UserDailyReportCompletedNotification notification; + @override + Widget build(BuildContext context) { + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: 'Клиент ${notification.clientName} завершил ежедневный отчет по плану "${notification.planName}"', + createdAt: notification.createdAt, + ); + } +} + +class _StayOnTrackToCustomerWidget extends StatelessWidget { + const _StayOnTrackToCustomerWidget({required this.notification}); + final StayOnTrackToCustomerNotification notification; + @override + Widget build(BuildContext context) { + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: 'Консультант ${notification.consultantName} остается на плане "${notification.planName}"', + createdAt: notification.createdAt, + ); + } +} + +class _PhoneChangedWidget extends StatelessWidget { + const _PhoneChangedWidget({required this.notification}); + final PhoneChangedNotification notification; + @override + Widget build(BuildContext context) { + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: 'Номер телефона изменен с ${notification.oldPhone} на ${notification.newPhone}', + createdAt: notification.createdAt, + ); + } +} + +class _SubscriptionWidget extends StatelessWidget { + const _SubscriptionWidget({required this.notification}); + final SubscriptionNotification notification; + @override + Widget build(BuildContext context) { + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: 'Подписка ${notification.subscriptionType} на план "${notification.planName}"', + createdAt: notification.createdAt, + ); + } +} + +class _BadgeAwardedWidget extends StatelessWidget { + const _BadgeAwardedWidget({required this.notification}); + final BadgeAwardedNotification notification; + @override + Widget build(BuildContext context) { + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: 'Получен значок "${notification.badgeName}": ${notification.badgeDescription}', + createdAt: notification.createdAt, + ); + } +} + +class _BadgeRevokedWidget extends StatelessWidget { + const _BadgeRevokedWidget({required this.notification}); + final BadgeRevokedNotification notification; + @override + Widget build(BuildContext context) { + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: 'Отозван значок "${notification.badgeName}": ${notification.reason}', + createdAt: notification.createdAt, + ); + } +} + +class _ConsultantRequestStartedWidget extends StatelessWidget { + const _ConsultantRequestStartedWidget({required this.notification}); + final ConsultantRequestStartedNotification notification; + @override + Widget build(BuildContext context) { + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: 'Запрос к консультанту ${notification.consultantName} начат', + createdAt: notification.createdAt, + ); + } +} + +class _ClientCloseComplaintSuccessWidget extends StatelessWidget { + const _ClientCloseComplaintSuccessWidget({required this.notification}); + final ClientCloseComplaintSuccessNotification notification; + @override + Widget build(BuildContext context) { + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: 'Жалоба на ${notification.complaintType} "${notification.entityName}" успешно закрыта', + createdAt: notification.createdAt, + ); + } +} + +class _ClientRefundSuccessWidget extends StatelessWidget { + const _ClientRefundSuccessWidget({required this.notification}); + final ClientRefundSuccessNotification notification; + @override + Widget build(BuildContext context) { + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: 'Возврат средств по плану "${notification.planName}" на сумму ${notification.amount}: ${notification.reason}', + createdAt: notification.createdAt, + ); + } +} + +class _ConsultantRefundSuccessWidget extends StatelessWidget { + const _ConsultantRefundSuccessWidget({required this.notification}); + final ConsultantRefundSuccessNotification notification; + @override + Widget build(BuildContext context) { + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: 'Возврат средств клиенту ${notification.clientName} по плану "${notification.planName}" на сумму ${notification.amount}', + createdAt: notification.createdAt, + ); + } +} + +class _ClientRejectSuccessWidget extends StatelessWidget { + const _ClientRejectSuccessWidget({required this.notification}); + final ClientRejectSuccessNotification notification; + @override + Widget build(BuildContext context) { + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: 'Отклонение по плану "${notification.planName}": ${notification.reason}', + createdAt: notification.createdAt, + ); + } +} + +class _ConsultantRejectSuccessWidget extends StatelessWidget { + const _ConsultantRejectSuccessWidget({required this.notification}); + final ConsultantRejectSuccessNotification notification; + @override + Widget build(BuildContext context) { + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: 'Отклонение клиентом ${notification.clientName} по плану "${notification.planName}": ${notification.reason}', + createdAt: notification.createdAt, + ); + } +} + +class _ScoreSubstractedWidget extends StatelessWidget { + const _ScoreSubstractedWidget({required this.notification}); + final ScoreSubstractedNotification notification; + @override + Widget build(BuildContext context) { + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: 'Вычтено ${notification.scoreValue} баллов за ${notification.scorableName}', + createdAt: notification.createdAt, + ); + } +} + +class _ProductStatusUpdatedForAuthorWidget extends StatelessWidget { + const _ProductStatusUpdatedForAuthorWidget({required this.notification}); + final ProductStatusUpdatedForAuthorNotification notification; + @override + Widget build(BuildContext context) { + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: 'Статус продукта "${notification.productName}" изменен с ${notification.oldStatus} на ${notification.newStatus}', + createdAt: notification.createdAt, + ); + } +} + +class _DiaryReminderForUsersWidget extends StatelessWidget { + const _DiaryReminderForUsersWidget({required this.notification}); + final DiaryReminderForUsersNotification notification; + @override + Widget build(BuildContext context) { + return _BaseNotificationWidget(isRead: notification.isRead, notificationsText: 'Напоминание о заполнении дневника', createdAt: notification.createdAt); + } +} diff --git a/lib/features/notifications/service/notifications_service.dart b/lib/features/notifications/service/notifications_service.dart index 7fdcb4fe..5b3ca78b 100644 --- a/lib/features/notifications/service/notifications_service.dart +++ b/lib/features/notifications/service/notifications_service.dart @@ -13,10 +13,30 @@ class NotificationsService { final notifications = data.map((notificationJson) { try { - final stringifiedType = notificationJson['data']['notification_class_name']; + // Улучшенная логика определения типа уведомления + String? stringifiedType; + + // Сначала проверяем поле 'type' в корне JSON + if (notificationJson.containsKey('type') && notificationJson['type'] != null) { + stringifiedType = notificationJson['type'].toString(); + } + // Затем проверяем поле 'notification_class_name' в корне JSON + else if (notificationJson.containsKey('notification_class_name') && notificationJson['notification_class_name'] != null) { + stringifiedType = notificationJson['notification_class_name'].toString(); + } + // Если есть поле 'data', проверяем внутри него + else if (notificationJson.containsKey('data') && notificationJson['data'] is Map) { + final data = notificationJson['data'] as Map; + if (data.containsKey('type') && data['type'] != null) { + stringifiedType = data['type'].toString(); + } else if (data.containsKey('notification_class_name') && data['notification_class_name'] != null) { + stringifiedType = data['notification_class_name'].toString(); + } + } + final readDate = notificationJson['read_at']; final createdAt = notificationJson['created_at']; - final type = NotificationType.getTypeFromString(stringifiedType); + final type = stringifiedType != null ? NotificationType.getTypeFromString(stringifiedType) : NotificationType.unknown; return switch (type) { NotificationType.planSubscriptionStartedToAuthor => PlanSubscriptionStartedToAuthorNotification.fromJson( @@ -174,6 +194,219 @@ class NotificationsService { isRead: readDate != null, createdAt: createdAt, ), + // New notification types + NotificationType.dietCancelled => DietCancelledNotification.fromJson( + notificationJson['data'], + type, + isRead: readDate != null, + createdAt: createdAt, + ), + NotificationType.dietStarted => DietStartedNotification.fromJson(notificationJson['data'], type, isRead: readDate != null, createdAt: createdAt), + NotificationType.dietExpired => DietExpiredNotification.fromJson(notificationJson['data'], type, isRead: readDate != null, createdAt: createdAt), + NotificationType.dietWillStartedIn => DietWillStartedInNotification.fromJson( + notificationJson['data'], + type, + isRead: readDate != null, + createdAt: createdAt, + ), + NotificationType.dietCanNotBeStarted => DietCanNotBeStartedNotification.fromJson( + notificationJson['data'], + type, + isRead: readDate != null, + createdAt: createdAt, + ), + NotificationType.personalDietCreationNeeded => PersonalDietCreationNeededNotification.fromJson( + notificationJson['data'], + type, + isRead: readDate != null, + createdAt: createdAt, + ), + NotificationType.chosenPlanClientLastDayFinished => ChosenPlanClientLastDayFinishedNotification.fromJson( + notificationJson['data'], + type, + isRead: readDate != null, + createdAt: createdAt, + ), + NotificationType.chosenPlanClientLastDayStarted => ChosenPlanClientLastDayStartedNotification.fromJson( + notificationJson['data'], + type, + isRead: readDate != null, + createdAt: createdAt, + ), + NotificationType.stayOnTrackToAuthor => StayOnTrackToAuthorNotification.fromJson( + notificationJson['data'], + type, + isRead: readDate != null, + createdAt: createdAt, + ), + NotificationType.chosenPlanStartedToClient => ChosenPlanStartedToClientNotification.fromJson( + notificationJson['data'], + type, + isRead: readDate != null, + createdAt: createdAt, + ), + NotificationType.clientStartPlanSubscriptionToSubscriber => ClientStartPlanSubscriptionToSubscriberNotification.fromJson( + notificationJson['data'], + type, + isRead: readDate != null, + createdAt: createdAt, + ), + NotificationType.consultantConfirmPlanSubscriptionToSubscriber => ConsultantConfirmPlanSubscriptionToSubscriberNotification.fromJson( + notificationJson['data'], + type, + isRead: readDate != null, + createdAt: createdAt, + ), + NotificationType.clientPaidPlanSubscriptionToAuthor => ClientPaidPlanSubscriptionToAuthorNotification.fromJson( + notificationJson['data'], + type, + isRead: readDate != null, + createdAt: createdAt, + ), + NotificationType.chosenPlanTomorrowReminderToClient => ChosenPlanTomorrowReminderToClientNotification.fromJson( + notificationJson['data'], + type, + isRead: readDate != null, + createdAt: createdAt, + ), + NotificationType.chosenPlanTomorrowReminderToConsultant => ChosenPlanTomorrowReminderToConsultantNotification.fromJson( + notificationJson['data'], + type, + isRead: readDate != null, + createdAt: createdAt, + ), + NotificationType.chosenPlanStartedToConsultant => ChosenPlanStartedToConsultantNotification.fromJson( + notificationJson['data'], + type, + isRead: readDate != null, + createdAt: createdAt, + ), + NotificationType.consultantLeftDiaryComment => ConsultantLeftDiaryCommentNotification.fromJson( + notificationJson['data'], + type, + isRead: readDate != null, + createdAt: createdAt, + ), + NotificationType.consultantConfirmPlanSubscriptionToAuthor => ConsultantConfirmPlanSubscriptionToAuthorNotification.fromJson( + notificationJson['data'], + type, + isRead: readDate != null, + createdAt: createdAt, + ), + NotificationType.clientPaidPlanSubscriptionToSubscriber => ClientPaidPlanSubscriptionToSubscriberNotification.fromJson( + notificationJson['data'], + type, + isRead: readDate != null, + createdAt: createdAt, + ), + NotificationType.clientStartPlanSubscriptionToAuthor => ClientStartPlanSubscriptionToAuthorNotification.fromJson( + notificationJson['data'], + type, + isRead: readDate != null, + createdAt: createdAt, + ), + NotificationType.clientCancelPlanSubscriptionToAuthor => ClientCancelPlanSubscriptionToAuthorNotification.fromJson( + notificationJson['data'], + type, + isRead: readDate != null, + createdAt: createdAt, + ), + NotificationType.clientCancelPlanSubscriptionToSubscriber => ClientCancelPlanSubscriptionToSubscriberNotification.fromJson( + notificationJson['data'], + type, + isRead: readDate != null, + createdAt: createdAt, + ), + NotificationType.userDailyReportCompleted => UserDailyReportCompletedNotification.fromJson( + notificationJson['data'], + type, + isRead: readDate != null, + createdAt: createdAt, + ), + NotificationType.stayOnTrackToCustomer => StayOnTrackToCustomerNotification.fromJson( + notificationJson['data'], + type, + isRead: readDate != null, + createdAt: createdAt, + ), + NotificationType.phoneChanged => PhoneChangedNotification.fromJson( + notificationJson['data'], + type, + isRead: readDate != null, + createdAt: createdAt, + ), + NotificationType.subscription => SubscriptionNotification.fromJson( + notificationJson['data'], + type, + isRead: readDate != null, + createdAt: createdAt, + ), + NotificationType.badgeAwarded => BadgeAwardedNotification.fromJson( + notificationJson['data'], + type, + isRead: readDate != null, + createdAt: createdAt, + ), + NotificationType.badgeRevoked => BadgeRevokedNotification.fromJson( + notificationJson['data'], + type, + isRead: readDate != null, + createdAt: createdAt, + ), + NotificationType.consultantRequestStarted => ConsultantRequestStartedNotification.fromJson( + notificationJson['data'], + type, + isRead: readDate != null, + createdAt: createdAt, + ), + NotificationType.clientCloseComplaintSuccess => ClientCloseComplaintSuccessNotification.fromJson( + notificationJson['data'], + type, + isRead: readDate != null, + createdAt: createdAt, + ), + NotificationType.clientRefundSuccess => ClientRefundSuccessNotification.fromJson( + notificationJson['data'], + type, + isRead: readDate != null, + createdAt: createdAt, + ), + NotificationType.consultantRefundSuccess => ConsultantRefundSuccessNotification.fromJson( + notificationJson['data'], + type, + isRead: readDate != null, + createdAt: createdAt, + ), + NotificationType.clientRejectSuccess => ClientRejectSuccessNotification.fromJson( + notificationJson['data'], + type, + isRead: readDate != null, + createdAt: createdAt, + ), + NotificationType.consultantRejectSuccess => ConsultantRejectSuccessNotification.fromJson( + notificationJson['data'], + type, + isRead: readDate != null, + createdAt: createdAt, + ), + NotificationType.scoreSubstracted => ScoreSubstractedNotification.fromJson( + notificationJson['data'], + type, + isRead: readDate != null, + createdAt: createdAt, + ), + NotificationType.productStatusUpdatedForAuthor => ProductStatusUpdatedForAuthorNotification.fromJson( + notificationJson['data'], + type, + isRead: readDate != null, + createdAt: createdAt, + ), + NotificationType.diaryReminderForUsers => DiaryReminderForUsersNotification.fromJson( + notificationJson, + type, + isRead: readDate != null, + createdAt: createdAt, + ), NotificationType.unknown => UnknownNotification(type: type, createdAt: parseDate(createdAt)), }; } catch (e) {