import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:island/models/activity.dart'; import 'package:island/pods/network.dart'; import 'package:island/pods/paging.dart'; final activityListProvider = AsyncNotifierProvider.autoDispose( ActivityListNotifier.new, ); class ActivityListNotifier extends AsyncNotifier> with AsyncPaginationController, AsyncPaginationFilter { static const int pageSize = 20; @override String? currentFilter; @override Future> fetch() async { final client = ref.read(apiClientProvider); final cursor = state.value?.lastOrNull?.createdAt.toUtc().toIso8601String(); final queryParameters = { if (cursor != null) 'cursor': cursor, 'take': pageSize, if (currentFilter != null) 'filter': currentFilter, }; final response = await client.get( '/sphere/timeline', queryParameters: queryParameters, ); final List items = (response.data as List) .map((e) => SnTimelineEvent.fromJson(e as Map)) .toList(); final hasMore = (items.firstOrNull?.type ?? 'empty') != 'empty'; totalCount = (state.value?.length ?? 0) + items.length + (hasMore ? pageSize : 0); return items; } void updateOne(int index, SnTimelineEvent activity) { final currentState = state.value; if (currentState == null) return; final updatedItems = [...currentState]; updatedItems[index] = activity; state = AsyncData(updatedItems); } }