import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:smol_mail/smol/address.dart"; import "package:smol_mail/smol/client.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(); }); /// One tab (Inbox/Sent/Requests) can be on screen — and simultaneously kept /// alive off-screen by [TabBarView] for swiping — while another is active, /// so each is parameterized by its own folder rather than sharing one /// ambient "current folder" provider. final messagesForFolderProvider = Provider.family, String>((ref, folder) { ref.watch(revisionProvider); return ref.watch(storeProvider).listMessages(folder); }); final unreadProvider = Provider((ref) { ref.watch(revisionProvider); return ref.watch(storeProvider).unreadCount(); }); final requestsUnreadProvider = Provider((ref) { ref.watch(revisionProvider); return ref.watch(storeProvider).requestsUnreadCount(); }); final contactsProvider = Provider>((ref) { ref.watch(revisionProvider); return ref.watch(storeProvider).allContacts(); });