kirakira/lib/data/providers/providers.dart

58 lines
1.7 KiB
Dart
Raw Normal View History

2024-02-17 20:32:01 +05:30
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";
2024-02-17 20:32:01 +05:30
/// Overridden in main() with the Hive-backed store opened at boot.
final storeProvider = Provider<SmolStore>((ref) => throw UnimplementedError());
final clientProvider = Provider<SmolClient>(
(ref) => SmolClient(ref.watch(storeProvider)),
2024-02-17 20:32:01 +05:30
);
/// 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<int> {
@override
int build() => 0;
void bump() => state++;
}
2024-02-17 20:32:01 +05:30
final revisionProvider = NotifierProvider<Revision, int>(Revision.new);
2024-02-17 20:32:01 +05:30
final identityProvider = Provider<SmolIdentity?>((ref) {
ref.watch(revisionProvider);
return ref.watch(storeProvider).identity();
2024-02-17 20:32:01 +05:30
});
final accountProvider = Provider<SmolAddress?>((ref) {
ref.watch(revisionProvider);
return ref.watch(clientProvider).accountAddress();
});
class Folder extends Notifier<String> {
@override
String build() => "inbox";
void select(String folder) => state = folder;
}
final folderProvider = NotifierProvider<Folder, String>(Folder.new);
final messagesProvider = Provider<List<MailRecord>>((ref) {
ref.watch(revisionProvider);
return ref.watch(storeProvider).listMessages(ref.watch(folderProvider));
});
final unreadProvider = Provider<int>((ref) {
ref.watch(revisionProvider);
return ref.watch(storeProvider).unreadCount();
});
final contactsProvider = Provider<List<(String, StoredContact)>>((ref) {
ref.watch(revisionProvider);
return ref.watch(storeProvider).allContacts();
});