import 'package:flutter/material.dart'; import 'package:flutter/foundation.dart'; import 'package:initial_folder/models/notification.dart'; import 'package:initial_folder/services/notification_service.dart'; enum resultState { Loading, NoData, HasData, Error } enum countState { Loading, NoData, HasData, Error } class NotificationProvider with ChangeNotifier { final NotificationServices notificationServices; NotificationProvider({required this.notificationServices}) { getMyNotification(); } List _notificationData = []; List _notificationDataAnnouncementUser = []; resultState? _state; countState? _cState; int _notificationCount = 0; String _message = ''; List get result => _notificationData; List get resultAnnouncement => _notificationDataAnnouncementUser; int get notificationCount => _notificationCount; String get message => _message; resultState? get state => _state; countState? get cState => _cState; changeIsRead(List list, int index) { list[index].isRead = "1"; if (_notificationCount > 0) { _notificationCount--; } notifyListeners(); } changeAllRead() { if (_state == resultState.HasData) { for (final notif in _notificationData) { notif.isRead = "1"; } _notificationCount = 0; notifyListeners(); } } Future getMyNotification() async { try { _state = resultState.Loading; notifyListeners(); var notifications = await notificationServices.getNotification(); List myNotification = notifications[0]; List myNotificationAnnouncement = notifications[1]; if (myNotification.isEmpty && myNotificationAnnouncement.isEmpty) { _state = resultState.NoData; notifyListeners(); return _message = 'Empty Data'; } else { _state = resultState.HasData; _notificationData = myNotification; _notificationDataAnnouncementUser = myNotificationAnnouncement; _notificationData .sort((a, b) => b.timestamps!.compareTo(a.timestamps!)); _notificationDataAnnouncementUser .sort((a, b) => b.timestamps!.compareTo(a.timestamps!)); _notificationCount = _notificationData.where((notif) => notif.isRead == "0").length; notifyListeners(); return [_notificationData, _notificationDataAnnouncementUser]; } } catch (e, stacktrace) { print(stacktrace.toString()); _state = resultState.Error; notifyListeners(); return _message = 'Error --> $e'; } } Future markAsRead() async { try { await notificationServices.readAllNotification(); notifyListeners(); } catch (e) { if (kDebugMode) { print("Error: --> $e"); } } } Future getNotificationCount() async { try { _cState = countState.Loading; notifyListeners(); int notificationCount = _notificationData.where((notif) => notif.isRead == "0").length; if (notificationCount == 0) { _cState = countState.NoData; _notificationCount = 0; notifyListeners(); } else { _cState = countState.HasData; _notificationCount = notificationCount; notifyListeners(); } } catch (e) { _cState = countState.Error; notifyListeners(); return _message = 'Error --> $e'; } } decreaseNotificationCount() { if (_notificationCount > 0) { _notificationCount--; } notifyListeners(); } }