fetchPage method

  1. @override
Future<List<Map<String, dynamic>>> fetchPage({
  1. required int page,
  2. required int pageSize,
  3. String? userId,
})
override

Fetches a page of raw feed item maps, ordered by timestamp descending.

page — zero-based page index. pageSize — number of items per page. userId — when non-null, filters items by actor or target user.

Implementation

@override
Future<List<Map<String, dynamic>>> fetchPage({
  required int page,
  required int pageSize,
  String? userId,
}) async {
  try {
    var query = _ref.orderBy('timestamp', descending: true).limit(pageSize);

    if (userId != null) {
      query = query.where('actorId', isEqualTo: userId);
    }

    // Simple offset pagination: skip `page * pageSize` docs.
    if (page > 0) {
      final previousSnapshot =
          await _ref
              .orderBy('timestamp', descending: true)
              .limit(page * pageSize)
              .get();
      if (previousSnapshot.docs.isNotEmpty) {
        query = query.startAfterDocument(previousSnapshot.docs.last);
      }
    }

    final snapshot = await query.get();
    return snapshot.docs
        .map((d) => {'id': d.id, ...d.data()})
        .toList(growable: false);
  } catch (error) {
    throw Exception(
      'FirebaseActivityFeedSource.fetchPage failed (page: $page): $error',
    );
  }
}