2024-02-17 20:32:01 +05:30
|
|
|
import "package:flutter_riverpod/flutter_riverpod.dart";
|
|
|
|
|
|
2026-09-26 22:45:38 +03:00
|
|
|
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
|
|
|
|
2026-09-26 22:45:38 +03:00
|
|
|
/// 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
|
|
|
);
|
|
|
|
|
|
2026-09-26 22:45:38 +03:00
|
|
|
/// 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
|
|
|
|
2026-09-26 22:45:38 +03:00
|
|
|
final revisionProvider = NotifierProvider<Revision, int>(Revision.new);
|
2024-02-17 20:32:01 +05:30
|
|
|
|
2026-09-26 22:45:38 +03:00
|
|
|
final identityProvider = Provider<SmolIdentity?>((ref) {
|
|
|
|
|
ref.watch(revisionProvider);
|
|
|
|
|
return ref.watch(storeProvider).identity();
|
2024-02-17 20:32:01 +05:30
|
|
|
});
|
|
|
|
|
|
2026-09-26 22:45:38 +03:00
|
|
|
final accountProvider = Provider<SmolAddress?>((ref) {
|
|
|
|
|
ref.watch(revisionProvider);
|
|
|
|
|
return ref.watch(clientProvider).accountAddress();
|
|
|
|
|
});
|
|
|
|
|
|
2026-09-27 11:07:11 +03:00
|
|
|
/// 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<List<MailRecord>, String>((ref, folder) {
|
2026-09-26 22:45:38 +03:00
|
|
|
ref.watch(revisionProvider);
|
2026-09-27 11:07:11 +03:00
|
|
|
return ref.watch(storeProvider).listMessages(folder);
|
2026-09-26 22:45:38 +03:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
final unreadProvider = Provider<int>((ref) {
|
|
|
|
|
ref.watch(revisionProvider);
|
|
|
|
|
return ref.watch(storeProvider).unreadCount();
|
|
|
|
|
});
|
|
|
|
|
|
2026-09-27 11:07:11 +03:00
|
|
|
final requestsUnreadProvider = Provider<int>((ref) {
|
|
|
|
|
ref.watch(revisionProvider);
|
|
|
|
|
return ref.watch(storeProvider).requestsUnreadCount();
|
|
|
|
|
});
|
|
|
|
|
|
2026-09-26 22:45:38 +03:00
|
|
|
final contactsProvider = Provider<List<(String, StoredContact)>>((ref) {
|
|
|
|
|
ref.watch(revisionProvider);
|
|
|
|
|
return ref.watch(storeProvider).allContacts();
|
|
|
|
|
});
|