import 'package:hive/hive.dart'; import 'package:equatable/equatable.dart'; part 'notification_settings.g.dart'; /// Paramètres de notification pour le chat /// /// Permet à l'utilisateur de configurer ses préférences de notification @HiveType(typeId: 25) class NotificationSettings extends HiveObject with EquatableMixin { @HiveField(0) final bool enableNotifications; @HiveField(1) final bool soundEnabled; @HiveField(2) final bool vibrationEnabled; @HiveField(3) final List mutedConversations; @HiveField(4) final bool showPreview; @HiveField(5) final Map conversationNotifications; @HiveField(6) final bool doNotDisturb; @HiveField(7) final DateTime? doNotDisturbStart; @HiveField(8) final DateTime? doNotDisturbEnd; @HiveField(9) final String? deviceToken; NotificationSettings({ this.enableNotifications = true, this.soundEnabled = true, this.vibrationEnabled = true, this.mutedConversations = const [], this.showPreview = true, this.conversationNotifications = const {}, this.doNotDisturb = false, this.doNotDisturbStart, this.doNotDisturbEnd, this.deviceToken, }); /// Crée une instance depuis le JSON factory NotificationSettings.fromJson(Map json) { return NotificationSettings( enableNotifications: json['enable_notifications'] as bool? ?? true, soundEnabled: json['sound_enabled'] as bool? ?? true, vibrationEnabled: json['vibration_enabled'] as bool? ?? true, mutedConversations: List.from(json['muted_conversations'] ?? []), showPreview: json['show_preview'] as bool? ?? true, conversationNotifications: Map.from(json['conversation_notifications'] ?? {}), doNotDisturb: json['do_not_disturb'] as bool? ?? false, doNotDisturbStart: json['do_not_disturb_start'] != null ? DateTime.parse(json['do_not_disturb_start']) : null, doNotDisturbEnd: json['do_not_disturb_end'] != null ? DateTime.parse(json['do_not_disturb_end']) : null, deviceToken: json['device_token'] as String?, ); } /// Convertit l'instance en JSON Map toJson() { return { 'enable_notifications': enableNotifications, 'sound_enabled': soundEnabled, 'vibration_enabled': vibrationEnabled, 'muted_conversations': mutedConversations, 'show_preview': showPreview, 'conversation_notifications': conversationNotifications, 'do_not_disturb': doNotDisturb, 'do_not_disturb_start': doNotDisturbStart?.toIso8601String(), 'do_not_disturb_end': doNotDisturbEnd?.toIso8601String(), 'device_token': deviceToken, }; } /// Crée une copie modifiée de l'instance NotificationSettings copyWith({ bool? enableNotifications, bool? soundEnabled, bool? vibrationEnabled, List? mutedConversations, bool? showPreview, Map? conversationNotifications, bool? doNotDisturb, DateTime? doNotDisturbStart, DateTime? doNotDisturbEnd, String? deviceToken, }) { return NotificationSettings( enableNotifications: enableNotifications ?? this.enableNotifications, soundEnabled: soundEnabled ?? this.soundEnabled, vibrationEnabled: vibrationEnabled ?? this.vibrationEnabled, mutedConversations: mutedConversations ?? this.mutedConversations, showPreview: showPreview ?? this.showPreview, conversationNotifications: conversationNotifications ?? this.conversationNotifications, doNotDisturb: doNotDisturb ?? this.doNotDisturb, doNotDisturbStart: doNotDisturbStart ?? this.doNotDisturbStart, doNotDisturbEnd: doNotDisturbEnd ?? this.doNotDisturbEnd, deviceToken: deviceToken ?? this.deviceToken, ); } /// Vérifie si une conversation est en mode silencieux bool isConversationMuted(String conversationId) { return mutedConversations.contains(conversationId); } /// Vérifie si les notifications sont activées pour une conversation bool areNotificationsEnabled(String conversationId) { if (!enableNotifications) return false; if (isConversationMuted(conversationId)) return false; if (doNotDisturb && _isInDoNotDisturbPeriod()) return false; return conversationNotifications[conversationId] ?? true; } /// Vérifie si on est dans la période "Ne pas déranger" bool _isInDoNotDisturbPeriod() { if (!doNotDisturb) return false; if (doNotDisturbStart == null || doNotDisturbEnd == null) return false; final now = DateTime.now(); if (doNotDisturbStart!.isBefore(doNotDisturbEnd!)) { // Période normale (ex: 22h à 8h) return now.isAfter(doNotDisturbStart!) && now.isBefore(doNotDisturbEnd!); } else { // Période qui chevauche minuit (ex: 20h à 6h) return now.isAfter(doNotDisturbStart!) || now.isBefore(doNotDisturbEnd!); } } @override List get props => [ enableNotifications, soundEnabled, vibrationEnabled, mutedConversations, showPreview, conversationNotifications, doNotDisturb, doNotDisturbStart, doNotDisturbEnd, deviceToken, ]; }