import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:smol_mail/smol/client.dart"; import "package:smol_mail/smol/proto.dart"; import "package:smol_mail/smol/store.dart"; /// Overridden in main() with the Hive-backed store opened at boot. final storeProvider = Provider((ref) => throw UnimplementedError()); final clientProvider = Provider( (ref) => SmolClient(ref.watch(storeProvider)), ); /// Hive gives no change notifications; every mail or state mutation bumps this, /// which is what the list, badge, identity and account providers watch. class Revision extends Notifier { @override int build() => 0; void bump() => state++; } final revisionProvider = NotifierProvider(Revision.new); final identityProvider = Provider((ref) { ref.watch(revisionProvider); return ref.watch(storeProvider).identity(); }); final accountProvider = Provider((ref) { ref.watch(revisionProvider); return ref.watch(clientProvider).accountAddress(); }); class Folder extends Notifier { @override String build() => "inbox"; void select(String folder) => state = folder; } final folderProvider = NotifierProvider(Folder.new); final messagesProvider = Provider>((ref) { ref.watch(revisionProvider); return ref.watch(storeProvider).listMessages(ref.watch(folderProvider)); }); final unreadProvider = Provider((ref) { ref.watch(revisionProvider); return ref.watch(storeProvider).unreadCount(); }); final contactsProvider = Provider>((ref) { ref.watch(revisionProvider); return ref.watch(storeProvider).allContacts(); });