Skip to content

Commit

Permalink
event provider
Browse files Browse the repository at this point in the history
  • Loading branch information
leo-lox committed Nov 4, 2024
1 parent dd4232b commit dd722a6
Show file tree
Hide file tree
Showing 5 changed files with 127 additions and 1 deletion.
7 changes: 7 additions & 0 deletions lib/data_layer/repositories/note_repository_impl.dart
Original file line number Diff line number Diff line change
Expand Up @@ -113,4 +113,11 @@ class NoteRepositoryImpl implements NoteRepository {
Future<void> closeSubscription(String subscriptionId) async {
await dartNdkSource.dartNdk.requests.closeSubscription(subscriptionId);
}

@override
Stream<NostrNote> subscribeReplyNotes(
{required String rootNoteId, required String requestId}) {
// TODO: implement subscribeReplyNotes
throw UnimplementedError();
}
}
22 changes: 22 additions & 0 deletions lib/domain_layer/entities/feed_event_view_model.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import 'nostr_note.dart';
import 'tree_node.dart';

class FeedEventViewModel {
NostrNote? rootNote;
List<TreeNode<NostrNote>> comments;

FeedEventViewModel({
required this.rootNote,
required this.comments,
});

copyWith({
NostrNote? rootNote,
List<TreeNode<NostrNote>>? comments,
}) {
return FeedEventViewModel(
rootNote: rootNote ?? this.rootNote,
comments: comments ?? this.comments,
);
}
}
6 changes: 6 additions & 0 deletions lib/domain_layer/repositories/note_repository.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,12 @@ abstract class NoteRepository {

Stream<NostrNote> getTextNote(String noteId);

/// returns the replies to a root note, without the root note
Stream<NostrNote> subscribeReplyNotes({
required String rootNoteId,
required String requestId,
});

Stream<NostrNote> getTextNotesByAuthors({
required List<String> authors,
required String requestId,
Expand Down
1 change: 0 additions & 1 deletion lib/domain_layer/usecases/event_feed.dart
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ class EventFeed {

Future<void> subscribeToReplyNotes({
required String rootNoteId,
required int since,
}) async {
final replyNotes = _noteRepository.subscribeReplyNotes(
requestId: repliesFetchId,
Expand Down
92 changes: 92 additions & 0 deletions lib/presentation_layer/providers/event_feed_provider.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
import 'dart:async';

import 'package:riverpod/riverpod.dart';

import '../../data_layer/data_sources/dart_ndk_source.dart';
import '../../data_layer/repositories/note_repository_impl.dart';
import '../../domain_layer/entities/feed_event_view_model.dart';
import '../../domain_layer/repositories/note_repository.dart';
import '../../domain_layer/usecases/event_feed.dart';
import '../../domain_layer/usecases/follow.dart';

import 'event_verifier.dart';
import 'following_provider.dart';
import 'ndk_provider.dart';

final eventFeedProvider = Provider<EventFeed>((ref) {
final ndk = ref.watch(ndkProvider);

final eventVerifier = ref.watch(eventVerifierProvider);

final DartNdkSource dartNdkSource = DartNdkSource(ndk);

final NoteRepository noteRepository = NoteRepositoryImpl(
dartNdkSource: dartNdkSource,
eventVerifier: eventVerifier,
);

final Follow followProvider = ref.watch(followingProvider);

final EventFeed eventFeed = EventFeed(noteRepository, followProvider);

return eventFeed;
});

/// [String] is root event id
final eventFeedStateProvider =
NotifierProvider.family<EventFeedState, FeedEventViewModel, String>(
EventFeedState.new,
);

class EventFeedState extends FamilyNotifier<FeedEventViewModel, String> {
StreamSubscription? _rootNoteSub;
StreamSubscription? _commentNotesSub;

/// closes everthing and resets the state
Future<void> resetStateDispose() async {
final eventFeed = ref.read(eventFeedProvider);
state = FeedEventViewModel(
comments: [],
rootNote: null,
);

_commentNotesSub?.cancel();
_rootNoteSub?.cancel();
await eventFeed.dispose();
}

@override
FeedEventViewModel build(String arg) {
_initialFetch(arg);
_initSubscriptions();
return FeedEventViewModel(
comments: [],
rootNote: null,
);
}

_initialFetch(String rootNoteId) {
final eventFeed = ref.read(eventFeedProvider);
eventFeed.subscribeToRootNote(
noteId: rootNoteId,
);

eventFeed.subscribeToReplyNotes(
rootNoteId: rootNoteId,
);
}

void _initSubscriptions() async {
final eventFeed = ref.read(eventFeedProvider);

// Root note subscription
_rootNoteSub = eventFeed.rootNoteStream.listen((event) {
state = state.copyWith(rootNote: event);
});

// Comment notes subscription
_commentNotesSub = eventFeed.repliesTreeStream.listen((tree) {
state = state.copyWith(comments: tree);
});
}
}

0 comments on commit dd722a6

Please sign in to comment.