diff --git a/lib/pages/home/news/news_state.dart b/lib/pages/home/news/news_state.dart index ab22631..12fe709 100644 --- a/lib/pages/home/news/news_state.dart +++ b/lib/pages/home/news/news_state.dart @@ -1,3 +1,4 @@ +import 'package:collection/collection.dart'; import 'package:didvan/models/enums.dart'; import 'package:didvan/models/news_overview.dart'; import 'package:didvan/providers/core_provider.dart'; @@ -6,11 +7,12 @@ import 'package:didvan/services/network/request_helper.dart'; class NewsState extends CoreProvier { bool isFiltering = false; - String? search; - String? lastSearch; + String search = ''; + String lastSearch = ''; String? startDate; String? endDate; + final List _markQueue = []; final List news = []; void resetFilters() { @@ -22,21 +24,21 @@ class NewsState extends CoreProvier { Future getNews({ required int page, }) async { - if (search != '' && search != null || filterApplied) { + if (search != '' || filterApplied) { lastSearch = search; isFiltering = true; - news.clear(); } else { isFiltering = false; } lastSearch = search; appState = AppState.busy; + news.clear(); final service = RequestService( RequestHelper.newsOverviews( page: 1, startDate: startDate?.split(' ').first, endDate: endDate?.split(' ').first, - search: search, + search: search == '' ? null : search, ), ); await service.httpGet(); @@ -52,8 +54,35 @@ class NewsState extends CoreProvier { } Future markNews(int id) async { - final service = RequestService(RequestHelper.markNews(id)); - await service.post(); + news.firstWhere((element) => element.id == id).marked = true; + notifyListeners(); + _markQueue.add(MapEntry(id, true)); + Future.delayed(const Duration(milliseconds: 500), () async { + final MapEntry? lastChange = + _markQueue.lastWhereOrNull((item) => item.key == id); + if (lastChange == null) return; + if (lastChange.value) { + final service = RequestService(RequestHelper.markNews(id)); + await service.post(); + _markQueue.removeWhere((element) => element.key == id); + } + }); + } + + Future unMarkNews(int id) async { + news.firstWhere((element) => element.id == id).marked = false; + notifyListeners(); + _markQueue.add(MapEntry(id, false)); + Future.delayed(const Duration(milliseconds: 500), () async { + final MapEntry? lastChange = + _markQueue.lastWhereOrNull((item) => item.key == id); + if (lastChange == null) return; + if (!lastChange.value) { + final service = RequestService(RequestHelper.markNews(id)); + await service.delete(); + _markQueue.removeWhere((element) => element.key == id); + } + }); } bool get filterApplied => startDate != null || endDate != null;