From c655857e8db65d3081388d4f03b00b793beacfcb Mon Sep 17 00:00:00 2001 From: LeoLox <58687994+leo-lox@users.noreply.github.com> Date: Mon, 4 Nov 2024 10:54:24 +0100 Subject: [PATCH] event feed streams --- lib/domain_layer/usecases/event_feed.dart | 46 ++++++++++++++--------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/lib/domain_layer/usecases/event_feed.dart b/lib/domain_layer/usecases/event_feed.dart index 6984566e..4c24cd6e 100644 --- a/lib/domain_layer/usecases/event_feed.dart +++ b/lib/domain_layer/usecases/event_feed.dart @@ -1,35 +1,35 @@ import 'dart:async'; import 'dart:developer'; +import 'package:rxdart/rxdart.dart'; + import '../entities/nostr_note.dart'; import '../entities/tree_node.dart'; import '../repositories/note_repository.dart'; import 'follow.dart'; -/// -/// idea is to combine multiple streams here into the feed stream -/// the feed stream gets then sorted on the ui in an intervall to prevent huge layout shifts -/// -/// there could be one update stream and one for scrolling -/// -/// - class EventFeed { final NoteRepository _noteRepository; final Follow _follow; - final String rootNoteFetchId = "event-root"; - final String repliesFetchId = "event-replies"; + final String repliesFetchId = "replies"; - // root streams - final StreamController _rootNoteController = - StreamController(); - Stream get rootNoteStream => _rootNoteController.stream; + /// the complete build tree of replies => new updates = new state + final StreamController>> _repliesTreeController = + StreamController>>(); + Stream>> get repliesTreeStream => + _repliesTreeController.stream; + /// raw replies final StreamController _replyNotesController = StreamController(); Stream get replyNotesStream => _replyNotesController.stream; + /// root note + final StreamController _rootNoteController = + StreamController(); + Stream get rootNoteStream => _rootNoteController.stream; + EventFeed(this._noteRepository, this._follow); Future subscribeToReplyNotes({ @@ -41,8 +41,20 @@ class EventFeed { rootNoteId: rootNoteId, ); - replyNotes.listen((event) { - _replyNotesController.add(event); + replyNotes + .bufferTime(const Duration(milliseconds: 500)) + .where((events) => events.isNotEmpty) + .listen((events) { + for (final event in events) { + _replyNotesController.add(event); + } + + final tree = buildRepliesTree( + rootNoteId: rootNoteId, + replies: events, + ); + + _repliesTreeController.add(tree); }); } @@ -61,7 +73,6 @@ class EventFeed { /// build a tree from the replies \ /// [returns] a list of first level replies \ /// the cildren are replies of replies - static List> buildRepliesTree({ required String rootNoteId, required List replies, @@ -114,6 +125,7 @@ class EventFeed { futures.add(_noteRepository.closeSubscription(repliesFetchId)); futures.add(_rootNoteController.close()); futures.add(_replyNotesController.close()); + futures.add(_repliesTreeController.close()); await Future.wait(futures); }