didvan-app/lib/views/home/bookmarks/bookmark_state.dart

113 lines
3.2 KiB
Dart

import 'package:didvan/models/enums.dart';
import 'package:didvan/models/overview_data.dart';
import 'package:didvan/models/home_page_content/swot.dart';
import 'package:didvan/providers/core.dart';
import 'package:didvan/services/network/request.dart';
import 'package:didvan/services/network/request_helper.dart';
import 'package:didvan/views/home/bookmarks/bookmark_service.dart';
import 'package:didvan/services/swot_service.dart';
class BookmarksState extends CoreProvier {
final List<OverviewData> bookmarks = [];
List<SwotItem> bookmarkedSwotItems = [];
String search = '';
String lastSearch = '';
int page = 1;
int lastPage = 1;
bool _swotItemsLoading = false;
bool get searching => search.isNotEmpty;
bool get swotItemsLoading => _swotItemsLoading;
Future<void> loadInitialData() async {
appState = AppState.busy;
_swotItemsLoading = true;
bookmarks.clear();
bookmarkedSwotItems.clear();
notifyListeners();
await Future.wait([
_fetchGeneralBookmarks(page: 1),
_fetchSwotBookmarks(),
]);
if (appState != AppState.failed && !searching) {
appState = AppState.idle;
} else if (appState != AppState.failed && searching && bookmarks.isEmpty && bookmarkedSwotItems.isEmpty) {
appState = AppState.idle;
}
_swotItemsLoading = false;
notifyListeners();
}
Future<void> _fetchGeneralBookmarks({required int page}) async {
if (page == 1) bookmarks.clear();
this.page = page;
if (!searching) lastSearch = search;
final service = RequestService(
RequestHelper.searchMarks(page: page, search: search.isNotEmpty ? search : null),
);
await service.httpGet();
if (service.isSuccess) {
lastPage = service.result['lastPage'];
final marks = service.result['contents'];
for (var i = 0; i < marks.length; i++) {
bookmarks.add(OverviewData.fromJson(marks[i]));
}
} else {
appState = AppState.failed;
}
}
Future<void> searchAndLoadData({required int page}) async {
appState = AppState.busy;
_swotItemsLoading = true;
bookmarks.clear();
notifyListeners();
await Future.wait([
_fetchGeneralBookmarks(page: page),
_fetchSwotBookmarks(),
]);
if (appState != AppState.failed) {
appState = AppState.idle;
}
_swotItemsLoading = false;
notifyListeners();
}
Future<void> _fetchSwotBookmarks() async {
try {
final postIds = await BookmarkService.fetchBookmarks();
if (postIds.isNotEmpty) {
final allSwots = await SwotService.fetchSwotItems();
bookmarkedSwotItems = allSwots.where((swot) {
final isBookmarked = postIds.contains(swot.id);
if (search.isEmpty) return isBookmarked;
return isBookmarked && swot.title.toLowerCase().contains(search.toLowerCase());
}).toList();
} else {
bookmarkedSwotItems = [];
}
} catch (e) {
bookmarkedSwotItems = [];
}
}
void onMarkChanged(int id, bool value) {
bookmarks.removeWhere((element) => element.id == id);
notifyListeners();
}
void onSwotMarkChanged(int swotId) {
bookmarkedSwotItems.removeWhere((element) => element.id == swotId);
notifyListeners();
}
}